{
  "schemaVersion": 1,
  "kind": "webgpu-os-es-module-catalog",
  "description": "Machine-readable ES-module catalog generated from repository source. Use each sourceHash to detect drift before relying on a signature. Empty summaries mean the source has no extractable JSDoc; they are reported by summaryCoverage and are never filled with invented prose.",
  "runtimeLoading": {
    "sourceMode": "Serve the repository root over HTTP with start_server.py, then use each module's absolute import path.",
    "compiledMode": "The compact production site loads generated bundles; raw source module URLs are not guaranteed to be deployed."
  },
  "repositories": {
    "platformDistribution": {
      "url": "https://github.com/BTSpaniel/particlerealms.engine",
      "role": "Public browser-ready platform downloads, including compressed .gz bundles.",
      "sourceOfApiTruth": false
    },
    "masterServer": {
      "url": "https://github.com/BTSpaniel/particlerealms.engine-master-server",
      "role": "Separate discovery, admission, encrypted-signaling, TURN, and trusted-node service source.",
      "gameplayAuthority": false
    }
  },
  "summaryCoverage": {
    "modules": {
      "documented": 1770,
      "total": 2603,
      "percent": 68.0
    },
    "exports": {
      "documented": 5250,
      "total": 17364,
      "percent": 30.2
    }
  },
  "modules": [
    {
      "schemaVersion": 1,
      "title": "adapters/PBDRagdollAgentAdapter",
      "path": "agi/reference/adapters/PBDRagdollAgentAdapter.md",
      "source": "agi/adapters/PBDRagdollAgentAdapter.js",
      "import": "/agi/adapters/PBDRagdollAgentAdapter.js",
      "sourceHash": "c617ddeda76aa47cbee3e7af4dc72dd8ddde7cc5fce76f545db3c1e36fd3f9d3",
      "summary": "",
      "exports": [
        {
          "name": "PBDRagdollAgentAdapter",
          "kind": "class",
          "signature": "class PBDRagdollAgentAdapter",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "brain/ExperienceBuffer",
      "path": "agi/reference/brain/ExperienceBuffer.md",
      "source": "agi/brain/ExperienceBuffer.js",
      "import": "/agi/brain/ExperienceBuffer.js",
      "sourceHash": "63538bf2e35b05177c5527d73d67997316caab4d98969bb6746ef0a2d32ba4e1",
      "summary": "",
      "exports": [
        {
          "name": "ExperienceBuffer",
          "kind": "class",
          "signature": "class ExperienceBuffer",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "brain/NetworkArchitecture",
      "path": "agi/reference/brain/NetworkArchitecture.md",
      "source": "agi/brain/NetworkArchitecture.js",
      "import": "/agi/brain/NetworkArchitecture.js",
      "sourceHash": "96d127e43ea3c4d4b717561078bdeecc9efb341e393b25c8214a9da5ad4dd5f4",
      "summary": "Layer class - represents a single neural network layer",
      "exports": [
        {
          "name": "Layer",
          "kind": "class",
          "signature": "class Layer",
          "summary": "Layer class - represents a single neural network layer"
        },
        {
          "name": "NETWORK_ARCHITECTURES",
          "kind": "constant",
          "signature": "NETWORK_ARCHITECTURES",
          "summary": "Network Architecture Definitions Layer configurations and hyperparameters for Policy and Value networks"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "brain/PolicyNetwork",
      "path": "agi/reference/brain/PolicyNetwork.md",
      "source": "agi/brain/PolicyNetwork.js",
      "import": "/agi/brain/PolicyNetwork.js",
      "sourceHash": "6afeb61b0f881e76c5952c95655bc26cfbcd02670d7dab75859857bb7fa9ec98",
      "summary": "",
      "exports": [
        {
          "name": "PolicyNetwork",
          "kind": "class",
          "signature": "class PolicyNetwork",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "brain/ValueNetwork",
      "path": "agi/reference/brain/ValueNetwork.md",
      "source": "agi/brain/ValueNetwork.js",
      "import": "/agi/brain/ValueNetwork.js",
      "sourceHash": "a8768cfbc58ba7acf9656ff451b78b4fac2bf49cdbce4b45e5b6a9dff5b2593c",
      "summary": "",
      "exports": [
        {
          "name": "ValueNetwork",
          "kind": "class",
          "signature": "class ValueNetwork",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "brain/trainers/PPOTrainer",
      "path": "agi/reference/brain/trainers/PPOTrainer.md",
      "source": "agi/brain/trainers/PPOTrainer.js",
      "import": "/agi/brain/trainers/PPOTrainer.js",
      "sourceHash": "9ef5331dbd0e566011cba2dcdaeb672138eb9040c461152d6aab61a741a6b88a",
      "summary": "",
      "exports": [
        {
          "name": "PPOTrainer",
          "kind": "class",
          "signature": "class PPOTrainer",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "config/curriculum",
      "path": "agi/reference/config/curriculum.md",
      "source": "agi/config/curriculum.js",
      "import": "/agi/config/curriculum.js",
      "sourceHash": "faac029b5a078f894addf4f1810a1e04b028aaa5e37fcaf4da8c70586c1e2893",
      "summary": "Curriculum Learning Stages Progressive training stages from standing to full locomotion",
      "exports": [
        {
          "name": "CURRICULUM_STAGES",
          "kind": "constant",
          "signature": "CURRICULUM_STAGES",
          "summary": "Curriculum Learning Stages Progressive training stages from standing to full locomotion"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "config/hyperparameters",
      "path": "agi/reference/config/hyperparameters.md",
      "source": "agi/config/hyperparameters.js",
      "import": "/agi/config/hyperparameters.js",
      "sourceHash": "a5a8c1d2731a9c858ed889d8bb72b8cbef9838f3cf2c4f68d00cbf685485ead7",
      "summary": "Neural Network Hyperparameters Configuration for Policy and Value networks, training parameters",
      "exports": [
        {
          "name": "HYPERPARAMETERS",
          "kind": "constant",
          "signature": "HYPERPARAMETERS",
          "summary": "Neural Network Hyperparameters Configuration for Policy and Value networks, training parameters"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "config/rewards",
      "path": "agi/reference/config/rewards.md",
      "source": "agi/config/rewards.js",
      "import": "/agi/config/rewards.js",
      "sourceHash": "a54ceb15b1a4b9edba1c462a25c6cf35d0ea99546e3729b6a2bd4704c4eef292",
      "summary": "Compute reward for current state",
      "exports": [
        {
          "name": "computeReward",
          "kind": "function",
          "signature": "computeReward(state, config = REWARD_WEIGHTS.standing)",
          "summary": "Compute reward for current state"
        },
        {
          "name": "REWARD_WEIGHTS",
          "kind": "constant",
          "signature": "REWARD_WEIGHTS",
          "summary": "Reward Function Weights Configurable reward components for different training objectives"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "core/CurriculumManager",
      "path": "agi/reference/core/CurriculumManager.md",
      "source": "agi/core/CurriculumManager.js",
      "import": "/agi/core/CurriculumManager.js",
      "sourceHash": "4b2fdc7d123b94cdd1d734d3998d70fc2bfa60043fc6c9003ec5d63455d11179",
      "summary": "",
      "exports": [
        {
          "name": "CurriculumManager",
          "kind": "class",
          "signature": "class CurriculumManager",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "core/MotionMatchingTeacher",
      "path": "agi/reference/core/MotionMatchingTeacher.md",
      "source": "agi/core/MotionMatchingTeacher.js",
      "import": "/agi/core/MotionMatchingTeacher.js",
      "sourceHash": "8067ac4e7eb42fd195398395e3cd8b35098562e5c8cd79a6a0e1f049ce22fbf7",
      "summary": "",
      "exports": [
        {
          "name": "MotionMatchingTeacher",
          "kind": "class",
          "signature": "class MotionMatchingTeacher extends MotionMatcher",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "core/MotorController",
      "path": "agi/reference/core/MotorController.md",
      "source": "agi/core/MotorController.js",
      "import": "/agi/core/MotorController.js",
      "sourceHash": "e92518a41940bd87db2e88b406599fd661679e73cf9d561f45cab80e30dabd03",
      "summary": "Motor Controller Converts neural network actions into physics impulses",
      "exports": [
        {
          "name": "MotorController",
          "kind": "class",
          "signature": "class MotorController",
          "summary": "Motor Controller Converts neural network actions into physics impulses"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "core/ObservationBuilder",
      "path": "agi/reference/core/ObservationBuilder.md",
      "source": "agi/core/ObservationBuilder.js",
      "import": "/agi/core/ObservationBuilder.js",
      "sourceHash": "74c5e77974cdfdec7ae331f82796deafff336adfcae527282cb31a90cf99ab81",
      "summary": "Observation Builder Converts ragdoll sensor data into neural network input",
      "exports": [
        {
          "name": "ObservationBuilder",
          "kind": "class",
          "signature": "class ObservationBuilder",
          "summary": "Observation Builder Converts ragdoll sensor data into neural network input"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "core/RagdollController",
      "path": "agi/reference/core/RagdollController.md",
      "source": "agi/core/RagdollController.js",
      "import": "/agi/core/RagdollController.js",
      "sourceHash": "c248723f6e650dcff7a470393e6c11d4dac0bec1e37d27bc03ba9c8d0c4096f8",
      "summary": "",
      "exports": [
        {
          "name": "RagdollController",
          "kind": "class",
          "signature": "class RagdollController",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "core/RewardFunction",
      "path": "agi/reference/core/RewardFunction.md",
      "source": "agi/core/RewardFunction.js",
      "import": "/agi/core/RewardFunction.js",
      "sourceHash": "8f94baf0346ff8e13cb398786fef280535c407b60b10db85aaa1806581f575b6",
      "summary": "",
      "exports": [
        {
          "name": "RewardFunction",
          "kind": "class",
          "signature": "class RewardFunction",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "index",
      "path": "agi/reference/index.md",
      "source": "agi/index.js",
      "import": "/agi/index.js",
      "sourceHash": "f20d34de48bbf9d6566a9ffe9b10f489ef732fb3740aea98512226867c7ca502",
      "summary": "",
      "exports": [
        {
          "name": "AGI_CORE_FULL",
          "kind": "re-export",
          "signature": "AGI_CORE_FULL",
          "summary": ""
        },
        {
          "name": "AGI_CORE_VERSION",
          "kind": "re-export",
          "signature": "AGI_CORE_VERSION",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_CHANNEL_ID",
          "kind": "re-export",
          "signature": "AGI_TRAINING_CHANNEL_ID",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_CONTRACT",
          "kind": "re-export",
          "signature": "AGI_TRAINING_CONTRACT",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_ROUTE_ID",
          "kind": "re-export",
          "signature": "AGI_TRAINING_ROUTE_ID",
          "summary": ""
        },
        {
          "name": "AgiTrainingStateChannel",
          "kind": "re-export",
          "signature": "AgiTrainingStateChannel",
          "summary": ""
        },
        {
          "name": "BUILD_TAG",
          "kind": "re-export",
          "signature": "BUILD_TAG",
          "summary": ""
        },
        {
          "name": "BrainVisualizer",
          "kind": "re-export",
          "signature": "BrainVisualizer",
          "summary": ""
        },
        {
          "name": "ComputeGraph",
          "kind": "re-export",
          "signature": "ComputeGraph",
          "summary": ""
        },
        {
          "name": "CurriculumManager",
          "kind": "re-export",
          "signature": "CurriculumManager",
          "summary": ""
        },
        {
          "name": "DebugVisualizer",
          "kind": "re-export",
          "signature": "DebugVisualizer",
          "summary": ""
        },
        {
          "name": "ExperienceBuffer",
          "kind": "re-export",
          "signature": "ExperienceBuffer",
          "summary": ""
        },
        {
          "name": "GradientContext",
          "kind": "re-export",
          "signature": "GradientContext",
          "summary": ""
        },
        {
          "name": "GradientTape",
          "kind": "re-export",
          "signature": "GradientTape",
          "summary": ""
        },
        {
          "name": "GroundPlane",
          "kind": "re-export",
          "signature": "GroundPlane",
          "summary": ""
        },
        {
          "name": "InjectionSystem",
          "kind": "re-export",
          "signature": "InjectionSystem",
          "summary": ""
        },
        {
          "name": "Layer",
          "kind": "re-export",
          "signature": "Layer",
          "summary": ""
        },
        {
          "name": "LoadingProgress",
          "kind": "re-export",
          "signature": "LoadingProgress",
          "summary": ""
        },
        {
          "name": "MetricsDisplay",
          "kind": "re-export",
          "signature": "MetricsDisplay",
          "summary": ""
        },
        {
          "name": "ModelLoader",
          "kind": "re-export",
          "signature": "ModelLoader",
          "summary": ""
        },
        {
          "name": "MotionMatchingTeacher",
          "kind": "re-export",
          "signature": "MotionMatchingTeacher",
          "summary": ""
        },
        {
          "name": "MotorController",
          "kind": "re-export",
          "signature": "MotorController",
          "summary": ""
        },
        {
          "name": "NETWORK_ARCHITECTURES",
          "kind": "re-export",
          "signature": "NETWORK_ARCHITECTURES",
          "summary": ""
        },
        {
          "name": "NetworkArchitecture",
          "kind": "re-export",
          "signature": "NetworkArchitecture",
          "summary": ""
        },
        {
          "name": "ObservationBuilder",
          "kind": "re-export",
          "signature": "ObservationBuilder",
          "summary": ""
        },
        {
          "name": "PBDRagdollAgentAdapter",
          "kind": "re-export",
          "signature": "PBDRagdollAgentAdapter",
          "summary": ""
        },
        {
          "name": "PPOTrainer",
          "kind": "re-export",
          "signature": "PPOTrainer",
          "summary": ""
        },
        {
          "name": "ParasiteRig",
          "kind": "re-export",
          "signature": "ParasiteRig",
          "summary": ""
        },
        {
          "name": "PolicyNetwork",
          "kind": "re-export",
          "signature": "PolicyNetwork",
          "summary": ""
        },
        {
          "name": "RagdollController",
          "kind": "re-export",
          "signature": "RagdollController",
          "summary": ""
        },
        {
          "name": "RewardFunction",
          "kind": "re-export",
          "signature": "RewardFunction",
          "summary": ""
        },
        {
          "name": "SceneRenderer",
          "kind": "re-export",
          "signature": "SceneRenderer",
          "summary": ""
        },
        {
          "name": "StudioApp",
          "kind": "re-export",
          "signature": "StudioApp",
          "summary": ""
        },
        {
          "name": "TensorCache",
          "kind": "re-export",
          "signature": "TensorCache",
          "summary": ""
        },
        {
          "name": "TentacleRenderer",
          "kind": "re-export",
          "signature": "TentacleRenderer",
          "summary": ""
        },
        {
          "name": "TrackingCamera",
          "kind": "re-export",
          "signature": "TrackingCamera",
          "summary": ""
        },
        {
          "name": "TrainingScene",
          "kind": "re-export",
          "signature": "TrainingScene",
          "summary": ""
        },
        {
          "name": "TrainingUI",
          "kind": "re-export",
          "signature": "TrainingUI",
          "summary": ""
        },
        {
          "name": "ValueNetwork",
          "kind": "re-export",
          "signature": "ValueNetwork",
          "summary": ""
        },
        {
          "name": "createAgiTrainingStateChannel",
          "kind": "re-export",
          "signature": "createAgiTrainingStateChannel",
          "summary": ""
        },
        {
          "name": "loadingProgress",
          "kind": "re-export",
          "signature": "loadingProgress",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/DeviceProfiler",
      "path": "agi/reference/llm/DeviceProfiler.md",
      "source": "agi/llm/DeviceProfiler.js",
      "import": "/agi/llm/DeviceProfiler.js",
      "sourceHash": "31c08824be41f7aa80654a5cbfa109250c7ba8d998213935abe7dc176e279945",
      "summary": "DeviceProfiler.js - WebGPU capability and LLM feasibility profiler. This module is intentionally browser-native and dependency-free. It can use the kernel's shared GPU device when available, or probe navigator.gpu directly for standalone AGI tests.",
      "exports": [
        {
          "name": "AIDeviceProfiler",
          "kind": "class",
          "signature": "class AIDeviceProfiler",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/formats/GGUFParser",
      "path": "agi/reference/llm/formats/GGUFParser.md",
      "source": "agi/llm/formats/GGUFParser.js",
      "import": "/agi/llm/formats/GGUFParser.js",
      "sourceHash": "a7c01840a7315dcc9cbd906b3edaf8c843ade73612d4a63ce023571d1e49c921",
      "summary": "",
      "exports": [
        {
          "name": "GGUFParser",
          "kind": "class",
          "signature": "class GGUFParser",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/formats/GGUFTensorReader",
      "path": "agi/reference/llm/formats/GGUFTensorReader.md",
      "source": "agi/llm/formats/GGUFTensorReader.js",
      "import": "/agi/llm/formats/GGUFTensorReader.js",
      "sourceHash": "bd77c6687c617369f002717fd7bef7429eeebd0a8ba27eca501e9c39e18c258a",
      "summary": "",
      "exports": [
        {
          "name": "GGUFTensorReader",
          "kind": "class",
          "signature": "class GGUFTensorReader",
          "summary": ""
        },
        {
          "name": "bf16ToF32",
          "kind": "function",
          "signature": "bf16ToF32(value)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/formats/LLMPersistenceContracts",
      "path": "agi/reference/llm/formats/LLMPersistenceContracts.md",
      "source": "agi/llm/formats/LLMPersistenceContracts.js",
      "import": "/agi/llm/formats/LLMPersistenceContracts.js",
      "sourceHash": "6bb1547664180c24ce26d1760ea42eb59574058ad0e089e9452d39492a128b03",
      "summary": "Accept a legacy bare conversation and return the canonical durable v1 envelope.",
      "exports": [
        {
          "name": "validateConversationId",
          "kind": "function",
          "signature": "validateConversationId(value)",
          "summary": ""
        },
        {
          "name": "validateModelId",
          "kind": "function",
          "signature": "validateModelId(value)",
          "summary": ""
        },
        {
          "name": "prepareModelRegistry",
          "kind": "function",
          "signature": "prepareModelRegistry(input)",
          "summary": ""
        },
        {
          "name": "prepareModelPackage",
          "kind": "function",
          "signature": "prepareModelPackage(input)",
          "summary": ""
        },
        {
          "name": "prepareConversation",
          "kind": "function",
          "signature": "prepareConversation(input, expectedId = null)",
          "summary": "Accept a legacy bare conversation and return the canonical durable v1 envelope."
        },
        {
          "name": "MODEL_REGISTRY_SCHEMA",
          "kind": "constant",
          "signature": "MODEL_REGISTRY_SCHEMA",
          "summary": ""
        },
        {
          "name": "MODEL_PACKAGE_SCHEMA",
          "kind": "constant",
          "signature": "MODEL_PACKAGE_SCHEMA",
          "summary": ""
        },
        {
          "name": "CONVERSATION_SCHEMA",
          "kind": "constant",
          "signature": "CONVERSATION_SCHEMA",
          "summary": ""
        },
        {
          "name": "LLM_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "LLM_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/formats/ModelPackageReader",
      "path": "agi/reference/llm/formats/ModelPackageReader.md",
      "source": "agi/llm/formats/ModelPackageReader.js",
      "import": "/agi/llm/formats/ModelPackageReader.js",
      "sourceHash": "0c36a0a464be2eace294b50d704e66ebf4035dbf64daa8dc84be8601cdd6069d",
      "summary": "",
      "exports": [
        {
          "name": "ModelPackageReader",
          "kind": "class",
          "signature": "class ModelPackageReader",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/formats/ModelPackageWriter",
      "path": "agi/reference/llm/formats/ModelPackageWriter.md",
      "source": "agi/llm/formats/ModelPackageWriter.js",
      "import": "/agi/llm/formats/ModelPackageWriter.js",
      "sourceHash": "3e4a12517cf5cb5eeee7b685113e49e0dd850fe8344488e78f2a844c9d8e8a3e",
      "summary": "",
      "exports": [
        {
          "name": "ModelPackageWriter",
          "kind": "class",
          "signature": "class ModelPackageWriter",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/formats/Quantization",
      "path": "agi/reference/llm/formats/Quantization.md",
      "source": "agi/llm/formats/Quantization.js",
      "import": "/agi/llm/formats/Quantization.js",
      "sourceHash": "f7a2023a142bedad1e3eef00d91e5578221d7250d8645963db0272be33fc4386",
      "summary": "",
      "exports": [
        {
          "name": "quantTypeName",
          "kind": "function",
          "signature": "quantTypeName(type)",
          "summary": ""
        },
        {
          "name": "ggufFileTypeName",
          "kind": "function",
          "signature": "ggufFileTypeName(type)",
          "summary": ""
        },
        {
          "name": "inferQuantization",
          "kind": "function",
          "signature": "inferQuantization(tensors = [], metadata = {})",
          "summary": ""
        },
        {
          "name": "normalizeQuantization",
          "kind": "function",
          "signature": "normalizeQuantization(value)",
          "summary": ""
        },
        {
          "name": "isSupportedMetadataQuant",
          "kind": "function",
          "signature": "isSupportedMetadataQuant(value)",
          "summary": ""
        },
        {
          "name": "quantBlockInfo",
          "kind": "function",
          "signature": "quantBlockInfo(type)",
          "summary": ""
        },
        {
          "name": "tensorElementCount",
          "kind": "function",
          "signature": "tensorElementCount(dims = [])",
          "summary": ""
        },
        {
          "name": "tensorByteSize",
          "kind": "function",
          "signature": "tensorByteSize(type, dims = [])",
          "summary": ""
        },
        {
          "name": "GGML_QUANT_TYPES",
          "kind": "constant",
          "signature": "GGML_QUANT_TYPES",
          "summary": ""
        },
        {
          "name": "SUPPORTED_METADATA_QUANTS",
          "kind": "constant",
          "signature": "SUPPORTED_METADATA_QUANTS",
          "summary": ""
        },
        {
          "name": "GGUF_FILE_TYPES",
          "kind": "constant",
          "signature": "GGUF_FILE_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/formats/TensorShardIndex",
      "path": "agi/reference/llm/formats/TensorShardIndex.md",
      "source": "agi/llm/formats/TensorShardIndex.js",
      "import": "/agi/llm/formats/TensorShardIndex.js",
      "sourceHash": "bf83fd0a109ee8b96bae74d3b80a2ce1c49f01b70e7f7db4503d27b638dda4c2",
      "summary": "Accept legacy bare indexes and return a canonical, independently cloned v1 document.",
      "exports": [
        {
          "name": "UnsupportedTensorShardIndexVersionError",
          "kind": "class",
          "signature": "class UnsupportedTensorShardIndexVersionError extends Error",
          "summary": ""
        },
        {
          "name": "TensorShardIndex",
          "kind": "class",
          "signature": "class TensorShardIndex",
          "summary": ""
        },
        {
          "name": "prepareTensorShardIndexDocument",
          "kind": "function",
          "signature": "prepareTensorShardIndexDocument(input)",
          "summary": "Accept legacy bare indexes and return a canonical, independently cloned v1 document."
        },
        {
          "name": "TENSOR_SHARD_INDEX_SCHEMA",
          "kind": "constant",
          "signature": "TENSOR_SHARD_INDEX_SCHEMA",
          "summary": ""
        },
        {
          "name": "TENSOR_SHARD_INDEX_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "TENSOR_SHARD_INDEX_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/index",
      "path": "agi/reference/llm/index.md",
      "source": "agi/llm/index.js",
      "import": "/agi/llm/index.js",
      "sourceHash": "7a63122268e40a7d5b4c4af344681240db64d95bf9122ad16bc9845ba0d9a007",
      "summary": "",
      "exports": [
        {
          "name": "AIDeviceProfiler",
          "kind": "re-export",
          "signature": "AIDeviceProfiler",
          "summary": ""
        },
        {
          "name": "CONVERSATION_SCHEMA",
          "kind": "re-export",
          "signature": "CONVERSATION_SCHEMA",
          "summary": ""
        },
        {
          "name": "CpuTensorRunner",
          "kind": "re-export",
          "signature": "CpuTensorRunner",
          "summary": ""
        },
        {
          "name": "GGUFParser",
          "kind": "re-export",
          "signature": "GGUFParser",
          "summary": ""
        },
        {
          "name": "GGUFTensorReader",
          "kind": "re-export",
          "signature": "GGUFTensorReader",
          "summary": ""
        },
        {
          "name": "Gemma4GraphRunner",
          "kind": "re-export",
          "signature": "Gemma4GraphRunner",
          "summary": ""
        },
        {
          "name": "GenerationLoop",
          "kind": "re-export",
          "signature": "GenerationLoop",
          "summary": ""
        },
        {
          "name": "GpuPrimitiveRunner",
          "kind": "re-export",
          "signature": "GpuPrimitiveRunner",
          "summary": ""
        },
        {
          "name": "GraphCompiler",
          "kind": "re-export",
          "signature": "GraphCompiler",
          "summary": ""
        },
        {
          "name": "InferenceEngine",
          "kind": "re-export",
          "signature": "InferenceEngine",
          "summary": ""
        },
        {
          "name": "KVCache",
          "kind": "re-export",
          "signature": "KVCache",
          "summary": ""
        },
        {
          "name": "K_QUANT_LAYOUTS",
          "kind": "re-export",
          "signature": "K_QUANT_LAYOUTS",
          "summary": ""
        },
        {
          "name": "KernelRegistry",
          "kind": "re-export",
          "signature": "KernelRegistry",
          "summary": ""
        },
        {
          "name": "LLMRuntime",
          "kind": "re-export",
          "signature": "LLMRuntime",
          "summary": ""
        },
        {
          "name": "LLMSession",
          "kind": "re-export",
          "signature": "LLMSession",
          "summary": ""
        },
        {
          "name": "LLM_SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "LLM_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "LocalGGUFExecutor",
          "kind": "re-export",
          "signature": "LocalGGUFExecutor",
          "summary": ""
        },
        {
          "name": "MODEL_HANDLE_QUARANTINE_SCHEMA",
          "kind": "re-export",
          "signature": "MODEL_HANDLE_QUARANTINE_SCHEMA",
          "summary": ""
        },
        {
          "name": "MODEL_HANDLE_RECORD_SCHEMA",
          "kind": "re-export",
          "signature": "MODEL_HANDLE_RECORD_SCHEMA",
          "summary": ""
        },
        {
          "name": "MODEL_HANDLE_RECORD_VERSION",
          "kind": "re-export",
          "signature": "MODEL_HANDLE_RECORD_VERSION",
          "summary": ""
        },
        {
          "name": "MODEL_PACKAGE_SCHEMA",
          "kind": "re-export",
          "signature": "MODEL_PACKAGE_SCHEMA",
          "summary": ""
        },
        {
          "name": "MODEL_REGISTRY_SCHEMA",
          "kind": "re-export",
          "signature": "MODEL_REGISTRY_SCHEMA",
          "summary": ""
        },
        {
          "name": "ModelCache",
          "kind": "re-export",
          "signature": "ModelCache",
          "summary": ""
        },
        {
          "name": "ModelHandleStore",
          "kind": "re-export",
          "signature": "ModelHandleStore",
          "summary": ""
        },
        {
          "name": "ModelHandleStoreError",
          "kind": "re-export",
          "signature": "ModelHandleStoreError",
          "summary": ""
        },
        {
          "name": "ModelPackageReader",
          "kind": "re-export",
          "signature": "ModelPackageReader",
          "summary": ""
        },
        {
          "name": "ModelPackageWriter",
          "kind": "re-export",
          "signature": "ModelPackageWriter",
          "summary": ""
        },
        {
          "name": "ModelRegistry",
          "kind": "re-export",
          "signature": "ModelRegistry",
          "summary": ""
        },
        {
          "name": "OPFSStore",
          "kind": "re-export",
          "signature": "OPFSStore",
          "summary": ""
        },
        {
          "name": "PagedAttention",
          "kind": "re-export",
          "signature": "PagedAttention",
          "summary": ""
        },
        {
          "name": "PrefixBlockCache",
          "kind": "re-export",
          "signature": "PrefixBlockCache",
          "summary": ""
        },
        {
          "name": "PromptTemplate",
          "kind": "re-export",
          "signature": "PromptTemplate",
          "summary": ""
        },
        {
          "name": "Q8_0_LAYOUT",
          "kind": "re-export",
          "signature": "Q8_0_LAYOUT",
          "summary": ""
        },
        {
          "name": "QuantizedMatVecRunner",
          "kind": "re-export",
          "signature": "QuantizedMatVecRunner",
          "summary": ""
        },
        {
          "name": "Sampler",
          "kind": "re-export",
          "signature": "Sampler",
          "summary": ""
        },
        {
          "name": "StaticMemoryPlanner",
          "kind": "re-export",
          "signature": "StaticMemoryPlanner",
          "summary": ""
        },
        {
          "name": "TENSOR_SHARD_INDEX_SCHEMA",
          "kind": "re-export",
          "signature": "TENSOR_SHARD_INDEX_SCHEMA",
          "summary": ""
        },
        {
          "name": "TENSOR_SHARD_INDEX_SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "TENSOR_SHARD_INDEX_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "TensorShardIndex",
          "kind": "re-export",
          "signature": "TensorShardIndex",
          "summary": ""
        },
        {
          "name": "Tokenizer",
          "kind": "re-export",
          "signature": "Tokenizer",
          "summary": ""
        },
        {
          "name": "ToolBridge",
          "kind": "re-export",
          "signature": "ToolBridge",
          "summary": ""
        },
        {
          "name": "TransformerExecutor",
          "kind": "re-export",
          "signature": "TransformerExecutor",
          "summary": ""
        },
        {
          "name": "UnsupportedTensorShardIndexVersionError",
          "kind": "re-export",
          "signature": "UnsupportedTensorShardIndexVersionError",
          "summary": ""
        },
        {
          "name": "VFSConversationStore",
          "kind": "re-export",
          "signature": "VFSConversationStore",
          "summary": ""
        },
        {
          "name": "WeightCache",
          "kind": "re-export",
          "signature": "WeightCache",
          "summary": ""
        },
        {
          "name": "assertShaderCompiled",
          "kind": "re-export",
          "signature": "assertShaderCompiled",
          "summary": ""
        },
        {
          "name": "checksumBytes",
          "kind": "re-export",
          "signature": "checksumBytes",
          "summary": ""
        },
        {
          "name": "checksumString",
          "kind": "re-export",
          "signature": "checksumString",
          "summary": ""
        },
        {
          "name": "createComputePipelineChecked",
          "kind": "re-export",
          "signature": "createComputePipelineChecked",
          "summary": ""
        },
        {
          "name": "kernelNameForQuant",
          "kind": "re-export",
          "signature": "kernelNameForQuant",
          "summary": ""
        },
        {
          "name": "prepareConversation",
          "kind": "re-export",
          "signature": "prepareConversation",
          "summary": ""
        },
        {
          "name": "prepareLastModelRecord",
          "kind": "re-export",
          "signature": "prepareLastModelRecord",
          "summary": ""
        },
        {
          "name": "prepareModelHandleRecord",
          "kind": "re-export",
          "signature": "prepareModelHandleRecord",
          "summary": ""
        },
        {
          "name": "prepareModelPackage",
          "kind": "re-export",
          "signature": "prepareModelPackage",
          "summary": ""
        },
        {
          "name": "prepareModelRegistry",
          "kind": "re-export",
          "signature": "prepareModelRegistry",
          "summary": ""
        },
        {
          "name": "prepareTensorShardIndexDocument",
          "kind": "re-export",
          "signature": "prepareTensorShardIndexDocument",
          "summary": ""
        },
        {
          "name": "rowStrideForQuant",
          "kind": "re-export",
          "signature": "rowStrideForQuant",
          "summary": ""
        },
        {
          "name": "shaderQ4K",
          "kind": "re-export",
          "signature": "shaderQ4K",
          "summary": ""
        },
        {
          "name": "shaderQ5K",
          "kind": "re-export",
          "signature": "shaderQ5K",
          "summary": ""
        },
        {
          "name": "shaderQ6K",
          "kind": "re-export",
          "signature": "shaderQ6K",
          "summary": ""
        },
        {
          "name": "shaderQ80",
          "kind": "re-export",
          "signature": "shaderQ80",
          "summary": ""
        },
        {
          "name": "validateConversationId",
          "kind": "re-export",
          "signature": "validateConversationId",
          "summary": ""
        },
        {
          "name": "validateModelId",
          "kind": "re-export",
          "signature": "validateModelId",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/CacheGovernor",
      "path": "agi/reference/llm/inference/CacheGovernor.md",
      "source": "agi/llm/inference/CacheGovernor.js",
      "import": "/agi/llm/inference/CacheGovernor.js",
      "sourceHash": "678bf1b0b84834d9b88952f07e3e69eb481d83f331d7701fbe8b510945f596c0",
      "summary": "",
      "exports": [
        {
          "name": "CacheGovernor",
          "kind": "class",
          "signature": "class CacheGovernor",
          "summary": ""
        },
        {
          "name": "planAdaptivePreload",
          "kind": "function",
          "signature": "planAdaptivePreload(tensors = [], options = {})",
          "summary": ""
        },
        {
          "name": "adaptiveWeightPriority",
          "kind": "function",
          "signature": "adaptiveWeightPriority(tensor)",
          "summary": ""
        },
        {
          "name": "adaptiveEvictionScore",
          "kind": "function",
          "signature": "adaptiveEvictionScore(name, entry = {}, options = {})",
          "summary": ""
        },
        {
          "name": "weightFamily",
          "kind": "function",
          "signature": "weightFamily(name)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/CpuTensorRunner",
      "path": "agi/reference/llm/inference/CpuTensorRunner.md",
      "source": "agi/llm/inference/CpuTensorRunner.js",
      "import": "/agi/llm/inference/CpuTensorRunner.js",
      "sourceHash": "c2588dc9c5ee2b947451104f28ee92dff1e1f17363ed84f85985ca5cf0fc7166",
      "summary": "",
      "exports": [
        {
          "name": "CpuTensorRunner",
          "kind": "class",
          "signature": "class CpuTensorRunner",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/Gemma4GraphRunner",
      "path": "agi/reference/llm/inference/Gemma4GraphRunner.md",
      "source": "agi/llm/inference/Gemma4GraphRunner.js",
      "import": "/agi/llm/inference/Gemma4GraphRunner.js",
      "sourceHash": "b06865d59a227b489cf458884419f550c193fcd4f348c822ea648895665e2a51",
      "summary": "",
      "exports": [
        {
          "name": "Gemma4GraphRunner",
          "kind": "class",
          "signature": "class Gemma4GraphRunner",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/GenerationLoop",
      "path": "agi/reference/llm/inference/GenerationLoop.md",
      "source": "agi/llm/inference/GenerationLoop.js",
      "import": "/agi/llm/inference/GenerationLoop.js",
      "sourceHash": "05147a76cb527903174acb5343064fe163d06c7a1c0dfccbc0b2b3baef52aeb7",
      "summary": "",
      "exports": [
        {
          "name": "GenerationLoop",
          "kind": "class",
          "signature": "class GenerationLoop",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/GpuPrimitiveRunner",
      "path": "agi/reference/llm/inference/GpuPrimitiveRunner.md",
      "source": "agi/llm/inference/GpuPrimitiveRunner.js",
      "import": "/agi/llm/inference/GpuPrimitiveRunner.js",
      "sourceHash": "afb6ff6ca17b455d5d8111a205bce1064ade992a1c9179bd2cb23a9c15c84c70",
      "summary": "",
      "exports": [
        {
          "name": "GpuPrimitiveRunner",
          "kind": "class",
          "signature": "class GpuPrimitiveRunner",
          "summary": ""
        },
        {
          "name": "blockedTokenKey",
          "kind": "function",
          "signature": "blockedTokenKey(ids, vocabSize)",
          "summary": ""
        },
        {
          "name": "mapAsyncWithTimeout",
          "kind": "function",
          "signature": "mapAsyncWithTimeout(buffer, mode, timeoutMs, message)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/GpuRuntimeResources",
      "path": "agi/reference/llm/inference/GpuRuntimeResources.md",
      "source": "agi/llm/inference/GpuRuntimeResources.js",
      "import": "/agi/llm/inference/GpuRuntimeResources.js",
      "sourceHash": "bcf6b65ecef401e35378b047bf1085f9e9e7152a1258c249d1034a42bb911f79",
      "summary": "",
      "exports": [
        {
          "name": "GpuParameterArena",
          "kind": "class",
          "signature": "class GpuParameterArena",
          "summary": ""
        },
        {
          "name": "GpuBindGroupCache",
          "kind": "class",
          "signature": "class GpuBindGroupCache",
          "summary": ""
        },
        {
          "name": "uniformBinding",
          "kind": "function",
          "signature": "uniformBinding(allocation)",
          "summary": ""
        },
        {
          "name": "isArenaAllocation",
          "kind": "function",
          "signature": "isArenaAllocation(value)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/GraphCompiler",
      "path": "agi/reference/llm/inference/GraphCompiler.md",
      "source": "agi/llm/inference/GraphCompiler.js",
      "import": "/agi/llm/inference/GraphCompiler.js",
      "sourceHash": "30fb4ea82efd7f95c5fb61c28ca221010ed258a9d482cc7b5091a4c63b6c605b",
      "summary": "",
      "exports": [
        {
          "name": "GraphCompiler",
          "kind": "class",
          "signature": "class GraphCompiler",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/InferenceEngine",
      "path": "agi/reference/llm/inference/InferenceEngine.md",
      "source": "agi/llm/inference/InferenceEngine.js",
      "import": "/agi/llm/inference/InferenceEngine.js",
      "sourceHash": "8398db540595e51abbd5798548e3e7c3943cc41ca607eb35d68f31f838a2d132",
      "summary": "",
      "exports": [
        {
          "name": "InferenceEngine",
          "kind": "class",
          "signature": "class InferenceEngine",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/KVCache",
      "path": "agi/reference/llm/inference/KVCache.md",
      "source": "agi/llm/inference/KVCache.js",
      "import": "/agi/llm/inference/KVCache.js",
      "sourceHash": "d9c20edbeb25e42bd6fb81b302286919a2a1aeb217a7be1d1f2d9e71cb4bf385",
      "summary": "",
      "exports": [
        {
          "name": "KVCache",
          "kind": "class",
          "signature": "class KVCache",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/LocalGGUFExecutor",
      "path": "agi/reference/llm/inference/LocalGGUFExecutor.md",
      "source": "agi/llm/inference/LocalGGUFExecutor.js",
      "import": "/agi/llm/inference/LocalGGUFExecutor.js",
      "sourceHash": "615988a623002f6b6869c0e6551a9e56efdc8c54722ac5215fc60493544c5711",
      "summary": "",
      "exports": [
        {
          "name": "LocalGGUFExecutor",
          "kind": "class",
          "signature": "class LocalGGUFExecutor",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/PagedAttention",
      "path": "agi/reference/llm/inference/PagedAttention.md",
      "source": "agi/llm/inference/PagedAttention.js",
      "import": "/agi/llm/inference/PagedAttention.js",
      "sourceHash": "c941566582c2757e53b4260fdd676a70c898dc183570958ddc69fb3cf546e48b",
      "summary": "",
      "exports": [
        {
          "name": "PagedAttention",
          "kind": "class",
          "signature": "class PagedAttention",
          "summary": ""
        },
        {
          "name": "PrefixBlockCache",
          "kind": "class",
          "signature": "class PrefixBlockCache",
          "summary": ""
        },
        {
          "name": "blockHash",
          "kind": "function",
          "signature": "blockHash(namespace, prefixHash, blockTokens)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/QuantizedMatVecRunner",
      "path": "agi/reference/llm/inference/QuantizedMatVecRunner.md",
      "source": "agi/llm/inference/QuantizedMatVecRunner.js",
      "import": "/agi/llm/inference/QuantizedMatVecRunner.js",
      "sourceHash": "dc3596344dda9371cbfe8608dd4ebcfd96438f40595e2e36039a6ccff475c04d",
      "summary": "",
      "exports": [
        {
          "name": "QuantizedMatVecRunner",
          "kind": "class",
          "signature": "class QuantizedMatVecRunner",
          "summary": ""
        },
        {
          "name": "kernelNameForQuant",
          "kind": "function",
          "signature": "kernelNameForQuant(quantization)",
          "summary": ""
        },
        {
          "name": "batchedKernelNameForQuant",
          "kind": "function",
          "signature": "batchedKernelNameForQuant(quantization)",
          "summary": ""
        },
        {
          "name": "rowStrideForQuant",
          "kind": "function",
          "signature": "rowStrideForQuant(quantization, cols)",
          "summary": ""
        },
        {
          "name": "createKQuantParityProbeData",
          "kind": "function",
          "signature": "createKQuantParityProbeData(quantization, { rows = SUBGROUP_PROBE_ROWS } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/StaticMemoryPlanner",
      "path": "agi/reference/llm/inference/StaticMemoryPlanner.md",
      "source": "agi/llm/inference/StaticMemoryPlanner.js",
      "import": "/agi/llm/inference/StaticMemoryPlanner.js",
      "sourceHash": "263245e37abfd8cce2c8de11df753bff164b998624a21f7ca96fd5a415c1cf72",
      "summary": "",
      "exports": [
        {
          "name": "StaticMemoryPlanner",
          "kind": "class",
          "signature": "class StaticMemoryPlanner",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/TransformerExecutor",
      "path": "agi/reference/llm/inference/TransformerExecutor.md",
      "source": "agi/llm/inference/TransformerExecutor.js",
      "import": "/agi/llm/inference/TransformerExecutor.js",
      "sourceHash": "89f26b7091ee7dfa3ee3c7d3ef5f5af81315f19348762f3e7ab355433008539f",
      "summary": "",
      "exports": [
        {
          "name": "TransformerExecutor",
          "kind": "class",
          "signature": "class TransformerExecutor",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/inference/WeightCache",
      "path": "agi/reference/llm/inference/WeightCache.md",
      "source": "agi/llm/inference/WeightCache.js",
      "import": "/agi/llm/inference/WeightCache.js",
      "sourceHash": "196c9d86c78264fefad15369fcfa04bab453c289a4c4fbc3c67e6e6a9c28b5fc",
      "summary": "",
      "exports": [
        {
          "name": "WeightCache",
          "kind": "class",
          "signature": "class WeightCache",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/KernelRegistry",
      "path": "agi/reference/llm/kernels/KernelRegistry.md",
      "source": "agi/llm/kernels/KernelRegistry.js",
      "import": "/agi/llm/kernels/KernelRegistry.js",
      "sourceHash": "9a5e33335548532e5b6c2cb2513c0086b3cd3f125e336e175b61d8056cd991d0",
      "summary": "",
      "exports": [
        {
          "name": "KernelRegistry",
          "kind": "class",
          "signature": "class KernelRegistry",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/PipelineUtils",
      "path": "agi/reference/llm/kernels/PipelineUtils.md",
      "source": "agi/llm/kernels/PipelineUtils.js",
      "import": "/agi/llm/kernels/PipelineUtils.js",
      "sourceHash": "867a34da5e41e5f69215f113d0d1a0490cf4af3b332dcef251f3fc0d7c71c535",
      "summary": "",
      "exports": [
        {
          "name": "createComputePipelineChecked",
          "kind": "function",
          "signature": "async createComputePipelineChecked(device, module, { label, name = label, entryPoint = 'main' } = {})",
          "summary": ""
        },
        {
          "name": "assertShaderCompiled",
          "kind": "function",
          "signature": "async assertShaderCompiled(module, name = 'shader')",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/attention_decode",
      "path": "agi/reference/llm/kernels/shaders/attention_decode.md",
      "source": "agi/llm/kernels/shaders/attention_decode.js",
      "import": "/agi/llm/kernels/shaders/attention_decode.js",
      "sourceHash": "0be9494f3d3038420e5d1ef789b7101d019a2f21c1b32bf7d5c8581665d2280f",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/attention_decode_legacy",
      "path": "agi/reference/llm/kernels/shaders/attention_decode_legacy.md",
      "source": "agi/llm/kernels/shaders/attention_decode_legacy.js",
      "import": "/agi/llm/kernels/shaders/attention_decode_legacy.js",
      "sourceHash": "6fd4106a4e62961fe6b2444ca36a061e23487641f8ebdc9082215f704b29f602",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/attention_prefill_legacy",
      "path": "agi/reference/llm/kernels/shaders/attention_prefill_legacy.md",
      "source": "agi/llm/kernels/shaders/attention_prefill_legacy.js",
      "import": "/agi/llm/kernels/shaders/attention_prefill_legacy.js",
      "sourceHash": "84b9cc7369771e1ab0840029198d6b86169ad43cac083d2e188e8ab60d5fa88f",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/attention_prefill_tiled",
      "path": "agi/reference/llm/kernels/shaders/attention_prefill_tiled.md",
      "source": "agi/llm/kernels/shaders/attention_prefill_tiled.js",
      "import": "/agi/llm/kernels/shaders/attention_prefill_tiled.js",
      "sourceHash": "2bd1338a663e90012322d133cca6b4232f4511cda58df2d065a3c9998fe5de9f",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/dequant_row_dense",
      "path": "agi/reference/llm/kernels/shaders/dequant_row_dense.md",
      "source": "agi/llm/kernels/shaders/dequant_row_dense.js",
      "import": "/agi/llm/kernels/shaders/dequant_row_dense.js",
      "sourceHash": "7432a0f5e4b72d8d333dd13088662ffa2d660ffd1abaa6291d6cafbcda77c991",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ format = 'F16' } = {})",
          "summary": ""
        },
        {
          "name": "shaderDequantF32",
          "kind": "function",
          "signature": "shaderDequantF32(options = {})",
          "summary": ""
        },
        {
          "name": "shaderDequantF16",
          "kind": "function",
          "signature": "shaderDequantF16(options = {})",
          "summary": ""
        },
        {
          "name": "shaderDequantBF16",
          "kind": "function",
          "signature": "shaderDequantBF16(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/dequant_row_k_quant",
      "path": "agi/reference/llm/kernels/shaders/dequant_row_k_quant.md",
      "source": "agi/llm/kernels/shaders/dequant_row_k_quant.js",
      "import": "/agi/llm/kernels/shaders/dequant_row_k_quant.js",
      "sourceHash": "f365dd3956e7b7dd8551e01dcff0fe1ed0cbecbd25aa07e1567f9f5b0bcdc310",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ quant = 'Q4_K' } = {})",
          "summary": ""
        },
        {
          "name": "shaderDequantQ4K",
          "kind": "function",
          "signature": "shaderDequantQ4K(options = {})",
          "summary": ""
        },
        {
          "name": "shaderDequantQ5K",
          "kind": "function",
          "signature": "shaderDequantQ5K(options = {})",
          "summary": ""
        },
        {
          "name": "shaderDequantQ6K",
          "kind": "function",
          "signature": "shaderDequantQ6K(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/dequant_row_q4_0",
      "path": "agi/reference/llm/kernels/shaders/dequant_row_q4_0.md",
      "source": "agi/llm/kernels/shaders/dequant_row_q4_0.js",
      "import": "/agi/llm/kernels/shaders/dequant_row_q4_0.js",
      "sourceHash": "bf440db4c3f2eabe87c23e376cda758d114115c9cb0512d0ae27e6d35d3d9546",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        },
        {
          "name": "shaderDequantQ40",
          "kind": "function",
          "signature": "shaderDequantQ40(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/dequant_row_q8_0",
      "path": "agi/reference/llm/kernels/shaders/dequant_row_q8_0.md",
      "source": "agi/llm/kernels/shaders/dequant_row_q8_0.js",
      "import": "/agi/llm/kernels/shaders/dequant_row_q8_0.js",
      "sourceHash": "c7a53b6f38c2ce8569d5aed7190abb3d3d0a7efe73153fa3fcb253ec9247236a",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        },
        {
          "name": "shaderDequantQ80",
          "kind": "function",
          "signature": "shaderDequantQ80(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/embedding_row_gather",
      "path": "agi/reference/llm/kernels/shaders/embedding_row_gather.md",
      "source": "agi/llm/kernels/shaders/embedding_row_gather.js",
      "import": "/agi/llm/kernels/shaders/embedding_row_gather.js",
      "sourceHash": "57a19c1055f6c8ef7d5dc919dc2b3fb1e0e754da8c2d54dd248c46a693f9005b",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/matmul_k_quant",
      "path": "agi/reference/llm/kernels/shaders/matmul_k_quant.md",
      "source": "agi/llm/kernels/shaders/matmul_k_quant.js",
      "import": "/agi/llm/kernels/shaders/matmul_k_quant.js",
      "sourceHash": "6f5cb344061d162f343a57b251fe92f0addfe5f23362e42b31a92d79feb2f643",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ quant = 'Q4_K', workgroupSize = WORKGROUP_SIZE } = {})",
          "summary": ""
        },
        {
          "name": "shaderMatMulQ4K",
          "kind": "function",
          "signature": "shaderMatMulQ4K(options = {})",
          "summary": ""
        },
        {
          "name": "shaderMatMulQ5K",
          "kind": "function",
          "signature": "shaderMatMulQ5K(options = {})",
          "summary": ""
        },
        {
          "name": "shaderMatMulQ6K",
          "kind": "function",
          "signature": "shaderMatMulQ6K(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/matmul_q4",
      "path": "agi/reference/llm/kernels/shaders/matmul_q4.md",
      "source": "agi/llm/kernels/shaders/matmul_q4.js",
      "import": "/agi/llm/kernels/shaders/matmul_q4.js",
      "sourceHash": "bf5931cdb4e80ca432641b4d1b61bd89cb410e6a4f2b98fdc0df8c79c0f48908",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/matmul_q4_0",
      "path": "agi/reference/llm/kernels/shaders/matmul_q4_0.md",
      "source": "agi/llm/kernels/shaders/matmul_q4_0.js",
      "import": "/agi/llm/kernels/shaders/matmul_q4_0.js",
      "sourceHash": "547c12a0394481647058fd962907e7255df191670c3d36bb2dabaa360d77c927",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ workgroupSize = WORKGROUP_SIZE } = {})",
          "summary": ""
        },
        {
          "name": "shaderMatMulQ40",
          "kind": "function",
          "signature": "shaderMatMulQ40(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/matvec_dense",
      "path": "agi/reference/llm/kernels/shaders/matvec_dense.md",
      "source": "agi/llm/kernels/shaders/matvec_dense.js",
      "import": "/agi/llm/kernels/shaders/matvec_dense.js",
      "sourceHash": "6a4151e047b9ad87008971b3e529a76da594e2ddecd27eda26969f798370100f",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ format = 'F32', workgroupSize = WORKGROUP_SIZE } = {})",
          "summary": ""
        },
        {
          "name": "shaderF32",
          "kind": "function",
          "signature": "shaderF32(options = {})",
          "summary": ""
        },
        {
          "name": "shaderF16",
          "kind": "function",
          "signature": "shaderF16(options = {})",
          "summary": ""
        },
        {
          "name": "shaderBF16",
          "kind": "function",
          "signature": "shaderBF16(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/matvec_k_quant",
      "path": "agi/reference/llm/kernels/shaders/matvec_k_quant.md",
      "source": "agi/llm/kernels/shaders/matvec_k_quant.js",
      "import": "/agi/llm/kernels/shaders/matvec_k_quant.js",
      "sourceHash": "e69ee211a39f66e61461fc9d4638427b2d0425e9208c50256ede0bc22edd36dd",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ quant = 'Q4_K', workgroupSize = WORKGROUP_SIZE, useSubgroups = false } = {})",
          "summary": ""
        },
        {
          "name": "shaderQ4K",
          "kind": "function",
          "signature": "shaderQ4K(options = {})",
          "summary": ""
        },
        {
          "name": "shaderQ5K",
          "kind": "function",
          "signature": "shaderQ5K(options = {})",
          "summary": ""
        },
        {
          "name": "shaderQ6K",
          "kind": "function",
          "signature": "shaderQ6K(options = {})",
          "summary": ""
        },
        {
          "name": "K_QUANT_LAYOUTS",
          "kind": "constant",
          "signature": "K_QUANT_LAYOUTS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/matvec_q4_0",
      "path": "agi/reference/llm/kernels/shaders/matvec_q4_0.md",
      "source": "agi/llm/kernels/shaders/matvec_q4_0.js",
      "import": "/agi/llm/kernels/shaders/matvec_q4_0.js",
      "sourceHash": "e97dd089f8c186dd3ae4361c757a43e72d31b1716b5257eede66d3347fa660bd",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ workgroupSize = WORKGROUP_SIZE } = {})",
          "summary": ""
        },
        {
          "name": "shaderQ40",
          "kind": "function",
          "signature": "shaderQ40(options = {})",
          "summary": ""
        },
        {
          "name": "Q4_0_LAYOUT",
          "kind": "constant",
          "signature": "Q4_0_LAYOUT",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/matvec_q8_0",
      "path": "agi/reference/llm/kernels/shaders/matvec_q8_0.md",
      "source": "agi/llm/kernels/shaders/matvec_q8_0.js",
      "import": "/agi/llm/kernels/shaders/matvec_q8_0.js",
      "sourceHash": "eed60c3ea0ab2f3873ff1fee33847d5f06117df09ffa20fb6cc8374fc3dc350f",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ workgroupSize = WORKGROUP_SIZE } = {})",
          "summary": ""
        },
        {
          "name": "shaderQ80",
          "kind": "function",
          "signature": "shaderQ80(options = {})",
          "summary": ""
        },
        {
          "name": "Q8_0_LAYOUT",
          "kind": "constant",
          "signature": "Q8_0_LAYOUT",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/rmsnorm_fused",
      "path": "agi/reference/llm/kernels/shaders/rmsnorm_fused.md",
      "source": "agi/llm/kernels/shaders/rmsnorm_fused.js",
      "import": "/agi/llm/kernels/shaders/rmsnorm_fused.js",
      "sourceHash": "74586ffb56cf3fa59378e75eb7281c427bb34fd60dced4298336ca65b6d241c4",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ hiddenSize = 1536, epsilon = '0.000001', workgroupSize = 256 } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/rmsnorm_residual_fused",
      "path": "agi/reference/llm/kernels/shaders/rmsnorm_residual_fused.md",
      "source": "agi/llm/kernels/shaders/rmsnorm_residual_fused.js",
      "import": "/agi/llm/kernels/shaders/rmsnorm_residual_fused.js",
      "sourceHash": "1f5766acb0c1e2059787778865605e88764f3fe2d927c196194bec180ed1c997",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ hiddenSize = 1536, epsilon = '0.000001', workgroupSize = 256 } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/rope_batch",
      "path": "agi/reference/llm/kernels/shaders/rope_batch.md",
      "source": "agi/llm/kernels/shaders/rope_batch.js",
      "import": "/agi/llm/kernels/shaders/rope_batch.js",
      "sourceHash": "20eea19d8f78862bb94d7fe482a80f789b660eafbddbb410a76a51a942ba17c8",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ theta = '10000.0' } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/rope_fused",
      "path": "agi/reference/llm/kernels/shaders/rope_fused.md",
      "source": "agi/llm/kernels/shaders/rope_fused.js",
      "import": "/agi/llm/kernels/shaders/rope_fused.js",
      "sourceHash": "17235f8e330980030c2a833e5b794716589e9c5e3685a5a0036a6de59b9bc1c9",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ theta = '10000.0' } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/rope_kv_append",
      "path": "agi/reference/llm/kernels/shaders/rope_kv_append.md",
      "source": "agi/llm/kernels/shaders/rope_kv_append.js",
      "import": "/agi/llm/kernels/shaders/rope_kv_append.js",
      "sourceHash": "933d3683015dab6cbd815f769f0af56c038d4ddaf5a1ff140eb77a4dc2a76f4a",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ theta = '10000.0' } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/rope_table",
      "path": "agi/reference/llm/kernels/shaders/rope_table.md",
      "source": "agi/llm/kernels/shaders/rope_table.js",
      "import": "/agi/llm/kernels/shaders/rope_table.js",
      "sourceHash": "fbba2d1a3dc39889670e58f0d3a59112f3c1cd06749f3c4ed1ba1c22efd023f1",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/sampling_topk_candidates",
      "path": "agi/reference/llm/kernels/shaders/sampling_topk_candidates.md",
      "source": "agi/llm/kernels/shaders/sampling_topk_candidates.js",
      "import": "/agi/llm/kernels/shaders/sampling_topk_candidates.js",
      "sourceHash": "da73f52b37c5cb358503cc4a1113fae24497da73fa41fe6f1eda2f47dd5343e1",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/sampling_topk_reduce",
      "path": "agi/reference/llm/kernels/shaders/sampling_topk_reduce.md",
      "source": "agi/llm/kernels/shaders/sampling_topk_reduce.js",
      "import": "/agi/llm/kernels/shaders/sampling_topk_reduce.js",
      "sourceHash": "7fc54814db3fb73dfeaae4f84d31d0ec89cedd658d28012073707551b7bac905",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/sampling_topk_topp",
      "path": "agi/reference/llm/kernels/shaders/sampling_topk_topp.md",
      "source": "agi/llm/kernels/shaders/sampling_topk_topp.js",
      "import": "/agi/llm/kernels/shaders/sampling_topk_topp.js",
      "sourceHash": "78523733d5de1973008e6076f8030d5a3b6fec799ec66c63b9b574fe765b92e6",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/sampling_topk_topp_legacy",
      "path": "agi/reference/llm/kernels/shaders/sampling_topk_topp_legacy.md",
      "source": "agi/llm/kernels/shaders/sampling_topk_topp_legacy.js",
      "import": "/agi/llm/kernels/shaders/sampling_topk_topp_legacy.js",
      "sourceHash": "2928af2857e53545e737df56ff73dae832500fa94221d2bb041f083bf94a0dd8",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader()",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/swiglu_fused",
      "path": "agi/reference/llm/kernels/shaders/swiglu_fused.md",
      "source": "agi/llm/kernels/shaders/swiglu_fused.js",
      "import": "/agi/llm/kernels/shaders/swiglu_fused.js",
      "sourceHash": "4a73d9ed716df74caa90480a22d65a8e9f9eb3b75ac4d140e44c7331b993dc07",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ activation = 'gelu_pytorch_tanh' } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/tied_embedding_logits",
      "path": "agi/reference/llm/kernels/shaders/tied_embedding_logits.md",
      "source": "agi/llm/kernels/shaders/tied_embedding_logits.js",
      "import": "/agi/llm/kernels/shaders/tied_embedding_logits.js",
      "sourceHash": "dc498a6e969dbbc616cec0e077793dae57c25bdba66946bf3bc4d230ddd454c7",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ workgroupSize = 128 } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/kernels/shaders/vector_ops",
      "path": "agi/reference/llm/kernels/shaders/vector_ops.md",
      "source": "agi/llm/kernels/shaders/vector_ops.js",
      "import": "/agi/llm/kernels/shaders/vector_ops.js",
      "sourceHash": "5ba610453422e04d830ce916cd74d91b328c7539d3e55f406a5a68e547f2a376",
      "summary": "",
      "exports": [
        {
          "name": "shader",
          "kind": "function",
          "signature": "shader({ op = 'add' } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/LLMRuntime",
      "path": "agi/reference/llm/runtime/LLMRuntime.md",
      "source": "agi/llm/runtime/LLMRuntime.js",
      "import": "/agi/llm/runtime/LLMRuntime.js",
      "sourceHash": "3ac2e9e534240f3d7d807becc5b3704433d2c207259b45ce1297d62a6a9160a1",
      "summary": "",
      "exports": [
        {
          "name": "LLMRuntime",
          "kind": "class",
          "signature": "class LLMRuntime",
          "summary": ""
        },
        {
          "name": "normalizeLocalRuntimeResourceUsage",
          "kind": "function",
          "signature": "normalizeLocalRuntimeResourceUsage(before, after)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/LLMSession",
      "path": "agi/reference/llm/runtime/LLMSession.md",
      "source": "agi/llm/runtime/LLMSession.js",
      "import": "/agi/llm/runtime/LLMSession.js",
      "sourceHash": "a589715cef48e22304b5327132e2dbecf7ed9fef2eb3e0217b595fcfe1b51310",
      "summary": "",
      "exports": [
        {
          "name": "LLMSession",
          "kind": "class",
          "signature": "class LLMSession",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/LogFormat",
      "path": "agi/reference/llm/runtime/LogFormat.md",
      "source": "agi/llm/runtime/LogFormat.js",
      "import": "/agi/llm/runtime/LogFormat.js",
      "sourceHash": "820e6a6e3aa5a9535c690613776ddcb3fec7f20dae1115ebaf2fb13e88057f1a",
      "summary": "",
      "exports": [
        {
          "name": "logRuntimeEvent",
          "kind": "function",
          "signature": "logRuntimeEvent(event, data = {}, options = {})",
          "summary": ""
        },
        {
          "name": "compactLogLine",
          "kind": "function",
          "signature": "compactLogLine(data)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/ModelRegistry",
      "path": "agi/reference/llm/runtime/ModelRegistry.md",
      "source": "agi/llm/runtime/ModelRegistry.js",
      "import": "/agi/llm/runtime/ModelRegistry.js",
      "sourceHash": "9c248d6bd650fc067d502d4283e2abe039a4c8941e8ad28e064728ffc35167fa",
      "summary": "",
      "exports": [
        {
          "name": "ModelRegistry",
          "kind": "class",
          "signature": "class ModelRegistry",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/PromptTemplate",
      "path": "agi/reference/llm/runtime/PromptTemplate.md",
      "source": "agi/llm/runtime/PromptTemplate.js",
      "import": "/agi/llm/runtime/PromptTemplate.js",
      "sourceHash": "2f159e1f9e527baab2001e447b934eb619724f46e9500d7175e1b6cf4b214557",
      "summary": "",
      "exports": [
        {
          "name": "PromptTemplate",
          "kind": "class",
          "signature": "class PromptTemplate",
          "summary": ""
        },
        {
          "name": "GEMMA4_SPECIAL_TOKENS",
          "kind": "constant",
          "signature": "GEMMA4_SPECIAL_TOKENS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/RuntimePerformanceMonitor",
      "path": "agi/reference/llm/runtime/RuntimePerformanceMonitor.md",
      "source": "agi/llm/runtime/RuntimePerformanceMonitor.js",
      "import": "/agi/llm/runtime/RuntimePerformanceMonitor.js",
      "sourceHash": "e689a583853ad1636940b5e3387cc35ae022450d76cea1f9d590b175af7de5a9",
      "summary": "",
      "exports": [
        {
          "name": "RuntimePerformanceMonitor",
          "kind": "class",
          "signature": "class RuntimePerformanceMonitor",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/Sampler",
      "path": "agi/reference/llm/runtime/Sampler.md",
      "source": "agi/llm/runtime/Sampler.js",
      "import": "/agi/llm/runtime/Sampler.js",
      "sourceHash": "8e51d5faea4a77bd54d89efcbb191ef8d0f848def16e5a06986a79d2f3f2cfce",
      "summary": "",
      "exports": [
        {
          "name": "Sampler",
          "kind": "class",
          "signature": "class Sampler",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/Tokenizer",
      "path": "agi/reference/llm/runtime/Tokenizer.md",
      "source": "agi/llm/runtime/Tokenizer.js",
      "import": "/agi/llm/runtime/Tokenizer.js",
      "sourceHash": "609fa36ca7371a78ab083580a8f7abbb72e3760cbffd6c269983fe6df7bca22c",
      "summary": "",
      "exports": [
        {
          "name": "Tokenizer",
          "kind": "class",
          "signature": "class Tokenizer",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/TokenizerWorkerClient",
      "path": "agi/reference/llm/runtime/TokenizerWorkerClient.md",
      "source": "agi/llm/runtime/TokenizerWorkerClient.js",
      "import": "/agi/llm/runtime/TokenizerWorkerClient.js",
      "sourceHash": "c39ec40134c451df5a47c9cd7d268ba56a0ed225c5e8fe09c39082644ee2d930",
      "summary": "",
      "exports": [
        {
          "name": "TokenizerWorkerClient",
          "kind": "class",
          "signature": "class TokenizerWorkerClient",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/runtime/ToolBridge",
      "path": "agi/reference/llm/runtime/ToolBridge.md",
      "source": "agi/llm/runtime/ToolBridge.js",
      "import": "/agi/llm/runtime/ToolBridge.js",
      "sourceHash": "8fc3a009d82b829a6e0cb140402c0dbf639db62c05914d68f28971618fa29105",
      "summary": "",
      "exports": [
        {
          "name": "ToolBridge",
          "kind": "class",
          "signature": "class ToolBridge",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/storage/AtomicJSON",
      "path": "agi/reference/llm/storage/AtomicJSON.md",
      "source": "agi/llm/storage/AtomicJSON.js",
      "import": "/agi/llm/storage/AtomicJSON.js",
      "sourceHash": "29990a9482059b74d5fa6518e9f656deb9453857d478e78f4a71f8ccd07ba685",
      "summary": "Publish JSON through a verified staging file while retaining the previous revision until the replacement move succeeds.",
      "exports": [
        {
          "name": "replaceJSONCopyOnWrite",
          "kind": "function",
          "signature": "async replaceJSONCopyOnWrite(store, path, value, { validate = null, label = 'JSON record' } = {})",
          "summary": "Publish JSON through a verified staging file while retaining the previous revision until the replacement move succeeds."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/storage/Checksum",
      "path": "agi/reference/llm/storage/Checksum.md",
      "source": "agi/llm/storage/Checksum.js",
      "import": "/agi/llm/storage/Checksum.js",
      "sourceHash": "06867b19c75e6c53f4c04fce2a8d2722ee576925a6a19000d9510d6ad6be3f59",
      "summary": "",
      "exports": [
        {
          "name": "checksumBytes",
          "kind": "function",
          "signature": "async checksumBytes(bytes, algorithm = 'SHA-256')",
          "summary": ""
        },
        {
          "name": "checksumString",
          "kind": "function",
          "signature": "async checksumString(text, algorithm = 'SHA-256')",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/storage/ModelCache",
      "path": "agi/reference/llm/storage/ModelCache.md",
      "source": "agi/llm/storage/ModelCache.js",
      "import": "/agi/llm/storage/ModelCache.js",
      "sourceHash": "61ef650481657d194c49bd4d85b49717c67893238b22f837de8b311892c1d420",
      "summary": "",
      "exports": [
        {
          "name": "ModelCache",
          "kind": "class",
          "signature": "class ModelCache",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/storage/ModelHandleStore",
      "path": "agi/reference/llm/storage/ModelHandleStore.md",
      "source": "agi/llm/storage/ModelHandleStore.js",
      "import": "/agi/llm/storage/ModelHandleStore.js",
      "sourceHash": "1ac899619e21fe46122a9f035b0e75e0416b01dacc5f4bdb23d0c8cf82bd26c0",
      "summary": "",
      "exports": [
        {
          "name": "ModelHandleStoreError",
          "kind": "class",
          "signature": "class ModelHandleStoreError extends Error",
          "summary": ""
        },
        {
          "name": "ModelHandleStore",
          "kind": "class",
          "signature": "class ModelHandleStore",
          "summary": ""
        },
        {
          "name": "prepareModelHandleRecord",
          "kind": "function",
          "signature": "prepareModelHandleRecord(value, expectedModelId = null)",
          "summary": ""
        },
        {
          "name": "prepareLastModelRecord",
          "kind": "function",
          "signature": "prepareLastModelRecord(value)",
          "summary": ""
        },
        {
          "name": "isFileSystemHandle",
          "kind": "function",
          "signature": "isFileSystemHandle(value)",
          "summary": ""
        },
        {
          "name": "queryHandlePermission",
          "kind": "function",
          "signature": "async queryHandlePermission(handle)",
          "summary": ""
        },
        {
          "name": "requestHandlePermission",
          "kind": "function",
          "signature": "async requestHandlePermission(handle)",
          "summary": ""
        },
        {
          "name": "MODEL_HANDLE_RECORD_SCHEMA",
          "kind": "constant",
          "signature": "MODEL_HANDLE_RECORD_SCHEMA",
          "summary": ""
        },
        {
          "name": "MODEL_HANDLE_RECORD_VERSION",
          "kind": "constant",
          "signature": "MODEL_HANDLE_RECORD_VERSION",
          "summary": ""
        },
        {
          "name": "MODEL_HANDLE_QUARANTINE_SCHEMA",
          "kind": "constant",
          "signature": "MODEL_HANDLE_QUARANTINE_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/storage/OPFSStore",
      "path": "agi/reference/llm/storage/OPFSStore.md",
      "source": "agi/llm/storage/OPFSStore.js",
      "import": "/agi/llm/storage/OPFSStore.js",
      "sourceHash": "59bfc3241bd863dd7c1cb58aa9480cc22620a004d9526192f0bf9c249761403b",
      "summary": "",
      "exports": [
        {
          "name": "OPFSStore",
          "kind": "class",
          "signature": "class OPFSStore",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/storage/VFSConversationStore",
      "path": "agi/reference/llm/storage/VFSConversationStore.md",
      "source": "agi/llm/storage/VFSConversationStore.js",
      "import": "/agi/llm/storage/VFSConversationStore.js",
      "sourceHash": "db4e21ded540c16a1f9fca1007fb19c9a8ec726bafb03074d230f91ba64c8a47",
      "summary": "",
      "exports": [
        {
          "name": "VFSConversationStore",
          "kind": "class",
          "signature": "class VFSConversationStore",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/workers/LLMLoadPlannerWorker",
      "path": "agi/reference/llm/workers/LLMLoadPlannerWorker.md",
      "source": "agi/llm/workers/LLMLoadPlannerWorker.js",
      "import": "/agi/llm/workers/LLMLoadPlannerWorker.js",
      "sourceHash": "b62dac9e7b377ca82e5c3176bde34aedf13eae2fa75c5d9b8b8e346dd17217b5",
      "summary": "",
      "exports": [],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "llm/workers/LLMTokenizerWorker",
      "path": "agi/reference/llm/workers/LLMTokenizerWorker.md",
      "source": "agi/llm/workers/LLMTokenizerWorker.js",
      "import": "/agi/llm/workers/LLMTokenizerWorker.js",
      "sourceHash": "769ae066cd2b0d1f52841f87b4094b164190165e88dba83d82d0546f8fed9d25",
      "summary": "",
      "exports": [],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "loader/ModelLoader",
      "path": "agi/reference/loader/ModelLoader.md",
      "source": "agi/loader/ModelLoader.js",
      "import": "/agi/loader/ModelLoader.js",
      "sourceHash": "6e3006b4ce7d497edf04a0fa47e99860b44bc97a2bd2b802477c1e06f521d40a",
      "summary": "",
      "exports": [
        {
          "name": "ModelLoader",
          "kind": "class",
          "signature": "class ModelLoader",
          "summary": ""
        },
        {
          "name": "modelLoaderVertexDedupHash32",
          "kind": "function",
          "signature": "modelLoaderVertexDedupHash32(posBits, pOff, uvBits = null, uOff = 0)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "network/TrainingStateChannel",
      "path": "agi/reference/network/TrainingStateChannel.md",
      "source": "agi/network/TrainingStateChannel.js",
      "import": "/agi/network/TrainingStateChannel.js",
      "sourceHash": "3bfd7433f6e110a712aec26fdaab4b2fa1bc52d841d7372ea1027c06054fcb9c",
      "summary": "Bind AGI Studio telemetry to the standard State Channel stack. The training runtime is authoritative; same-origin tabs need no setup, and callers hosted inside WebGPU OS may pass NetworkDriver to publish over mesh.",
      "exports": [
        {
          "name": "AgiTrainingStateChannel",
          "kind": "class",
          "signature": "class AgiTrainingStateChannel",
          "summary": "Bind AGI Studio telemetry to the standard State Channel stack. The training runtime is authoritative; same-origin tabs need no setup, and callers hosted inside WebGPU OS may pass NetworkDriver to publish over mesh."
        },
        {
          "name": "createAgiTrainingStateChannel",
          "kind": "function",
          "signature": "createAgiTrainingStateChannel(options = {})",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_CHANNEL_ID",
          "kind": "constant",
          "signature": "AGI_TRAINING_CHANNEL_ID",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_ROUTE_ID",
          "kind": "constant",
          "signature": "AGI_TRAINING_ROUTE_ID",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_CONTRACT",
          "kind": "constant",
          "signature": "AGI_TRAINING_CONTRACT",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/BreathReservoirState",
      "path": "agi/reference/particle_voice/articulatory/BreathReservoirState.md",
      "source": "agi/particle_voice/articulatory/BreathReservoirState.js",
      "import": "/agi/particle_voice/articulatory/BreathReservoirState.js",
      "sourceHash": "5d29378ba659dc894212c40bace8aca69114befc9e97127e251717dec025df5f",
      "summary": "BreathReservoirState.js — Phase 2 Voice Box state schema (`v0`). \"Lung pressure, compliance, target subglottal pressure\" per `ARCHITECTURE.md` §4 — the JS-side state container wrapping `nn/kernels/articulatory/breath_reservoir.js`'s per-instance recurrence (`pressure[n] = pressure[n-1] + (target[n] - pressure[n-1]) * lagRate`, proven against `risk/BreathReservoir.js` (R6A)). This module owns the `lagRate` derivation from `compliance`/`sampleRate` (the caller-computed value that kernel's docstring says it expects pre-computed, not recomputed in-shader) and the timestamped state container the kernel's `initial_pressure`/`pressure_out` buffers round-trip through across chunks — it does not itself dispatch the kernel (that is `ParticleTract.js`'s job once a real model exists to drive it).",
      "exports": [
        {
          "name": "lagRateFromCompliance",
          "kind": "function",
          "signature": "lagRateFromCompliance(compliance, sampleRate)",
          "summary": "`lagRate = 1 - exp(-1/(compliance*sampleRate))` — matches `risk/BreathReservoir.js` (R6A)'s proven formula exactly; `breath_reservoir.js`'s own docstring requires this be computed by the caller, not the kernel."
        },
        {
          "name": "createBreathReservoirState",
          "kind": "function",
          "signature": "createBreathReservoirState({ sampleIndex, pressure, compliance, targetSubglottalPressure })",
          "summary": ""
        },
        {
          "name": "stepBreathReservoirState",
          "kind": "function",
          "signature": "stepBreathReservoirState(state, sampleRate)",
          "summary": "Advance one `BreathReservoirState` by one sample using the exact same recurrence `breath_reservoir.js`/`risk/BreathReservoir.js` implement — the CPU-side single-sample equivalent, useful for tests and for any non-GPU fallback path, not a replacement for the GPU kernel's chunked dispatch."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/FormantSolver",
      "path": "agi/reference/particle_voice/articulatory/FormantSolver.md",
      "source": "agi/particle_voice/articulatory/FormantSolver.js",
      "import": "/agi/particle_voice/articulatory/FormantSolver.js",
      "sourceHash": "b8dc73ed6ea31c7ecbca2bf1e03f0f79e8c2d19e55bbfc61e3190aac2f2651d9",
      "summary": "FormantSolver.js — Phase 3 ParticleVoice articulatory calibration. Measures the resonances a Kelly-Lochbaum area profile actually produces, and inverts that: given target formants, searches for an area profile that hits them. ## Why this exists Vowel identity in speech is carried almost entirely by **F1 and F2**. An area profile invented from articulatory adjectives (\"high\", \"back\", \"rounded\") produces *some* formants, but nothing forces them to be the RIGHT ones — and if they are wrong, every vowel collapses toward a neutral timbre and the speech is unintelligible no matter how clean the pipeline is. That was the state before this module: `ArticulationHead`'s height/backness → area mapping was plausible but uncalibrated. Defining vowels by their measured formant targets and SOLVING for the geometry inverts the dependency: the targets are citable data (Peterson & Barney 1952 / Hillenbrand et al. 1995 male averages, whose vowel set maps exactly onto `spec/PhonemeSet-v0.md`'s ten monophthongs), and the geometry becomes a derived quantity that stays correct if the section count or sample rate changes. ## The response is measured with the SAME recurrence the GPU runs `impulseResponse()` reimplements `tract_waveguide.js`'s scattering recurrence on the CPU rather than using an analytic transfer function. That is deliberate: an analytic formula would be a second model that could disagree with the kernel, and then a \"calibrated\" vowel would not actually be calibrated for the thing doing the synthesis. In particular this omits the lip first-difference, matching `ParticleTract`'s `radiation_difference = 0` (its source is already a flow derivative).",
      "exports": [
        {
          "name": "impulseResponse",
          "kind": "function",
          "signature": "impulseResponse(areas, { glottalReflection, lipReflection, responseLength, wallLoss = 1 })",
          "summary": "Impulse response of the lossless KL chain, mirroring `tract_waveguide.js`'s recurrence (and, like `ParticleTract`, WITHOUT the lip first difference)."
        },
        {
          "name": "findFormants",
          "kind": "function",
          "signature": "findFormants(areas, sampleRate, options = {})",
          "summary": "Resonance frequencies of an area profile, lowest first."
        },
        {
          "name": "profileFromParams",
          "kind": "function",
          "signature": "profileFromParams(params, numSections)",
          "summary": "Build the profile this solver searches over. `constrictionWidth` exists because a single control point is not enough for high front vowels. `shapedAreaProfile` interpolates LINEARLY between control points, so one narrow point produces a smooth V — a tract that tapers and re-widens with no distinct cavities. /i/ needs the opposite: a genuinely SHORT front cavity (F2 = 2290 Hz implies c/(4*F2) ~ 3.7 cm) sharply separated from a long back cavity. Giving the constriction a WIDTH creates that two-cavity structure, and with it F2 values a single point cannot reach (an earlier 3-point version topped out at 1889 Hz against IY's 2290 Hz target, 333 cents low, which made IY and IH nearly identical in F2). A width of 0 degenerates to the original 3-point shape, so the parametrisation strictly extends the old one rather than replacing it."
        },
        {
          "name": "fitVowelAreas",
          "kind": "function",
          "signature": "fitVowelAreas(target, numSections, sampleRate, options = {})",
          "summary": "Search for an area profile whose first two resonances match `target`. Error is measured in the LOG-frequency domain, because formant perception is roughly logarithmic: being 100 Hz off matters far more at F1 = 270 than at F2 = 2290, and a linear error would happily sacrifice F1 accuracy to shave a little off F2. Exhaustive over a coarse grid, then a local refinement pass. Exhaustive rather than gradient-based on purpose: the map from geometry to formants is non-monotonic (moving a constriction can swap which cavity dominates F2), so a descent method lands in whichever basin it started in."
        },
        {
          "name": "fitTargets",
          "kind": "function",
          "signature": "fitTargets(targets, numSections, sampleRate, options = {})",
          "summary": "Fit every entry in a formant-target table. Slow (a full grid per entry) — intended for a calibration tool/test, not a hot path."
        },
        {
          "name": "fitAllVowels",
          "kind": "function",
          "signature": "fitAllVowels(numSections, sampleRate, options = {})",
          "summary": ""
        },
        {
          "name": "fitAllApproximants",
          "kind": "function",
          "signature": "fitAllApproximants(numSections, sampleRate, options = {})",
          "summary": ""
        },
        {
          "name": "tractLengthFor",
          "kind": "function",
          "signature": "tractLengthFor(numSections, sampleRate)",
          "summary": "The tract length a section count represents, for reporting alongside a fit."
        },
        {
          "name": "VOWEL_FORMANTS",
          "kind": "constant",
          "signature": "VOWEL_FORMANTS",
          "summary": "Peterson & Barney (1952) male averages, Hz. Their vowel set — heed, hid, head, had, hod, hawed, hood, who'd, hud, heard — is exactly this project's ten monophthongs, so no mapping or interpolation is needed. F3 is carried for `ER` only, where the unusually LOW F3 is the defining rhotic cue; for the others F1/F2 determine identity."
        },
        {
          "name": "VOWEL_AREA_PARAMS",
          "kind": "constant",
          "signature": "VOWEL_AREA_PARAMS",
          "summary": "The solved geometry for each vowel, produced by `fitAllVowels()` and baked here so the runtime does not pay for the search (a full grid per vowel takes tens of seconds). `tests/particle-voice/vowel-formants.html` re-verifies this table against the targets cheaply on every run, so it cannot silently go stale if the section count or sample rate changes — the check fails and the table is re-fitted. Fitted at **32 sections / 64 kHz, two constrictions, wall loss included**. Measured F1/F2 vs target, worst case **21 cents** across all ten: IY 270/2291   IH 390/1989   EH 530/1844   AE 661/1724   AH 640/1190 ER 490/1350   AA 730/1090   AO 569/850    UH 438/1019   UW 300/867 Three structural changes got here, none of them tuning: 1. **Doubling the resolution** (16 -> 32 sections, via 32 -> 64 kHz) made a short front cavity representable, which is what front vowels need. IY's F2 went 1926 -> 2211 Hz on its own. 2. **A second constriction** fixed the back rounded vowels, which a single narrowing simply could not reach: AO's F2 was 1130 Hz against an 840 Hz target (513 cents) and no better solution existed anywhere in the search space, because a low F2 requires a long back cavity AND lip rounding acting together. Worst error 513 -> 60 cents. 3. **Including WALL LOSS in the calibration**, which improved it again (60 -> 21 cents). That is not a coincidence: loss gives the formants realistic bandwidth, and damped peaks are better separated and more reliably located than the near-singular peaks of a lossless tube. It also means the fit is now against the same damped tube that renders. Every area respects `MIN_VOWEL_AREA_CM2`, so no vowel is realised with a constriction tight enough to whistle or hiss."
        },
        {
          "name": "APPROXIMANT_FORMANTS",
          "kind": "constant",
          "signature": "APPROXIMANT_FORMANTS",
          "summary": "Formant targets for the four approximants, Hz. These are consonants only in their distribution — acoustically /w j r l/ are \"vowel-like consonants\" (semivowels), and a generic `MANNER_AREA` constriction cannot produce any of them. That is why they were inaudible as themselves: a single 0.85 cm^2 narrowing at a place position yields something vowel-shaped and roughly neutral, so /r/, /l/, /w/ and /y/ all collapsed into the same glide. Treating them like vowels — targets first, geometry solved — is the only way they become distinct. Values from the acoustic-phonetics literature (Espy-Wilson's prevocalic measurements; the Delaware ASEL synthesis tables): /w/ 250/750   — an \"extreme /u/\": lower F1 and F2 than the vowel /r/ 350/1000  — F1/F2 like a central rounded vowel... /l/ 400/1075  — ...nearly the same F1/F2 as /r/ /y/ 300/2450  — an \"extreme /i/\" Note the F1/F2 values for /r/ and /l/ are nearly identical. **F3 is what separates them**, almost entirely: /r/'s F3 falls below 2000 Hz (often close to F2, which is its single most salient property), while /l/'s sits at or above 2500 Hz. `f3` is carried here for that reason, and `f3Weight` marks where matching it actually matters — for /r/ and /l/ an F3 error is not a refinement, it is the difference between the two phonemes."
        },
        {
          "name": "APPROXIMANT_AREA_PARAMS",
          "kind": "constant",
          "signature": "APPROXIMANT_AREA_PARAMS",
          "summary": "Solved approximant geometry, same provenance and staleness guard as `VOWEL_AREA_PARAMS`. Fitted at 32 sections / 64 kHz, with the second constriction AND wall loss (both must match `DEFAULT_TRACT_CONFIG`, or this calibrates a different tube than the one that renders). Measured F1/F2/F3 against target: W 249/852/2113  (250/750/2500) R 337/1137/1845 (350/1000/1500) L 398/1075/2556 (400/1075/2550) Y 299/2402/2688 (300/2450/2600) L is near-exact on all three and Y is within 50 Hz on F1/F2. The decisive property holds: **R's F3 sits at 1845 Hz and L's at 2556 Hz**, a 711 Hz separation, so the one cue that distinguishes /r/ from /l/ genuinely exists. Before calibration both were a generic manner constriction with NO F3 contrast at all — literally the same sound, which is why the user could hear neither. The second constriction is what made this reachable. With a single one, R's F3 was 2166 Hz (not rhotic at all), W's F2 was 1091 against 750, and Y's F2 was 1541 against 2450. R's F3 is still ~345 Hz above target, the remaining gap being the sublingual cavity that a 1-D area function cannot represent at all."
        },
        {
          "name": "MIN_VOWEL_AREA_CM2",
          "kind": "constant",
          "signature": "MIN_VOWEL_AREA_CM2",
          "summary": "Smallest cross-section, in cm^2, a VOWEL is allowed anywhere in the tract. Without this the search is free to buy formant accuracy with impossible geometry: an unconstrained fit put AA's constriction at 0.15 cm^2, which is TIGHTER than `ArticulationHead`'s fricative constant (0.14). Two things are wrong with that. Physically, a channel that narrow generates turbulence at speech airflow rates — it would be a fricative, not a vowel, and a vowel that hisses is not the vowel you asked for. Numerically, the extreme area ratio drives junction reflection coefficients toward +-1, giving absurdly high-Q resonances that ring. 0.35 cm^2 sits just above the turbulence onset region while still allowing the tight constrictions high vowels genuinely need (measured vowel minima run from ~0.3 cm^2 for /i/ upward)."
        },
        {
          "name": "DEFAULT_SOLVER_OPTIONS",
          "kind": "constant",
          "signature": "DEFAULT_SOLVER_OPTIONS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/NeuralPhysiologyState",
      "path": "agi/reference/particle_voice/articulatory/NeuralPhysiologyState.md",
      "source": "agi/particle_voice/articulatory/NeuralPhysiologyState.js",
      "import": "/agi/particle_voice/articulatory/NeuralPhysiologyState.js",
      "sourceHash": "e759a67f60b7e17ad72176a031511d060010bc247e22176a052bfdcf2f393c76",
      "summary": "NeuralPhysiologyState.js — Phase 2 Voice Box state schema (`v0`). The model's predicted per-frame physiology state, per `ARCHITECTURE.md` §4: four control heads plus an uncertainty head, version `0x00010000`. This is a `v0` working definition of each head's field set — the heads themselves are named and required by the plan, but their exact field composition was not otherwise specified anywhere in the frozen `spec/` documents, so the fields chosen here are deliberately the smallest set that maps DIRECTLY onto an already-built, already-tested GPU kernel's input parameters (not invented ahead of a consumer): - `RespiratoryDriveHead.targetSubglottalPressure` → drives `BreathReservoirState`/`nn/kernels/articulatory/breath_reservoir.js`. - `GlottalStateHead` (`t0Samples`/`teSamples`/`tpSamples`/`taSamples`/ `ee`) → the exact parameter names `nn/kernels/articulatory/glottal_lf.js` takes per instance. - `TractGestureHead.areas` → the area profile `nn/kernels/articulatory/tract_transfer.js`/`tract_waveguide.js` consume. - `ArticulationEventHead` (`constrictionIndex`/`constrictionAmplitude`/ `nasalCoupling`) → drives `constriction_noise.js`/`nasal_junction.js` injection points (the actual multi-port coupling math those two kernels' docstrings still flag as deferred — this head only carries the control values, not a coupling implementation). - `UncertaintyHead.confidence` → a single scalar per-frame confidence, the minimal representation until a real model exists to justify a richer (e.g. per-head covariance) shape. Like every other `v0` document in this project, this field set may still change before a `v1` freeze — it is not a claim that these are the final head shapes, only that they are usable today and traceable to real kernel inputs rather than speculative. Per `ARCHITECTURE.md` §4's timestamping rule, every state object here carries the absolute sample counter it was produced at (`sampleIndex`), never a chunk-relative index.",
      "exports": [
        {
          "name": "createNeuralPhysiologyState",
          "kind": "function",
          "signature": "createNeuralPhysiologyState({ sampleIndex, respiratoryDrive, glottalState, tractGesture, articulationEvent = null, uncertainty = { confidence: 1 }, })",
          "summary": ""
        },
        {
          "name": "validateRespiratoryDriveHead",
          "kind": "function",
          "signature": "validateRespiratoryDriveHead(head)",
          "summary": ""
        },
        {
          "name": "validateGlottalStateHead",
          "kind": "function",
          "signature": "validateGlottalStateHead(head)",
          "summary": ""
        },
        {
          "name": "validateTractGestureHead",
          "kind": "function",
          "signature": "validateTractGestureHead(head)",
          "summary": ""
        },
        {
          "name": "validateArticulationEventHead",
          "kind": "function",
          "signature": "validateArticulationEventHead(head)",
          "summary": ""
        },
        {
          "name": "validateUncertaintyHead",
          "kind": "function",
          "signature": "validateUncertaintyHead(head)",
          "summary": ""
        },
        {
          "name": "NEURAL_PHYSIOLOGY_STATE_VERSION",
          "kind": "constant",
          "signature": "NEURAL_PHYSIOLOGY_STATE_VERSION",
          "summary": "NeuralPhysiologyState.js — Phase 2 Voice Box state schema (`v0`). The model's predicted per-frame physiology state, per `ARCHITECTURE.md` §4: four control heads plus an uncertainty head, version `0x00010000`. This is a `v0` working definition of each head's field set — the heads themselves are named and required by the plan, but their exact field composition was not otherwise specified anywhere in the frozen `spec/` documents, so the fields chosen here are deliberately the smallest set that maps DIRECTLY onto an already-built, already-tested GPU kernel's input parameters (not invented ahead of a consumer): - `RespiratoryDriveHead.targetSubglottalPressure` → drives `BreathReservoirState`/`nn/kernels/articulatory/breath_reservoir.js`. - `GlottalStateHead` (`t0Samples`/`teSamples`/`tpSamples`/`taSamples`/ `ee`) → the exact parameter names `nn/kernels/articulatory/glottal_lf.js` takes per instance. - `TractGestureHead.areas` → the area profile `nn/kernels/articulatory/tract_transfer.js`/`tract_waveguide.js` consume. - `ArticulationEventHead` (`constrictionIndex`/`constrictionAmplitude`/ `nasalCoupling`) → drives `constriction_noise.js`/`nasal_junction.js` injection points (the actual multi-port coupling math those two kernels' docstrings still flag as deferred — this head only carries the control values, not a coupling implementation). - `UncertaintyHead.confidence` → a single scalar per-frame confidence, the minimal representation until a real model exists to justify a richer (e.g. per-head covariance) shape. Like every other `v0` document in this project, this field set may still change before a `v1` freeze — it is not a claim that these are the final head shapes, only that they are usable today and traceable to real kernel inputs rather than speculative. Per `ARCHITECTURE.md` §4's timestamping rule, every state object here carries the absolute sample counter it was produced at (`sampleIndex`), never a chunk-relative index."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/ParticleTract",
      "path": "agi/reference/particle_voice/articulatory/ParticleTract.md",
      "source": "agi/particle_voice/articulatory/ParticleTract.js",
      "import": "/agi/particle_voice/articulatory/ParticleTract.js",
      "sourceHash": "a294f6f6db8a6fbe43ad637c6ee1e5575dd74b882281b1c96b833704f6c93497",
      "summary": "ParticleTract.js — Phase 2 ParticleVoice Voice Box orchestrator. The GPU-resident articulatory synthesizer: composes the already-verified Phase 2 articulatory kernels into audible speech, one fixed-size chunk at a time, with all cross-chunk state persisted ON THE GPU (no CPU round trip mid-pipeline). This is the production counterpart of R6's pure-CPU `risk/VoiceBoxWaveguideProbe.js`, and deliberately reproduces the same four controllable behaviors that probe proved: stable vowels, nasal coupling, closure/release/frication, and pitch sweeps. Signal graph per chunk (7 GPU passes + 4 state copies, ONE submit): glottal_lf ────────────────► voicing ──┐ ├─ signal_add ─► source_flow ─┐ constriction_noise(asp seed) ─► asp ────┘                            │ ▼ constriction_noise(fric seed) ─► frication ──────► tract_waveguide (oral) │         │ radiated ◄─────────┘         └──► nasal_tap │                                │ │            nasal_junction ◄────┘ │                   │ └── signal_add ◄── radiated │ ▼  final PCM Design decisions worth knowing: - **Frication is injected at the constriction, not the glottis.** The frication noise buffer goes to `tract_waveguide.js`'s `constriction_noise` input and is added to the right-going wave at `constrictionIndex`, so only the cavity in FRONT of the constriction filters it. Mixing it into `source_flow` instead would make every fricative sound like a whisper. Aspiration, which really is glottal, IS mixed into `source_flow`. - **No `lip_radiation` pass.** `tract_waveguide.js` already applies the `outputRaw - prevOutputRaw` radiation first-difference internally (exactly as R6's `step()` does). Running `lip_radiation.js` on its output would differentiate twice and produce a thin, bass-less buzz. That kernel exists for callers holding an undifferentiated signal. - **Fixed `chunkSamples`.** `tract_waveguide.js`/`nasal_junction.js` pack their radiated signal and persisted state into one buffer whose internal offsets depend on `num_samples`, so a varying chunk size would move every offset and invalidate the pre-built bind groups. A fixed chunk size is also what a real-time audio bridge wants anyway (`streaming/VoiceChunker.js` schedules in fixed frame buckets), so it is required here rather than worked around. - **Reflection coefficients are computed CPU-side** each chunk via `risk/KellyLochbaumWaveguide.js`'s proven `reflectionCoefficients`, matching `tract_waveguide.js`'s stated contract. Changing `areas` between chunks is how closure/release is articulated. **Visualization is optional and structurally incapable of changing the PCM.** `ARCHITECTURE.md` §4 requires visualization to be \"bit-identically disable-able without changing rendered PCM\". Here that is not a runtime convention but a structural property: when `visualFramesPerChunk` is 0 (the default) the visualization buffers, pipeline and dispatches are never created at all, and when it is enabled every visualization buffer is WRITE-ONLY from the acoustic path's perspective — the field is copied OUT of `tract_waveguide`/`nasal_junction`'s already-final packed outputs, and nothing in the visualization path is ever read back into the acoustic path. `visual_state_decimate.js` makes the same guarantee at kernel level (it has no read_write access to anything the acoustic path reads). Known limitations, stated honestly rather than papered over: - `constrictionIndex` and `nasalCoupling` are DISPATCH-WIDE (they live in the kernels' uniform structs, not per-instance storage arrays), so all instances of one `ParticleTract` share them. Per-instance variation would require promoting both to storage buffers. They are therefore top-level controls here, not per-instance ones, so the API does not imply a capability that does not exist. - The nasal tap is a read-only observation of the oral tract, not a rigorous 3-port scattering junction — the oral tract is not loaded by the nasal branch. This matches R6 exactly and is noted in `tract_waveguide.js`'s docstring too. - The visualization field carries the THREE per-sample solver signals the kernels actually expose (oral radiated, nasal tap, nasal radiated), not one channel per tube section. `ARCHITECTURE.md` §4 describes the richer per-section field, but `tract_waveguide.js` does not emit a `[section, sample]` field — only its radiated signal, final state and the single tapped section. Adding one would mean a `numSections * chunkSamples` output block (~512 KB per chunk at 32 sections / 1024 samples) allocated whether or not visualization is on. That is a deliberate follow-up, not an oversight; the three channels here are enough to drive a ribbon/heatmap of what the solver is actually radiating.",
      "exports": [
        {
          "name": "ParticleTract",
          "kind": "class",
          "signature": "class ParticleTract",
          "summary": ""
        },
        {
          "name": "sectionsForLength",
          "kind": "function",
          "signature": "sectionsForLength(lengthM, sampleRate, speedOfSound = SPEED_OF_SOUND_M_PER_S)",
          "summary": ""
        },
        {
          "name": "lengthForSections",
          "kind": "function",
          "signature": "lengthForSections(numSections, sampleRate, speedOfSound = SPEED_OF_SOUND_M_PER_S)",
          "summary": ""
        },
        {
          "name": "createParticleTract",
          "kind": "function",
          "signature": "createParticleTract(device, options)",
          "summary": ""
        },
        {
          "name": "SPEED_OF_SOUND_M_PER_S",
          "kind": "constant",
          "signature": "SPEED_OF_SOUND_M_PER_S",
          "summary": "Boundary coefficients are R6's proven values. The SECTION COUNTS are not — they are derived from physics, and R6's were wrong. ## Section count is not a free parameter: it sets the tract LENGTH In this waveguide a wave advances one section per sample (`right[i] -> right[i+1]`), so each section is one sample of travel: sectionLength = c / sampleRate tractLength   = numSections * c / sampleRate The count is therefore *determined* by the sample rate and the length you want. At 32 kHz with c = 340 m/s a section is 1.06 cm, so a 17.5 cm adult vocal tract needs **16 sections**, not 32. R6 used 32 sections at 32 kHz, which models a **34 cm** tube — twice human length. Nothing errors: the model is a perfectly valid tube, just the wrong one. Since a quarter-wave resonator's formants are `(2k-1)*c/(4L)`, doubling L puts EVERY formant an octave too low — F1 at ~260 Hz instead of ~500 Hz. That is not a subtle detune; it moves the formants out of the range speech sounds occupy, which is audible as muffled, \"underwater\", vowel-less noise no matter how clean the rest of the pipeline is. It was measured directly (F1 261 Hz, implied length 32.6 cm) by the uniform-tube calibration check in `tests/particle-voice/voicebox-audio.html`, which now guards it. Note the literature's 2x trap: a HALF-sample-delay Kelly-Lochbaum variant has `sectionLength = c/(2*sampleRate)`, for which 32 sections at 32 kHz WOULD be right (that is why published models quote e.g. 44 segments at 44.1 kHz). This implementation is the full-sample form, so the full-sample relation applies. The calibration test asserts the resulting length empirically rather than trusting either convention."
        },
        {
          "name": "ADULT_TRACT_LENGTH_M",
          "kind": "constant",
          "signature": "ADULT_TRACT_LENGTH_M",
          "summary": ""
        },
        {
          "name": "ADULT_NASAL_LENGTH_M",
          "kind": "constant",
          "signature": "ADULT_NASAL_LENGTH_M",
          "summary": ""
        },
        {
          "name": "DEFAULT_TRACT_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_TRACT_CONFIG",
          "summary": ""
        },
        {
          "name": "VISUAL_CHANNELS",
          "kind": "constant",
          "signature": "VISUAL_CHANNELS",
          "summary": "The per-sample solver signals the visualization field carries, in channel order. Exported so a renderer indexes channels by name instead of hard-coding 0/1/2."
        },
        {
          "name": "DEFAULT_LF_SHAPE",
          "kind": "constant",
          "signature": "DEFAULT_LF_SHAPE",
          "summary": "LF shape defaults. `openQuotient` matches R6's `createGlottalSource({ openQuotient: 0.6 })`; the other two are LF-specific ratios with no R6 equivalent (R6 used the raised-cosine \"LF-lite\" shape that has no Tp/Ta at all)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/PhysiologyFeedbackState",
      "path": "agi/reference/particle_voice/articulatory/PhysiologyFeedbackState.md",
      "source": "agi/particle_voice/articulatory/PhysiologyFeedbackState.js",
      "import": "/agi/particle_voice/articulatory/PhysiologyFeedbackState.js",
      "sourceHash": "adbb8adf62de04bc7038811cd5b7a79a24d3aeef734d1dd099757c1e254922ff",
      "summary": "PhysiologyFeedbackState.js — Phase 2 Voice Box state schema (`v0`). `ARCHITECTURE.md` §4's `PhysiologyFeedbackState`: \"a reduced/decimated feedback signal from the acoustic solve back toward the model\". The JS-side timestamped container for one `nn/kernels/articulatory/physiology_feedback_reduce.js` dispatch's output — per-instance (mean, RMS) pairs, one pair per fixed-size frame — distinct from `TractStateSnapshot.js`'s multi-channel visualization field (`visual_state_decimate.js`'s output): this shape is what the model's control loop reads back, not what a rig/visual system reads. Every consumer of this state should treat it as internal-physiology feedback, not a real acoustic measurement — matching `spec/ActivityContract-v0.md` §8's `GeneratedPhysiologyEnergy` / `RenderedOutputEnergy` / `ObservedInputEnergy` three-domain separation (this is `GeneratedPhysiologyEnergy`'s reduced form, never to be confused with a microphone-observed or rendered-PCM-measured energy value).",
      "exports": [
        {
          "name": "createPhysiologyFeedbackState",
          "kind": "function",
          "signature": "createPhysiologyFeedbackState({ sampleIndex, numFrames, mean, rms })",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/TractStateSnapshot",
      "path": "agi/reference/particle_voice/articulatory/TractStateSnapshot.md",
      "source": "agi/particle_voice/articulatory/TractStateSnapshot.js",
      "import": "/agi/particle_voice/articulatory/TractStateSnapshot.js",
      "sourceHash": "10ed0ac0a50c92dc1214e3d28ce96a141d247a7ad534c1cf41922b5618cb408d",
      "summary": "TractStateSnapshot.js — Phase 2 Voice Box state schema (`v0`). `ARCHITECTURE.md` §4's `TractStateSnapshot`: \"low-rate timestamped state for rigs/visualization, decimated from the per-sample waveguide state\". The JS-side timestamped container for one `nn/kernels/articulatory/visual_state_decimate.js` dispatch's output — a `[channel, frame]` box-averaged field (one channel per tube section, per that kernel's docstring), NOT the model-feedback (mean, RMS) shape `PhysiologyFeedbackState.js` wraps (`physiology_feedback_reduce.js`'s output) — the two are read by different consumers (a rig/visual system here, the model's control loop there) and were kept as separate kernels for exactly this reason (see `visual_state_decimate.js`'s own docstring). Per `ARCHITECTURE.md` §4's requirement that visualization \"must be bit-identically disable-able without changing rendered PCM\", this container holds ONLY derived/decimated data for display — nothing here is ever read back into the acoustic path, matching `visual_state_decimate.js`'s structural read-only guarantee.",
      "exports": [
        {
          "name": "createTractStateSnapshot",
          "kind": "function",
          "signature": "createTractStateSnapshot({ sampleIndex, numChannels, numFrames, field })",
          "summary": ""
        },
        {
          "name": "channelSeries",
          "kind": "function",
          "signature": "channelSeries(snapshot, channel)",
          "summary": "Reads channel `channel`'s decimated time series out of a snapshot's flat `[channel, frame]` field — matches `visual_state_decimate.js`'s `(inst*num_channels+ch)*num_frames+frame` packing (single-instance view; the caller selects `channel`/`instance` slicing upstream of this helper)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/VoiceAnatomyProfile",
      "path": "agi/reference/particle_voice/articulatory/VoiceAnatomyProfile.md",
      "source": "agi/particle_voice/articulatory/VoiceAnatomyProfile.js",
      "import": "/agi/particle_voice/articulatory/VoiceAnatomyProfile.js",
      "sourceHash": "0bcf2ed0d4d2dbd00062ed90e14f1598429d046845c4ec3d16f83c27662cb386",
      "summary": "VoiceAnatomyProfile.js — Phase 2 Voice Box state schema (`v0`). `ARCHITECTURE.md` §4's `CharacterAnatomyState`: \"persistent per-character morphology (equivalent role to `PRVC-v0`'s `formantScale`/pitch-range calibration, but for non-cloned/authored characters rather than captured voices)\". This is the STATIC per-voice data that stays constant across frames — the rest-position oral tube area profile, optional nasal branch area profile, and the three boundary reflection coefficients `nn/kernels/articulatory/tract_waveguide.js`/`nasal_junction.js` require (`glottalReflection`/`lipReflection`/`nostrilReflection`, all magnitude `< 1` for BIBO stability per `risk/KellyLochbaumWaveguide.js` (R6)) — as distinct from `NeuralPhysiologyState`'s `TractGestureHead`, which is the per-FRAME predicted deviation/gesture applied on top of this rest profile, not a replacement for it. `risk/VoiceBoxWaveguideProbe.js` (R6/R6A) already proved out `NUM_SECTIONS = 32`/`NASAL_SECTIONS = 16`, `GLOTTAL_REFLECTION = 0.85`, `LIP_REFLECTION = -0.9`, `NOSTRIL_REFLECTION = -0.85` as one working anatomy — `defaultVoiceAnatomyProfile()` below reuses those exact proven values as the default rather than inventing new ones.",
      "exports": [
        {
          "name": "createVoiceAnatomyProfile",
          "kind": "function",
          "signature": "createVoiceAnatomyProfile({ oralAreas, nasalAreas = null, glottalReflection = DEFAULT_GLOTTAL_REFLECTION, lipReflection = DEFAULT_LIP_REFLECTION, nostrilReflection = DEFAULT_NOSTRIL_REFLECTION, formantScale = 1, pitchRangeHz = { min: 80, max: 400 }, } = {})",
          "summary": ""
        },
        {
          "name": "defaultVoiceAnatomyProfile",
          "kind": "function",
          "signature": "defaultVoiceAnatomyProfile()",
          "summary": "The R6/R6A-proven default anatomy (uniform tube, no nasal coupling) — a reasonable starting profile for an authored (non-cloned) character, not a claim of acoustic realism."
        },
        {
          "name": "DEFAULT_NUM_ORAL_SECTIONS",
          "kind": "constant",
          "signature": "DEFAULT_NUM_ORAL_SECTIONS",
          "summary": "VoiceAnatomyProfile.js — Phase 2 Voice Box state schema (`v0`). `ARCHITECTURE.md` §4's `CharacterAnatomyState`: \"persistent per-character morphology (equivalent role to `PRVC-v0`'s `formantScale`/pitch-range calibration, but for non-cloned/authored characters rather than captured voices)\". This is the STATIC per-voice data that stays constant across frames — the rest-position oral tube area profile, optional nasal branch area profile, and the three boundary reflection coefficients `nn/kernels/articulatory/tract_waveguide.js`/`nasal_junction.js` require (`glottalReflection`/`lipReflection`/`nostrilReflection`, all magnitude `< 1` for BIBO stability per `risk/KellyLochbaumWaveguide.js` (R6)) — as distinct from `NeuralPhysiologyState`'s `TractGestureHead`, which is the per-FRAME predicted deviation/gesture applied on top of this rest profile, not a replacement for it. `risk/VoiceBoxWaveguideProbe.js` (R6/R6A) already proved out `NUM_SECTIONS = 32`/`NASAL_SECTIONS = 16`, `GLOTTAL_REFLECTION = 0.85`, `LIP_REFLECTION = -0.9`, `NOSTRIL_REFLECTION = -0.85` as one working anatomy — `defaultVoiceAnatomyProfile()` below reuses those exact proven values as the default rather than inventing new ones."
        },
        {
          "name": "DEFAULT_NUM_NASAL_SECTIONS",
          "kind": "constant",
          "signature": "DEFAULT_NUM_NASAL_SECTIONS",
          "summary": ""
        },
        {
          "name": "DEFAULT_GLOTTAL_REFLECTION",
          "kind": "constant",
          "signature": "DEFAULT_GLOTTAL_REFLECTION",
          "summary": ""
        },
        {
          "name": "DEFAULT_LIP_REFLECTION",
          "kind": "constant",
          "signature": "DEFAULT_LIP_REFLECTION",
          "summary": ""
        },
        {
          "name": "DEFAULT_NOSTRIL_REFLECTION",
          "kind": "constant",
          "signature": "DEFAULT_NOSTRIL_REFLECTION",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/articulatory/WaveguideAcousticState",
      "path": "agi/reference/particle_voice/articulatory/WaveguideAcousticState.md",
      "source": "agi/particle_voice/articulatory/WaveguideAcousticState.js",
      "import": "/agi/particle_voice/articulatory/WaveguideAcousticState.js",
      "sourceHash": "448316a5a8989253150f963573bbfa72eada9c9598dc53a4baa42e5768d48772",
      "summary": "WaveguideAcousticState.js — Phase 2 Voice Box state schema (`v0`). \"The R6 `KellyLochbaumWaveguide.js` tract's per-sample output (radiated signal + nasal tap)\" per `ARCHITECTURE.md` §4 — the JS-side timestamped container for one dispatched chunk's worth of `nn/kernels/articulatory/tract_waveguide.js` (`radiated`, plus the persisted `finalRight`/`finalLeft`/`finalPrevOutput` continuation state that kernel's packed output layout produces) and, optionally, a coupled `nn/kernels/articulatory/nasal_junction.js` chunk's own radiated output. This container does not itself dispatch either kernel or compute `nasalTapSignal` (`tract_waveguide.js`'s own docstring notes the nasal tap read-out is still deferred there) — it only fixes the shape a caller that DOES dispatch those kernels should hand back, so downstream consumers (the audio bridge, `physiology_feedback_reduce.js`, `visual_state_decimate.js`) have one stable state shape to depend on regardless of which kernel(s) produced it.",
      "exports": [
        {
          "name": "createWaveguideAcousticState",
          "kind": "function",
          "signature": "createWaveguideAcousticState({ sampleIndex, numSamples, radiated, finalRight, finalLeft, finalPrevOutput, nasalRadiated = null })",
          "summary": ""
        },
        {
          "name": "nextChunkInitialState",
          "kind": "function",
          "signature": "nextChunkInitialState(previousState)",
          "summary": "Builds the next chunk's initial-state inputs (`tract_waveguide.js`'s `initial_right`/`initial_left`/`initial_prev_output` bindings) from a previous chunk's `WaveguideAcousticState` — the exact cross-chunk continuity `tests/particle-voice/phase2-dsp.html`'s `tract_waveguide` test verifies at the kernel level."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/frontend/G2PModel",
      "path": "agi/reference/particle_voice/frontend/G2PModel.md",
      "source": "agi/particle_voice/frontend/G2PModel.js",
      "import": "/agi/particle_voice/frontend/G2PModel.js",
      "sourceHash": "c7cc69895f4d227ad78224baa6ece1a568c91edad1c547a17b2b00763ea9673e",
      "summary": "G2PModel.js — Phase 3 ParticleVoice text frontend. Grapheme-to-phoneme fallback for words `PronunciationLexicon.js` does not cover, plus `textToPhonemeSequence()` — the deterministic lowering `spec/VoicePlan-v0.md` §4 describes, which turns raw text into the `{ phonemeIds, stress, punctuationContext }` triple the model consumes. ## It is rules, not a network — deliberately The plan calls for a \"minimal `G2PModel.js`\" in Phase 3, and this is a **deterministic, context-sensitive letter-to-sound rule set**, not a trained model. That is the honest choice at this stage: a neural G2P needs a pronunciation corpus to train against, and this project vendors no external data (CMUdict included). Rules give reproducible output today, and the class boundary here is what a learned model would later slot into without touching callers. The name matches the plan's; the implementation does not pretend to be learned. ## Accuracy expectations, stated plainly English orthography is not a function of spelling alone, so a rule set of this size gets the regular cases right and a meaningful minority wrong (`read` has two pronunciations; `bread` breaks the `ea → IY` rule; stress placement in long words is genuinely lexical). That is exactly why `PronunciationLexicon.js` exists and is consulted FIRST — every word whose spelling actively lies belongs there. G2P's job is to make unseen words (character names, invented words, rare vocabulary) pronounceable and stable, not to be a dictionary. ## Rule format Each rule is `[leftContext, target, rightContext, phonemes]`, tried in order at each position, first match winning. Rules are authored longest-target-first per letter so digraphs beat single letters. The context pattern language is deliberately tiny — three metacharacters, no regex — so a rule's behaviour is obvious by inspection: `#` word boundary (start of a left context, end of a right context) `C` exactly one consonant letter `V` exactly one vowel letter anything else, a literal letter Stress is assigned afterwards by syllable heuristic (see `assignStressHeuristic`), because stress is a property of the whole word, not of any single grapheme.",
      "exports": [
        {
          "name": "G2PModel",
          "kind": "class",
          "signature": "class G2PModel",
          "summary": ""
        },
        {
          "name": "graphemesToPhonemeSymbols",
          "kind": "function",
          "signature": "graphemesToPhonemeSymbols(word)",
          "summary": "Apply the rule set to a spelling."
        },
        {
          "name": "assignStressHeuristic",
          "kind": "function",
          "signature": "assignStressHeuristic(word, symbols)",
          "summary": "Place a single primary stress by syllable heuristic. Documented as a heuristic because English stress is genuinely lexical — the lexicon is the place to be exact. - Suffixes `-tion/-sion/-cial/-tial/-cian` pull stress onto the syllable immediately before them (na-TION-al → \"NA-tion\", in-for-MA-tion). - `-ity/-ety/-ify/-ogy/-omy` pull stress two syllables back. - Otherwise stress the first syllable, unless the word opens with a normally-unstressed prefix and has more than one syllable, in which case stress the second."
        },
        {
          "name": "graphemesToPhonemes",
          "kind": "function",
          "signature": "graphemesToPhonemes(word)",
          "summary": ""
        },
        {
          "name": "textToPhonemeSequence",
          "kind": "function",
          "signature": "textToPhonemeSequence(normalized, { g2p = new G2PModel()",
          "summary": "Deterministic lowering of normalized text into `spec/VoicePlan-v0.md` §4's `PhonemeSequence`. All three arrays are the same length, one entry per phoneme instance including structural tokens, exactly as that spec requires. Structural insertion follows `spec/PhonemeSet-v0.md` §4's Effect column: a phrase's `structural` token (`SP` for comma-level, `SIL` for terminals) is appended after its words, and a paragraph boundary additionally emits `BREATH` before its `SIL` (§4: \"longer SIL, breath event likely\")."
        },
        {
          "name": "createG2PModel",
          "kind": "function",
          "signature": "createG2PModel(options)",
          "summary": ""
        },
        {
          "name": "LTS_RULES",
          "kind": "constant",
          "signature": "LTS_RULES",
          "summary": "Letter-to-sound rules, grouped by first letter of `target`. Order within a group IS the priority order."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/frontend/PhonemeSet",
      "path": "agi/reference/particle_voice/frontend/PhonemeSet.md",
      "source": "agi/particle_voice/frontend/PhonemeSet.js",
      "import": "/agi/particle_voice/frontend/PhonemeSet.js",
      "sourceHash": "7d7c3c56c4e63354c33e516a24aa3efded914b60af82ec5adeac4e5c9c1dd821",
      "summary": "PhonemeSet.js — Phase 3 ParticleVoice text frontend. The executable form of `spec/PhonemeSet-v0.md`: the English phoneme inventory, its per-entry articulatory feature vectors, the stress scale, and the punctuation-context tags. This module is the SINGLE SOURCE OF TRUTH every other Phase 3 component reads — `PronunciationLexicon.js` validates against it, `G2PModel.js` targets it, `PhonemeEncoder.js` sizes its embedding table from `PHONEME_COUNT`, and `ArticulationHead.js` consumes the feature vectors to bias `NeuralPhysiologyState`. ## Corrections to `spec/PhonemeSet-v0.md` Encoding the spec surfaced four places where its §1 tables (the actual data) disagree with its §1 summary line or its §2 enum declarations. The tables are treated as normative and the spec has been corrected to match; each is recorded here because a reader comparing the two must know which way the discrepancy was resolved. 1. **Inventory size.** §1 claimed \"24 vowel symbols + 24 consonant symbols + 3 structural tokens = 51\" and `u8` IDs `0..50`. The tables actually list **10 monophthongs + 5 diphthongs = 15 vowels**, so the real total is **42** entries, IDs `0..41`. \"24 vowel symbols\" appears to be an accidental duplication of the consonant count. This matters concretely: it sets `PhonemeEncoder.js`'s embedding table size and the legal `phonemeIds` range in `spec/VoicePlan-v0.md` §4, both of which were also stated as 51/`0..50` and are now corrected. 2. **Vowel height values.** §2 declares `height: low | mid | high`, but §1's table also uses `low-mid` (`AO`) and `high-mid` (`UH`). All five values are kept (see `HEIGHT`); the narrower §2 enum was the error. 3. **`ER`'s rounded column** contains `rhotic`, which is not a rounded-ness value at all. Modeled here as `rounded: false` plus a separate `rhotic: true` flag, since rhoticity is an independent articulatory property (it shapes the area profile rather than the lip aperture). 4. **`W`'s place** is `bilabial-velar` in §1's table, which is not one of §2's `place` values. Modeled as `place: 'bilabial'` with `secondaryPlace: 'velar'`, preserving the information without inventing an enum member the spec does not define. Structural tokens (`SIL`/`SP`/`BREATH`) carry `place: null`, `manner: null`, `voiced: false` and are identified by `category === 'structural'` — deliberately NOT given invented enum values, since §2's `place`/`manner` enums describe articulated speech sounds only.",
      "exports": [
        {
          "name": "phonemeIdOf",
          "kind": "function",
          "signature": "phonemeIdOf(symbol)",
          "summary": ""
        },
        {
          "name": "hasPhoneme",
          "kind": "function",
          "signature": "hasPhoneme(symbol)",
          "summary": ""
        },
        {
          "name": "phonemeAt",
          "kind": "function",
          "signature": "phonemeAt(id)",
          "summary": ""
        },
        {
          "name": "phonemeBySymbol",
          "kind": "function",
          "signature": "phonemeBySymbol(symbol)",
          "summary": ""
        },
        {
          "name": "diphthongTargetIds",
          "kind": "function",
          "signature": "diphthongTargetIds(id)",
          "summary": ""
        },
        {
          "name": "constrictionPositionOf",
          "kind": "function",
          "signature": "constrictionPositionOf(id)",
          "summary": ""
        },
        {
          "name": "isValidStress",
          "kind": "function",
          "signature": "isValidStress(stress)",
          "summary": ""
        },
        {
          "name": "isValidPunctuationContext",
          "kind": "function",
          "signature": "isValidPunctuationContext(tag)",
          "summary": ""
        },
        {
          "name": "isVowel",
          "kind": "function",
          "signature": "isVowel(id)",
          "summary": ""
        },
        {
          "name": "isConsonant",
          "kind": "function",
          "signature": "isConsonant(id)",
          "summary": ""
        },
        {
          "name": "isStructural",
          "kind": "function",
          "signature": "isStructural(id)",
          "summary": ""
        },
        {
          "name": "isVoiced",
          "kind": "function",
          "signature": "isVoiced(id)",
          "summary": ""
        },
        {
          "name": "isDiphthong",
          "kind": "function",
          "signature": "isDiphthong(id)",
          "summary": ""
        },
        {
          "name": "STRESS",
          "kind": "constant",
          "signature": "STRESS",
          "summary": "§3: per-vowel-instance stress, separate from the phoneme symbol."
        },
        {
          "name": "PUNCTUATION_CONTEXT",
          "kind": "constant",
          "signature": "PUNCTUATION_CONTEXT",
          "summary": "§4: punctuation-context tag ids, emitted per phoneme by `TextNormalizer.js`."
        },
        {
          "name": "PLACE",
          "kind": "constant",
          "signature": "PLACE",
          "summary": ""
        },
        {
          "name": "MANNER",
          "kind": "constant",
          "signature": "MANNER",
          "summary": ""
        },
        {
          "name": "HEIGHT",
          "kind": "constant",
          "signature": "HEIGHT",
          "summary": "Includes §1's `low-mid`/`high-mid`, which §2's three-value enum omitted (correction 2)."
        },
        {
          "name": "BACKNESS",
          "kind": "constant",
          "signature": "BACKNESS",
          "summary": ""
        },
        {
          "name": "PLACE_POSITION",
          "kind": "constant",
          "signature": "PLACE_POSITION",
          "summary": "§2: place → normalized position (0 = glottis, 1 = lips) of the narrowest point, fed to `shapedAreaProfile`'s control points. Provisional estimates per the spec's own §6 — NOT measured against vocal-tract MRI data."
        },
        {
          "name": "PHONEMES",
          "kind": "constant",
          "signature": "PHONEMES",
          "summary": "The inventory, in `spec/PhonemeSet-v0.md` §1 table order. **Array index IS the `u8` phoneme id** — appending is safe, reordering is a breaking change to every trained embedding table."
        },
        {
          "name": "PHONEME_COUNT",
          "kind": "constant",
          "signature": "PHONEME_COUNT",
          "summary": "42 — sizes `PhonemeEncoder.js`'s embedding table. See correction 1."
        },
        {
          "name": "MAX_PHONEME_ID",
          "kind": "constant",
          "signature": "MAX_PHONEME_ID",
          "summary": "Highest legal `u8` phoneme id (41)."
        },
        {
          "name": "STRUCTURAL_SYMBOLS",
          "kind": "constant",
          "signature": "STRUCTURAL_SYMBOLS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/frontend/PronunciationLexicon",
      "path": "agi/reference/particle_voice/frontend/PronunciationLexicon.md",
      "source": "agi/particle_voice/frontend/PronunciationLexicon.js",
      "import": "/agi/particle_voice/frontend/PronunciationLexicon.js",
      "sourceHash": "b99b1bb0da549f99d195ede8f5a035789cc49a13f03e37ebe170c254bfcd4276",
      "summary": "PronunciationLexicon.js — Phase 3 ParticleVoice text frontend. Word → phoneme-sequence dictionary, checked entry-by-entry against `PhonemeSet.js` at construction time. Sits between `TextNormalizer.js` and `G2PModel.js`: a lexicon hit is authoritative, and only words with no entry fall through to G2P's letter-to-sound rules. ## ⚠ Stress digits are the INVERSE of CMUdict Pronunciation strings use CMUdict's familiar `SYMBOL+digit` shape (`HH AH L OW2`), but the digit follows `spec/PhonemeSet-v0.md` §3: **0 = unstressed, 1 = SECONDARY, 2 = PRIMARY** CMUdict is the other way round (`1` = primary, `2` = secondary). Copying CMUdict strings verbatim would therefore silently swap primary and secondary stress on every polysyllabic word — audible as wrong prosody, not as an error. This module cannot detect that mistake for you, so the convention is stated here, in `spec/PhonemeSet-v0.md` §3, and enforced by `MAX_STRESS`-range validation only. ## Authoring rules (validated, not merely documented) - Every symbol must exist in `PhonemeSet.js`. A typo throws at construction, naming the word — never at synthesis time. - A stress digit is legal ONLY on a vowel. Spec §3 defines stress as a per-vowel-instance property, so `S2` is rejected outright rather than quietly ignored. - Omitting the digit on a vowel means unstressed (0). This keeps reduced function words (`the` = `DH AH`) readable. - **At most one** primary stress per word. Not *exactly* one: genuinely reduced function words (`the`, `a`, `of`) carry no stress at all, and forcing a primary onto them would produce robotically over-stressed speech. ## Scope `CORE_LEXICON` is a deliberately curated core, NOT a full dictionary. It covers high-frequency function/content words plus — the reason a lexicon exists at all — words whose spelling actively lies about their pronunciation (`one`, `through`, `women`, `said`, `colonel`, `choir`, `island`), which any letter-to-sound rule set gets wrong. CMUdict is not vendored: this project takes no external data dependencies, and the long tail is `G2PModel.js`'s job. Callers add domain vocabulary (character names, place names) via `add()`/`addAll()`.",
      "exports": [
        {
          "name": "PronunciationLexicon",
          "kind": "class",
          "signature": "class PronunciationLexicon",
          "summary": ""
        },
        {
          "name": "parsePronunciation",
          "kind": "function",
          "signature": "parsePronunciation(pronunciation, wordLabel = '<unknown>')",
          "summary": "Parse one `SYMBOL+digit` pronunciation string."
        },
        {
          "name": "createPronunciationLexicon",
          "kind": "function",
          "signature": "createPronunciationLexicon(options)",
          "summary": ""
        },
        {
          "name": "MAX_STRESS",
          "kind": "constant",
          "signature": "MAX_STRESS",
          "summary": ""
        },
        {
          "name": "LETTER_NAMES",
          "kind": "constant",
          "signature": "LETTER_NAMES",
          "summary": "Spoken letter names, for spelling out initialisms. `TextNormalizer.js` flags all-caps tokens with `wasAllCaps` but deliberately does not decide whether they are words or initialisms; `spellOut()` here is the mechanism for the latter."
        },
        {
          "name": "CORE_LEXICON",
          "kind": "constant",
          "signature": "CORE_LEXICON",
          "summary": "Curated core lexicon. Stress digits: 2 = PRIMARY (see the warning above). Grouped by why each entry is here."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/frontend/TextNormalizer",
      "path": "agi/reference/particle_voice/frontend/TextNormalizer.md",
      "source": "agi/particle_voice/frontend/TextNormalizer.js",
      "import": "/agi/particle_voice/frontend/TextNormalizer.js",
      "sourceHash": "ddc390177f2ebb15055b52bc90e4b1f6bebf549283dafb49299720ab4ab60cbc",
      "summary": "TextNormalizer.js — Phase 3 ParticleVoice text frontend. Turns raw author/LLM text into speakable words plus the per-phrase punctuation-context tags `spec/PhonemeSet-v0.md` §4 defines, ready for `PronunciationLexicon.js`/`G2PModel.js` to lower into phoneme ids. Output shape (`normalizeText`): { raw: string, phrases: [{ words: [{ text, wasAllCaps }], boundary: PUNCTUATION_CONTEXT id,   // §4 tag for THIS phrase's end structural: 'SP' | 'SIL' | null,    // token to insert at the boundary breathLikely: boolean,              // §4: paragraph breaks only }] } One tag per phrase (not per phoneme): `spec/VoicePlan-v0.md` §4's per-phoneme `punctuationContext` array is produced downstream by repeating a phrase's tag across the phonemes its words expand into, which is exactly what that spec means by \"repeats within a phrase, changes at boundaries\". ## Ordering matters Abbreviation expansion and decimal-point protection run BEFORE phrase splitting, because both consume `.` characters that would otherwise be mistaken for sentence terminators — `Dr. Smith` is one phrase, not two, and `3.14` is one number, not `3` then `14`. Getting this order wrong is the classic text-frontend bug, so it is enforced by construction here rather than left to a later cleanup pass. ## Deliberate non-guesses Two things this module refuses to infer, because guessing wrong is worse than not trying: - **Years.** `1999` could be a year (\"nineteen ninety nine\") or a quantity (\"one thousand nine hundred ninety nine\"), and `1500 dollars` proves the quantity reading is often right. Bare integers are ALWAYS read as cardinals; `expandYear()` is exported for callers that actually know the context (e.g. a date field), rather than being applied by a heuristic that would silently corrupt prices and counts. - **Acronym pronunciation.** `NASA` is said as a word, `USA` letter by letter, and nothing in the surface form distinguishes them. All-caps tokens are passed through with `wasAllCaps: true` so `PronunciationLexicon.js` gets first refusal and `G2PModel.js` can fall back to spelling out — the decision belongs where the pronunciation knowledge lives, not here. Dates and clock times are likewise out of scope for `v0` (both are format-ambiguous: `3/4` is a date in one locale and a fraction in another). They are documented as unhandled rather than half-handled.",
      "exports": [
        {
          "name": "expandCardinal",
          "kind": "function",
          "signature": "expandCardinal(n)",
          "summary": ""
        },
        {
          "name": "expandOrdinal",
          "kind": "function",
          "signature": "expandOrdinal(n)",
          "summary": ""
        },
        {
          "name": "expandDigits",
          "kind": "function",
          "signature": "expandDigits(digits)",
          "summary": ""
        },
        {
          "name": "expandYear",
          "kind": "function",
          "signature": "expandYear(year)",
          "summary": "Read a 4-digit year the way speech does. NOT applied automatically — see this module's \"deliberate non-guesses\" note; callers that know a number is a year opt in explicitly."
        },
        {
          "name": "normalizeCharacters",
          "kind": "function",
          "signature": "normalizeCharacters(raw)",
          "summary": "Unicode/typography normalization: NFKC, curly quotes and dashes to ASCII, whitespace collapsed (paragraph breaks preserved as `\\n\\n`)."
        },
        {
          "name": "normalizeText",
          "kind": "function",
          "signature": "normalizeText(raw)",
          "summary": ""
        },
        {
          "name": "flattenWords",
          "kind": "function",
          "signature": "flattenWords(normalized)",
          "summary": ""
        },
        {
          "name": "MAX_CARDINAL",
          "kind": "constant",
          "signature": "MAX_CARDINAL",
          "summary": ""
        },
        {
          "name": "ABBREVIATIONS",
          "kind": "constant",
          "signature": "ABBREVIATIONS",
          "summary": "Expanded before phrase splitting, so their trailing `.` never reads as a sentence end. Keys are matched case-insensitively without the period."
        },
        {
          "name": "SYMBOL_WORDS",
          "kind": "constant",
          "signature": "SYMBOL_WORDS",
          "summary": "Standalone symbol → word. Applied per token, so `&` between words works but `AT&T` is left to the lexicon."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/lab/ManualArticulator",
      "path": "agi/reference/particle_voice/lab/ManualArticulator.md",
      "source": "agi/particle_voice/lab/ManualArticulator.js",
      "import": "/agi/particle_voice/lab/ManualArticulator.js",
      "sourceHash": "e2aa28a20c38cb338c70ec14130e5c7f5142eddc816eb2df922d5bed3b07c73c",
      "summary": "ManualArticulator.js — Phase 3 ParticleVoice lab. Turns direct articulator controls (the Voice Box demo's sliders) into the SAME physiology-stream shape `ArticulationHead.predict()` produces, so `ParticleVoiceModel.renderPhysiology()` accepts it unchanged. ## Why this is a module and not inline demo code The plan requires the live demo to have \"manual articulator mode + neural mode; same `VisualAirflowState`\". If manual mode built its own control path — or worse, called `ParticleTract` directly — the two modes would diverge: different smoothing, different validation, a different visualization source. By emitting the identical stream shape, manual mode goes through exactly the same `renderPhysiology()` → `ParticleTract` → `SafetyLimiter` path, and the visualization comes from the same solver snapshots. That makes \"same VisualAirflowState\" structural rather than a promise, and it means this logic is testable headlessly instead of only by clicking. ## Controls Deliberately the physical knobs, not phonemes — the point of manual mode is to drive the tract directly: - `f0Hz`, `voiced` — glottal source - `constrictionPosition` (0 = glottis, 1 = lips) and `constrictionArea` — one moving constriction, the single most expressive articulator - `pharynxArea`, `lipArea` — the tube's two ends - `nasalCoupling` — velum - `fricationAmplitude` — turbulence at the constriction - `pressure` — subglottal drive A held pose is rendered as a constant stream; `interpolatePoses()` produces a glide between two poses, which is how the demo can sweep a diphthong or a closure/release gesture without hand-authoring every frame.",
      "exports": [
        {
          "name": "ManualArticulator",
          "kind": "class",
          "signature": "class ManualArticulator",
          "summary": ""
        },
        {
          "name": "normalizePose",
          "kind": "function",
          "signature": "normalizePose(pose = {})",
          "summary": "Validate and clamp a partial pose into a complete one."
        },
        {
          "name": "interpolatePoses",
          "kind": "function",
          "signature": "interpolatePoses(a, b, t)",
          "summary": "Linear blend between two poses; `voiced` switches at the midpoint since it is boolean."
        },
        {
          "name": "poseAreaProfile",
          "kind": "function",
          "signature": "poseAreaProfile(pose, numSections)",
          "summary": "Area profile for one pose, using the same 3-control-point `shapedAreaProfile` shape `ArticulationHead` uses for vowels."
        },
        {
          "name": "createManualArticulator",
          "kind": "function",
          "signature": "createManualArticulator(options)",
          "summary": ""
        },
        {
          "name": "DEFAULT_POSE",
          "kind": "constant",
          "signature": "DEFAULT_POSE",
          "summary": ""
        },
        {
          "name": "POSE_CONTROLS",
          "kind": "constant",
          "signature": "POSE_CONTROLS",
          "summary": "Slider metadata for the demo UI, kept beside the pose it describes so the two cannot drift apart."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/lab/TractSagittalView",
      "path": "agi/reference/particle_voice/lab/TractSagittalView.md",
      "source": "agi/particle_voice/lab/TractSagittalView.js",
      "import": "/agi/particle_voice/lab/TractSagittalView.js",
      "sourceHash": "942497f48f9c80bea8834b00e8d7d25aed300f421077e4fd8efcb6f4a1605cb4",
      "summary": "TractSagittalView.js — mid-sagittal renderer for the vocal tract area function. Draws what the solver is actually doing, as an anatomical cross-section: the pharynx rising from the glottis, the bend behind the tongue, the oral cavity, the teeth and the lips. The tract's `areas` array IS the picture — section `i` is a slice of tube, and its cross-sectional area is the gap between the tongue surface and the roof of the mouth at that point. ## Why a sagittal view rather than a plot of the numbers A line plot of 32 areas is readable but not *diagnosable*: it does not tell you whether a shape is a plausible mouth. Errors in this project have repeatedly been of exactly that kind — a tract twice the correct length, a \"stop\" whose closure never closed, a constriction so tight it would whistle. All of those are obvious at a glance in an anatomical view and invisible in a spectrum. ## Geometry The centreline follows an arc, matching how the real tract bends ~90 degrees behind the tongue: the glottis end points up, the lip end points forward. Each section is drawn radially across that arc, with the OUTER boundary fixed (the rigid palate, teeth and rear pharyngeal wall) and the INNER boundary displaced by the section's diameter (the tongue and jaw, which are what move). Diameter, not area, sets the drawn width: a tube's diameter goes as the SQUARE ROOT of its area, so plotting area directly would exaggerate open sections and make near-closures look tighter than they are.",
      "exports": [
        {
          "name": "TractSagittalView",
          "kind": "class",
          "signature": "class TractSagittalView",
          "summary": "Renders one frame of tract geometry. Stateless by design: it takes the geometry and draws it, so the same view can be driven by `ArticulationHead`'s per-frame stream, by `ManualArticulator`'s live sliders, or by a single static profile from `FormantSolver`, with no notion of playback inside it."
        },
        {
          "name": "diameterForArea",
          "kind": "function",
          "signature": "diameterForArea(areaCm2)",
          "summary": ""
        },
        {
          "name": "LANDMARKS",
          "kind": "constant",
          "signature": "LANDMARKS",
          "summary": "Anatomical landmarks as a fraction of tract length from the glottis, used only for labels and the teeth marker."
        },
        {
          "name": "DEFAULT_VIEW_OPTIONS",
          "kind": "constant",
          "signature": "DEFAULT_VIEW_OPTIONS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/model/ArticulationHead",
      "path": "agi/reference/particle_voice/model/ArticulationHead.md",
      "source": "agi/particle_voice/model/ArticulationHead.js",
      "import": "/agi/particle_voice/model/ArticulationHead.js",
      "sourceHash": "2edfa30adfbaba9b6e993d08a1381f7a4bf43d21cc13de20b14dc0fcb9442b33",
      "summary": "ArticulationHead.js — Phase 3 ParticleVoice model. Per-frame streams → `NeuralPhysiologyState` (`articulatory/NeuralPhysiologyState.js`): the four control heads plus uncertainty that `ParticleTract` actually consumes. This is where `spec/PhonemeSet-v0.md` §2's articulatory feature vectors finally reach the vocal tract — place becomes a constriction position, manner becomes a constriction degree, height/backness/rounded become a vowel area profile. ## Rule-based, mapping features to geometry Like `ProsodyPlanner`, this is a deterministic feature→geometry mapping, not a trained head. `spec/PhonemeSet-v0.md` §6 already flags its place-position percentages as \"provisional estimates ... not measured against real vocal-tract MRI data\", and the vowel profiles here are the same kind of estimate: a 3-control-point `shapedAreaProfile` whose constriction position comes from backness, constriction area from height, and lip area from rounding. They are ordered correctly (high vowels narrower than low, front constrictions further forward than back) and produce distinguishable formants — verified in Phase 2 to be what makes a vowel a vowel rather than a buzz — but they are not fitted to measured data. ## Two constraints that are NOT stylistic 1. **`ee` must be strictly positive, even when unvoiced.** It is tempting to set the glottal excitation to 0 on a voiceless frame. That breaks `glottal_lf.js`: its Newton solve for `alpha` computes `areaPrime = (-ee / sin(wg*te)) * (...)`, so `ee = 0` makes the derivative exactly 0 and the update `alpha -= (area - target) / 0` evaluates to **NaN**, which then propagates through the whole waveguide. `NeuralPhysiologyState`'s own validator independently requires `ee > 0`. Voiceless frames therefore use a small positive `UNVOICED_EE` — inaudible, but numerically safe. 2. **Areas are SMOOTHED across frames, per-manner.** Snapping the area profile to a new target at a phoneme boundary is a step change in the waveguide's reflection coefficients, which radiates as a click — the precise artifact Phase 2's exit gate spent effort eliminating. Each manner gets its own time constant because the right smoothing speed is phonetically real, not a tuning knob: a stop's closure and release ARE fast (smearing them destroys the plosive), while a vowel-to-vowel transition is genuinely slow. A single global constant would either smear plosives or click on vowels. ## Output shape `predict()` returns COMPACT typed arrays (one row per frame), not an array of frozen `NeuralPhysiologyState` objects: a few seconds of speech is hundreds of frames, and materializing hundreds of frozen nested objects per utterance would be wasteful when the consumer reads them once, in order. `physiologyStateAt(result, frame)` builds the real validated schema object on demand, so the schema is genuinely exercised (and validated) rather than bypassed.",
      "exports": [
        {
          "name": "ArticulationHead",
          "kind": "class",
          "signature": "class ArticulationHead",
          "summary": ""
        },
        {
          "name": "physiologyStateAt",
          "kind": "function",
          "signature": "physiologyStateAt(result, frame, { glottalReflection, lipReflection } = {})",
          "summary": "Materialize one frame of a `predict()` result as a validated `NeuralPhysiologyState`. Built on demand rather than eagerly — see the header's \"output shape\" note — so the schema and its validators are genuinely exercised without allocating hundreds of frozen objects per utterance."
        },
        {
          "name": "createArticulationHead",
          "kind": "function",
          "signature": "createArticulationHead(config)",
          "summary": ""
        },
        {
          "name": "UNVOICED_EE",
          "kind": "constant",
          "signature": "UNVOICED_EE",
          "summary": "Small but strictly positive glottal excitation for voiceless frames. See constraint 1 in the header: 0 would make `glottal_lf.js`'s Newton solve produce NaN."
        },
        {
          "name": "BACKNESS_POSITION",
          "kind": "constant",
          "signature": "BACKNESS_POSITION",
          "summary": "Fallback constriction position (0 = glottis, 1 = lips) by vowel backness, and cross-section by height. These are NO LONGER the primary path for the ten monophthongs — see `vowelProfile()`. They were an articulatory-adjective mapping (\"front vowels constrict further forward\", \"high vowels constrict more tightly\") that is directionally right but produces whatever formants it happens to produce. Since vowel identity is carried almost entirely by F1/F2, \"plausible geometry\" is not good enough: uncalibrated profiles pull every vowel toward a neutral timbre, which is heard as speech-like noise with no decipherable vowels. Retained only as the fallback for any vowel with no entry in `VOWEL_AREA_PARAMS`, so adding a phoneme to `PhonemeSet` cannot crash synthesis before it has been calibrated."
        },
        {
          "name": "HEIGHT_AREA",
          "kind": "constant",
          "signature": "HEIGHT_AREA",
          "summary": ""
        },
        {
          "name": "MANNER_WIDTH",
          "kind": "constant",
          "signature": "MANNER_WIDTH",
          "summary": "Constriction LENGTH by manner, as a fraction of tract length. A constriction specified as a single control point does not survive `shapedAreaProfile`'s linear interpolation: the profile tapers to the target only exactly AT that point, and since the point rarely lands on a section centre, the realised minimum is far wider than requested. Measured, a stop asking for 0.02 cm^2 actually reached **0.138** — nearly 7x too open. That is not a cosmetic error: a stop whose closure never closes produces neither the silence nor the release burst that identify it, and stops are six of the most frequent consonants in English. The effect got worse when the section count was corrected from 32 to 16, because coarser sections smear a point further. Giving the constriction a length makes it span whole sections, so it genuinely reaches the target area. The values are anatomical: a stop's occlusion covers roughly 1.5-2 cm of the tract, a fricative channel is comparable, and an approximant's narrowing is longer and gentler. At 17 cm / 16 sections one section is 1.06 cm, so 0.10 (1.7 cm) is about 1.6 sections — enough to hold the target rather than merely touch it."
        },
        {
          "name": "MANNER_AREA",
          "kind": "constant",
          "signature": "MANNER_AREA",
          "summary": "Constriction cross-section by consonant manner — the \"degree\" half of spec §2's place/manner pair."
        },
        {
          "name": "VOICING_TIME_MS",
          "kind": "constant",
          "signature": "VOICING_TIME_MS",
          "summary": "Smoothing time constant for the glottal excitation amplitude. `ee` switches between `voicedEe` (1.0) and `UNVOICED_EE` (1e-3) — a factor of a THOUSAND, i.e. a 60 dB step. Applied instantaneously that is a hard click at every voicing transition, and an English sentence has one at every voiceless consonant; several per second turns into a sputter that swamps the speech. Real vocal folds cannot change amplitude discontinuously either, so smoothing here is physical as well as necessary. ~18 ms is fast enough to keep a voiceless stop sounding unvoiced (its closure alone is ~25 ms) while removing the step."
        },
        {
          "name": "GESTURE_TIME_MS",
          "kind": "constant",
          "signature": "GESTURE_TIME_MS",
          "summary": "Area-smoothing time constants in ms, by manner — the speed of the ARTICULATOR, nothing else. ## These were far too slow, and every stop in every utterance was a glide The previous values (stop 25 ms, vowel 50 ms) were justified by the claim that \"a stop at 25 ms still reaches ~94% of its closure within a typical 70 ms stop, so the plosive is preserved\". That reasoning is wrong, and wrong in a way worth recording: it measures the PERCENTAGE OF DISTANCE travelled, but what decides whether a stop is a stop is the ABSOLUTE area reached. Going 94% of the way from a vowel's ~3.0 cm^2 to a 0.02 cm^2 closure leaves **0.18 cm^2** — which is not a closure at all, it is a narrow approximant. So the tract never actually blocked, no stop ever produced silence or a release burst, and all six English stops came out as vowel-like glides. Perceptually the whole utterance collapses toward a string of semivowels, which is exactly the reported \"yeah yeah yeah\". For a target near zero, percentage-of-distance and absolute-value diverge arbitrarily far. This is the same relative-versus-absolute confusion that produced the earlier bad thresholds in this project. ## Why they can now be as fast as the phonetics actually requires These constants USED to be doing two jobs: modelling articulator inertia AND preventing the per-chunk reflection-coefficient step from clicking. The second job is gone — `tract_waveguide.js` now interpolates `junction_k` per sample, so geometry is continuous no matter how fast the frame targets move. That frees these to be purely phonetic. O'Connor et al. (1957) found listeners hear a formant transition as a STOP below ~50 ms and as a SEMIVOWEL above it, so a stop's gesture must complete well inside 50 ms. At the 10 ms frame interval, tau = 8 ms gives alpha 0.71, reaching 0.026 cm^2 (a real closure) within 50 ms. Approximants stay slower: the same literature has /w j r l/ holding their formant loci for 30-50 ms, i.e. genuinely gliding rather than snapping."
        },
        {
          "name": "RELEASE_AREA_CM2",
          "kind": "constant",
          "signature": "RELEASE_AREA_CM2",
          "summary": "Stop RELEASE BURST. A plosive is two acoustic events, not one: a silent closure, then a sharp transient when the occlusion opens and the pressure built up behind it escapes. Only the closure was being modelled, so stops had the right silence and then simply faded back into the next vowel. The burst is a primary place cue — much of what distinguishes /p/ from /t/ from /k/ lives in its spectrum — so without it stops are detectable but not identifiable. Pink Trombone models the same thing, adding a transient whenever a diameter goes from zero to positive; this is the equivalent, expressed through the turbulence channel that already exists rather than as a new kernel input, since a burst IS a brief broadband excitation at the constriction. Detection uses the SMOOTHED area, not the phoneme label: what matters is that the tract actually opened, which is the same reason the closure test asserts realised rather than target geometry. `RELEASE_AREA_CM2` is the threshold below which the tract counts as closed, matching the closure the test requires."
        },
        {
          "name": "BURST_AMPLITUDE",
          "kind": "constant",
          "signature": "BURST_AMPLITUDE",
          "summary": ""
        },
        {
          "name": "BURST_TIME_MS",
          "kind": "constant",
          "signature": "BURST_TIME_MS",
          "summary": "Burst decay. ~8 ms puts the transient plus its aspiration in the 10-30 ms range measured for real plosive releases."
        },
        {
          "name": "FRICATION_PLACE_GAIN",
          "kind": "constant",
          "signature": "FRICATION_PLACE_GAIN",
          "summary": ""
        },
        {
          "name": "VOICED_FRICATION_GAIN",
          "kind": "constant",
          "signature": "VOICED_FRICATION_GAIN",
          "summary": ""
        },
        {
          "name": "DEFAULT_ARTICULATION_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_ARTICULATION_CONFIG",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/model/LengthRegulator",
      "path": "agi/reference/particle_voice/model/LengthRegulator.md",
      "source": "agi/particle_voice/model/LengthRegulator.js",
      "import": "/agi/particle_voice/model/LengthRegulator.js",
      "sourceHash": "4f465197f6c3f3eddb6be39697fe9937780b792ac89bdaeb6d868bcdd46292e9",
      "summary": "LengthRegulator.js — Phase 3 ParticleVoice model. Expands per-PHONEME encoder features and prosody into per-FRAME streams, and — because `spec/VoicePlan-v0.md` §5 explicitly assigns it here — handles resampling between the 100 Hz plan frame rate and whatever rate the consumer runs at (the Activity path is 8 ms/frame = 125 Hz, `ActivityContract-v0` §1; the two \"are not required to be equal; any resampling between them is `LengthRegulator.js`'s job, not assumed away here\"). ## F0 is interpolated, features are held These two streams are expanded differently, on purpose: - **F0 is linearly interpolated** between phoneme centres. Holding one value per phoneme would produce a pitch STAIRCASE, and a discontinuous F0 is audible as a click or a warble at every phoneme boundary — the exact artifact the Phase 2 exit gate spent effort eliminating from the waveguide. Interpolating between centres (not edges) means each phoneme's nominal pitch is actually reached at its midpoint. - **Feature vectors are HELD** across a phoneme's frames, not interpolated. They are a learned representation, and blending two phonemes' embeddings produces a vector that means neither. Holding is the standard FastSpeech-style length regulation and is what the downstream `ArticulationHead` expects. - **The voiced flag is held** — it is boolean; interpolating it would invent half-voiced frames that no source model can honour. ## Where it runs CPU-side. The encoder's features are produced on GPU, so using them here costs a readback — but the consumer (`ArticulationHead` → `ParticleTract`) needs per-chunk control values in JS anyway (`areas`, `f0Hz`), so the readback is not avoided by moving this to GPU, only relocated. A GPU `length_regulate` gather kernel is a straightforward follow-up IF profiling later shows the feature upload dominating; the condition that would justify it is stated so the decision is revisitable rather than forgotten.",
      "exports": [
        {
          "name": "LengthRegulator",
          "kind": "class",
          "signature": "class LengthRegulator",
          "summary": ""
        },
        {
          "name": "regulateLength",
          "kind": "function",
          "signature": "regulateLength({ durationFrames, f0Hz, voiced, features = null, featureDim = 0, maxFrames = 1 << 20 })",
          "summary": "Expand per-phoneme streams to per-frame streams. durationFrames: ArrayLike<number>, f0Hz: ArrayLike<number>, voiced: ArrayLike<number>, features?: ArrayLike<number>, featureDim?: number, maxFrames?: number, }} input"
        },
        {
          "name": "resampleFrames",
          "kind": "function",
          "signature": "resampleFrames(regulated, fromRateHz, toRateHz, featureDim = 0)",
          "summary": "Resample per-frame streams from one frame rate to another — the job `spec/VoicePlan-v0.md` §5 assigns to this module for crossing between the 100 Hz plan rate and the 125 Hz Activity rate. F0 is linearly interpolated (it is continuous); voicing and the phoneme index use NEAREST-neighbour, because both are categorical and interpolating them would invent values that do not exist (a half-voiced frame, or a fractional phoneme id)."
        },
        {
          "name": "createLengthRegulator",
          "kind": "function",
          "signature": "createLengthRegulator(options)",
          "summary": ""
        },
        {
          "name": "ACTIVITY_FRAME_RATE_HZ",
          "kind": "constant",
          "signature": "ACTIVITY_FRAME_RATE_HZ",
          "summary": "LengthRegulator.js — Phase 3 ParticleVoice model. Expands per-PHONEME encoder features and prosody into per-FRAME streams, and — because `spec/VoicePlan-v0.md` §5 explicitly assigns it here — handles resampling between the 100 Hz plan frame rate and whatever rate the consumer runs at (the Activity path is 8 ms/frame = 125 Hz, `ActivityContract-v0` §1; the two \"are not required to be equal; any resampling between them is `LengthRegulator.js`'s job, not assumed away here\"). ## F0 is interpolated, features are held These two streams are expanded differently, on purpose: - **F0 is linearly interpolated** between phoneme centres. Holding one value per phoneme would produce a pitch STAIRCASE, and a discontinuous F0 is audible as a click or a warble at every phoneme boundary — the exact artifact the Phase 2 exit gate spent effort eliminating from the waveguide. Interpolating between centres (not edges) means each phoneme's nominal pitch is actually reached at its midpoint. - **Feature vectors are HELD** across a phoneme's frames, not interpolated. They are a learned representation, and blending two phonemes' embeddings produces a vector that means neither. Holding is the standard FastSpeech-style length regulation and is what the downstream `ArticulationHead` expects. - **The voiced flag is held** — it is boolean; interpolating it would invent half-voiced frames that no source model can honour. ## Where it runs CPU-side. The encoder's features are produced on GPU, so using them here costs a readback — but the consumer (`ArticulationHead` → `ParticleTract`) needs per-chunk control values in JS anyway (`areas`, `f0Hz`), so the readback is not avoided by moving this to GPU, only relocated. A GPU `length_regulate` gather kernel is a straightforward follow-up IF profiling later shows the feature upload dominating; the condition that would justify it is stated so the decision is revisitable rather than forgotten."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/model/ParticleVoiceModel",
      "path": "agi/reference/particle_voice/model/ParticleVoiceModel.md",
      "source": "agi/particle_voice/model/ParticleVoiceModel.js",
      "import": "/agi/particle_voice/model/ParticleVoiceModel.js",
      "sourceHash": "ceb7f417da825d08ede6d7eac2c998966dbd1eeb172cec46060c9a7f533a9bce",
      "summary": "ParticleVoiceModel.js — Phase 3 ParticleVoice model. Wires the whole Phase 3 path into one call: **text → PCM**. TextNormalizer → G2P/lexicon → PhonemeSequence → PhonemeEncoder (GPU, optional) → ProsodyPlanner → LengthRegulator → ArticulationHead → NeuralPhysiologyState stream → ParticleTract (GPU acoustic solver) → SafetyLimiter → PCM ## Why there is no separate `SourceVocoder` in Phase 3 The plan lists \"`SourceVocoder.js` basic harmonic + noise + waveguide output\". In Phase 3 that IS `ParticleTract`: it already runs `glottal_lf` (harmonic source), two `constriction_noise` streams (aspiration at the glottis, frication at the constriction) and the Kelly-Lochbaum waveguide, with lip radiation applied internally. Adding a `SourceVocoder` wrapper that only forwarded to it would be a layer with no content. Phase 4's full source-filter Fourier vocoder (bounded spectral residual, MPD/MRD refinement, IFFT + WOLA) is where that module earns its own file — and the seam for it is `renderPhysiology()`, which is already separate from the text frontend. ## Frame rate vs chunk rate: the decimation that matters `ArticulationHead` emits physiology at the 100 Hz plan frame rate (10 ms), but `ParticleTract.renderChunk()` accepts **one control set per chunk** — one area profile, one f0, one constriction index. At 32 kHz with 1024-sample chunks a chunk is 32 ms, so roughly 3 physiology frames fall inside each one. Something has to reduce them, and the choice is audible: - **Areas are AVERAGED** across the frames in a chunk. Picking one frame (say the first) would throw away the smoothing `ArticulationHead` deliberately applied and reintroduce exactly the reflection-coefficient step it exists to prevent. - **F0 is averaged** for the same reason: a chunk-rate pitch staircase is audible as a warble. - **Constriction index is taken by MAJORITY**, not averaged — it is a position index, and the mean of \"junction 20\" and \"junction 6\" is junction 13, a place no phoneme asked for. - **Voicing/amplitudes are averaged**, which naturally cross-fades a voiced→voiceless transition across the chunk rather than switching hard. This decimation is the one place a Phase 3 discontinuity could still enter, so it is concentrated in `_decimateChunk()` and tested directly. ## Breath reservoir `BreathReservoirState`'s one-pole lag is applied CPU-side per chunk to turn `ArticulationHead`'s target subglottal pressure into an actual pressure with inertia, and that pressure scales the glottal excitation. This uses the same `lagRateFromCompliance` formula the GPU `breath_reservoir` kernel expects pre-computed, so the two agree; running it here rather than on GPU avoids a readback for a single scalar per chunk. Documented as a deliberate simplification: a per-SAMPLE reservoir would need the kernel.",
      "exports": [
        {
          "name": "ParticleVoiceModel",
          "kind": "class",
          "signature": "class ParticleVoiceModel",
          "summary": ""
        },
        {
          "name": "DEFAULT_VOICE_MODEL_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_VOICE_MODEL_CONFIG",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/model/PhonemeEncoder",
      "path": "agi/reference/particle_voice/model/PhonemeEncoder.md",
      "source": "agi/particle_voice/model/PhonemeEncoder.js",
      "import": "/agi/particle_voice/model/PhonemeEncoder.js",
      "sourceHash": "4099b66bf7b0331dc1686681d7fde3502c56c671ba3c4b6ef25e49571d91a74e",
      "summary": "PhonemeEncoder.js — Phase 3 ParticleVoice model. Phoneme ids → contextual per-token feature vectors, entirely on GPU: a `PHONEME_COUNT`-row embedding table followed by two Conv1D blocks, each with SiLU, and a final RMSNorm. This is the first Phase 3 component that runs the Phase 1 ParticleNN kernels in composition. Pipeline (7 dispatches, ONE submit per `encode()`): ids [T] → embedding_f16   → [T, D]   sequence-major → transpose_2d    → [D, T]   channel-major  (see \"layout\" below) → conv1d_w8a16    → [H, T] → silu_f16        → [H, T] → conv1d_w8a16    → [O, T] → silu_f16        → [O, T] → transpose_2d    → [T, O]   sequence-major → rmsnorm_f16     → [T, O]   per-token normalization ## Layout: why two transposes are load-bearing The Phase 1 kernels disagree about which axis is major, and each is right for itself: `embedding_f16` gathers rows so it emits **sequence-major** `[numIds, embedDim]`; `conv1d_w8a16` slides a kernel along time so it reads **channel-major** `[inChannels, seqLen]`; `rmsnorm_f16` normalizes rows, so per-token normalization needs sequence-major again. Composing them without the axis swaps would not error — it would silently convolve across the feature axis and produce scrambled activations. `core/transpose_2d.js` was added for exactly this, and the two transposes here are the minimum: SiLU is elementwise and therefore layout-agnostic, so both convolutions run back-to-back in channel-major before a single swap back for the norm. ## Weights are placeholders, and this file says so No Phase 3 training exists yet, so `createDeterministicEncoderWeights()` produces **seeded pseudorandom INT8 weights**. They make the pipeline runnable, shape-correct and reproducible end-to-end; they do NOT make it meaningful. The encoder's output is a deterministic function of its input, which is what Phase 3's downstream components need in order to be built and tested — but nothing here has learned anything about phonetics. Real weights arrive with training; the `weights` argument is the seam. ## Quantization Conv weights are INT8 with a per-output-channel scale, matching `conv1d_w8a16.js`'s packed layout exactly (4 int8 per `u32`, flattened `(inCh, tap)` index, `inChannels * kernelWidth` a multiple of 4 — validated in the constructor rather than left to fail as garbage output).",
      "exports": [
        {
          "name": "PhonemeEncoder",
          "kind": "class",
          "signature": "class PhonemeEncoder",
          "summary": ""
        },
        {
          "name": "packInt8Weights",
          "kind": "function",
          "signature": "packInt8Weights(weights, outChannels, kTotal)",
          "summary": "Pack int8 weights into `u32`s, 4 per word, matching `conv1d_w8a16.js`'s documented `(inCh, tap)` flattening."
        },
        {
          "name": "createDeterministicEncoderWeights",
          "kind": "function",
          "signature": "createDeterministicEncoderWeights(config = {}, seed = 1337)",
          "summary": "Build a complete, reproducible placeholder weight set. See the header: this is scaffolding so the pipeline can be exercised, not a trained model."
        },
        {
          "name": "createPhonemeEncoder",
          "kind": "function",
          "signature": "createPhonemeEncoder(device, options)",
          "summary": ""
        },
        {
          "name": "DEFAULT_ENCODER_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_ENCODER_CONFIG",
          "summary": "Small by design: Phase 3 is a \"tiny deterministic single-speaker model\", not a production encoder."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/model/ProsodyPlanner",
      "path": "agi/reference/particle_voice/model/ProsodyPlanner.md",
      "source": "agi/particle_voice/model/ProsodyPlanner.js",
      "import": "/agi/particle_voice/model/ProsodyPlanner.js",
      "sourceHash": "b8bf23fcb2a94a29ff26b3a723154cddbc038f94fe2335238c0fd17afc2ba9e0",
      "summary": "ProsodyPlanner.js — Phase 3 ParticleVoice model. Predicts per-phoneme **duration**, **F0** and a **voiced flag** from a `PhonemeSequence` (`spec/VoicePlan-v0.md` §4), at the plan frame rate of 100 Hz / 10 ms per frame that spec fixes. ## Rule-based, and the plan says \"minimal\" This is a deterministic rule model, not a trained one: durations come from per-manner base values scaled by stress and boundary position, and F0 from a declination line with stress excursions and a terminal contour selected by punctuation context. Phase 3's goal is \"a tiny deterministic single-speaker model\", and a learned duration/F0 predictor needs aligned speech data this project does not have. The numbers below are therefore **plausible phonetics, not measured values** — they are ordered correctly relative to each other (stops shorter than fricatives, diphthongs longer than monophthongs, stressed longer than unstressed), which is what makes speech intelligible, but they are not fitted to any corpus. `plan()` takes an optional `overrides` bag so a caller can retune without editing this file, and the class boundary is where a learned predictor slots in. ## What it deliberately does not do - **No per-phoneme F0 contour inside a phoneme.** One target per phoneme; smoothing into a continuous per-frame curve is `LengthRegulator.js`'s job, because that is where frame counts exist. Emitting a flat value per phoneme here and interpolating there avoids the audible pitch STEP that a naive per-phoneme hold would produce. - **No accent/emotion conditioning.** `spec/VoicePlan-v0.md` §3's factorized conditioning channels exist, but wiring them is Phase 4+; pretending to condition on them now would be fake.",
      "exports": [
        {
          "name": "ProsodyPlanner",
          "kind": "class",
          "signature": "class ProsodyPlanner",
          "summary": ""
        },
        {
          "name": "createProsodyPlanner",
          "kind": "function",
          "signature": "createProsodyPlanner(config)",
          "summary": ""
        },
        {
          "name": "PLAN_FRAME_RATE_HZ",
          "kind": "constant",
          "signature": "PLAN_FRAME_RATE_HZ",
          "summary": "`spec/VoicePlan-v0.md` §5: the plan frame rate is 100 Hz (10 ms/frame)."
        },
        {
          "name": "PLAN_FRAME_MS",
          "kind": "constant",
          "signature": "PLAN_FRAME_MS",
          "summary": ""
        },
        {
          "name": "BASE_DURATION_MS",
          "kind": "constant",
          "signature": "BASE_DURATION_MS",
          "summary": "Base durations in MILLISECONDS by articulatory manner. Relative ordering is the part that matters (see header); absolute values are plausible defaults."
        },
        {
          "name": "STRUCTURAL_DURATION_MS",
          "kind": "constant",
          "signature": "STRUCTURAL_DURATION_MS",
          "summary": "Structural-token durations, keyed by the punctuation context they sit at (spec §4's Effect column: comma-level is a short pause, terminals are full silences, a paragraph is longer still)."
        },
        {
          "name": "DEFAULT_PROSODY_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_PROSODY_CONFIG",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/autodiff/BackwardGraphCompiler",
      "path": "agi/reference/particle_voice/nn/autodiff/BackwardGraphCompiler.md",
      "source": "agi/particle_voice/nn/autodiff/BackwardGraphCompiler.js",
      "import": "/agi/particle_voice/nn/autodiff/BackwardGraphCompiler.js",
      "sourceHash": "40bed4344aa1afa39a03635f1d31fe032444fde0eb6ab8f48b1392eb864ae7aa",
      "summary": "BackwardGraphCompiler.js — Phase 1 ParticleNN autodiff STUB. **Not wired into anything until Phase 11.** Walks a `ParticleTape`'s recorded forward ops in reverse and builds a `GradientGraph` node per op that has a registered `BackwardRuleRegistry` rule (ops without one are skipped, not silently faked with an identity/zero gradient). Refuses to compile anything if the registry is completely empty — the honest current state (no backward rules exist yet for any real kernel) rather than returning a plausible-looking but meaningless empty graph.",
      "exports": [
        {
          "name": "BackwardGraphCompiler",
          "kind": "class",
          "signature": "class BackwardGraphCompiler",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/autodiff/BackwardRuleRegistry",
      "path": "agi/reference/particle_voice/nn/autodiff/BackwardRuleRegistry.md",
      "source": "agi/particle_voice/nn/autodiff/BackwardRuleRegistry.js",
      "import": "/agi/particle_voice/nn/autodiff/BackwardRuleRegistry.js",
      "sourceHash": "7fa8f347e083d9a344b32aba41790913e04fb201aa05fb4396630fe8792f0d2d",
      "summary": "BackwardRuleRegistry.js — Phase 1 ParticleNN autodiff STUB. **Not wired into anything until Phase 11.** Maps a forward op name (from `KernelRegistry.js`'s allowlist, e.g. `matmul_w8a16`) to a backward rule: a function that, given the recorded forward op's inputs/outputs/params plus the gradient(s) flowing into its outputs, produces the gradient(s) with respect to its inputs. No rules are registered for any real kernel yet — that is genuinely Phase 11 work (differentiating through INT8 quantization and FP16 rounding correctly is a real design problem, not something to hand-wave here) — this file only fixes the registry shape.",
      "exports": [
        {
          "name": "BackwardRuleRegistry",
          "kind": "class",
          "signature": "class BackwardRuleRegistry",
          "summary": "BackwardRuleRegistry.js — Phase 1 ParticleNN autodiff STUB. **Not wired into anything until Phase 11.** Maps a forward op name (from `KernelRegistry.js`'s allowlist, e.g. `matmul_w8a16`) to a backward rule: a function that, given the recorded forward op's inputs/outputs/params plus the gradient(s) flowing into its outputs, produces the gradient(s) with respect to its inputs. No rules are registered for any real kernel yet — that is genuinely Phase 11 work (differentiating through INT8 quantization and FP16 rounding correctly is a real design problem, not something to hand-wave here) — this file only fixes the registry shape."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/autodiff/GradientGraph",
      "path": "agi/reference/particle_voice/nn/autodiff/GradientGraph.md",
      "source": "agi/particle_voice/nn/autodiff/GradientGraph.js",
      "import": "/agi/particle_voice/nn/autodiff/GradientGraph.js",
      "sourceHash": "b2f0dd7bb7f7cf81a7edeedc69afc2719015be50a7c93af47f523ec6cde48882",
      "summary": "GradientGraph.js — Phase 1 ParticleNN autodiff STUB. **Not wired into anything until Phase 11.** The backward-pass analogue of `ParticleGraph.js`: nodes are backward-rule applications rather than forward kernels, gradient-tensor names rather than activation-tensor names. Reuses `ParticleGraph`'s DAG/topological-sort machinery directly (a gradient graph's dependency structure is a plain DAG exactly like a forward graph's — no different algorithm is needed) rather than duplicating it, and adds `accumulate()` for the one thing a gradient graph needs that a forward graph never does: multiple edges producing a gradient for the *same* tensor must sum, not overwrite (a tensor used as input to two or more forward ops receives a gradient contribution from each one).",
      "exports": [
        {
          "name": "GradientGraph",
          "kind": "class",
          "signature": "class GradientGraph extends ParticleGraph",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/autodiff/ParticleTape",
      "path": "agi/reference/particle_voice/nn/autodiff/ParticleTape.md",
      "source": "agi/particle_voice/nn/autodiff/ParticleTape.js",
      "import": "/agi/particle_voice/nn/autodiff/ParticleTape.js",
      "sourceHash": "3efdfbe05c920def939bd97d89c68c81aed888637fded444b3929087e226a713",
      "summary": "ParticleTape.js — Phase 1 ParticleNN autodiff STUB. **Not wired into anything until Phase 11** (browser training), per the plan's explicit phasing. This establishes the recording-tape contract a future forward pass will write to and `BackwardGraphCompiler.js` will read from — it is NOT exercised by any real training loop yet (R7's training spike used its own hand-wired `TinyAutodiff.js`, deliberately separate from this production module). Records forward-pass operations (op name, input tensor names, output tensor names, and any params the backward rule will need) in execution order, reverse-mode style.",
      "exports": [
        {
          "name": "ParticleTape",
          "kind": "class",
          "signature": "class ParticleTape",
          "summary": "ParticleTape.js — Phase 1 ParticleNN autodiff STUB. **Not wired into anything until Phase 11** (browser training), per the plan's explicit phasing. This establishes the recording-tape contract a future forward pass will write to and `BackwardGraphCompiler.js` will read from — it is NOT exercised by any real training loop yet (R7's training spike used its own hand-wired `TinyAutodiff.js`, deliberately separate from this production module). Records forward-pass operations (op name, input tensor names, output tensor names, and any params the backward rule will need) in execution order, reverse-mode style."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/core/ParticleGraph",
      "path": "agi/reference/particle_voice/nn/core/ParticleGraph.md",
      "source": "agi/particle_voice/nn/core/ParticleGraph.js",
      "import": "/agi/particle_voice/nn/core/ParticleGraph.js",
      "sourceHash": "15daeedd19bebde7375ffc386b807991182723149294f0651afc2f55a664f748",
      "summary": "ParticleGraph.js — Phase 1 ParticleNN core. The uncompiled neural compute graph a model author builds: named nodes with an `op` (must be in `PRNN-v0.md` §3's operator allowlist) and named input/output tensor slots. `PRNNCompiler.js` (Phase 2+) lowers a `ParticleGraph` into a `PRNN-v0` §8 execution plan / `ParticleProgram`; this file only builds and validates the DAG itself (topological sort, cycle/dangling-reference detection) — it does not compile or dispatch anything.",
      "exports": [
        {
          "name": "ParticleGraph",
          "kind": "class",
          "signature": "class ParticleGraph",
          "summary": "ParticleGraph.js — Phase 1 ParticleNN core. The uncompiled neural compute graph a model author builds: named nodes with an `op` (must be in `PRNN-v0.md` §3's operator allowlist) and named input/output tensor slots. `PRNNCompiler.js` (Phase 2+) lowers a `ParticleGraph` into a `PRNN-v0` §8 execution plan / `ParticleProgram`; this file only builds and validates the DAG itself (topological sort, cycle/dangling-reference detection) — it does not compile or dispatch anything."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/core/ParticleKernel",
      "path": "agi/reference/particle_voice/nn/core/ParticleKernel.md",
      "source": "agi/particle_voice/nn/core/ParticleKernel.js",
      "import": "/agi/particle_voice/nn/core/ParticleKernel.js",
      "sourceHash": "123b27d02c1efe426eafe37c3146f0102efc32d503fa815d16b80bb7c72ba380",
      "summary": "ParticleKernel.js — Phase 1 ParticleNN core. Kernel specialization: resolves a `KernelRegistry` entry + concrete params (`useShaderF16`, kernel-specific options like `eps`) into one ready-to-compile unit — WGSL source, entry point, workgroup size, and the explicit bind-group-layout entries `PipelineCache.js`/`KernelValidation.js` proved necessary for `f16` kernels (`DeviceContract-v0.md` §8).",
      "exports": [
        {
          "name": "ParticleKernel",
          "kind": "class",
          "signature": "class ParticleKernel",
          "summary": "ParticleKernel.js — Phase 1 ParticleNN core. Kernel specialization: resolves a `KernelRegistry` entry + concrete params (`useShaderF16`, kernel-specific options like `eps`) into one ready-to-compile unit — WGSL source, entry point, workgroup size, and the explicit bind-group-layout entries `PipelineCache.js`/`KernelValidation.js` proved necessary for `f16` kernels (`DeviceContract-v0.md` §8)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/core/ParticleModel",
      "path": "agi/reference/particle_voice/nn/core/ParticleModel.md",
      "source": "agi/particle_voice/nn/core/ParticleModel.js",
      "import": "/agi/particle_voice/nn/core/ParticleModel.js",
      "sourceHash": "3438a4ebf315d89dc8c95d3a698408c0f95b777d17cfec0682e88738769e8fd2",
      "summary": "ParticleModel.js — Phase 1 ParticleNN core. A loaded model container: a compiled `ParticleProgram` plus its weight memory (`WeightPageStore`/`WeightBindWindow`/`WeightPageUploader`) and `.prnn` header metadata, as one object. Deliberately thin scaffolding at Phase 1 — no real model exists yet (`PRNNReader.js`/`PRNNCompiler.js` that would actually produce one of these from a `.prnn` file are Phase 2+ work); this fixes the shape that loader will hand to callers.",
      "exports": [
        {
          "name": "ParticleModel",
          "kind": "class",
          "signature": "class ParticleModel",
          "summary": "ParticleModel.js — Phase 1 ParticleNN core. A loaded model container: a compiled `ParticleProgram` plus its weight memory (`WeightPageStore`/`WeightBindWindow`/`WeightPageUploader`) and `.prnn` header metadata, as one object. Deliberately thin scaffolding at Phase 1 — no real model exists yet (`PRNNReader.js`/`PRNNCompiler.js` that would actually produce one of these from a `.prnn` file are Phase 2+ work); this fixes the shape that loader will hand to callers."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/core/ParticleProgram",
      "path": "agi/reference/particle_voice/nn/core/ParticleProgram.md",
      "source": "agi/particle_voice/nn/core/ParticleProgram.js",
      "import": "/agi/particle_voice/nn/core/ParticleProgram.js",
      "sourceHash": "1a366f9296f31cdb985fd020356bda7fa5df1bcd347f893666ee22728b91a4ec",
      "summary": "ParticleProgram.js — Phase 1 ParticleNN core. A compiled dispatch sequence: `ParticleGraph`'s topological order lowered into an ordered list of `{ nodeId, kernel: ParticleKernel, inputs, outputs }` steps, one `ParticleKernel` per graph node. `compileAll()` builds every step's GPU pipeline via a shared `PipelineCache` up front (so first dispatch has no compile-stall); actually running the steps each frame is `NeuralExecutor.js`'s job, not this file's.",
      "exports": [
        {
          "name": "ParticleProgram",
          "kind": "class",
          "signature": "class ParticleProgram",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/core/ParticleTensor",
      "path": "agi/reference/particle_voice/nn/core/ParticleTensor.md",
      "source": "agi/particle_voice/nn/core/ParticleTensor.js",
      "import": "/agi/particle_voice/nn/core/ParticleTensor.js",
      "sourceHash": "14e6b39b5d77438d5628526ab3343ff90b8e96eb1d8e891e8c4427beb4586214",
      "summary": "ParticleTensor.js — Phase 1 ParticleNN core. GPU-resident tensor with explicit shape/strides/dtype/quant metadata. Mirrors `agi/tensor/Tensor.js`'s ownership/readback/dispose conventions (reference only, not imported at runtime — the plan requires ParticleNN to stay decoupled from the LLM runtime) but adds the metadata ParticleVoice actually needs: multiple dtypes (`f32`/`f16`/`i8`/`u32`) and optional per-block INT8 quantization scale/zero data alongside the raw buffer.",
      "exports": [
        {
          "name": "ParticleTensor",
          "kind": "class",
          "signature": "class ParticleTensor",
          "summary": "`quant`, when present, describes INT8 block quantization for `dtype: 'i8'` tensors: `{ scheme: 'int8-block', blockSize: u32, scales: Float32Array }` — one scale per `ceil(elementCount / blockSize)` block, dequantized as `value = i8Value * scales[blockIndex]` (zero-point-free, symmetric quantization; PRNN-v0's `dequant_int8` kernel implements this exact scheme — see `nn/kernels/quantization/dequant_int8.js`)."
        },
        {
          "name": "contiguousStrides",
          "kind": "function",
          "signature": "contiguousStrides(shape)",
          "summary": "Row-major contiguous strides for `shape` (element units, not bytes)."
        },
        {
          "name": "tensorElementCount",
          "kind": "function",
          "signature": "tensorElementCount(shape)",
          "summary": ""
        },
        {
          "name": "wrapReadbackBuffer",
          "kind": "function",
          "signature": "wrapReadbackBuffer(dtype, arrayBuffer, size)",
          "summary": "Wrap a raw readback `ArrayBuffer` in the correct typed-array view for `dtype`. Shared by `ParticleTensor` and `ParticleTensorView` so readback interpretation lives in exactly one place."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/core/ParticleTensorView",
      "path": "agi/reference/particle_voice/nn/core/ParticleTensorView.md",
      "source": "agi/particle_voice/nn/core/ParticleTensorView.js",
      "import": "/agi/particle_voice/nn/core/ParticleTensorView.js",
      "sourceHash": "16aa70b107f4a6b95b991ae206e4ff7d211c06dc2e2fb245883abef6bc2e4123",
      "summary": "ParticleTensorView.js — Phase 1 ParticleNN core. A zero-copy view over a parent `ParticleTensor`'s GPU buffer: a different logical shape/strides/byte-offset into the SAME underlying buffer, with no `device.queue` copy and no new buffer allocation. Used for things like binding a single weight page's sub-range, or reading one layer's slice out of a stacked activation tensor, without a `copyBufferToBuffer` pass.",
      "exports": [
        {
          "name": "ParticleTensorView",
          "kind": "class",
          "signature": "class ParticleTensorView",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/KernelRegistry",
      "path": "agi/reference/particle_voice/nn/kernels/KernelRegistry.md",
      "source": "agi/particle_voice/nn/kernels/KernelRegistry.js",
      "import": "/agi/particle_voice/nn/kernels/KernelRegistry.js",
      "sourceHash": "ebc1640bea74a31e76572d90ddf48518bd63f7c87855d72d61f41663d9534d19",
      "summary": "KernelRegistry.js — Phase 1 ParticleNN kernel infrastructure. Maps kernel name -> `shader(params)` generator, mirroring `agi/llm/kernels/KernelRegistry.js`'s design (reference only, not imported — same LLM-runtime-decoupling rule as `PipelineUtils.js`). Each generator here also declares `inputCount` (how many read-only storage bindings it expects before the single read_write output binding) so `createShaderModule`'s caller can build the matching explicit bind-group layout required for `useShaderF16` kernels (see `DeviceContract-v0.md` §8 / `KernelValidation.js`'s `createExplicitLayoutPipeline`) without re-deriving each kernel's binding count by hand.",
      "exports": [
        {
          "name": "KernelRegistry",
          "kind": "class",
          "signature": "class KernelRegistry",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/ShaderComposer",
      "path": "agi/reference/particle_voice/nn/kernels/ShaderComposer.md",
      "source": "agi/particle_voice/nn/kernels/ShaderComposer.js",
      "import": "/agi/particle_voice/nn/kernels/ShaderComposer.js",
      "sourceHash": "18282638eea21ae5e09e66e8c5d20c355144e57389352457ac632a0606ebc938",
      "summary": "ShaderComposer.js — Phase 1 ParticleNN kernel infrastructure. WGSL chunk composition with dependency resolution: register named chunks (each optionally depending on other chunks), then compose an ordered, deduplicated concatenation for a kernel body — so e.g. `int8_pack`'s `unpack_int8` is emitted exactly once even if two requested chunks both depend on it, and always appears before any chunk/body that calls it.",
      "exports": [
        {
          "name": "ShaderComposer",
          "kind": "class",
          "signature": "class ShaderComposer",
          "summary": "ShaderComposer.js — Phase 1 ParticleNN kernel infrastructure. WGSL chunk composition with dependency resolution: register named chunks (each optionally depending on other chunks), then compose an ordered, deduplicated concatenation for a kernel body — so e.g. `int8_pack`'s `unpack_int8` is emitted exactly once even if two requested chunks both depend on it, and always appears before any chunk/body that calls it."
        },
        {
          "name": "createDefaultShaderComposer",
          "kind": "function",
          "signature": "async createDefaultShaderComposer()",
          "summary": "Pre-registers the Phase 1 WGSL chunk set (`math_common`, `int8_pack`, `complex_math`) so a kernel generator can immediately `compose(['math_common', 'int8_pack'], body)` without registering each chunk itself. `f16_utils.js` has no WGSL fragment (it is a host-side-only JS<->f16 bit-conversion utility, per its own module doc) so it is not registered here."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/ShaderDiagnosticFormatter",
      "path": "agi/reference/particle_voice/nn/kernels/ShaderDiagnosticFormatter.md",
      "source": "agi/particle_voice/nn/kernels/ShaderDiagnosticFormatter.js",
      "import": "/agi/particle_voice/nn/kernels/ShaderDiagnosticFormatter.js",
      "sourceHash": "13b19634b694ecc98fc536dbfc72af1111e262398f0de662600f6dfe3b3897d7",
      "summary": "ShaderDiagnosticFormatter.js — Phase 1 ParticleNN kernel infrastructure. Formats `GPUCompilationMessage[]` (from `module.getCompilationInfo()`) into human-readable diagnostics, optionally resolving each message's line number through a `WGSLSourceMap` to name which chunk it came from — a strict superset of `PipelineUtils.js`'s `assertShaderCompiled` error text (which only reports line:col + message, no chunk attribution).",
      "exports": [
        {
          "name": "formatCompilationMessages",
          "kind": "function",
          "signature": "formatCompilationMessages(messages, { sourceMap = null } = {})",
          "summary": ""
        },
        {
          "name": "formatDiagnosticReport",
          "kind": "function",
          "signature": "formatDiagnosticReport(kernelName, messages, options = {})",
          "summary": ""
        },
        {
          "name": "formatErrorsOnly",
          "kind": "function",
          "signature": "formatErrorsOnly(kernelName, messages, options = {})",
          "summary": "Only the `type === 'error'` messages, formatted — the subset that should fail a build/test, distinct from warnings/info the caller may want to log but not fail on."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/WGSLSourceMap",
      "path": "agi/reference/particle_voice/nn/kernels/WGSLSourceMap.md",
      "source": "agi/particle_voice/nn/kernels/WGSLSourceMap.js",
      "import": "/agi/particle_voice/nn/kernels/WGSLSourceMap.js",
      "sourceHash": "e73066c5debd3b3a0c2c309f7adf24988d31a1fffbce8254d3876f6b1e85074b",
      "summary": "WGSLSourceMap.js — Phase 1 ParticleNN kernel infrastructure. Generated-WGSL-line -> originating-chunk mapping. Kernels compose WGSL from named chunks (`ShaderComposer.js`) plus their own body; when the GPU compiler reports an error at line N, this turns that bare line number back into \"which named chunk (or the kernel's own body) that line came from\" — the JS source itself isn't line-mapped (these are template literals, not a separate compilation step), but chunk attribution is usually enough to know where to look.",
      "exports": [
        {
          "name": "WGSLSourceMap",
          "kind": "class",
          "signature": "class WGSLSourceMap",
          "summary": "WGSLSourceMap.js — Phase 1 ParticleNN kernel infrastructure. Generated-WGSL-line -> originating-chunk mapping. Kernels compose WGSL from named chunks (`ShaderComposer.js`) plus their own body; when the GPU compiler reports an error at line N, this turns that bare line number back into \"which named chunk (or the kernel's own body) that line came from\" — the JS source itself isn't line-mapped (these are template literals, not a separate compilation step), but chunk attribution is usually enough to know where to look."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/WgslPreprocessor",
      "path": "agi/reference/particle_voice/nn/kernels/WgslPreprocessor.md",
      "source": "agi/particle_voice/nn/kernels/WgslPreprocessor.js",
      "import": "/agi/particle_voice/nn/kernels/WgslPreprocessor.js",
      "sourceHash": "694bb73ac6f6ee88cdad7dd6c31ebc171c47fa01a199061b9045dcdd18837c3b",
      "summary": "WgslPreprocessor.js — Phase 1 ParticleNN kernel infrastructure. Tagged template `wgsl\\`...\\`` supporting `#if`/`#else`/`#endif` and `#for`/`#endfor` directives, evaluated at kernel-generation time (trusted JS call sites only — this is code generation for the kernel author, not a user-input template engine, so a plain `Function` eval for `#if` expressions is an acceptable, deliberate choice here). Directive syntax (each directive must be alone on its own line): #if <jsExpression>      // evaluated with no closure — pre-interpolate #else                   //   values via `${...}` before the directive #endif                  //   line if the condition depends on a variable #for <name> in <start>..<end>   // half-open range, start/end integers #endfor                          // body may reference `#{name}` (a // literal placeholder distinct from // `${}`, since `${}` is already // resolved by template-literal // substitution before this runs)",
      "exports": [
        {
          "name": "preprocessWgsl",
          "kind": "function",
          "signature": "preprocessWgsl(source)",
          "summary": "Process `#if`/`#else`/`#endif` and `#for`/`#endfor` directives in a flat WGSL source string, line by line."
        },
        {
          "name": "wgsl",
          "kind": "function",
          "signature": "wgsl(strings, ...values)",
          "summary": "Tagged template: joins `strings`/`values` per normal template-literal semantics, then runs `preprocessWgsl` over the result."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/activation/silu_f16",
      "path": "agi/reference/particle_voice/nn/kernels/activation/silu_f16.md",
      "source": "agi/particle_voice/nn/kernels/activation/silu_f16.js",
      "import": "/agi/particle_voice/nn/kernels/activation/silu_f16.js",
      "sourceHash": "deb9b2192f65324386089c61c6330950cf7bbbe36a8bd92b801606b719a9fc2c",
      "summary": "activation/silu_f16.js — Phase 1 ParticleNN kernel. Elementwise SiLU (`x * sigmoid(x)`), composed from `chunks/math_common.js`'s `siluScalar` rather than re-deriving the sigmoid inline.",
      "exports": [
        {
          "name": "siluF16Shader",
          "kind": "function",
          "signature": "siluF16Shader({ useShaderF16 = false } = {})",
          "summary": ""
        },
        {
          "name": "SILU_F16_ENTRY_POINT",
          "kind": "constant",
          "signature": "SILU_F16_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "SILU_F16_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "SILU_F16_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/breath_reservoir",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/breath_reservoir.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/breath_reservoir.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/breath_reservoir.js",
      "sourceHash": "05c936a99ba1cc87307bce066c86376211bc53e62c2814b417ebdaf9f2d7588b",
      "summary": "breath_reservoir.js — Phase 2 ParticleNN articulatory kernel. First-order lag filter: `pressure[n] = pressure[n-1] + (target[n] - pressure[n-1]) * lag_rate`, matching `risk/BreathReservoir.js` (R6A)'s proven recurrence exactly (`lag_rate = 1 - exp(-1/(compliance*sampleRate))` is computed by the caller and passed in, not recomputed here). A first-order IIR recurrence is inherently sequential in time, but each of up to N simultaneous voice/capsule *instances* is fully independent — `workgroup_id.x` selects the instance, and a single thread per workgroup walks that instance's whole chunk sequentially (cheap: a chunk is a few hundred samples, and GPU dispatch overhead dominates at that size anyway, so there is nothing to gain from parallelizing within one instance's strictly-sequential recurrence).",
      "exports": [
        {
          "name": "breathReservoirShader",
          "kind": "function",
          "signature": "breathReservoirShader()",
          "summary": ""
        },
        {
          "name": "BREATH_RESERVOIR_ENTRY_POINT",
          "kind": "constant",
          "signature": "BREATH_RESERVOIR_ENTRY_POINT",
          "summary": "breath_reservoir.js — Phase 2 ParticleNN articulatory kernel. First-order lag filter: `pressure[n] = pressure[n-1] + (target[n] - pressure[n-1]) * lag_rate`, matching `risk/BreathReservoir.js` (R6A)'s proven recurrence exactly (`lag_rate = 1 - exp(-1/(compliance*sampleRate))` is computed by the caller and passed in, not recomputed here). A first-order IIR recurrence is inherently sequential in time, but each of up to N simultaneous voice/capsule *instances* is fully independent — `workgroup_id.x` selects the instance, and a single thread per workgroup walks that instance's whole chunk sequentially (cheap: a chunk is a few hundred samples, and GPU dispatch overhead dominates at that size anyway, so there is nothing to gain from parallelizing within one instance's strictly-sequential recurrence)."
        },
        {
          "name": "BREATH_RESERVOIR_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "BREATH_RESERVOIR_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/constriction_noise",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/constriction_noise.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/constriction_noise.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/constriction_noise.js",
      "sourceHash": "ef910ca35007fa674e4288bc74ad062b4fb9b6d3606345153ed74d567a4a72e7",
      "summary": "constriction_noise.js — Phase 2 ParticleNN articulatory kernel. Turbulence/frication noise generator for a chosen internal tract junction (fricatives, plosive bursts) — deliberately a SEPARATE kernel from `speech/noise_source.js` rather than reusing it directly, because the two have genuinely different shapes: `noise_source.js` generates one flat, constant-amplitude signal for the whole dispatch (aspiration noise mixed at the glottis, `risk/GlottalSource.js` (R6)'s `aspirationLevel`), while frication noise needs a per-sample, per-instance TIME-VARYING amplitude envelope (driven by how tightly a constriction is formed, which changes continuously as an articulator moves) and per-instance start index/seed so N simultaneous voices/characters never share correlated turbulence. Sharing the same underlying hash rather than inventing a second one is still correct reuse: `noise_at()` below is the identical two-round Murmur-style avalanche hash as `noise_source.js`/ `risk/GlottalSource.js`'s `noiseAt` (same technique as `StreamingContinuitySource.js`), just applied per-instance with an amplitude that varies per output sample instead of being a single dispatch-wide uniform scalar. `tract_waveguide.js` does not (yet) consume this kernel's output at a `constrictionIndex` internally (its own docstring flags that as deferred, matching R6's `step()`'s own `constrictionIndex`/ `constrictionNoiseSample` option) — this kernel only produces the turbulence signal; injecting it into a specific internal tract junction is a `ParticleTract` orchestration concern for a later phase, once the model that decides the constriction's time-varying amplitude envelope exists. Three spectral shapes are supported: - `direct` `noise_at()` (flat/white-ish), the default reference; - `lowpass` block-interpolated `noise_at()` for glottal aspiration, giving the noise a predominantly low-frequency, breathy character rather than a hissy fricative one; - `derivative` first-differenced `noise_at()` (blue, +6 dB/octave) for oral frication and plosive bursts, where the high-frequency emphasis makes consonants like /s/ and /t/ pop without changing the vowel source.",
      "exports": [
        {
          "name": "constrictionNoiseShader",
          "kind": "function",
          "signature": "constrictionNoiseShader({ spectralShape = 'direct', lowpassHold = 32 } = {})",
          "summary": ""
        },
        {
          "name": "CONSTRICTION_NOISE_ENTRY_POINT",
          "kind": "constant",
          "signature": "CONSTRICTION_NOISE_ENTRY_POINT",
          "summary": "constriction_noise.js — Phase 2 ParticleNN articulatory kernel. Turbulence/frication noise generator for a chosen internal tract junction (fricatives, plosive bursts) — deliberately a SEPARATE kernel from `speech/noise_source.js` rather than reusing it directly, because the two have genuinely different shapes: `noise_source.js` generates one flat, constant-amplitude signal for the whole dispatch (aspiration noise mixed at the glottis, `risk/GlottalSource.js` (R6)'s `aspirationLevel`), while frication noise needs a per-sample, per-instance TIME-VARYING amplitude envelope (driven by how tightly a constriction is formed, which changes continuously as an articulator moves) and per-instance start index/seed so N simultaneous voices/characters never share correlated turbulence. Sharing the same underlying hash rather than inventing a second one is still correct reuse: `noise_at()` below is the identical two-round Murmur-style avalanche hash as `noise_source.js`/ `risk/GlottalSource.js`'s `noiseAt` (same technique as `StreamingContinuitySource.js`), just applied per-instance with an amplitude that varies per output sample instead of being a single dispatch-wide uniform scalar. `tract_waveguide.js` does not (yet) consume this kernel's output at a `constrictionIndex` internally (its own docstring flags that as deferred, matching R6's `step()`'s own `constrictionIndex`/ `constrictionNoiseSample` option) — this kernel only produces the turbulence signal; injecting it into a specific internal tract junction is a `ParticleTract` orchestration concern for a later phase, once the model that decides the constriction's time-varying amplitude envelope exists. Three spectral shapes are supported: - `direct` `noise_at()` (flat/white-ish), the default reference; - `lowpass` block-interpolated `noise_at()` for glottal aspiration, giving the noise a predominantly low-frequency, breathy character rather than a hissy fricative one; - `derivative` first-differenced `noise_at()` (blue, +6 dB/octave) for oral frication and plosive bursts, where the high-frequency emphasis makes consonants like /s/ and /t/ pop without changing the vowel source."
        },
        {
          "name": "CONSTRICTION_NOISE_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "CONSTRICTION_NOISE_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/glottal_lf",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/glottal_lf.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/glottal_lf.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/glottal_lf.js",
      "sourceHash": "1310ff7266290c426809da09eb2155d5b5b5f8cad49461cf445230069c1aca8c",
      "summary": "glottal_lf.js — Phase 2 ParticleNN articulatory kernel. The full Liljencrants-Fant (LF) glottal flow DERIVATIVE model, replacing `speech/harmonic_source.js`'s raised-cosine \"LF-lite\" stand-in (`risk/GlottalSource.js` (R6)'s own docstring calls that shape a deliberate simplification and names `articulatory/glottal_lf.js` as the real implementation it stands in for). Per period, given control instants Te (glottal closure / main excitation, 0 < Te < T0), Tp (peak-flow instant, 0 < Tp < Te), Ta (return-phase time constant), and Ee (excitation strength), the classic two-segment LF waveform is: E(t) = E0 * exp(alpha*t) * sin(wg*t)                            0<=t<Te E(t) = -(Ee/(eps*Ta)) * (exp(-eps*(t-Te)) - exp(-eps*(T0-Te)))  Te<=t<T0 with `wg = pi/Tp`. `E0`, `alpha`, and `eps` are NOT free parameters — they are pinned by three physical constraints this file's author derived and verified algebraically (rather than recalling a textbook formula from memory, to avoid presenting an unverified transcendental equation as fact): 1. Boundary match at Te: E(Te-) = -Ee, giving `E0 = -Ee / (exp(alpha*Te) * sin(wg*Te))`. 2. `eps` solves `eps*Ta = 1 - exp(-eps*(T0-Te))` (the standard LF return-phase time-constant equation) via Newton-Raphson with the exact analytic derivative `f(eps)=eps*Ta-1+exp(-eps*(T0-Te))`, `f'(eps)=Ta-(T0-Te)*exp(-eps*(T0-Te))`, started at `eps0=1/Ta`. 3. `alpha` solves the area-balance constraint (glottal flow is periodic, so its derivative integrates to zero over one full period): substituting constraint 1 into the closed-form `int[0,Te] E0*exp(alpha*t)*sin(wg*t) dt` (standard `exp(at)sin(bt)` antiderivative) and the closed-form return-phase integral (simplified using constraint 2) gives `Area(alpha) = -Ee/sin(wg*Te) * N(alpha)/D(alpha)` where `N(alpha) = alpha*sin(wg*Te) - wg*cos(wg*Te) + wg*exp(-alpha*Te)` and `D(alpha) = alpha^2 + wg^2`; this is solved for `Area(alpha) = Ee/eps - Ee*(T0-Te)*exp(-eps*(T0-Te))/(eps*Ta)` via Newton-Raphson using the exact analytic derivative of `N/D` (quotient rule from `N'(alpha) = sin(wg*Te) - wg*Te*exp(-alpha*Te)`, `D'(alpha) = 2*alpha`), started at `alpha0 = 0` (a safe, singularity- free starting point: `D(0) = wg^2 != 0`). Both Newton solves run for a fixed, generous iteration count (8 each) — cheap scalar math, and every thread in this kernel redoes the same per-instance solve redundantly rather than solving once and broadcasting through workgroup memory: unlike `tract_waveguide.js`'s per-sample recurrence, LF generation has NO cross-sample dependency at all (like `harmonic_source.js`/`noise_source.js`), so the simplest correct design is one thread per (instance, sample) output element, matching those kernels' flat-parallel convention exactly. If per-period solve cost ever matters at scale, hoisting it into its own once-per-instance kernel (mirroring `tract_transfer.js`'s role for `tract_waveguide.js`) is a straightforward follow-up, not a design change. Every control instant is expressed in SAMPLES (not seconds), matching `harmonic_source.js`'s `period_samples`/`open_samples`/`start_phase` convention and this kernel's own absolute-sample-counter continuity requirement across chunk boundaries.",
      "exports": [
        {
          "name": "solveLfShapeParameters",
          "kind": "function",
          "signature": "solveLfShapeParameters({ t0, te, tp, ta, ee })",
          "summary": "CPU-side reference implementation of the exact same closed-form/Newton- Raphson math the WGSL kernel below runs — used by the parity test and documented here as the canonical derivation any future GPU-side per-instance solve kernel (see docstring) must also match bit-for-bit in structure (same iteration count, same starting values)."
        },
        {
          "name": "evaluateLfSample",
          "kind": "function",
          "signature": "evaluateLfSample(cyclePos, { t0, te, ta, ee, wg, eps, alpha, e0 })",
          "summary": "CPU-side reference for a single sample's LF value, given already-solved shape parameters — matches the WGSL kernel's per-sample branch exactly."
        },
        {
          "name": "glottalLfShader",
          "kind": "function",
          "signature": "glottalLfShader()",
          "summary": ""
        },
        {
          "name": "GLOTTAL_LF_ENTRY_POINT",
          "kind": "constant",
          "signature": "GLOTTAL_LF_ENTRY_POINT",
          "summary": "glottal_lf.js — Phase 2 ParticleNN articulatory kernel. The full Liljencrants-Fant (LF) glottal flow DERIVATIVE model, replacing `speech/harmonic_source.js`'s raised-cosine \"LF-lite\" stand-in (`risk/GlottalSource.js` (R6)'s own docstring calls that shape a deliberate simplification and names `articulatory/glottal_lf.js` as the real implementation it stands in for). Per period, given control instants Te (glottal closure / main excitation, 0 < Te < T0), Tp (peak-flow instant, 0 < Tp < Te), Ta (return-phase time constant), and Ee (excitation strength), the classic two-segment LF waveform is: E(t) = E0 * exp(alpha*t) * sin(wg*t)                            0<=t<Te E(t) = -(Ee/(eps*Ta)) * (exp(-eps*(t-Te)) - exp(-eps*(T0-Te)))  Te<=t<T0 with `wg = pi/Tp`. `E0`, `alpha`, and `eps` are NOT free parameters — they are pinned by three physical constraints this file's author derived and verified algebraically (rather than recalling a textbook formula from memory, to avoid presenting an unverified transcendental equation as fact): 1. Boundary match at Te: E(Te-) = -Ee, giving `E0 = -Ee / (exp(alpha*Te) * sin(wg*Te))`. 2. `eps` solves `eps*Ta = 1 - exp(-eps*(T0-Te))` (the standard LF return-phase time-constant equation) via Newton-Raphson with the exact analytic derivative `f(eps)=eps*Ta-1+exp(-eps*(T0-Te))`, `f'(eps)=Ta-(T0-Te)*exp(-eps*(T0-Te))`, started at `eps0=1/Ta`. 3. `alpha` solves the area-balance constraint (glottal flow is periodic, so its derivative integrates to zero over one full period): substituting constraint 1 into the closed-form `int[0,Te] E0*exp(alpha*t)*sin(wg*t) dt` (standard `exp(at)sin(bt)` antiderivative) and the closed-form return-phase integral (simplified using constraint 2) gives `Area(alpha) = -Ee/sin(wg*Te) * N(alpha)/D(alpha)` where `N(alpha) = alpha*sin(wg*Te) - wg*cos(wg*Te) + wg*exp(-alpha*Te)` and `D(alpha) = alpha^2 + wg^2`; this is solved for `Area(alpha) = Ee/eps - Ee*(T0-Te)*exp(-eps*(T0-Te))/(eps*Ta)` via Newton-Raphson using the exact analytic derivative of `N/D` (quotient rule from `N'(alpha) = sin(wg*Te) - wg*Te*exp(-alpha*Te)`, `D'(alpha) = 2*alpha`), started at `alpha0 = 0` (a safe, singularity- free starting point: `D(0) = wg^2 != 0`). Both Newton solves run for a fixed, generous iteration count (8 each) — cheap scalar math, and every thread in this kernel redoes the same per-instance solve redundantly rather than solving once and broadcasting through workgroup memory: unlike `tract_waveguide.js`'s per-sample recurrence, LF generation has NO cross-sample dependency at all (like `harmonic_source.js`/`noise_source.js`), so the simplest correct design is one thread per (instance, sample) output element, matching those kernels' flat-parallel convention exactly. If per-period solve cost ever matters at scale, hoisting it into its own once-per-instance kernel (mirroring `tract_transfer.js`'s role for `tract_waveguide.js`) is a straightforward follow-up, not a design change. Every control instant is expressed in SAMPLES (not seconds), matching `harmonic_source.js`'s `period_samples`/`open_samples`/`start_phase` convention and this kernel's own absolute-sample-counter continuity requirement across chunk boundaries."
        },
        {
          "name": "GLOTTAL_LF_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "GLOTTAL_LF_WORKGROUP_SIZE",
          "summary": ""
        },
        {
          "name": "GLOTTAL_LF_NEWTON_ITERATIONS",
          "kind": "constant",
          "signature": "GLOTTAL_LF_NEWTON_ITERATIONS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/lip_radiation",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/lip_radiation.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/lip_radiation.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/lip_radiation.js",
      "sourceHash": "10e584e9e268e4f325ffe169025591a1516586c2a40788083d0eddd2b222be06",
      "summary": "lip_radiation.js — Phase 2 ParticleNN articulatory kernel. Idealized lip-radiation filter: a first difference, `radiated[n] = raw[n] - raw[n-1]`, matching `risk/KellyLochbaumWaveguide.js` (R6)'s `step()` exactly (`radiated = outputRaw - prevOutputRaw`) — the differentiating characteristic of radiation from an open end. Despite being defined via a one-sample recurrence, this is embarrassingly parallel: `raw[n-1]` for `n > 0` is just the previous element of the *same* input buffer (already fully computed, no accumulation), and only `n = 0` needs externally-supplied state (`prev_last_sample`, the previous chunk's final raw sample) — so every output sample can be computed independently with no sequential loop at all.",
      "exports": [
        {
          "name": "lipRadiationShader",
          "kind": "function",
          "signature": "lipRadiationShader()",
          "summary": ""
        },
        {
          "name": "LIP_RADIATION_ENTRY_POINT",
          "kind": "constant",
          "signature": "LIP_RADIATION_ENTRY_POINT",
          "summary": "lip_radiation.js — Phase 2 ParticleNN articulatory kernel. Idealized lip-radiation filter: a first difference, `radiated[n] = raw[n] - raw[n-1]`, matching `risk/KellyLochbaumWaveguide.js` (R6)'s `step()` exactly (`radiated = outputRaw - prevOutputRaw`) — the differentiating characteristic of radiation from an open end. Despite being defined via a one-sample recurrence, this is embarrassingly parallel: `raw[n-1]` for `n > 0` is just the previous element of the *same* input buffer (already fully computed, no accumulation), and only `n = 0` needs externally-supplied state (`prev_last_sample`, the previous chunk's final raw sample) — so every output sample can be computed independently with no sequential loop at all."
        },
        {
          "name": "LIP_RADIATION_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "LIP_RADIATION_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/nasal_junction",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/nasal_junction.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/nasal_junction.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/nasal_junction.js",
      "sourceHash": "734baaf1aa299d5c3bd78778865ce973467b8a232da59f37376895aff24d4d59",
      "summary": "nasal_junction.js — Phase 2 ParticleNN articulatory kernel. Production nasal branch: a second, independent Kelly-Lochbaum tube chain generalizing risk/KellyLochbaumWaveguide.js (R6)'s proven createNasalBranch().step() to run a whole sample chunk times N instances on GPU, using the exact same one-thread-per-section / double-buffered-workgroup-memory / sequential-workgroupBarrier-per-sample structure as tract_waveguide.js (see that file's docstring for the full parallelization rationale, not repeated here). Differences from tract_waveguide.js's oral tract, matching R6's createNasalBranch() exactly: - The near end has no reflection term at all: nextRight[0] = inputFlow (R6's oral tract instead does sourceFlow + glottalReflection * left[0]) — the nasal branch is driven directly by a coupled fraction of an oral-tract tap signal, not its own glottal source. - The far end uses a single nostrilReflection coefficient (R6's lipReflection equivalent). `radiation_difference` selects whether the first-difference radiation filter is applied: 1.0 for R6's flow-domain parity path, 0.0 for ParticleTract's LF-derivative-domain production path. This kernel does not itself compute the oral-tract tap signal fed into inputFlow — that is tract_waveguide.js's nasal_tap output block, and inputFlow is an ordinary per-instance per-sample input buffer here, matching every other Phase 2 kernel's convention of not silently reaching into another kernel's state. input_gain is the velum/nasal COUPLING fraction. R6's createNasalBranch() has no such parameter because its caller pre-multiplied the tap signal (nasalCoupling * nasalTapSignal) before calling step(). On GPU that would force either a whole extra scaling kernel or a CPU round-trip in the middle of an otherwise GPU-resident chunk, so the scalar lives here instead — exactly where this file's own docstring already says the branch is \"driven by a coupled fraction of an oral-tract tap signal\". input_gain = 1.0 reproduces R6's step() bit-for-bit, which is what the parity test in phase2-dsp.html pins.",
      "exports": [
        {
          "name": "nasalJunctionOutputLayout",
          "kind": "function",
          "signature": "nasalJunctionOutputLayout(numSections, numSamples, numInstances)",
          "summary": "Shared flat-output-buffer layout — mirrors tractWaveguideOutputLayout() exactly (same three persisted-state pieces plus the radiated signal), kept as its own function per kernel so a future layout change to one tract type can never silently affect the other."
        },
        {
          "name": "nasalJunctionShader",
          "kind": "function",
          "signature": "nasalJunctionShader()",
          "summary": ""
        },
        {
          "name": "NASAL_JUNCTION_MAX_SECTIONS",
          "kind": "constant",
          "signature": "NASAL_JUNCTION_MAX_SECTIONS",
          "summary": "nasal_junction.js — Phase 2 ParticleNN articulatory kernel. Production nasal branch: a second, independent Kelly-Lochbaum tube chain generalizing risk/KellyLochbaumWaveguide.js (R6)'s proven createNasalBranch().step() to run a whole sample chunk times N instances on GPU, using the exact same one-thread-per-section / double-buffered-workgroup-memory / sequential-workgroupBarrier-per-sample structure as tract_waveguide.js (see that file's docstring for the full parallelization rationale, not repeated here). Differences from tract_waveguide.js's oral tract, matching R6's createNasalBranch() exactly: - The near end has no reflection term at all: nextRight[0] = inputFlow (R6's oral tract instead does sourceFlow + glottalReflection * left[0]) — the nasal branch is driven directly by a coupled fraction of an oral-tract tap signal, not its own glottal source. - The far end uses a single nostrilReflection coefficient (R6's lipReflection equivalent). `radiation_difference` selects whether the first-difference radiation filter is applied: 1.0 for R6's flow-domain parity path, 0.0 for ParticleTract's LF-derivative-domain production path. This kernel does not itself compute the oral-tract tap signal fed into inputFlow — that is tract_waveguide.js's nasal_tap output block, and inputFlow is an ordinary per-instance per-sample input buffer here, matching every other Phase 2 kernel's convention of not silently reaching into another kernel's state. input_gain is the velum/nasal COUPLING fraction. R6's createNasalBranch() has no such parameter because its caller pre-multiplied the tap signal (nasalCoupling * nasalTapSignal) before calling step(). On GPU that would force either a whole extra scaling kernel or a CPU round-trip in the middle of an otherwise GPU-resident chunk, so the scalar lives here instead — exactly where this file's own docstring already says the branch is \"driven by a coupled fraction of an oral-tract tap signal\". input_gain = 1.0 reproduces R6's step() bit-for-bit, which is what the parity test in phase2-dsp.html pins."
        },
        {
          "name": "NASAL_JUNCTION_ENTRY_POINT",
          "kind": "constant",
          "signature": "NASAL_JUNCTION_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "NASAL_JUNCTION_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "NASAL_JUNCTION_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/physiology_feedback_reduce",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/physiology_feedback_reduce.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/physiology_feedback_reduce.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/physiology_feedback_reduce.js",
      "sourceHash": "19003236581791c2a69dadf65ea6522e6b74738663abdc10aec1fc76f5f0b08c",
      "summary": "physiology_feedback_reduce.js — Phase 2 ParticleNN articulatory kernel. Reduces a high-rate (32 kHz per `ARCHITECTURE.md` §3) per-sample waveguide/tract signal (e.g. `tract_waveguide.js`'s radiated output, or a raw right/left traveling-wave channel) down to one (mean, RMS) pair per fixed-size frame — the `PhysiologyFeedbackState` `ARCHITECTURE.md` §4 names as \"a reduced/decimated feedback signal from the acoustic solve back toward the model\", so the model's control-rate loop (100 Hz per `ARCHITECTURE.md` §3) can see a compact summary of what the acoustic solver actually produced last frame without reading back and processing the full high-rate PCM itself. `samples_per_frame` is expected to be one of the plan's fixed legal chunk buckets (first 12/16/24 frames, steady 32/48/64 frames at the activity frame size, or a caller-chosen block size for this specific feedback path) — this kernel does not itself enforce bucket membership, it just requires `num_samples == num_frames * samples_per_frame` exactly (no partial trailing frame), matching every other Phase 2 kernel's expectation that framing/bucketing is decided by the caller (`stft.js`/`overlap_add.js` take the same stance). One thread per (instance, frame) pair does its own small sequential reduction over `samples_per_frame` samples — deliberately not a parallel-reduction tree, since typical frame sizes here (tens to a few hundred samples) are small enough that per-thread sequential summation is simpler and cheaper than the synchronization a tree reduction would need, the same reasoning `breath_reservoir.js`'s per-instance single-thread recurrence gives for its own necessarily-sequential loop (this kernel's reduction isn't sequential for correctness, just small enough that a loop is the pragmatic choice).",
      "exports": [
        {
          "name": "physiologyFeedbackReduceOutputLayout",
          "kind": "function",
          "signature": "physiologyFeedbackReduceOutputLayout(numFrames, numInstances)",
          "summary": "Packed-output layout: [mean block (num_instances*num_frames)] then [rms block (num_instances*num_frames)] — kept as its own function so the WGSL offsets and any JS-side reader stay in lockstep, matching `tractWaveguideOutputLayout()`'s precedent."
        },
        {
          "name": "physiologyFeedbackReduceShader",
          "kind": "function",
          "signature": "physiologyFeedbackReduceShader()",
          "summary": ""
        },
        {
          "name": "PHYSIOLOGY_FEEDBACK_REDUCE_ENTRY_POINT",
          "kind": "constant",
          "signature": "PHYSIOLOGY_FEEDBACK_REDUCE_ENTRY_POINT",
          "summary": "physiology_feedback_reduce.js — Phase 2 ParticleNN articulatory kernel. Reduces a high-rate (32 kHz per `ARCHITECTURE.md` §3) per-sample waveguide/tract signal (e.g. `tract_waveguide.js`'s radiated output, or a raw right/left traveling-wave channel) down to one (mean, RMS) pair per fixed-size frame — the `PhysiologyFeedbackState` `ARCHITECTURE.md` §4 names as \"a reduced/decimated feedback signal from the acoustic solve back toward the model\", so the model's control-rate loop (100 Hz per `ARCHITECTURE.md` §3) can see a compact summary of what the acoustic solver actually produced last frame without reading back and processing the full high-rate PCM itself. `samples_per_frame` is expected to be one of the plan's fixed legal chunk buckets (first 12/16/24 frames, steady 32/48/64 frames at the activity frame size, or a caller-chosen block size for this specific feedback path) — this kernel does not itself enforce bucket membership, it just requires `num_samples == num_frames * samples_per_frame` exactly (no partial trailing frame), matching every other Phase 2 kernel's expectation that framing/bucketing is decided by the caller (`stft.js`/`overlap_add.js` take the same stance). One thread per (instance, frame) pair does its own small sequential reduction over `samples_per_frame` samples — deliberately not a parallel-reduction tree, since typical frame sizes here (tens to a few hundred samples) are small enough that per-thread sequential summation is simpler and cheaper than the synchronization a tree reduction would need, the same reasoning `breath_reservoir.js`'s per-instance single-thread recurrence gives for its own necessarily-sequential loop (this kernel's reduction isn't sequential for correctness, just small enough that a loop is the pragmatic choice)."
        },
        {
          "name": "PHYSIOLOGY_FEEDBACK_REDUCE_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "PHYSIOLOGY_FEEDBACK_REDUCE_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/signal_add",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/signal_add.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/signal_add.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/signal_add.js",
      "sourceHash": "63ef0eb74c68d996aad31679a2b66ace574c90f5c541d582437772da18c423b3",
      "summary": "signal_add.js — Phase 2 ParticleNN articulatory kernel. Elementwise sum of two equal-shaped signals: `out[i] = a[i] + b[i]`. `ParticleTract.js` needs exactly this twice, at the two points its signal graph merges: 1. **Glottal source mix** — `voicing` (`glottal_lf.js`) + `aspiration` (`constriction_noise.js` with a slowly-varying envelope) into the `source_flow` that `tract_waveguide.js` injects at the glottis. 2. **Output mix** — the oral tract's `radiated` signal plus the nasal branch's `radiated` signal (`nasal_junction.js`, already scaled by its own `input_gain` coupling), producing the final PCM. Note that FRICATION is deliberately NOT a third term here. Turbulence belongs at the constriction, not the glottis, so it is fed to `tract_waveguide.js`'s `constriction_noise` input and injected at `constriction_index` — only the cavity in front of the constriction then filters it, which is what makes a fricative sound like a fricative rather than a whisper. That is why this kernel takes two inputs and not three. This kernel exists because nothing in the registry could do it. There was no elementwise-add op, and `speech/crossfade.js` — the only existing two-signal combiner — is NOT a mixer: it sweeps its ratio across the buffer (`t = i/(length-1)`), making it a one-shot transition. Using it here would ramp the voicing/aspiration balance from 0 to 1 across every chunk. There are no gain inputs, deliberately: every amplitude this could scale is already a first-class parameter of the kernel that PRODUCES the term — `glottal_lf.js`'s per-instance `ee`, `constriction_noise.js`'s per-sample `amplitude_envelope`, and `nasal_junction.js`'s `input_gain`. Duplicating that control here would invite the two copies to disagree. Flat-parallel with no cross-sample dependency (one thread per output element), matching `lip_radiation.js`/`constriction_noise.js`. Instance layout is implicit: the caller passes `total_elements = num_instances * num_samples` and both inputs share the same `[num_instances, num_samples]` row-major shape, so no per-instance indexing is needed at all.",
      "exports": [
        {
          "name": "signalAddShader",
          "kind": "function",
          "signature": "signalAddShader()",
          "summary": ""
        },
        {
          "name": "SIGNAL_ADD_ENTRY_POINT",
          "kind": "constant",
          "signature": "SIGNAL_ADD_ENTRY_POINT",
          "summary": "signal_add.js — Phase 2 ParticleNN articulatory kernel. Elementwise sum of two equal-shaped signals: `out[i] = a[i] + b[i]`. `ParticleTract.js` needs exactly this twice, at the two points its signal graph merges: 1. **Glottal source mix** — `voicing` (`glottal_lf.js`) + `aspiration` (`constriction_noise.js` with a slowly-varying envelope) into the `source_flow` that `tract_waveguide.js` injects at the glottis. 2. **Output mix** — the oral tract's `radiated` signal plus the nasal branch's `radiated` signal (`nasal_junction.js`, already scaled by its own `input_gain` coupling), producing the final PCM. Note that FRICATION is deliberately NOT a third term here. Turbulence belongs at the constriction, not the glottis, so it is fed to `tract_waveguide.js`'s `constriction_noise` input and injected at `constriction_index` — only the cavity in front of the constriction then filters it, which is what makes a fricative sound like a fricative rather than a whisper. That is why this kernel takes two inputs and not three. This kernel exists because nothing in the registry could do it. There was no elementwise-add op, and `speech/crossfade.js` — the only existing two-signal combiner — is NOT a mixer: it sweeps its ratio across the buffer (`t = i/(length-1)`), making it a one-shot transition. Using it here would ramp the voicing/aspiration balance from 0 to 1 across every chunk. There are no gain inputs, deliberately: every amplitude this could scale is already a first-class parameter of the kernel that PRODUCES the term — `glottal_lf.js`'s per-instance `ee`, `constriction_noise.js`'s per-sample `amplitude_envelope`, and `nasal_junction.js`'s `input_gain`. Duplicating that control here would invite the two copies to disagree. Flat-parallel with no cross-sample dependency (one thread per output element), matching `lip_radiation.js`/`constriction_noise.js`. Instance layout is implicit: the caller passes `total_elements = num_instances * num_samples` and both inputs share the same `[num_instances, num_samples]` row-major shape, so no per-instance indexing is needed at all."
        },
        {
          "name": "SIGNAL_ADD_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "SIGNAL_ADD_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/tract_transfer",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/tract_transfer.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/tract_transfer.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/tract_transfer.js",
      "sourceHash": "847c47587a8d0f908359c38795230967cd94abde570e5b705bb35eab1adda1c7",
      "summary": "tract_transfer.js — Phase 2 ParticleNN articulatory kernel. Converts a per-instance tube cross-sectional area profile into Kelly- Lochbaum junction reflection coefficients — the exact formula `risk/KellyLochbaumWaveguide.js` (R6)'s proven `reflectionCoefficients()` uses: `k[i] = (A[i] - A[i+1]) / (A[i] + A[i+1] + 1e-6)`. `tract_waveguide.js`'s own docstring notes junction coefficients are \"computed CPU-side by the caller... not recomputed here\", matching `mel_filterbank.js`'s precedent for a fixed-shape precomputation — that is still correct for a STATIC area profile. This kernel exists for the case the plan's `NeuralPhysiologyState.TractGestureHead` implies: an area profile predicted fresh every control frame (100 Hz per `ARCHITECTURE.md` §3), which would otherwise force a GPU-to-CPU-to-GPU round trip every frame just to run one elementwise division — exactly the per-frame readback stall the plan's Production Contract and `engine/core/gpu/VGPUReadbackQueue.js`-style staged-readback convention are meant to avoid. Keeping the whole `TractGestureHead -> junction_k -> tract_waveguide.js` path on GPU is what \"single owned execution path\" requires once area profiles become per-frame instead of per-utterance. Purely elementwise across `(instance, junction)` pairs — no inter-junction dependency at all (unlike `tract_waveguide.js`'s per-sample recurrence), so this is one thread per output element with no workgroup memory or barriers needed.",
      "exports": [
        {
          "name": "tractTransferShader",
          "kind": "function",
          "signature": "tractTransferShader()",
          "summary": ""
        },
        {
          "name": "TRACT_TRANSFER_ENTRY_POINT",
          "kind": "constant",
          "signature": "TRACT_TRANSFER_ENTRY_POINT",
          "summary": "tract_transfer.js — Phase 2 ParticleNN articulatory kernel. Converts a per-instance tube cross-sectional area profile into Kelly- Lochbaum junction reflection coefficients — the exact formula `risk/KellyLochbaumWaveguide.js` (R6)'s proven `reflectionCoefficients()` uses: `k[i] = (A[i] - A[i+1]) / (A[i] + A[i+1] + 1e-6)`. `tract_waveguide.js`'s own docstring notes junction coefficients are \"computed CPU-side by the caller... not recomputed here\", matching `mel_filterbank.js`'s precedent for a fixed-shape precomputation — that is still correct for a STATIC area profile. This kernel exists for the case the plan's `NeuralPhysiologyState.TractGestureHead` implies: an area profile predicted fresh every control frame (100 Hz per `ARCHITECTURE.md` §3), which would otherwise force a GPU-to-CPU-to-GPU round trip every frame just to run one elementwise division — exactly the per-frame readback stall the plan's Production Contract and `engine/core/gpu/VGPUReadbackQueue.js`-style staged-readback convention are meant to avoid. Keeping the whole `TractGestureHead -> junction_k -> tract_waveguide.js` path on GPU is what \"single owned execution path\" requires once area profiles become per-frame instead of per-utterance. Purely elementwise across `(instance, junction)` pairs — no inter-junction dependency at all (unlike `tract_waveguide.js`'s per-sample recurrence), so this is one thread per output element with no workgroup memory or barriers needed."
        },
        {
          "name": "TRACT_TRANSFER_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "TRACT_TRANSFER_WORKGROUP_SIZE",
          "summary": ""
        },
        {
          "name": "TRACT_TRANSFER_EPSILON",
          "kind": "constant",
          "signature": "TRACT_TRANSFER_EPSILON",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/tract_waveguide",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/tract_waveguide.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/tract_waveguide.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/tract_waveguide.js",
      "sourceHash": "1c9857a4ccdcae11da751c66f3d5172ad52aec375a70248ac33ec45f438f89ca",
      "summary": "tract_waveguide.js — Phase 2 ParticleNN articulatory kernel. Production Kelly-Lochbaum single-delay-per-section digital waveguide vocal tract, generalizing `risk/KellyLochbaumWaveguide.js` (R6)'s proven `createVocalTract().step()` recurrence to run entirely on GPU across a whole chunk of samples and N simultaneous voice/capsule instances. Junction reflection coefficients (`k[i] = (A_i - A_{i+1}) / (A_i + A_{i+1})`) are computed CPU-side by the caller via `risk/KellyLochbaumWaveguide.js`'s `reflectionCoefficients` (a fixed-shape, typically-small computation — same rationale `mel_filterbank.js` gives for precomputing its filter matrix CPU-side rather than reproducing it in WGSL) and passed in as `junction_k`, not recomputed here. Constriction noise injection (`constriction_index` + `constriction_noise`) and the nasal TAP signal (`nasal_tap_index`) ARE implemented, as faithful ports of R6's proven `step()` options — they were deferred when this kernel was first written, but `ParticleTract.js` cannot produce real fricatives or real nasal coupling without them: - `constriction_index >= 0` adds that sample's `constriction_noise` value to the RIGHT-going wave entering junction `constriction_index`, exactly as R6's `if (i === constrictionIndex) incomingRight += constrictionNoiseSample`. Injecting at the junction (rather than mixing noise into `source_flow` at the glottis) is what makes a fricative a fricative: only the cavity IN FRONT of the constriction filters the turbulence. - `nasal_tap_index >= 0` writes `right[i] + left[i]` for that section into the packed output's `nasal_tap` block every sample, giving `nasal_junction.js` an anatomically-meaningful `input_flow` to be driven by. Matching R6 exactly, the tap is a READ-ONLY observation: the oral tract is not itself perturbed by it. That remains a simplification versus a rigorous 3-port scattering junction (R6's own docstring says the same); it is enough for controllable, stable nasal coupling, and the honest limitation is recorded here rather than overstated. Both are opt-in: a negative index disables that feature entirely, so callers that want neither pass `-1` and get bit-identical behavior to this kernel before they existed. ## `radiation_difference` must match what the SOURCE already is Lip radiation is approximately a differentiator, so R6's `step()` ends with `radiated = outputRaw - prevOutputRaw`. That is correct when the excitation is glottal FLOW, which is what R6's `GlottalSource.js` raised-cosine pulse produced. It is WRONG when the excitation is already the flow derivative. `glottal_lf.js` is explicitly the LF glottal flow DERIVATIVE model, so feeding it in and then differencing again yields the SECOND derivative: +6 dB/octave of spurious tilt (audibly reedy/buzzy) and a far spikier waveform, whose large crest factor then drives any downstream limiter into distorting every single pitch pulse. Injecting a derivative source and skipping the difference is what gives the correct radiated pressure, and is why formant synthesizers use the LF derivative directly. `radiation_difference` therefore has to agree with the caller's source: 1.0 for a flow source (R6 parity), 0.0 for `glottal_lf.js`. There is no safe default that suits both, so it is an explicit parameter rather than a built-in assumption. ## `wall_loss`: the tube was perfectly lossless, and that is audible Scattering at a Kelly-Lochbaum junction conserves energy exactly, so with only the glottis and lips absorbing anything, the formants of this tube had very high Q. Real vocal tracts lose energy continuously to yielding walls plus viscous and thermal effects, which is what gives formants their bandwidth (roughly 50-100 Hz for F1, more higher up). A resonator with too little damping rings after every excitation, and a whole tube of them reads as a metallic, synthetic buzz laid over the speech no matter how accurate the formant FREQUENCIES are — accurate centres with no bandwidth still does not sound human. `wall_loss` multiplies each traveling wave once per section per sample, so a wave crossing the whole tract is attenuated `wall_loss^num_sections`. Because it is applied per section rather than once at a boundary, the loss accumulates with distance travelled, which is the correct behaviour for a distributed effect. It is a frequency-INDEPENDENT approximation of a loss that really does grow with frequency; the honest limitation is recorded here rather than overstated, and a one-pole filter per junction would be the refinement. 1.0 restores the lossless tube exactly, which is what the R6 parity test uses. One digital-waveguide step is inherently sequential in time (sample n depends on sample n-1's right/left traveling-wave state), but the N-1 junction updates *within* one sample step are independent of each other (each reads only the previous sample's `right`/`left`, matching R6's `step()` computing a full `nextRight`/`nextLeft` array before committing it) — so this kernel assigns one thread per tube section (`local_invocation_id.x`), keeps the whole tract's traveling-wave state in workgroup memory (double-buffered, since every junction read is the *previous* sample's state), and walks the chunk's samples sequentially with a `workgroupBarrier()` between samples. `workgroup_id.x` selects which of up to `num_instances` simultaneous tracts to process, matching every other Phase 2 kernel's per-instance batching convention (`breath_reservoir.js`, `lip_radiation.js`). `MAX_SECTIONS = 64` is a compile-time workgroup-memory cap, comfortably above R6's proven `NUM_SECTIONS = 32` oral / `NASAL_SECTIONS = 16` nasal tract discretizations (`risk/VoiceBoxWaveguideProbe.js`) — `num_sections` over this cap is a caller error, not a silently-truncated tract. To keep this kernel within the project's \"N read-only storage inputs then one read_write storage output\" binding convention (`KernelRegistry.bindGroupLayoutEntriesFor`), all four pieces of kernel-produced data (`radiated_out`, the two persisted traveling-wave state arrays, and the persisted previous-lip-output scalar needed for the next chunk's radiation first-difference) are packed into ONE flat output buffer at fixed uniform-computed offsets, documented in the struct comments below, rather than needing four separate output bindings.",
      "exports": [
        {
          "name": "tractWaveguideOutputLayout",
          "kind": "function",
          "signature": "tractWaveguideOutputLayout(numSections, numSamples, numInstances)",
          "summary": "Compute the flat-output-buffer layout `tract_waveguide.js` writes to and `TractWaveguideModel.js` (Phase 3+ consumer) must read from, given `numSections`/`numSamples`/`numInstances` — kept as one shared function so the WGSL offsets below and any future JS-side reader can never drift apart."
        },
        {
          "name": "tractWaveguideShader",
          "kind": "function",
          "signature": "tractWaveguideShader()",
          "summary": ""
        },
        {
          "name": "TRACT_WAVEGUIDE_MAX_SECTIONS",
          "kind": "constant",
          "signature": "TRACT_WAVEGUIDE_MAX_SECTIONS",
          "summary": "tract_waveguide.js — Phase 2 ParticleNN articulatory kernel. Production Kelly-Lochbaum single-delay-per-section digital waveguide vocal tract, generalizing `risk/KellyLochbaumWaveguide.js` (R6)'s proven `createVocalTract().step()` recurrence to run entirely on GPU across a whole chunk of samples and N simultaneous voice/capsule instances. Junction reflection coefficients (`k[i] = (A_i - A_{i+1}) / (A_i + A_{i+1})`) are computed CPU-side by the caller via `risk/KellyLochbaumWaveguide.js`'s `reflectionCoefficients` (a fixed-shape, typically-small computation — same rationale `mel_filterbank.js` gives for precomputing its filter matrix CPU-side rather than reproducing it in WGSL) and passed in as `junction_k`, not recomputed here. Constriction noise injection (`constriction_index` + `constriction_noise`) and the nasal TAP signal (`nasal_tap_index`) ARE implemented, as faithful ports of R6's proven `step()` options — they were deferred when this kernel was first written, but `ParticleTract.js` cannot produce real fricatives or real nasal coupling without them: - `constriction_index >= 0` adds that sample's `constriction_noise` value to the RIGHT-going wave entering junction `constriction_index`, exactly as R6's `if (i === constrictionIndex) incomingRight += constrictionNoiseSample`. Injecting at the junction (rather than mixing noise into `source_flow` at the glottis) is what makes a fricative a fricative: only the cavity IN FRONT of the constriction filters the turbulence. - `nasal_tap_index >= 0` writes `right[i] + left[i]` for that section into the packed output's `nasal_tap` block every sample, giving `nasal_junction.js` an anatomically-meaningful `input_flow` to be driven by. Matching R6 exactly, the tap is a READ-ONLY observation: the oral tract is not itself perturbed by it. That remains a simplification versus a rigorous 3-port scattering junction (R6's own docstring says the same); it is enough for controllable, stable nasal coupling, and the honest limitation is recorded here rather than overstated. Both are opt-in: a negative index disables that feature entirely, so callers that want neither pass `-1` and get bit-identical behavior to this kernel before they existed. ## `radiation_difference` must match what the SOURCE already is Lip radiation is approximately a differentiator, so R6's `step()` ends with `radiated = outputRaw - prevOutputRaw`. That is correct when the excitation is glottal FLOW, which is what R6's `GlottalSource.js` raised-cosine pulse produced. It is WRONG when the excitation is already the flow derivative. `glottal_lf.js` is explicitly the LF glottal flow DERIVATIVE model, so feeding it in and then differencing again yields the SECOND derivative: +6 dB/octave of spurious tilt (audibly reedy/buzzy) and a far spikier waveform, whose large crest factor then drives any downstream limiter into distorting every single pitch pulse. Injecting a derivative source and skipping the difference is what gives the correct radiated pressure, and is why formant synthesizers use the LF derivative directly. `radiation_difference` therefore has to agree with the caller's source: 1.0 for a flow source (R6 parity), 0.0 for `glottal_lf.js`. There is no safe default that suits both, so it is an explicit parameter rather than a built-in assumption. ## `wall_loss`: the tube was perfectly lossless, and that is audible Scattering at a Kelly-Lochbaum junction conserves energy exactly, so with only the glottis and lips absorbing anything, the formants of this tube had very high Q. Real vocal tracts lose energy continuously to yielding walls plus viscous and thermal effects, which is what gives formants their bandwidth (roughly 50-100 Hz for F1, more higher up). A resonator with too little damping rings after every excitation, and a whole tube of them reads as a metallic, synthetic buzz laid over the speech no matter how accurate the formant FREQUENCIES are — accurate centres with no bandwidth still does not sound human. `wall_loss` multiplies each traveling wave once per section per sample, so a wave crossing the whole tract is attenuated `wall_loss^num_sections`. Because it is applied per section rather than once at a boundary, the loss accumulates with distance travelled, which is the correct behaviour for a distributed effect. It is a frequency-INDEPENDENT approximation of a loss that really does grow with frequency; the honest limitation is recorded here rather than overstated, and a one-pole filter per junction would be the refinement. 1.0 restores the lossless tube exactly, which is what the R6 parity test uses. One digital-waveguide step is inherently sequential in time (sample n depends on sample n-1's right/left traveling-wave state), but the N-1 junction updates *within* one sample step are independent of each other (each reads only the previous sample's `right`/`left`, matching R6's `step()` computing a full `nextRight`/`nextLeft` array before committing it) — so this kernel assigns one thread per tube section (`local_invocation_id.x`), keeps the whole tract's traveling-wave state in workgroup memory (double-buffered, since every junction read is the *previous* sample's state), and walks the chunk's samples sequentially with a `workgroupBarrier()` between samples. `workgroup_id.x` selects which of up to `num_instances` simultaneous tracts to process, matching every other Phase 2 kernel's per-instance batching convention (`breath_reservoir.js`, `lip_radiation.js`). `MAX_SECTIONS = 64` is a compile-time workgroup-memory cap, comfortably above R6's proven `NUM_SECTIONS = 32` oral / `NASAL_SECTIONS = 16` nasal tract discretizations (`risk/VoiceBoxWaveguideProbe.js`) — `num_sections` over this cap is a caller error, not a silently-truncated tract. To keep this kernel within the project's \"N read-only storage inputs then one read_write storage output\" binding convention (`KernelRegistry.bindGroupLayoutEntriesFor`), all four pieces of kernel-produced data (`radiated_out`, the two persisted traveling-wave state arrays, and the persisted previous-lip-output scalar needed for the next chunk's radiation first-difference) are packed into ONE flat output buffer at fixed uniform-computed offsets, documented in the struct comments below, rather than needing four separate output bindings."
        },
        {
          "name": "TRACT_WAVEGUIDE_ENTRY_POINT",
          "kind": "constant",
          "signature": "TRACT_WAVEGUIDE_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "TRACT_WAVEGUIDE_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "TRACT_WAVEGUIDE_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/articulatory/visual_state_decimate",
      "path": "agi/reference/particle_voice/nn/kernels/articulatory/visual_state_decimate.md",
      "source": "agi/particle_voice/nn/kernels/articulatory/visual_state_decimate.js",
      "import": "/agi/particle_voice/nn/kernels/articulatory/visual_state_decimate.js",
      "sourceHash": "ac0e231f3e305a5ebf4dedce4addca9b56a5b2ce171fefcb519601b33b5beb36",
      "summary": "visual_state_decimate.js — Phase 2 ParticleNN articulatory kernel. Decimates a high-rate, multi-CHANNEL tract field (e.g. a per-section pressure-like signal, one channel per tube section) down to one box-averaged value per channel per fixed-size frame — the `VisualAirflowState` `ARCHITECTURE.md` §4 names as \"a decimated field for ribbon/particle/heatmap visualization\". Deliberately NOT a reuse of `physiology_feedback_reduce.js` despite the similar per-thread \"small sequential average over a window\" shape: that kernel reduces a single FLAT per-instance signal to (mean, RMS) pairs for model feedback (a statistics reduction); this kernel decimates a multi-CHANNEL per-instance FIELD (extra channel/section axis) down to mean-only per channel per frame, because a rendered airflow ribbon/ heatmap needs a representative value per tube section over time, not an energy statistic, and box-averaging over the decimation window (rather than picking every Nth raw sample) avoids visual aliasing/flicker in the downsampled field — ordinary decimation-filter practice, and consistent with how `overlap_add.js`/`stft.js` already treat windowing as the caller's/kernel's job rather than raw strided subsampling. `ARCHITECTURE.md` §4 also requires that visualization \"must be bit- identically disable-able without changing rendered PCM\" — this kernel reads its input field only (never writes back into it), so skipping this kernel's dispatch entirely when visualization is off cannot affect the `tract_waveguide.js`/`nasal_junction.js` PCM path in any way; that invariant is structural (this kernel has no read_write access to anything the acoustic path also reads), not merely a runtime convention.",
      "exports": [
        {
          "name": "visualStateDecimateShader",
          "kind": "function",
          "signature": "visualStateDecimateShader()",
          "summary": ""
        },
        {
          "name": "VISUAL_STATE_DECIMATE_ENTRY_POINT",
          "kind": "constant",
          "signature": "VISUAL_STATE_DECIMATE_ENTRY_POINT",
          "summary": "visual_state_decimate.js — Phase 2 ParticleNN articulatory kernel. Decimates a high-rate, multi-CHANNEL tract field (e.g. a per-section pressure-like signal, one channel per tube section) down to one box-averaged value per channel per fixed-size frame — the `VisualAirflowState` `ARCHITECTURE.md` §4 names as \"a decimated field for ribbon/particle/heatmap visualization\". Deliberately NOT a reuse of `physiology_feedback_reduce.js` despite the similar per-thread \"small sequential average over a window\" shape: that kernel reduces a single FLAT per-instance signal to (mean, RMS) pairs for model feedback (a statistics reduction); this kernel decimates a multi-CHANNEL per-instance FIELD (extra channel/section axis) down to mean-only per channel per frame, because a rendered airflow ribbon/ heatmap needs a representative value per tube section over time, not an energy statistic, and box-averaging over the decimation window (rather than picking every Nth raw sample) avoids visual aliasing/flicker in the downsampled field — ordinary decimation-filter practice, and consistent with how `overlap_add.js`/`stft.js` already treat windowing as the caller's/kernel's job rather than raw strided subsampling. `ARCHITECTURE.md` §4 also requires that visualization \"must be bit- identically disable-able without changing rendered PCM\" — this kernel reads its input field only (never writes back into it), so skipping this kernel's dispatch entirely when visualization is off cannot affect the `tract_waveguide.js`/`nasal_junction.js` PCM path in any way; that invariant is structural (this kernel has no read_write access to anything the acoustic path also reads), not merely a runtime convention."
        },
        {
          "name": "VISUAL_STATE_DECIMATE_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "VISUAL_STATE_DECIMATE_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/chunks/complex_math",
      "path": "agi/reference/particle_voice/nn/kernels/chunks/complex_math.md",
      "source": "agi/particle_voice/nn/kernels/chunks/complex_math.js",
      "import": "/agi/particle_voice/nn/kernels/chunks/complex_math.js",
      "sourceHash": "e136ec85b076d78615a3364edf191b53d7ee160f0c0e2a6a5f2267f5bc545e75",
      "summary": "chunks/complex_math.js — Phase 1 ParticleNN kernel chunk. Generic complex-arithmetic WGSL fragment (mul/add/sub/twiddle), split out as reusable infrastructure ahead of Phase 2's `fft/fft1024_f32.js` / `fft/complex_mul.js` kernels — R3's `risk/Fft1024Kernel.js` inlined its own twiddle multiply directly in the butterfly loop (fine for a disposable risk spike); Phase 2's production FFT kernel should compose this chunk instead of re-deriving the same four multiplies/two adds. Complex numbers are represented as `vec2<f32>` (`.x` = real, `.y` = imag) throughout, not a named struct, to keep it directly usable as a return type/local without an extra struct declaration at every call site.",
      "exports": [
        {
          "name": "complexMathChunk",
          "kind": "function",
          "signature": "complexMathChunk()",
          "summary": ""
        },
        {
          "name": "COMPLEX_MATH_CHUNK_NAME",
          "kind": "constant",
          "signature": "COMPLEX_MATH_CHUNK_NAME",
          "summary": "chunks/complex_math.js — Phase 1 ParticleNN kernel chunk. Generic complex-arithmetic WGSL fragment (mul/add/sub/twiddle), split out as reusable infrastructure ahead of Phase 2's `fft/fft1024_f32.js` / `fft/complex_mul.js` kernels — R3's `risk/Fft1024Kernel.js` inlined its own twiddle multiply directly in the butterfly loop (fine for a disposable risk spike); Phase 2's production FFT kernel should compose this chunk instead of re-deriving the same four multiplies/two adds. Complex numbers are represented as `vec2<f32>` (`.x` = real, `.y` = imag) throughout, not a named struct, to keep it directly usable as a return type/local without an extra struct declaration at every call site."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/chunks/f16_utils",
      "path": "agi/reference/particle_voice/nn/kernels/chunks/f16_utils.md",
      "source": "agi/particle_voice/nn/kernels/chunks/f16_utils.js",
      "import": "/agi/particle_voice/nn/kernels/chunks/f16_utils.js",
      "sourceHash": "b0903d02074303a483db5686dc32a281895332f64a2a9da859b54750c7704d2b",
      "summary": "chunks/f16_utils.js — Phase 1 ParticleNN kernel chunk. On the WGSL side, `f16` kernels use WGSL's native `f16` type directly (`enable f16;` + `f16`/`vec2h` etc.) when `shader-f16` is available — no bit-manipulation WGSL fragment is needed there, unlike `int8_pack.js`'s manual unpack (WGSL has no native `i8` storage type, but it DOES have a native `f16` type). This file's job is the *host-side* JS<->f16 bit conversion needed to build/verify f16 test vectors and read `ParticleTensor`'s raw `Uint16Array` f16 readback (`ParticleTensor.js`'s `wrapReadbackBuffer` deliberately leaves `f16` tensors as raw bit patterns — this is where they get decoded).",
      "exports": [
        {
          "name": "decodeF16",
          "kind": "function",
          "signature": "decodeF16(bits)",
          "summary": "IEEE 754 binary16 -> JS float64."
        },
        {
          "name": "encodeF16",
          "kind": "function",
          "signature": "encodeF16(value)",
          "summary": "JS float64 -> IEEE 754 binary16 bit pattern (round-to-nearest-even is not implemented precisely — round-half-away-from-zero on the mantissa, adequate for test-vector construction, not for production-quality quantization-aware training)."
        },
        {
          "name": "decodeF16Array",
          "kind": "function",
          "signature": "decodeF16Array(bitsArray)",
          "summary": "Decode a raw f16-bits `Uint16Array` (e.g. from `ParticleTensor.getData()`) into a `Float64Array`."
        },
        {
          "name": "encodeF16Array",
          "kind": "function",
          "signature": "encodeF16Array(values)",
          "summary": "Encode a `Float32Array`/`Float64Array`/plain array into an f16-bits `Uint16Array`, suitable for `ParticleTensor` `data` with `dtype: 'f16'`."
        },
        {
          "name": "F16_ABS_TOLERANCE",
          "kind": "re-export",
          "signature": "F16_ABS_TOLERANCE",
          "summary": ""
        },
        {
          "name": "F16_REL_TOLERANCE",
          "kind": "re-export",
          "signature": "F16_REL_TOLERANCE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/chunks/int8_pack",
      "path": "agi/reference/particle_voice/nn/kernels/chunks/int8_pack.md",
      "source": "agi/particle_voice/nn/kernels/chunks/int8_pack.js",
      "import": "/agi/particle_voice/nn/kernels/chunks/int8_pack.js",
      "sourceHash": "7dc96101978d5d20feffcdda25b6b0c086f10c33fba69f12f381d95d8a78b63f",
      "summary": "chunks/int8_pack.js — Phase 1 ParticleNN kernel chunk. WGSL side: the `unpack_int8` fragment, extracted from R2's `risk/MatmulW8A16Kernel.js` (proven correct there — R2's parity test passed with max abs/rel error ~3.4e-7 against a JS scalar reference) into a shared chunk so `matmul_w8a16.js`/`conv1d_w8a16.js`/ `dequant_int8.js` all use the exact same unpack logic rather than each re-deriving it. JS side: the host-side symmetric block quantizer that produces the `packed`/`scales` pair this WGSL fragment expects, matching `ParticleTensor.js`'s documented `quant` scheme: `value = i8Value * scale` (zero-point-free, one scale per `blockSize`-sized block).",
      "exports": [
        {
          "name": "int8PackChunk",
          "kind": "function",
          "signature": "int8PackChunk()",
          "summary": ""
        },
        {
          "name": "quantizeInt8Blockwise",
          "kind": "function",
          "signature": "quantizeInt8Blockwise(values, blockSize)",
          "summary": "Symmetric per-block INT8 quantization: for each contiguous `blockSize`-sized block of `values`, scale = max(abs(block)) / 127, quantized = round(value / scale). Returns `{ packed: Uint32Array, scales: Float32Array, blockSize }`. `values.length` must be a multiple of 4 (four int8 values pack into one u32, matching R2's little-end-is-lowest-index layout)."
        },
        {
          "name": "dequantizeInt8Blockwise",
          "kind": "function",
          "signature": "dequantizeInt8Blockwise(quantized, scales, blockSize)",
          "summary": "Dequantize `quantizeInt8Blockwise`'s output back to a `Float32Array`, for host-side parity checking against a kernel's GPU output."
        },
        {
          "name": "INT8_PACK_CHUNK_NAME",
          "kind": "constant",
          "signature": "INT8_PACK_CHUNK_NAME",
          "summary": "chunks/int8_pack.js — Phase 1 ParticleNN kernel chunk. WGSL side: the `unpack_int8` fragment, extracted from R2's `risk/MatmulW8A16Kernel.js` (proven correct there — R2's parity test passed with max abs/rel error ~3.4e-7 against a JS scalar reference) into a shared chunk so `matmul_w8a16.js`/`conv1d_w8a16.js`/ `dequant_int8.js` all use the exact same unpack logic rather than each re-deriving it. JS side: the host-side symmetric block quantizer that produces the `packed`/`scales` pair this WGSL fragment expects, matching `ParticleTensor.js`'s documented `quant` scheme: `value = i8Value * scale` (zero-point-free, one scale per `blockSize`-sized block)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/chunks/math_common",
      "path": "agi/reference/particle_voice/nn/kernels/chunks/math_common.md",
      "source": "agi/particle_voice/nn/kernels/chunks/math_common.js",
      "import": "/agi/particle_voice/nn/kernels/chunks/math_common.js",
      "sourceHash": "c3bb5663ea36475ad26d0c6fc280a87c51cc761f9fc3e6fa171b0c4dce9ffedd",
      "summary": "chunks/math_common.js — Phase 1 ParticleNN kernel chunk. Small reusable WGSL scalar-math fragments shared by multiple kernel generators, so e.g. `silu_f16.js` and any future fused-activation kernel define `siluScalar()`/`sigmoidScalar()` exactly once rather than each inlining its own copy (the kind of duplication the R2 spike's inline `unpack_int8` was an acceptable one-off for, but Phase 1 kernels should not repeat).",
      "exports": [
        {
          "name": "mathCommonChunk",
          "kind": "function",
          "signature": "mathCommonChunk()",
          "summary": ""
        },
        {
          "name": "MATH_COMMON_CHUNK_NAME",
          "kind": "constant",
          "signature": "MATH_COMMON_CHUNK_NAME",
          "summary": "chunks/math_common.js — Phase 1 ParticleNN kernel chunk. Small reusable WGSL scalar-math fragments shared by multiple kernel generators, so e.g. `silu_f16.js` and any future fused-activation kernel define `siluScalar()`/`sigmoidScalar()` exactly once rather than each inlining its own copy (the kind of duplication the R2 spike's inline `unpack_int8` was an acceptable one-off for, but Phase 1 kernels should not repeat)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/convolution/conv1d_w8a16",
      "path": "agi/reference/particle_voice/nn/kernels/convolution/conv1d_w8a16.md",
      "source": "agi/particle_voice/nn/kernels/convolution/conv1d_w8a16.js",
      "import": "/agi/particle_voice/nn/kernels/convolution/conv1d_w8a16.js",
      "sourceHash": "a34e557313d05b525a9c7e579f1d27233a09b9d7c7b8519aa1159ba1eececbdf",
      "summary": "convolution/conv1d_w8a16.js — Phase 1 ParticleNN kernel. 1D convolution, INT8 weights (same 4-packed-per-u32 layout and `unpack_int8` as `matmul_w8a16.js`) x FP16/FP32 activations, FP32 accumulation. `[inChannels, kernelWidth]` per output channel, `'same'` padding (input implicitly zero-padded so output length equals input length) — stride 1 only; dilation/stride are Phase 2+ follow-ups if a consumer needs them (R7's toy Conv1D model used stride 1 only, and no Phase -1/0 document commits to anything else yet). Weight layout: `packedWeights[outCh * ceil(inChannels*kernelWidth/4) + k4]`, a u32 whose 4 bytes are int8 weights for the flattened `(inCh, tap)` index `k = k4*4 + 0..3`, where `inCh = k / kernelWidth` and `tap = k % kernelWidth`. `scales[outCh]` is the per-output-channel scale. `inChannels * kernelWidth` must be a multiple of 4.",
      "exports": [
        {
          "name": "conv1dW8a16Shader",
          "kind": "function",
          "signature": "conv1dW8a16Shader({ useShaderF16 = false } = {})",
          "summary": ""
        },
        {
          "name": "CONV1D_W8A16_ENTRY_POINT",
          "kind": "constant",
          "signature": "CONV1D_W8A16_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "CONV1D_W8A16_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "CONV1D_W8A16_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/core/transpose_2d",
      "path": "agi/reference/particle_voice/nn/kernels/core/transpose_2d.md",
      "source": "agi/particle_voice/nn/kernels/core/transpose_2d.js",
      "import": "/agi/particle_voice/nn/kernels/core/transpose_2d.js",
      "sourceHash": "6b7fd18cd76b62f07db290eadb286780e8201d2dfa70c581682412d8716b93be",
      "summary": "core/transpose_2d.js — Phase 3 ParticleNN kernel. 2D transpose: `out[c, r] = in[r, c]`, i.e. `[rows, cols]` → `[cols, rows]`, both row-major. ## Why this exists The Phase 1 kernels disagree about which axis is major, and building `PhonemeEncoder.js` is the first time anything composes them: - `speech/embedding_f16.js` writes `[numIds, embedDim]` — **sequence-major** (one row per token), the natural shape for a gather. - `convolution/conv1d_w8a16.js` reads `[inChannels, seqLen]` — **channel-major**, the natural shape for sliding a kernel along time. - `normalization/rmsnorm_f16.js` normalizes each ROW independently, so per-token normalization over the feature axis needs sequence-major again. Neither layout is wrong for its own kernel, but the encoder has to cross between them, and nothing in the registry could. Rather than duplicating a transposed variant of the convolution (or silently re-interpreting a buffer and producing scrambled activations), the axis swap is its own explicit, testable op. Deliberately naive: one thread per element, no tiling and no shared-memory staging. The encoder's tensors are small (tens of channels x hundreds of frames), so the uncoalesced write is not worth the complexity — and a tiled version can replace this later without changing a single caller, since the contract is just \"swap the axes\".",
      "exports": [
        {
          "name": "transpose2dShader",
          "kind": "function",
          "signature": "transpose2dShader({ useShaderF16 = false } = {})",
          "summary": ""
        },
        {
          "name": "TRANSPOSE_2D_ENTRY_POINT",
          "kind": "constant",
          "signature": "TRANSPOSE_2D_ENTRY_POINT",
          "summary": "core/transpose_2d.js — Phase 3 ParticleNN kernel. 2D transpose: `out[c, r] = in[r, c]`, i.e. `[rows, cols]` → `[cols, rows]`, both row-major. ## Why this exists The Phase 1 kernels disagree about which axis is major, and building `PhonemeEncoder.js` is the first time anything composes them: - `speech/embedding_f16.js` writes `[numIds, embedDim]` — **sequence-major** (one row per token), the natural shape for a gather. - `convolution/conv1d_w8a16.js` reads `[inChannels, seqLen]` — **channel-major**, the natural shape for sliding a kernel along time. - `normalization/rmsnorm_f16.js` normalizes each ROW independently, so per-token normalization over the feature axis needs sequence-major again. Neither layout is wrong for its own kernel, but the encoder has to cross between them, and nothing in the registry could. Rather than duplicating a transposed variant of the convolution (or silently re-interpreting a buffer and producing scrambled activations), the axis swap is its own explicit, testable op. Deliberately naive: one thread per element, no tiling and no shared-memory staging. The encoder's tensors are small (tens of channels x hundreds of frames), so the uncoalesced write is not worth the complexity — and a tiled version can replace this later without changing a single caller, since the contract is just \"swap the axes\"."
        },
        {
          "name": "TRANSPOSE_2D_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "TRANSPOSE_2D_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/fft/complex_mul",
      "path": "agi/reference/particle_voice/nn/kernels/fft/complex_mul.md",
      "source": "agi/particle_voice/nn/kernels/fft/complex_mul.js",
      "import": "/agi/particle_voice/nn/kernels/fft/complex_mul.js",
      "sourceHash": "3eb4e24f1739e1be87d89b2caa71a480dfafd00c7a9ef72e3d16ae21b642ae22",
      "summary": "complex_mul.js — Phase 2 ParticleNN DSP kernel. Elementwise complex multiplication: `(a+bi)(c+di) = (ac-bd) + (ad+bc)i`, over interleaved `[re, im, re, im, ...]` buffers, matching `fft1024_f32.js`'s interleaved-complex layout so FFT output can feed this directly (e.g. frequency-domain filtering: `FFT(x) * H` then `IFFT`).",
      "exports": [
        {
          "name": "complexMulShader",
          "kind": "function",
          "signature": "complexMulShader()",
          "summary": ""
        },
        {
          "name": "COMPLEX_MUL_ENTRY_POINT",
          "kind": "constant",
          "signature": "COMPLEX_MUL_ENTRY_POINT",
          "summary": "complex_mul.js — Phase 2 ParticleNN DSP kernel. Elementwise complex multiplication: `(a+bi)(c+di) = (ac-bd) + (ad+bc)i`, over interleaved `[re, im, re, im, ...]` buffers, matching `fft1024_f32.js`'s interleaved-complex layout so FFT output can feed this directly (e.g. frequency-domain filtering: `FFT(x) * H` then `IFFT`)."
        },
        {
          "name": "COMPLEX_MUL_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "COMPLEX_MUL_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/fft/fft1024_f32",
      "path": "agi/reference/particle_voice/nn/kernels/fft/fft1024_f32.md",
      "source": "agi/particle_voice/nn/kernels/fft/fft1024_f32.js",
      "import": "/agi/particle_voice/nn/kernels/fft/fft1024_f32.js",
      "sourceHash": "371829d47fd3b9f85b62f0eee545ae270a10e5834e98acbf9de2ede297768fd5",
      "summary": "fft1024_f32.js — Phase 2 ParticleNN DSP kernel. Single-workgroup, in-workgroup-memory, iterative radix-2 Cooley-Tukey forward FFT — generalizes `risk/Fft1024Kernel.js` (R3)'s proven butterfly network to run with **256 threads/workgroup** (each thread handles 2 butterfly operations per stage / 4 elements for load-scatter) instead of R3's 512, so it needs **no elevated `maxComputeWorkgroupSizeX` request** — every conformant WebGPU adapter guarantees 256 by default. This resolves the exact gap `spec/DeviceContract-v0.md` §4 flagged as an unresolved \"Phase 1/2 follow-up\": rather than requesting a higher limit with a fallback path for adapters that refuse it, this kernel simply never needs the higher limit. One workgroup computes exactly one 1024-point complex FFT; `workgroup_id.x` selects which frame of a batch to process (`dispatchWorkgroups(numFrames)`), matching R3's batching design. Complex numbers are interleaved `[re0, im0, re1, im1, ...]` in a single flat `array<f32>` per frame (`frame_base = wid.x * N * 2`) — one input buffer, one output buffer, matching every other Phase 1/2 kernel's single-input/single-output convention (unlike R3's separate real/imag arrays). No uniform buffer is needed (frame selection comes entirely from `workgroup_id`), so this kernel registers with `hasUniform: false` in `KernelRegistry.js`.",
      "exports": [
        {
          "name": "buildFft1024Shader",
          "kind": "function",
          "signature": "buildFft1024Shader(direction)",
          "summary": "Shared by `fft1024_f32.js` and `ifft1024_f32.js` — `direction` (+1 forward, -1 inverse) is baked in at generation time, not read from a uniform, since each op is a distinct, fixed-behavior kernel."
        },
        {
          "name": "fft1024F32Shader",
          "kind": "function",
          "signature": "fft1024F32Shader()",
          "summary": ""
        },
        {
          "name": "FFT_N",
          "kind": "constant",
          "signature": "FFT_N",
          "summary": "fft1024_f32.js — Phase 2 ParticleNN DSP kernel. Single-workgroup, in-workgroup-memory, iterative radix-2 Cooley-Tukey forward FFT — generalizes `risk/Fft1024Kernel.js` (R3)'s proven butterfly network to run with **256 threads/workgroup** (each thread handles 2 butterfly operations per stage / 4 elements for load-scatter) instead of R3's 512, so it needs **no elevated `maxComputeWorkgroupSizeX` request** — every conformant WebGPU adapter guarantees 256 by default. This resolves the exact gap `spec/DeviceContract-v0.md` §4 flagged as an unresolved \"Phase 1/2 follow-up\": rather than requesting a higher limit with a fallback path for adapters that refuse it, this kernel simply never needs the higher limit. One workgroup computes exactly one 1024-point complex FFT; `workgroup_id.x` selects which frame of a batch to process (`dispatchWorkgroups(numFrames)`), matching R3's batching design. Complex numbers are interleaved `[re0, im0, re1, im1, ...]` in a single flat `array<f32>` per frame (`frame_base = wid.x * N * 2`) — one input buffer, one output buffer, matching every other Phase 1/2 kernel's single-input/single-output convention (unlike R3's separate real/imag arrays). No uniform buffer is needed (frame selection comes entirely from `workgroup_id`), so this kernel registers with `hasUniform: false` in `KernelRegistry.js`."
        },
        {
          "name": "FFT_LOG2N",
          "kind": "constant",
          "signature": "FFT_LOG2N",
          "summary": ""
        },
        {
          "name": "FFT_WORKGROUP_THREADS",
          "kind": "constant",
          "signature": "FFT_WORKGROUP_THREADS",
          "summary": ""
        },
        {
          "name": "FFT_ENTRY_POINT",
          "kind": "constant",
          "signature": "FFT_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "FFT_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "FFT_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/fft/ifft1024_f32",
      "path": "agi/reference/particle_voice/nn/kernels/fft/ifft1024_f32.md",
      "source": "agi/particle_voice/nn/kernels/fft/ifft1024_f32.js",
      "import": "/agi/particle_voice/nn/kernels/fft/ifft1024_f32.js",
      "sourceHash": "22733db23e3f93bd6b455a5dc77e3308f377537ec606c8fe44d648b664fa4aa8",
      "summary": "ifft1024_f32.js — Phase 2 ParticleNN DSP kernel. Inverse of `fft1024_f32.js`: same butterfly network (see that file's docstring for the full algorithm/limit-generalization rationale), with `direction = -1` baked in — conjugate the input, run the same forward butterfly network, conjugate + scale by `1/N` (`IFFT(X) = (1/N) * conj(FFT(conj(X)))`), matching R3's proven identity.",
      "exports": [
        {
          "name": "ifft1024F32Shader",
          "kind": "function",
          "signature": "ifft1024F32Shader()",
          "summary": ""
        },
        {
          "name": "FFT_ENTRY_POINT",
          "kind": "re-export",
          "signature": "FFT_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "FFT_LOG2N",
          "kind": "re-export",
          "signature": "FFT_LOG2N",
          "summary": ""
        },
        {
          "name": "FFT_N",
          "kind": "re-export",
          "signature": "FFT_N",
          "summary": ""
        },
        {
          "name": "FFT_WORKGROUP_SIZE",
          "kind": "re-export",
          "signature": "FFT_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/matmul/matmul_w8a16",
      "path": "agi/reference/particle_voice/nn/kernels/matmul/matmul_w8a16.md",
      "source": "agi/particle_voice/nn/kernels/matmul/matmul_w8a16.js",
      "import": "/agi/particle_voice/nn/kernels/matmul/matmul_w8a16.js",
      "sourceHash": "e573221354603c35e438ee83cd17121d00705091e6d472733ae2065c6ce38e18",
      "summary": "matmul/matmul_w8a16.js — Phase 1 ParticleNN kernel. INT8 weights (4-packed per u32, per-output-channel scale, `chunks/int8_pack.js`'s `unpack_int8`) x FP16 activations, FP32 accumulation, FP16 output — the real target this plan names, superseding R2's FP32-activation stand-in (`risk/MatmulW8A16Kernel.js`) now that R1 has proven `shader-f16` is available on at least one reference device. Falls back to FP32 activations/output when `useShaderF16` is false (DeviceContract-v0's `no-f16` tier) — same kernel body, different element type, not two separately-maintained kernels. Weight layout (unchanged from R2, already proven): logical weights are [K, N]; `packedWeights[n * (K/4) + k4]` is a u32 whose 4 bytes are the int8 weights for k = k4*4 + 0..3 (little end = lowest k); `scales[n]` is the per-output-channel dequantization scale. K must be a multiple of 4.",
      "exports": [
        {
          "name": "matmulW8a16Shader",
          "kind": "function",
          "signature": "matmulW8a16Shader({ useShaderF16 = false } = {})",
          "summary": ""
        },
        {
          "name": "MATMUL_W8A16_ENTRY_POINT",
          "kind": "constant",
          "signature": "MATMUL_W8A16_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "MATMUL_W8A16_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "MATMUL_W8A16_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/normalization/rmsnorm_f16",
      "path": "agi/reference/particle_voice/nn/kernels/normalization/rmsnorm_f16.md",
      "source": "agi/particle_voice/nn/kernels/normalization/rmsnorm_f16.js",
      "import": "/agi/particle_voice/nn/kernels/normalization/rmsnorm_f16.js",
      "sourceHash": "598ad539ca4a533d2d0a56a11133457094e133738631d217d01f9e5a35cfe5be",
      "summary": "normalization/rmsnorm_f16.js — Phase 1 ParticleNN kernel. Row-wise RMSNorm: `out[i] = x[i] / sqrt(mean(x^2) + eps) * weight[i]`. One workgroup per row; workgroup-shared reduction for the sum-of-squares (standard tree reduction, `WORKGROUP_SIZE` must be a power of two). Accumulates in f32 regardless of `useShaderF16`, matching `matmul_w8a16.js`'s \"FP32 accumulation\" convention — only the input/output storage element type changes with the feature flag.",
      "exports": [
        {
          "name": "rmsnormF16Shader",
          "kind": "function",
          "signature": "rmsnormF16Shader({ useShaderF16 = false, eps = 1e-6 } = {})",
          "summary": ""
        },
        {
          "name": "RMSNORM_F16_ENTRY_POINT",
          "kind": "constant",
          "signature": "RMSNORM_F16_ENTRY_POINT",
          "summary": "normalization/rmsnorm_f16.js — Phase 1 ParticleNN kernel. Row-wise RMSNorm: `out[i] = x[i] / sqrt(mean(x^2) + eps) * weight[i]`. One workgroup per row; workgroup-shared reduction for the sum-of-squares (standard tree reduction, `WORKGROUP_SIZE` must be a power of two). Accumulates in f32 regardless of `useShaderF16`, matching `matmul_w8a16.js`'s \"FP32 accumulation\" convention — only the input/output storage element type changes with the feature flag."
        },
        {
          "name": "RMSNORM_F16_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "RMSNORM_F16_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/quantization/dequant_int8",
      "path": "agi/reference/particle_voice/nn/kernels/quantization/dequant_int8.md",
      "source": "agi/particle_voice/nn/kernels/quantization/dequant_int8.js",
      "import": "/agi/particle_voice/nn/kernels/quantization/dequant_int8.js",
      "sourceHash": "7bbca96258783b21efd68b02b9692a392ff0b24392eb92c285e9da9acbcd7ce1",
      "summary": "quantization/dequant_int8.js — Phase 1 ParticleNN kernel. Standalone unpack+dequantize kernel: `matmul_w8a16.js`/`conv1d_w8a16.js` fuse unpack+dequant+multiply-accumulate inline for performance, but `WeightPageUploader.js`/tooling sometimes need a plain materialized dequantized tensor (e.g. for a CPU-side parity check, or a debug visualization) without running a full matmul — this is that kernel. Uses the same `chunks/int8_pack.js` `unpack_int8` and per-block scale scheme as `ParticleTensor.js`'s documented `quant` metadata.",
      "exports": [
        {
          "name": "dequantInt8Shader",
          "kind": "function",
          "signature": "dequantInt8Shader({ useShaderF16 = false } = {})",
          "summary": ""
        },
        {
          "name": "DEQUANT_INT8_ENTRY_POINT",
          "kind": "constant",
          "signature": "DEQUANT_INT8_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "DEQUANT_INT8_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "DEQUANT_INT8_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/quantization/pack_unpack",
      "path": "agi/reference/particle_voice/nn/kernels/quantization/pack_unpack.md",
      "source": "agi/particle_voice/nn/kernels/quantization/pack_unpack.js",
      "import": "/agi/particle_voice/nn/kernels/quantization/pack_unpack.js",
      "sourceHash": "90b0f96a8adb1b4a91da43cea0f3defb250926901d802fbe8edde199ec2d4d29",
      "summary": "quantization/pack_unpack.js — Phase 1 ParticleNN kernel. The pack direction complementing `dequant_int8.js`'s unpack direction: a GPU kernel that bit-packs already-quantized int8 values (as `i32` inputs already rounded/clamped to [-127, 127] — computing the *scale* is a separate reduction pass, not this kernel's job) into 4-packed u32 words, matching `chunks/int8_pack.js`'s host-side `quantizeInt8Blockwise`'s packed-word layout exactly (so a GPU-side requantization pipeline and the JS host-side one are interchangeable).",
      "exports": [
        {
          "name": "packInt8Shader",
          "kind": "function",
          "signature": "packInt8Shader()",
          "summary": "Packs `array<i32>` (one already-quantized value per element, [-127,127]) into `array<u32>` (4 values per word). `count` must be a multiple of 4."
        },
        {
          "name": "packInt8Reference",
          "kind": "function",
          "signature": "packInt8Reference(quantizedInt8Array)",
          "summary": "JS-side reference pack, for parity-testing `packInt8Shader` against a CPU implementation. Mirrors `chunks/int8_pack.js`'s packing loop exactly."
        },
        {
          "name": "PACK_INT8_ENTRY_POINT",
          "kind": "constant",
          "signature": "PACK_INT8_ENTRY_POINT",
          "summary": "quantization/pack_unpack.js — Phase 1 ParticleNN kernel. The pack direction complementing `dequant_int8.js`'s unpack direction: a GPU kernel that bit-packs already-quantized int8 values (as `i32` inputs already rounded/clamped to [-127, 127] — computing the *scale* is a separate reduction pass, not this kernel's job) into 4-packed u32 words, matching `chunks/int8_pack.js`'s host-side `quantizeInt8Blockwise`'s packed-word layout exactly (so a GPU-side requantization pipeline and the JS host-side one are interchangeable)."
        },
        {
          "name": "PACK_INT8_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "PACK_INT8_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/crossfade",
      "path": "agi/reference/particle_voice/nn/kernels/speech/crossfade.md",
      "source": "agi/particle_voice/nn/kernels/speech/crossfade.js",
      "import": "/agi/particle_voice/nn/kernels/speech/crossfade.js",
      "sourceHash": "6a6d8a82d15cff5ee5fc0818df6413afe55c7a9a1924fd11ccd7a8c236f9a6f1",
      "summary": "crossfade.js — Phase 2 ParticleNN DSP kernel. Equal-power crossfade between two equal-length signals over their full length: `t = i/(length-1)`, `out = a*cos(t*pi/2) + b*sin(t*pi/2)` — equal-power (not linear) so the perceived loudness stays constant through the fade instead of dipping at the midpoint (linear crossfade's well-known flaw), matching the constant-power crossfade convention `ARCHITECTURE.md`'s reaction-system voice transitions call for.",
      "exports": [
        {
          "name": "crossfadeShader",
          "kind": "function",
          "signature": "crossfadeShader()",
          "summary": ""
        },
        {
          "name": "CROSSFADE_ENTRY_POINT",
          "kind": "constant",
          "signature": "CROSSFADE_ENTRY_POINT",
          "summary": "crossfade.js — Phase 2 ParticleNN DSP kernel. Equal-power crossfade between two equal-length signals over their full length: `t = i/(length-1)`, `out = a*cos(t*pi/2) + b*sin(t*pi/2)` — equal-power (not linear) so the perceived loudness stays constant through the fade instead of dipping at the midpoint (linear crossfade's well-known flaw), matching the constant-power crossfade convention `ARCHITECTURE.md`'s reaction-system voice transitions call for."
        },
        {
          "name": "CROSSFADE_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "CROSSFADE_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/embedding_f16",
      "path": "agi/reference/particle_voice/nn/kernels/speech/embedding_f16.md",
      "source": "agi/particle_voice/nn/kernels/speech/embedding_f16.js",
      "import": "/agi/particle_voice/nn/kernels/speech/embedding_f16.js",
      "sourceHash": "429357dde15d836e92ad885e48587bdaf14223107ea0287f4acee4ab0c1ca206",
      "summary": "speech/embedding_f16.js — Phase 1 ParticleNN kernel. Row-gather embedding lookup: `output[i, :] = table[ids[i], :]`. Named under `speech/` (not `matmul/`) because its first production consumer is `PhonemeEncoder.js`'s phoneme-ID embedding (Phase 3), looking up rows out of `PhonemeSet-v0`'s fixed 42-entry table — but the kernel itself is generic over table/embedding-dim size. (That count read \"51\" until Phase 3: the spec's own summary line miscounted its vowel tables. `frontend/PhonemeSet.js` is the executable source of truth and exports `PHONEME_COUNT = 42`, which is what a caller should size `tableRows` from rather than any hard-coded literal.) Output layout is `[numIds, embedDim]` — SEQUENCE-major, one row per token. Note that `convolution/conv1d_w8a16.js` expects CHANNEL-major `[inChannels, seqLen]`, so composing the two requires `core/transpose_2d.js` in between; `PhonemeEncoder.js` does exactly that.",
      "exports": [
        {
          "name": "embeddingF16Shader",
          "kind": "function",
          "signature": "embeddingF16Shader({ useShaderF16 = false } = {})",
          "summary": ""
        },
        {
          "name": "EMBEDDING_F16_ENTRY_POINT",
          "kind": "constant",
          "signature": "EMBEDDING_F16_ENTRY_POINT",
          "summary": "speech/embedding_f16.js — Phase 1 ParticleNN kernel. Row-gather embedding lookup: `output[i, :] = table[ids[i], :]`. Named under `speech/` (not `matmul/`) because its first production consumer is `PhonemeEncoder.js`'s phoneme-ID embedding (Phase 3), looking up rows out of `PhonemeSet-v0`'s fixed 42-entry table — but the kernel itself is generic over table/embedding-dim size. (That count read \"51\" until Phase 3: the spec's own summary line miscounted its vowel tables. `frontend/PhonemeSet.js` is the executable source of truth and exports `PHONEME_COUNT = 42`, which is what a caller should size `tableRows` from rather than any hard-coded literal.) Output layout is `[numIds, embedDim]` — SEQUENCE-major, one row per token. Note that `convolution/conv1d_w8a16.js` expects CHANNEL-major `[inChannels, seqLen]`, so composing the two requires `core/transpose_2d.js` in between; `PhonemeEncoder.js` does exactly that."
        },
        {
          "name": "EMBEDDING_F16_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "EMBEDDING_F16_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/harmonic_source",
      "path": "agi/reference/particle_voice/nn/kernels/speech/harmonic_source.md",
      "source": "agi/particle_voice/nn/kernels/speech/harmonic_source.js",
      "import": "/agi/particle_voice/nn/kernels/speech/harmonic_source.js",
      "sourceHash": "e4c63320996de935a002ed90d7ee86a1c84839a087e94e90de90a1686366fd1f",
      "summary": "harmonic_source.js — Phase 2 ParticleNN DSP kernel. Voiced glottal pulse train — the \"LF-lite\" raised-cosine shape proven in `risk/GlottalSource.js` (R6): flow(n) = 0.5*(1-cos(2*pi*cyclePos(n)/openSamples))  for cyclePos(n) < openSamples flow(n) = 0                                           otherwise Unlike R6's per-sample sequential CPU generator (which tracks `cyclePos` as running state, updated one sample at a time), this kernel computes every sample **in closed form and fully in parallel**: `cyclePos(n) = (start_phase + n) mod period_samples`, using an **absolute sample counter** (`start_phase`) the caller persists and advances across chunk boundaries — exactly the \"LF glottal source with absolute counter\" the plan's checklist calls for, and mathematically identical to R6's per-sample recurrence for as long as `period_samples`/`open_samples` hold constant across the dispatched chunk (the same constant-until-the- next-period-boundary assumption R6's own generator already makes). Aspiration noise is NOT mixed in here (unlike R6's spike, which combined both for simplicity) — that is `noise_source.js`'s job, mixed downstream, since the operator allowlist treats voiced and unvoiced excitation as independent ops that a later stage combines.",
      "exports": [
        {
          "name": "harmonicSourceShader",
          "kind": "function",
          "signature": "harmonicSourceShader()",
          "summary": ""
        },
        {
          "name": "HARMONIC_SOURCE_ENTRY_POINT",
          "kind": "constant",
          "signature": "HARMONIC_SOURCE_ENTRY_POINT",
          "summary": "harmonic_source.js — Phase 2 ParticleNN DSP kernel. Voiced glottal pulse train — the \"LF-lite\" raised-cosine shape proven in `risk/GlottalSource.js` (R6): flow(n) = 0.5*(1-cos(2*pi*cyclePos(n)/openSamples))  for cyclePos(n) < openSamples flow(n) = 0                                           otherwise Unlike R6's per-sample sequential CPU generator (which tracks `cyclePos` as running state, updated one sample at a time), this kernel computes every sample **in closed form and fully in parallel**: `cyclePos(n) = (start_phase + n) mod period_samples`, using an **absolute sample counter** (`start_phase`) the caller persists and advances across chunk boundaries — exactly the \"LF glottal source with absolute counter\" the plan's checklist calls for, and mathematically identical to R6's per-sample recurrence for as long as `period_samples`/`open_samples` hold constant across the dispatched chunk (the same constant-until-the- next-period-boundary assumption R6's own generator already makes). Aspiration noise is NOT mixed in here (unlike R6's spike, which combined both for simplicity) — that is `noise_source.js`'s job, mixed downstream, since the operator allowlist treats voiced and unvoiced excitation as independent ops that a later stage combines."
        },
        {
          "name": "HARMONIC_SOURCE_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "HARMONIC_SOURCE_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/mel_filterbank",
      "path": "agi/reference/particle_voice/nn/kernels/speech/mel_filterbank.md",
      "source": "agi/particle_voice/nn/kernels/speech/mel_filterbank.js",
      "import": "/agi/particle_voice/nn/kernels/speech/mel_filterbank.js",
      "sourceHash": "722bcc86cc8aa8e4f93c0be2d7ef3ca0b4a69f2d4bbf1a15ba1623645d0e3425",
      "summary": "mel_filterbank.js — Phase 2 ParticleNN DSP kernel. Applies a precomputed triangular mel filterbank matrix to a power/ magnitude spectrogram: `mel[f, m] = sum_k filterbank[m, k] * spectrum[f, k]` — a small matmul-shaped reduction, not a general matmul (the filterbank is fixed-shape and typically far smaller than `matmul_w8a16.js`'s tile sizes, so a dedicated one-thread-per-output-element kernel is simpler and avoids forcing an INT8-quantized weight path onto filter coefficients that are naturally small dense f32 matrices, not learned weights). The filterbank matrix itself (triangular mel-scale filters for a given sample rate/`n_mels`/`fmin`/`fmax`) is computed once on the CPU at model-load time — this kernel only applies it.",
      "exports": [
        {
          "name": "melFilterbankShader",
          "kind": "function",
          "signature": "melFilterbankShader()",
          "summary": ""
        },
        {
          "name": "MEL_FILTERBANK_ENTRY_POINT",
          "kind": "constant",
          "signature": "MEL_FILTERBANK_ENTRY_POINT",
          "summary": "mel_filterbank.js — Phase 2 ParticleNN DSP kernel. Applies a precomputed triangular mel filterbank matrix to a power/ magnitude spectrogram: `mel[f, m] = sum_k filterbank[m, k] * spectrum[f, k]` — a small matmul-shaped reduction, not a general matmul (the filterbank is fixed-shape and typically far smaller than `matmul_w8a16.js`'s tile sizes, so a dedicated one-thread-per-output-element kernel is simpler and avoids forcing an INT8-quantized weight path onto filter coefficients that are naturally small dense f32 matrices, not learned weights). The filterbank matrix itself (triangular mel-scale filters for a given sample rate/`n_mels`/`fmin`/`fmax`) is computed once on the CPU at model-load time — this kernel only applies it."
        },
        {
          "name": "MEL_FILTERBANK_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "MEL_FILTERBANK_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/noise_source",
      "path": "agi/reference/particle_voice/nn/kernels/speech/noise_source.md",
      "source": "agi/particle_voice/nn/kernels/speech/noise_source.js",
      "import": "/agi/particle_voice/nn/kernels/speech/noise_source.js",
      "sourceHash": "ee9442eec7b42af87042930c1b84cea804189903a9c738b7410385c2c7201070",
      "summary": "noise_source.js — Phase 2 ParticleNN DSP kernel. Deterministic, chunk-boundary-independent aspiration/turbulence noise — the exact integer hash proven in `risk/GlottalSource.js` (R6)'s `noiseAt(absoluteIndex, seed)` (itself the same technique as `StreamingContinuitySource.js`'s counter-based noise): a two-round Murmur-style avalanche hash of `absoluteIndex ^ seed`, mapped to `[-1, 1)`. Counter-based (not a stateful PRNG stream) so any two chunks covering the same absolute sample index always produce the same noise value, regardless of dispatch order or chunk boundaries — required for glitch-free streaming synthesis.",
      "exports": [
        {
          "name": "noiseSourceShader",
          "kind": "function",
          "signature": "noiseSourceShader()",
          "summary": ""
        },
        {
          "name": "NOISE_SOURCE_ENTRY_POINT",
          "kind": "constant",
          "signature": "NOISE_SOURCE_ENTRY_POINT",
          "summary": "noise_source.js — Phase 2 ParticleNN DSP kernel. Deterministic, chunk-boundary-independent aspiration/turbulence noise — the exact integer hash proven in `risk/GlottalSource.js` (R6)'s `noiseAt(absoluteIndex, seed)` (itself the same technique as `StreamingContinuitySource.js`'s counter-based noise): a two-round Murmur-style avalanche hash of `absoluteIndex ^ seed`, mapped to `[-1, 1)`. Counter-based (not a stateful PRNG stream) so any two chunks covering the same absolute sample index always produce the same noise value, regardless of dispatch order or chunk boundaries — required for glitch-free streaming synthesis."
        },
        {
          "name": "NOISE_SOURCE_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "NOISE_SOURCE_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/overlap_add",
      "path": "agi/reference/particle_voice/nn/kernels/speech/overlap_add.md",
      "source": "agi/particle_voice/nn/kernels/speech/overlap_add.js",
      "import": "/agi/particle_voice/nn/kernels/speech/overlap_add.js",
      "sourceHash": "d8034ad1def3f70176578813a48afd42eb3c50223999e246839a9e060ff454ed",
      "summary": "overlap_add.js — Phase 2 ParticleNN DSP kernel. Synthesis overlap-add: reconstructs a continuous signal from overlapping `frame_size`-length windowed frames at `hop_size` stride, matching `risk/WolaSignals.js`'s proven `overlapAdd` reference. Implemented as a **gather**, not a scatter: each output thread owns exactly one output sample and sums every frame that overlaps it (`f*hop <= t < f*hop + frame_size`) — WGSL's core spec has no `atomic<f32>` add, so a scatter (`output[t] += ...` from many threads across overlapping frames) would race; gathering avoids that entirely with no atomics and no serialized per-frame dispatches needed. `component_stride` is the number of consecutive `f32` components per logical sample in `frames_in`, so this kernel can consume both layouts the pipeline actually produces: - `component_stride = 1` — flat real frames. - `component_stride = 2` — INTERLEAVED COMPLEX frames, which is exactly what `ifft1024_f32.js` emits. Only the REAL component is summed (the imaginary residue of an inverse-transformed real signal is numerical noise), making this the ISTFT synthesis stage directly, with no separate deinterleave kernel needed in between. Without this stride, `frames_in[f*frame_size + n]` reads the interleaved-complex buffer as if it were flat real — silently mixing real and imaginary components of the wrong samples together. That gap was found by the `tests/particle-voice/stft-istft-identity.html` integration test.",
      "exports": [
        {
          "name": "overlapAddShader",
          "kind": "function",
          "signature": "overlapAddShader()",
          "summary": ""
        },
        {
          "name": "OVERLAP_ADD_ENTRY_POINT",
          "kind": "constant",
          "signature": "OVERLAP_ADD_ENTRY_POINT",
          "summary": "overlap_add.js — Phase 2 ParticleNN DSP kernel. Synthesis overlap-add: reconstructs a continuous signal from overlapping `frame_size`-length windowed frames at `hop_size` stride, matching `risk/WolaSignals.js`'s proven `overlapAdd` reference. Implemented as a **gather**, not a scatter: each output thread owns exactly one output sample and sums every frame that overlaps it (`f*hop <= t < f*hop + frame_size`) — WGSL's core spec has no `atomic<f32>` add, so a scatter (`output[t] += ...` from many threads across overlapping frames) would race; gathering avoids that entirely with no atomics and no serialized per-frame dispatches needed. `component_stride` is the number of consecutive `f32` components per logical sample in `frames_in`, so this kernel can consume both layouts the pipeline actually produces: - `component_stride = 1` — flat real frames. - `component_stride = 2` — INTERLEAVED COMPLEX frames, which is exactly what `ifft1024_f32.js` emits. Only the REAL component is summed (the imaginary residue of an inverse-transformed real signal is numerical noise), making this the ISTFT synthesis stage directly, with no separate deinterleave kernel needed in between. Without this stride, `frames_in[f*frame_size + n]` reads the interleaved-complex buffer as if it were flat real — silently mixing real and imaginary components of the wrong samples together. That gap was found by the `tests/particle-voice/stft-istft-identity.html` integration test."
        },
        {
          "name": "OVERLAP_ADD_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "OVERLAP_ADD_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/stft",
      "path": "agi/reference/particle_voice/nn/kernels/speech/stft.md",
      "source": "agi/particle_voice/nn/kernels/speech/stft.js",
      "import": "/agi/particle_voice/nn/kernels/speech/stft.js",
      "sourceHash": "2f1a0d7b155a23e65188b6f88b2782829ab86ed7cd51e9fed95c79fb5439d661",
      "summary": "stft.js — Phase 2 ParticleNN DSP kernel. The framing half of STFT: slices overlapping `frame_size`-length windows from a flat mono signal at `hop_size` stride (zero-padded past the signal's end), matching `risk/WolaSignals.js`'s proven `sliceFrames` reference exactly. Writes each frame's samples into the real channel of an interleaved-complex output (`fft1024_f32.js`'s layout) with the imaginary channel zeroed, so the output can be windowed (`window.js`) then fed directly to `fft1024_f32.js` — the actual FFT transform is a separate op (already in the operator allowlist), not duplicated here.",
      "exports": [
        {
          "name": "stftShader",
          "kind": "function",
          "signature": "stftShader()",
          "summary": ""
        },
        {
          "name": "STFT_ENTRY_POINT",
          "kind": "constant",
          "signature": "STFT_ENTRY_POINT",
          "summary": "stft.js — Phase 2 ParticleNN DSP kernel. The framing half of STFT: slices overlapping `frame_size`-length windows from a flat mono signal at `hop_size` stride (zero-padded past the signal's end), matching `risk/WolaSignals.js`'s proven `sliceFrames` reference exactly. Writes each frame's samples into the real channel of an interleaved-complex output (`fft1024_f32.js`'s layout) with the imaginary channel zeroed, so the output can be windowed (`window.js`) then fed directly to `fft1024_f32.js` — the actual FFT transform is a separate op (already in the operator allowlist), not duplicated here."
        },
        {
          "name": "STFT_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "STFT_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/kernels/speech/window",
      "path": "agi/reference/particle_voice/nn/kernels/speech/window.md",
      "source": "agi/particle_voice/nn/kernels/speech/window.js",
      "import": "/agi/particle_voice/nn/kernels/speech/window.js",
      "sourceHash": "ed9150e02394465ffea4789da4d3ed8b7d85d202fce393e562302d25b830f603",
      "summary": "window.js — Phase 2 ParticleNN DSP kernel. Applies a Hann window in-place across framed audio: `out[f,n] = in[f,n] * 0.5*(1-cos(2*pi*n/(N-1)))`, matching `risk/WolaSignals.js`'s proven `hannWindow`/`applyWindow` CPU reference exactly (same coefficient formula) so R3's WOLA identity tests remain the ground truth this kernel is checked against. The coefficient is computed in-shader from the frame-relative index rather than read from a precomputed buffer — one fewer buffer to manage, and Hann's formula is cheap per-element. `stride` is the number of consecutive `f32` components per logical sample, so the same kernel windows both layouts this pipeline actually produces: - `stride = 1` — flat real frames (`[f0s0, f0s1, ...]`). - `stride = 2` — INTERLEAVED COMPLEX frames (`[re, im, re, im, ...]`), which is exactly what `stft.js` emits and what `fft1024_f32.js` consumes. Both the real and imaginary component of a sample get the SAME coefficient (the correct definition of windowing a complex signal), because `n` is derived from the logical sample index `i / stride`, not the raw component index. Without this stride, `n = i % frame_size` silently mis-assigns coefficients when handed interleaved-complex data (component index and sample index diverge by a factor of 2), so `stft.js`'s documented \"output can be windowed (window.js) then fed directly to fft1024_f32.js\" composition would produce a wrong window. That gap was found by the `tests/particle-voice/stft-istft-identity.html` integration test — each kernel passed its own parity test in isolation, but the composed WOLA round-trip did not reconstruct.",
      "exports": [
        {
          "name": "windowShader",
          "kind": "function",
          "signature": "windowShader()",
          "summary": ""
        },
        {
          "name": "WINDOW_ENTRY_POINT",
          "kind": "constant",
          "signature": "WINDOW_ENTRY_POINT",
          "summary": "window.js — Phase 2 ParticleNN DSP kernel. Applies a Hann window in-place across framed audio: `out[f,n] = in[f,n] * 0.5*(1-cos(2*pi*n/(N-1)))`, matching `risk/WolaSignals.js`'s proven `hannWindow`/`applyWindow` CPU reference exactly (same coefficient formula) so R3's WOLA identity tests remain the ground truth this kernel is checked against. The coefficient is computed in-shader from the frame-relative index rather than read from a precomputed buffer — one fewer buffer to manage, and Hann's formula is cheap per-element. `stride` is the number of consecutive `f32` components per logical sample, so the same kernel windows both layouts this pipeline actually produces: - `stride = 1` — flat real frames (`[f0s0, f0s1, ...]`). - `stride = 2` — INTERLEAVED COMPLEX frames (`[re, im, re, im, ...]`), which is exactly what `stft.js` emits and what `fft1024_f32.js` consumes. Both the real and imaginary component of a sample get the SAME coefficient (the correct definition of windowing a complex signal), because `n` is derived from the logical sample index `i / stride`, not the raw component index. Without this stride, `n = i % frame_size` silently mis-assigns coefficients when handed interleaved-complex data (component index and sample index diverge by a factor of 2), so `stft.js`'s documented \"output can be windowed (window.js) then fed directly to fft1024_f32.js\" composition would produce a wrong window. That gap was found by the `tests/particle-voice/stft-istft-identity.html` integration test — each kernel passed its own parity test in isolation, but the composed WOLA round-trip did not reconstruct."
        },
        {
          "name": "WINDOW_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "WINDOW_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/memory/ActivationArena",
      "path": "agi/reference/particle_voice/nn/memory/ActivationArena.md",
      "source": "agi/particle_voice/nn/memory/ActivationArena.js",
      "import": "/agi/particle_voice/nn/memory/ActivationArena.js",
      "sourceHash": "eac1b45ac84a89abb447f9b30ed89aa5ca5bbe4e83f48a03039097dd690d0d0c",
      "summary": "ActivationArena.js — Phase 1 ParticleNN memory. Transient GPU-buffer pool for activation tensors, keyed by byte size: `acquire(tensorName, byteLength)` reuses a same-size buffer already released by an earlier tensor instead of allocating a new one, and `release(tensorName)` (driven by `TensorLifetimePlanner.freedAfter()`) returns a buffer to the pool the moment its last consumer has run.",
      "exports": [
        {
          "name": "ActivationArena",
          "kind": "class",
          "signature": "class ActivationArena",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/memory/GradientArena",
      "path": "agi/reference/particle_voice/nn/memory/GradientArena.md",
      "source": "agi/particle_voice/nn/memory/GradientArena.js",
      "import": "/agi/particle_voice/nn/memory/GradientArena.js",
      "sourceHash": "8d1d44f0935d341b7e23d69e91cda856d6f1e8f909417d953dd2a5593c0ab6d4",
      "summary": "GradientArena.js — Phase 1 ParticleNN memory. Transient GPU-buffer pool for gradient tensors during backward passes — identical pooling mechanism to `ActivationArena.js` (same size-bucketed acquire/release), given its own class identity/file per the plan's checklist rather than duplicated logic, since forward-pass activation buffers and backward-pass gradient buffers have separate lifetimes and should never be pooled together (an activation still needed for a backward computation must not be silently reused as a gradient buffer). Not wired into any executor until Phase 11 (autodiff), per the plan.",
      "exports": [
        {
          "name": "GradientArena",
          "kind": "class",
          "signature": "class GradientArena extends ActivationArena",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/memory/TensorLifetimePlanner",
      "path": "agi/reference/particle_voice/nn/memory/TensorLifetimePlanner.md",
      "source": "agi/particle_voice/nn/memory/TensorLifetimePlanner.js",
      "import": "/agi/particle_voice/nn/memory/TensorLifetimePlanner.js",
      "sourceHash": "bd72d9692af552d764704ccd9c39a049bba77431539f6f6a19ed2e1c7fc67330",
      "summary": "TensorLifetimePlanner.js — Phase 1 ParticleNN memory. First/last-use analysis over a `ParticleProgram`'s step order: for every tensor name, which step produces it (or `-1` if it's an external input to the program) and which step is the last to read it. `ActivationArena.js`/ `GradientArena.js` use `freedAfter(stepIndex)` to know exactly when a buffer becomes free to hand to the next tensor that needs one, enabling buffer aliasing instead of one allocation per tensor per run.",
      "exports": [
        {
          "name": "TensorLifetimePlanner",
          "kind": "class",
          "signature": "class TensorLifetimePlanner",
          "summary": "TensorLifetimePlanner.js — Phase 1 ParticleNN memory. First/last-use analysis over a `ParticleProgram`'s step order: for every tensor name, which step produces it (or `-1` if it's an external input to the program) and which step is the last to read it. `ActivationArena.js`/ `GradientArena.js` use `freedAfter(stepIndex)` to know exactly when a buffer becomes free to hand to the next tensor that needs one, enabling buffer aliasing instead of one allocation per tensor per run."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/memory/WeightBindWindow",
      "path": "agi/reference/particle_voice/nn/memory/WeightBindWindow.md",
      "source": "agi/particle_voice/nn/memory/WeightBindWindow.js",
      "import": "/agi/particle_voice/nn/memory/WeightBindWindow.js",
      "sourceHash": "5385ec8f358658553731ac75f55163cb44af8ad2ddbcb022af55bd8f20766561",
      "summary": "WeightBindWindow.js — Phase 1 ParticleNN memory. Storage-buffer bind group for a program segment's resident weight pages (up to 16 pages, per the plan's \"never allocate one monolithic buffer over 128 MiB\" rule) — one GPU buffer per page (not one big buffer for the whole window), matching `WeightPageStore.js`'s per-page granularity.",
      "exports": [
        {
          "name": "WeightBindWindow",
          "kind": "class",
          "signature": "class WeightBindWindow",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/memory/WeightPageStore",
      "path": "agi/reference/particle_voice/nn/memory/WeightPageStore.md",
      "source": "agi/particle_voice/nn/memory/WeightPageStore.js",
      "import": "/agi/particle_voice/nn/memory/WeightPageStore.js",
      "sourceHash": "10d30c53acf5bdc1d72c5eafe213b77d08a60a2bebbba276ffd3d686a93b1e13",
      "summary": "WeightPageStore.js — Phase 1 ParticleNN memory. Logical 16–32 MiB weight-page manifest: a page = a contiguous tensor set with its own SHA-256 hash, matching `PRNN-v0.md` §6's directory shape exactly (`{ index, byteLength, offset, hash }`) — the EXACT format R8 (`risk/WeightPagingProbe.js`) already proved works for interrupted downloads (retry, not silent data loss) and corruption detection (hash mismatch actually caught, not tautological). Network fetch is injected (`fetchPage(pageIndex, directoryEntry) => Promise<ArrayBuffer|TypedArray>`) rather than hardcoded to `fetch()`, so this store is testable with a deterministic fake fetcher (as R8 was) and still usable with a real HTTP fetch in production without a second implementation.",
      "exports": [
        {
          "name": "WeightPageStore",
          "kind": "class",
          "signature": "class WeightPageStore",
          "summary": ""
        },
        {
          "name": "buildPageDirectory",
          "kind": "function",
          "signature": "async buildPageDirectory(pages)",
          "summary": "Build a `PRNN-v0` §6-shaped directory from page byte data, computing each page's real hash and cumulative byte offset."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/memory/WeightPageUploader",
      "path": "agi/reference/particle_voice/nn/memory/WeightPageUploader.md",
      "source": "agi/particle_voice/nn/memory/WeightPageUploader.js",
      "import": "/agi/particle_voice/nn/memory/WeightPageUploader.js",
      "sourceHash": "7435c2d6f05cbf9de1c754623ffa329a6aa7a0bcbca522af8705bce2bdcb3a6b",
      "summary": "WeightPageUploader.js — Phase 1 ParticleNN memory. Orchestrates `WeightPageStore.js` (download+hash-verify) and `WeightBindWindow.js` (GPU upload) together: priority-ordered upload, resumability (skip already-uploaded pages), and device-loss re-upload — the exact three properties R8 (`risk/WeightPagingProbe.js`) proved for a single/multi-page toy case, generalized here to an arbitrary page count and caller-chosen priority order.",
      "exports": [
        {
          "name": "WeightPageUploader",
          "kind": "class",
          "signature": "class WeightPageUploader",
          "summary": ""
        },
        {
          "name": "attachDeviceLossRecovery",
          "kind": "function",
          "signature": "attachDeviceLossRecovery(device, uploader, recreateDevice, { maxBackoffMs = 8000 } = {})",
          "summary": "Wire the `device.lost` recovery contract from `DeviceContract-v0.md` §5: skip recovery if `reason === 'destroyed'` (intentional disposal, not a crash); otherwise recreate the device with exponential backoff and call `uploader.reuploadAfterDeviceLoss(newDevice)`."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/memory/WeightResidencyPlan",
      "path": "agi/reference/particle_voice/nn/memory/WeightResidencyPlan.md",
      "source": "agi/particle_voice/nn/memory/WeightResidencyPlan.js",
      "import": "/agi/particle_voice/nn/memory/WeightResidencyPlan.js",
      "sourceHash": "ea04fadf8b5ac2e88563b68ba19fbff2a0eae666f0ebb2b124c0a9a9465831cf",
      "summary": "WeightResidencyPlan.js — Phase 1 ParticleNN memory. For each program segment (from a `PRNN-v0.md` §7 bind-window directory: `{ windows: [{ segmentId, pageIndices, bindGroupLayoutHash }] }`), which pages must be resident — plus the diff between two segments' page sets, so a scheduler can decide exactly which pages to load/evict when moving from one segment to the next instead of reloading everything.",
      "exports": [
        {
          "name": "WeightResidencyPlan",
          "kind": "class",
          "signature": "class WeightResidencyPlan",
          "summary": "WeightResidencyPlan.js — Phase 1 ParticleNN memory. For each program segment (from a `PRNN-v0.md` §7 bind-window directory: `{ windows: [{ segmentId, pageIndices, bindGroupLayoutHash }] }`), which pages must be resident — plus the diff between two segments' page sets, so a scheduler can decide exactly which pages to load/evict when moving from one segment to the next instead of reloading everything."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/runtime/DeviceProfile",
      "path": "agi/reference/particle_voice/nn/runtime/DeviceProfile.md",
      "source": "agi/particle_voice/nn/runtime/DeviceProfile.js",
      "import": "/agi/particle_voice/nn/runtime/DeviceProfile.js",
      "sourceHash": "31c8954ef49265dc1501c24513283f86b700e9533fe31ec7db3e31157bb3bc05",
      "summary": "DeviceProfile.js — Phase 1 ParticleNN runtime. Capability/tier detection, implementing exactly the tier rules frozen in `spec/DeviceContract-v0.md` §1–§2 (hard requirements + `full`/`no-f16`/ `unsupported` tiers) — not a new policy invented here. Reuses the engine's own WebGPU acquisition (`engine/core/gpu/GpuDevice.js`) rather than reimplementing adapter/device request logic, same as R1's `risk/DeviceMatrixProbe.js`.",
      "exports": [
        {
          "name": "detectDeviceProfile",
          "kind": "function",
          "signature": "async detectDeviceProfile()",
          "summary": "Acquire a throwaway GPUDevice, classify its tier per DeviceContract-v0 §1–§2, then destroy it — mirrors R1's read-only probe discipline. The caller is expected to acquire its OWN long-lived device separately (this function is a classification probe, not a device provider)."
        },
        {
          "name": "DEVICE_TIER",
          "kind": "constant",
          "signature": "DEVICE_TIER",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/runtime/KernelValidation",
      "path": "agi/reference/particle_voice/nn/runtime/KernelValidation.md",
      "source": "agi/particle_voice/nn/runtime/KernelValidation.js",
      "import": "/agi/particle_voice/nn/runtime/KernelValidation.js",
      "sourceHash": "385a98aa791b1e1e4f2b0e4ded668e3ba44256cebc973d96161ec0d1f4282c9c",
      "summary": "KernelValidation.js — Phase 1 ParticleNN testing. Reusable dispatch-and-readback plumbing plus the plan's required edge-case test-vector generators (\"odd dims, min dims, zeros, extreme FP16, quantized values\") — kept generic over binding shape rather than one runner-per-kernel, since Phase 1's six kernels all differ in bind-group layout but share the same \"encode uniform + storage buffers, dispatch, read one output buffer back, compare to a JS reference\" shape.",
      "exports": [
        {
          "name": "dispatchAndReadback",
          "kind": "function",
          "signature": "async dispatchAndReadback(device, wgslSource, { uniform, storageInputs = [], outputByteLength, entryPoint = 'main', label = 'KernelValidation' }, workgroups)",
          "summary": "Run one compute dispatch against a set of storage/uniform buffers built from plain typed arrays, then read one designated output buffer back. Compiles `wgslSource` itself (rather than accepting a pre-built pipeline) so it can pair the shader module with the matching explicit bind group layout described above."
        },
        {
          "name": "checkParity",
          "kind": "function",
          "signature": "checkParity(actual, expected, tolerance)",
          "summary": "Compare an actual numeric array to an expected one and return a parity-check result object matching R2's `MatmulBenchProbe.js` shape."
        },
        {
          "name": "randomVector",
          "kind": "function",
          "signature": "randomVector(length, seed = 1)",
          "summary": "Random values in [-1, 1], deterministic given `seed`."
        },
        {
          "name": "zerosVector",
          "kind": "function",
          "signature": "zerosVector(length)",
          "summary": ""
        },
        {
          "name": "extremeF16Vector",
          "kind": "function",
          "signature": "extremeF16Vector(length)",
          "summary": "Values right at/near the extremes a well-behaved f16 encoder/kernel must not silently clip or NaN on."
        },
        {
          "name": "quantizedEdgeVector",
          "kind": "function",
          "signature": "quantizedEdgeVector(length)",
          "summary": "Values already rounded to representable int8 codes, for quantization-path parity tests."
        },
        {
          "name": "EDGE_CASE_DIMENSIONS",
          "kind": "constant",
          "signature": "EDGE_CASE_DIMENSIONS",
          "summary": "Standard edge-case dimension set: odd, minimal (1), and a \"normal\" power-of-two size, for sweeping a kernel's dimension parameter."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/runtime/NeuralExecutor",
      "path": "agi/reference/particle_voice/nn/runtime/NeuralExecutor.md",
      "source": "agi/particle_voice/nn/runtime/NeuralExecutor.js",
      "import": "/agi/particle_voice/nn/runtime/NeuralExecutor.js",
      "sourceHash": "ef9bbe66fc96d55c08304075c6b5b97f93a57d069ce12fe5513a6cffe29ffcd6",
      "summary": "NeuralExecutor.js — Phase 1 ParticleNN runtime. Dispatches a compiled `ParticleProgram`'s steps as one command encoder (one compute pass per step, in program order), then submits through the engine's own `GpuFrameBudgetBroker` when one is supplied — sharing the render queue's frame budget rather than a second, uncoordinated submission path. Falls back to a direct `device.queue.submit()` when no broker is given (e.g. an offline/background compile-and-run context with no render loop to share a budget with).",
      "exports": [
        {
          "name": "NeuralExecutor",
          "kind": "class",
          "signature": "class NeuralExecutor",
          "summary": "NeuralExecutor.js — Phase 1 ParticleNN runtime. Dispatches a compiled `ParticleProgram`'s steps as one command encoder (one compute pass per step, in program order), then submits through the engine's own `GpuFrameBudgetBroker` when one is supplied — sharing the render queue's frame budget rather than a second, uncoordinated submission path. Falls back to a direct `device.queue.submit()` when no broker is given (e.g. an offline/background compile-and-run context with no render loop to share a budget with)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/runtime/NeuralScheduler",
      "path": "agi/reference/particle_voice/nn/runtime/NeuralScheduler.md",
      "source": "agi/particle_voice/nn/runtime/NeuralScheduler.js",
      "import": "/agi/particle_voice/nn/runtime/NeuralScheduler.js",
      "sourceHash": "2363c74ee062bd1970e7142a890ea71a97e670380464ef8a87bc6513c5fa268a",
      "summary": "NeuralScheduler.js — Phase 1 ParticleNN runtime. Priority-ordered queue of `NeuralExecutor.run()` requests — for when several `ParticleProgram` runs are pending at once (e.g. multiple NPCs queued to speak in the same frame window). Mirrors `engine/core/gpu/AsyncComputeScheduler.js`'s high/normal/low priority bucket design (reference, not imported — ParticleNN stays decoupled from the render-side scheduler's internals) layered on top of `NeuralExecutor.js`, which already defers to a shared `GpuFrameBudgetBroker` for actual frame-budget admission — this file's job is only ordering *which* run gets submitted next, not re-deriving budget admission itself.",
      "exports": [
        {
          "name": "NeuralScheduler",
          "kind": "class",
          "signature": "class NeuralScheduler",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/runtime/NumericalTolerance",
      "path": "agi/reference/particle_voice/nn/runtime/NumericalTolerance.md",
      "source": "agi/particle_voice/nn/runtime/NumericalTolerance.js",
      "import": "/agi/particle_voice/nn/runtime/NumericalTolerance.js",
      "sourceHash": "aa27534a4aa10491753d2c31f030baedb968226b0051d21db4d8c672eb76b387",
      "summary": "NumericalTolerance.js — Phase 1 ParticleNN testing. Canonical tolerance constants (single source — `chunks/f16_utils.js` re-exports these rather than defining its own copy) and the shared abs/rel-error comparison used by `KernelValidation.js` and every kernel parity test, matching the exact convention R2's `MatmulBenchProbe.js` already proved out (`maxAbsError`/`maxRelError` against a JS scalar reference).",
      "exports": [
        {
          "name": "maxErrors",
          "kind": "function",
          "signature": "maxErrors(actual, expected)",
          "summary": "Elementwise max abs/rel error between two same-length numeric arrays."
        },
        {
          "name": "withinTolerance",
          "kind": "function",
          "signature": "withinTolerance(actual, expected, { absTolerance, relTolerance })",
          "summary": "True if `maxErrors(actual, expected)` is within `{ absTolerance, relTolerance }` (either bound satisfied per-element is sufficient — matches R2's tolerance semantics)."
        },
        {
          "name": "F16_ABS_TOLERANCE",
          "kind": "constant",
          "signature": "F16_ABS_TOLERANCE",
          "summary": "NumericalTolerance.js — Phase 1 ParticleNN testing. Canonical tolerance constants (single source — `chunks/f16_utils.js` re-exports these rather than defining its own copy) and the shared abs/rel-error comparison used by `KernelValidation.js` and every kernel parity test, matching the exact convention R2's `MatmulBenchProbe.js` already proved out (`maxAbsError`/`maxRelError` against a JS scalar reference)."
        },
        {
          "name": "F16_REL_TOLERANCE",
          "kind": "constant",
          "signature": "F16_REL_TOLERANCE",
          "summary": ""
        },
        {
          "name": "F32_ABS_TOLERANCE",
          "kind": "constant",
          "signature": "F32_ABS_TOLERANCE",
          "summary": ""
        },
        {
          "name": "F32_REL_TOLERANCE",
          "kind": "constant",
          "signature": "F32_REL_TOLERANCE",
          "summary": ""
        },
        {
          "name": "INT8_ABS_TOLERANCE",
          "kind": "constant",
          "signature": "INT8_ABS_TOLERANCE",
          "summary": ""
        },
        {
          "name": "INT8_REL_TOLERANCE",
          "kind": "constant",
          "signature": "INT8_REL_TOLERANCE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/runtime/PipelineCache",
      "path": "agi/reference/particle_voice/nn/runtime/PipelineCache.md",
      "source": "agi/particle_voice/nn/runtime/PipelineCache.js",
      "import": "/agi/particle_voice/nn/runtime/PipelineCache.js",
      "sourceHash": "50cf334c904b0186cb1557a0d705696c50062d74cf49c239339a70c010941e48",
      "summary": "PipelineCache.js — Phase 1 ParticleNN runtime. Hash-keyed compute pipeline cache: avoids recompiling the same WGSL source + entry point on every dispatch. Keyed by a cheap string hash of the generated WGSL source (kernels are JS-generated, so byte-identical source for the same params is expected — see `nn/kernels/ShaderComposer.js`), not by kernel name + params (two different param sets can legitimately generate identical WGSL, and caching by source avoids a redundant compile in that case too).",
      "exports": [
        {
          "name": "PipelineCache",
          "kind": "class",
          "signature": "class PipelineCache",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/nn/runtime/PipelineUtils",
      "path": "agi/reference/particle_voice/nn/runtime/PipelineUtils.md",
      "source": "agi/particle_voice/nn/runtime/PipelineUtils.js",
      "import": "/agi/particle_voice/nn/runtime/PipelineUtils.js",
      "sourceHash": "0c1b6e24952617f04e3c5e9573573fae2065095eda080ab65687c90c9a204150",
      "summary": "PipelineUtils.js — Phase 1 ParticleNN runtime. Deliberate byte-for-byte mirror of `agi/llm/kernels/PipelineUtils.js` (design reference, not imported) per the plan's explicit instruction to keep ParticleNN decoupled from the LLM runtime. Already proven correct — every Phase -1 risk spike (R2, R3, R9, etc.) has been using the LLM runtime's copy of this exact logic directly; this is the same logic under ParticleVoice's own module tree.",
      "exports": [
        {
          "name": "createComputePipelineChecked",
          "kind": "function",
          "signature": "async createComputePipelineChecked(device, module, { label, name = label, entryPoint = 'main' } = {})",
          "summary": "PipelineUtils.js — Phase 1 ParticleNN runtime. Deliberate byte-for-byte mirror of `agi/llm/kernels/PipelineUtils.js` (design reference, not imported) per the plan's explicit instruction to keep ParticleNN decoupled from the LLM runtime. Already proven correct — every Phase -1 risk spike (R2, R3, R9, etc.) has been using the LLM runtime's copy of this exact logic directly; this is the same logic under ParticleVoice's own module tree."
        },
        {
          "name": "assertShaderCompiled",
          "kind": "function",
          "signature": "async assertShaderCompiled(module, name = 'shader')",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/ActivityIntegrationProbe",
      "path": "agi/reference/particle_voice/risk/ActivityIntegrationProbe.md",
      "source": "agi/particle_voice/risk/ActivityIntegrationProbe.js",
      "import": "/agi/particle_voice/risk/ActivityIntegrationProbe.js",
      "sourceHash": "5f45a5c33268b24bad3b8fbfded957130d998bf5c63cebfe7dd5bfea83354342",
      "summary": "ActivityIntegrationProbe.js — R15 Phase -1 risk spike orchestrator.",
      "exports": [
        {
          "name": "runActivityIntegrationProbe",
          "kind": "function",
          "signature": "async runActivityIntegrationProbe()",
          "summary": ""
        },
        {
          "name": "buildActivityIntegrationReceipt",
          "kind": "function",
          "signature": "async buildActivityIntegrationReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareActivityIntegrationReceiptDownload",
          "kind": "function",
          "signature": "prepareActivityIntegrationReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R15_ACTIVITY_INTEGRATION_SCHEMA",
          "kind": "constant",
          "signature": "R15_ACTIVITY_INTEGRATION_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/BreathReservoir",
      "path": "agi/reference/particle_voice/risk/BreathReservoir.md",
      "source": "agi/particle_voice/risk/BreathReservoir.js",
      "import": "/agi/particle_voice/risk/BreathReservoir.js",
      "sourceHash": "ffe089a7151a6c9efcf5216328a38ca4ad954711c30c25c3c205903c4603f543",
      "summary": "BreathReservoir.js — R6A Phase -1 risk spike. \"BreathReservoirState (lung pressure, compliance, target subglottal pressure) -> ParticleTract\" — particle-voice-26357c.md, Phase 2. Minimal first-order lag model: lung pressure exponentially approaches whatever target subglottal pressure RespiratoryDriveHead commands, rate set by `compliance` (higher compliance = slower to respond, matching the physical intuition of a more elastic reservoir). This is the mechanism that lets a physiology intervention on breath effort actually change the glottal source's amplitude sample-by-sample rather than jumping instantly.",
      "exports": [
        {
          "name": "createBreathReservoir",
          "kind": "function",
          "signature": "createBreathReservoir({ sampleRate, compliance = 0.15 })",
          "summary": "BreathReservoir.js — R6A Phase -1 risk spike. \"BreathReservoirState (lung pressure, compliance, target subglottal pressure) -> ParticleTract\" — particle-voice-26357c.md, Phase 2. Minimal first-order lag model: lung pressure exponentially approaches whatever target subglottal pressure RespiratoryDriveHead commands, rate set by `compliance` (higher compliance = slower to respond, matching the physical intuition of a more elastic reservoir). This is the mechanism that lets a physiology intervention on breath effort actually change the glottal source's amplitude sample-by-sample rather than jumping instantly."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/CaptureGate",
      "path": "agi/reference/particle_voice/risk/CaptureGate.md",
      "source": "agi/particle_voice/risk/CaptureGate.js",
      "import": "/agi/particle_voice/risk/CaptureGate.js",
      "sourceHash": "7366a995a49542c91c20e99483438c6071e8d4540ca4bf8c1bb0d2b25707a86e",
      "summary": "CaptureGate.js — R14 Phase -1 risk spike. \"Custom-voice capture rejects insufficient speech, low SNR, clipping, echo, music, another speaker, gain drift, device changes, dropped samples, silence, or poor coverage.\" — Phase -1. Each check is a cheap, independently testable heuristic proxy (not a trained classifier) over a session of R10 `ParticleEnergyMeter` frame analyses plus out-of-band capture metadata (device-change/dropped-sample counts, target-phrase coverage) that a real `MicrophoneAudioWorklet` / `MicrophoneStream` layer — not the energy meter — would track.",
      "exports": [
        {
          "name": "checkInsufficientSpeech",
          "kind": "function",
          "signature": "checkInsufficientSpeech(frames)",
          "summary": ""
        },
        {
          "name": "checkLowSnr",
          "kind": "function",
          "signature": "checkLowSnr(frames)",
          "summary": ""
        },
        {
          "name": "checkClipping",
          "kind": "function",
          "signature": "checkClipping(frames)",
          "summary": ""
        },
        {
          "name": "checkEcho",
          "kind": "function",
          "signature": "checkEcho(echoResidualRatio)",
          "summary": "Echo contamination: strong correlation between the recording and a known TTS reference."
        },
        {
          "name": "checkMusic",
          "kind": "function",
          "signature": "checkMusic(frames)",
          "summary": "Music proxy: natural speech's frame-to-frame RMS is far less stable than sustained tonal/musical content."
        },
        {
          "name": "checkAnotherSpeaker",
          "kind": "function",
          "signature": "checkAnotherSpeaker(frames)",
          "summary": "Another-speaker proxy: an abrupt, sustained shift in low/high band energy balance partway through."
        },
        {
          "name": "checkGainDrift",
          "kind": "function",
          "signature": "checkGainDrift(frames)",
          "summary": "Gain drift: mean level of the last third vs first third of the speech should stay close."
        },
        {
          "name": "checkDeviceChanges",
          "kind": "function",
          "signature": "checkDeviceChanges(deviceChangeEventCount)",
          "summary": ""
        },
        {
          "name": "checkDroppedSamples",
          "kind": "function",
          "signature": "checkDroppedSamples(droppedSampleCount)",
          "summary": ""
        },
        {
          "name": "checkTooMuchSilence",
          "kind": "function",
          "signature": "checkTooMuchSilence(frames)",
          "summary": ""
        },
        {
          "name": "checkPoorCoverage",
          "kind": "function",
          "signature": "checkPoorCoverage(phraseCoverageRatio)",
          "summary": ""
        },
        {
          "name": "evaluateCaptureQuality",
          "kind": "function",
          "signature": "evaluateCaptureQuality(session)",
          "summary": "`session` = { frames, echoResidualRatio, deviceChangeEventCount, droppedSampleCount, phraseCoverageRatio }."
        },
        {
          "name": "CAPTURE_GATE_REASONS",
          "kind": "constant",
          "signature": "CAPTURE_GATE_REASONS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/CaptureGateProbe",
      "path": "agi/reference/particle_voice/risk/CaptureGateProbe.md",
      "source": "agi/particle_voice/risk/CaptureGateProbe.js",
      "import": "/agi/particle_voice/risk/CaptureGateProbe.js",
      "sourceHash": "b03045b72df9d73801add171378ba456834a7696c7c44a1eec4084f79fc2b151",
      "summary": "CaptureGateProbe.js — R14 Phase -1 risk spike orchestrator.",
      "exports": [
        {
          "name": "runCaptureGateProbe",
          "kind": "function",
          "signature": "async runCaptureGateProbe()",
          "summary": ""
        },
        {
          "name": "buildCaptureGateReceipt",
          "kind": "function",
          "signature": "async buildCaptureGateReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareCaptureGateReceiptDownload",
          "kind": "function",
          "signature": "prepareCaptureGateReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R14_CAPTURE_GATE_SCHEMA",
          "kind": "constant",
          "signature": "R14_CAPTURE_GATE_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/DeviceMatrixProbe",
      "path": "agi/reference/particle_voice/risk/DeviceMatrixProbe.md",
      "source": "agi/particle_voice/risk/DeviceMatrixProbe.js",
      "import": "/agi/particle_voice/risk/DeviceMatrixProbe.js",
      "sourceHash": "e268297bbe81287841f8f56f868f67537f54ce9cda6759f84147eff92d89369e",
      "summary": "DeviceMatrixProbe.js — R1 Phase -1 risk spike. \"device-matrix.html — record shader-f16, workgroup/storage/binding/invocation limits, AudioContext properties, crossOriginIsolated, AudioWorklet/ SharedArrayBuffer, OS VRAM quota.\" — particle-voice-26357c.md, Phase -1. Reuses the engine's own capability-probing primitives instead of reimplementing WebGPU adapter/device acquisition: - engine/core/gpu/GpuDevice.js  (GpuDevice.create, detectGpuPlatform) - engine/core/gpu/GpuInit.js    (isWebGpuSupported) - webgpu-os/kernel/VRAMTracker.js (default app/global quota) Read-only: the WebGPU device created here is destroyed immediately after limits/features are read, and the AudioContext is closed immediately after its properties are read.",
      "exports": [
        {
          "name": "probeWebGpu",
          "kind": "function",
          "signature": "async probeWebGpu()",
          "summary": "Acquire a throwaway GPUDevice via the engine's own GpuDevice, read limits/features, destroy it."
        },
        {
          "name": "probeAudioContext",
          "kind": "function",
          "signature": "async probeAudioContext()",
          "summary": "Construct a throwaway AudioContext, read its properties, close it."
        },
        {
          "name": "probeCrossOriginIsolation",
          "kind": "function",
          "signature": "probeCrossOriginIsolation()",
          "summary": ""
        },
        {
          "name": "probeSharedArrayBuffer",
          "kind": "function",
          "signature": "probeSharedArrayBuffer()",
          "summary": "Confirm SharedArrayBuffer is not just present but actually constructible."
        },
        {
          "name": "probeVramQuota",
          "kind": "function",
          "signature": "probeVramQuota()",
          "summary": "Read the OS default VRAM quota (webgpu-os/kernel/VRAMTracker.js), no kernel required."
        },
        {
          "name": "runDeviceMatrixProbe",
          "kind": "function",
          "signature": "async runDeviceMatrixProbe()",
          "summary": "Run every device-matrix probe and roll up an overall status. `unsupported` is a distinct outcome from `fail`, matching the plan's own Production Contract language (\"Unsupported hardware is reported explicitly as unsupported... the project does not degrade to an external runtime\"): - unsupported: WebGPU itself is unavailable on this device/browser. - fail: WebGPU is available, but a hard architectural requirement (crossOriginIsolated, SharedArrayBuffer, AudioWorklet) is missing — almost always a *serving* problem (missing COOP/COEP headers), not a hardware ceiling. Re-check via start_server.py before treating as real. - pass: WebGPU + AudioContext + cross-origin isolation + SharedArrayBuffer + AudioWorklet are all present."
        },
        {
          "name": "buildDeviceMatrixReceipt",
          "kind": "function",
          "signature": "async buildDeviceMatrixReceipt(result)",
          "summary": "Wrap a raw probe result into the immutable JSON receipt described by the R1 exit gate: \"Per-device limits + capability table.\""
        },
        {
          "name": "prepareDeviceMatrixReceiptDownload",
          "kind": "function",
          "signature": "prepareDeviceMatrixReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R1_DEVICE_MATRIX_SCHEMA",
          "kind": "constant",
          "signature": "R1_DEVICE_MATRIX_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/EchoBargeIn",
      "path": "agi/reference/particle_voice/risk/EchoBargeIn.md",
      "source": "agi/particle_voice/risk/EchoBargeIn.js",
      "import": "/agi/particle_voice/risk/EchoBargeIn.js",
      "sourceHash": "211ae8237cd22101111d83b9733d5269a21814c04db1bb49493594748be9025e",
      "summary": "EchoBargeIn.js — R12 Phase -1 risk spike. \"echo reference ring, delay estimation, acoustic echo suppression, double-talk detection, no self-interruption.\" — Phase -1. Simplified fixed-delay echo cancellation (cross-correlation delay estimate + least-squares gain fit + direct subtraction), not an adaptive filter (NLMS/Kalman) — enough to prove the architecture correctly distinguishes pure echo from genuine double-talk. `AcousticEchoController.js` (Phase 2+) would use a real adaptive filter for real acoustic paths that drift over time; this fixed-delay model is a feasibility check.",
      "exports": [
        {
          "name": "createEchoReferenceRing",
          "kind": "function",
          "signature": "createEchoReferenceRing(capacitySamples)",
          "summary": ""
        },
        {
          "name": "estimateDelay",
          "kind": "function",
          "signature": "estimateDelay(reference, microphone, maxDelaySamples)",
          "summary": "Cross-correlation delay estimate: which shift of `reference` best predicts `microphone`."
        },
        {
          "name": "estimateGain",
          "kind": "function",
          "signature": "estimateGain(referenceAligned, microphone)",
          "summary": "Least-squares gain fit: minimizes ||microphone - gain*referenceAligned||^2."
        },
        {
          "name": "cancelEcho",
          "kind": "function",
          "signature": "cancelEcho(microphone, reference, delay, gain)",
          "summary": ""
        },
        {
          "name": "detectDoubleTalk",
          "kind": "function",
          "signature": "detectDoubleTalk(residual, referenceLevel, thresholdRatio = 0.3)",
          "summary": ""
        },
        {
          "name": "createBargeInController",
          "kind": "function",
          "signature": "createBargeInController({ minSustainedFrames = 3 } = {})",
          "summary": "Commit bargeInConfirmed only when double-talk is detected AND sustained for `minSustainedFrames`."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/EchoBargeInProbe",
      "path": "agi/reference/particle_voice/risk/EchoBargeInProbe.md",
      "source": "agi/particle_voice/risk/EchoBargeInProbe.js",
      "import": "/agi/particle_voice/risk/EchoBargeInProbe.js",
      "sourceHash": "72323014c2a785bb1f400fb706a023e439e73d6dc8e50b9ba6d275d2047f3388",
      "summary": "EchoBargeInProbe.js — R12 Phase -1 risk spike orchestrator.",
      "exports": [
        {
          "name": "runEchoBargeInProbe",
          "kind": "function",
          "signature": "async runEchoBargeInProbe()",
          "summary": ""
        },
        {
          "name": "buildEchoBargeInReceipt",
          "kind": "function",
          "signature": "async buildEchoBargeInReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareEchoBargeInReceiptDownload",
          "kind": "function",
          "signature": "prepareEchoBargeInReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R12_ECHO_BARGE_IN_SCHEMA",
          "kind": "constant",
          "signature": "R12_ECHO_BARGE_IN_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/EndpointController",
      "path": "agi/reference/particle_voice/risk/EndpointController.md",
      "source": "agi/particle_voice/risk/EndpointController.js",
      "import": "/agi/particle_voice/risk/EndpointController.js",
      "sourceHash": "a2aef1d2ffeef9497bfae45565791554370edc51afe9a09b0613e99e48fa328e",
      "summary": "EndpointController.js — R13 Phase -1 risk spike. \"min speech/silence durations, max-segment cap, causal commit bits (no lookahead).\" — Phase -1. A plain frame-counting debounce state machine on top of a boolean VAD decision (e.g. R11's `hysteresisState`) — every `update()` call only consumes the CURRENT frame's VAD decision plus its own prior internal state, never anything from the future, by construction (no buffering of upcoming frames anywhere in this module).",
      "exports": [
        {
          "name": "createEndpointController",
          "kind": "function",
          "signature": "createEndpointController({ frameMs, minSpeechMs = 200, minSilenceMs = 300, maxSegmentMs = 8000 })",
          "summary": "EndpointController.js — R13 Phase -1 risk spike. \"min speech/silence durations, max-segment cap, causal commit bits (no lookahead).\" — Phase -1. A plain frame-counting debounce state machine on top of a boolean VAD decision (e.g. R11's `hysteresisState`) — every `update()` call only consumes the CURRENT frame's VAD decision plus its own prior internal state, never anything from the future, by construction (no buffering of upcoming frames anywhere in this module)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/EndpointLatencyProbe",
      "path": "agi/reference/particle_voice/risk/EndpointLatencyProbe.md",
      "source": "agi/particle_voice/risk/EndpointLatencyProbe.js",
      "import": "/agi/particle_voice/risk/EndpointLatencyProbe.js",
      "sourceHash": "e409bae8e8d4d9edd0d4674640e18338a59d7cc729f750d8841312a69a082561",
      "summary": "EndpointLatencyProbe.js — R13 Phase -1 risk spike orchestrator.",
      "exports": [
        {
          "name": "runEndpointLatencyProbe",
          "kind": "function",
          "signature": "async runEndpointLatencyProbe()",
          "summary": ""
        },
        {
          "name": "buildEndpointLatencyReceipt",
          "kind": "function",
          "signature": "async buildEndpointLatencyReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareEndpointLatencyReceiptDownload",
          "kind": "function",
          "signature": "prepareEndpointLatencyReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R13_ENDPOINT_LATENCY_SCHEMA",
          "kind": "constant",
          "signature": "R13_ENDPOINT_LATENCY_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/EnergyDomains",
      "path": "agi/reference/particle_voice/risk/EnergyDomains.md",
      "source": "agi/particle_voice/risk/EnergyDomains.js",
      "import": "/agi/particle_voice/risk/EnergyDomains.js",
      "sourceHash": "206d716aeaa068d8688166ee3e9cf2436f2b4c0324c3dae4ccfa16e409c29ef3",
      "summary": "EnergyDomains.js — R15 Phase -1 risk spike. \"ObservedInputEnergy, GeneratedPhysiologyEnergy, and RenderedOutputEnergy are correctly separated; mic energy is labelled an uncertain acoustic-equivalent proxy, not lung pressure.\" — Phase -1. Three distinct, runtime-tagged value types plus an `assertDomain` guard that THROWS on cross-domain misuse — the concrete mechanism proving the architecture cannot silently conflate \"what the mic heard\" with \"what the physiology model generated\" or \"what the renderer produced\".",
      "exports": [
        {
          "name": "ObservedInputEnergy",
          "kind": "class",
          "signature": "class ObservedInputEnergy",
          "summary": "Energy derived from the real microphone signal. This is explicitly an uncertain ACOUSTIC-EQUIVALENT proxy — it correlates with vocal effort but is NOT a measurement of lung pressure, glottal state, or any other physiological quantity (room acoustics, mic gain/placement, and background noise all corrupt the mapping)."
        },
        {
          "name": "GeneratedPhysiologyEnergy",
          "kind": "class",
          "signature": "class GeneratedPhysiologyEnergy",
          "summary": "Energy/state produced by the neural physiology model (R6A NeuralPhysiologyState/BreathReservoir) driving the Voice Box."
        },
        {
          "name": "RenderedOutputEnergy",
          "kind": "class",
          "signature": "class RenderedOutputEnergy",
          "summary": "Energy of the final rendered PCM output (post Voice Box waveguide render)."
        },
        {
          "name": "assertDomain",
          "kind": "function",
          "signature": "assertDomain(energyObject, expectedDomain, context)",
          "summary": "Throws unless `energyObject.domain === expectedDomain` — the runtime separation guard."
        },
        {
          "name": "driveVoiceBox",
          "kind": "function",
          "signature": "driveVoiceBox(energyObject)",
          "summary": "Stand-in consumer: drives the Voice Box — must only ever accept generated-physiology energy."
        },
        {
          "name": "computeBargeInEvidence",
          "kind": "function",
          "signature": "computeBargeInEvidence(energyObject)",
          "summary": "Stand-in consumer: barge-in/VAD evidence — must only ever accept observed-input energy."
        },
        {
          "name": "computeLoudnessDisplay",
          "kind": "function",
          "signature": "computeLoudnessDisplay(energyObject)",
          "summary": "Stand-in consumer: UI loudness meter for what actually came out of the speakers — must only ever accept rendered-output energy."
        },
        {
          "name": "ENERGY_DOMAIN",
          "kind": "constant",
          "signature": "ENERGY_DOMAIN",
          "summary": "EnergyDomains.js — R15 Phase -1 risk spike. \"ObservedInputEnergy, GeneratedPhysiologyEnergy, and RenderedOutputEnergy are correctly separated; mic energy is labelled an uncertain acoustic-equivalent proxy, not lung pressure.\" — Phase -1. Three distinct, runtime-tagged value types plus an `assertDomain` guard that THROWS on cross-domain misuse — the concrete mechanism proving the architecture cannot silently conflate \"what the mic heard\" with \"what the physiology model generated\" or \"what the renderer produced\"."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/EnergyMeterProbe",
      "path": "agi/reference/particle_voice/risk/EnergyMeterProbe.md",
      "source": "agi/particle_voice/risk/EnergyMeterProbe.js",
      "import": "/agi/particle_voice/risk/EnergyMeterProbe.js",
      "sourceHash": "d89a83b81983dd55d12bb805a544754bd292c4bb8c21db04c546d2e6b09200a6",
      "summary": "EnergyMeterProbe.js — R10 Phase -1 risk spike orchestrator. No dedicated filename exists for R10 in the plan's risk/ page list either (named \"mic-energy-meter.html\" in the risk-page description text, used here directly).",
      "exports": [
        {
          "name": "runEnergyMeterProbe",
          "kind": "function",
          "signature": "async runEnergyMeterProbe()",
          "summary": ""
        },
        {
          "name": "buildEnergyMeterReceipt",
          "kind": "function",
          "signature": "async buildEnergyMeterReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareEnergyMeterReceiptDownload",
          "kind": "function",
          "signature": "prepareEnergyMeterReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R10_ENERGY_METER_SCHEMA",
          "kind": "constant",
          "signature": "R10_ENERGY_METER_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/Fft1024Kernel",
      "path": "agi/reference/particle_voice/risk/Fft1024Kernel.md",
      "source": "agi/particle_voice/risk/Fft1024Kernel.js",
      "import": "/agi/particle_voice/risk/Fft1024Kernel.js",
      "sourceHash": "d8385c80c2b0d88c88054730ca0d8dc20dc53434321f2712ce1af4a997c9e740",
      "summary": "Fft1024Kernel.js — R3 Phase -1 risk spike WGSL generator. No raw `.wgsl` files (Engine Alignment invariant #1): exports a `shader(params)` function, matching the eventual `nn/kernels/fft/fft1024_f32.js` / `ifft1024_f32.js` production kernels. Single-workgroup, in-workgroup-memory, iterative radix-2 Cooley-Tukey FFT. One workgroup (512 threads) computes exactly one 1024-point complex FFT; `workgroup_id.x` selects which frame of a batch to process, so N frames can be transformed in a single dispatch of N workgroups (needed to batch many overlapping STFT frames for the WOLA test). Direction is a per-dispatch uniform, not two separate shaders: forward uses the standard e^{-i2*pi*k/N} twiddle; inverse conjugates the input, runs the same forward butterfly network, then conjugates + scales the output by 1/N (IFFT(X) = (1/N) * conj(FFT(conj(X)))). Buffer layout (flat, frame-major): inputReal/inputImag/outputReal/outputImag are each `numFrames * 1024` f32 values; frame f occupies [f*1024, f*1024+1024).",
      "exports": [
        {
          "name": "fft1024Shader",
          "kind": "function",
          "signature": "fft1024Shader()",
          "summary": ""
        },
        {
          "name": "FFT_N",
          "kind": "constant",
          "signature": "FFT_N",
          "summary": "Fft1024Kernel.js — R3 Phase -1 risk spike WGSL generator. No raw `.wgsl` files (Engine Alignment invariant #1): exports a `shader(params)` function, matching the eventual `nn/kernels/fft/fft1024_f32.js` / `ifft1024_f32.js` production kernels. Single-workgroup, in-workgroup-memory, iterative radix-2 Cooley-Tukey FFT. One workgroup (512 threads) computes exactly one 1024-point complex FFT; `workgroup_id.x` selects which frame of a batch to process, so N frames can be transformed in a single dispatch of N workgroups (needed to batch many overlapping STFT frames for the WOLA test). Direction is a per-dispatch uniform, not two separate shaders: forward uses the standard e^{-i2*pi*k/N} twiddle; inverse conjugates the input, runs the same forward butterfly network, then conjugates + scales the output by 1/N (IFFT(X) = (1/N) * conj(FFT(conj(X)))). Buffer layout (flat, frame-major): inputReal/inputImag/outputReal/outputImag are each `numFrames * 1024` f32 values; frame f occupies [f*1024, f*1024+1024)."
        },
        {
          "name": "FFT_LOG2N",
          "kind": "constant",
          "signature": "FFT_LOG2N",
          "summary": ""
        },
        {
          "name": "FFT_ENTRY_POINT",
          "kind": "constant",
          "signature": "FFT_ENTRY_POINT",
          "summary": ""
        },
        {
          "name": "FFT_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "FFT_WORKGROUP_SIZE",
          "summary": ""
        },
        {
          "name": "FFT_DIRECTION_FORWARD",
          "kind": "constant",
          "signature": "FFT_DIRECTION_FORWARD",
          "summary": ""
        },
        {
          "name": "FFT_DIRECTION_INVERSE",
          "kind": "constant",
          "signature": "FFT_DIRECTION_INVERSE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/GlottalSource",
      "path": "agi/reference/particle_voice/risk/GlottalSource.md",
      "source": "agi/particle_voice/risk/GlottalSource.js",
      "import": "/agi/particle_voice/risk/GlottalSource.js",
      "sourceHash": "3d797545905407c2092f248ef593d98e8be41b44b8b07a4647d54a90c4c5efcb",
      "summary": "GlottalSource.js — R6 Phase -1 risk spike. A simplified (\"LF-lite\") glottal flow source, not the full Liljencrants- Fant model (which requires an iterative numerical solve of its alpha/wg/ ta/b parameters from open/speed quotient — out of scope for a feasibility spike). Each glottal pulse is a raised-cosine bump over the open phase of the cycle: flow(n) = 0.5 * (1 - cos(2*pi*n/Topen))   for 0 <= n < Topen flow(n) = 0                                for Topen <= n < T This is deliberately C1-continuous and zero at both pulse boundaries — clicks are a discontinuity in the waveform or its derivative, and this shape has neither, by construction, regardless of how F0 (period T) changes from one pulse to the next. `articulatory/glottal_lf.js` (Phase 2) is the real LF implementation this stands in for. Aspiration noise is mixed in proportional to instantaneous flow (breathy voicing), driven by a counter-based hash so it is chunk-boundary independent (same technique as StreamingContinuitySource.js).",
      "exports": [
        {
          "name": "createGlottalSource",
          "kind": "function",
          "signature": "createGlottalSource({ sampleRate, f0AtSample, openQuotient = 0.6, aspirationLevel = 0.0, noiseSeed = 777 })",
          "summary": "Create a glottal source generator. `f0AtSample(n)` lets callers drive a pitch sweep (F0 varies per absolute sample index); `openQuotient` is the fraction of each pitch period the folds are open (typical modal voice ~0.5-0.7)."
        },
        {
          "name": "noiseAt",
          "kind": "re-export",
          "signature": "noiseAt",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/GpuReadbackRing",
      "path": "agi/reference/particle_voice/risk/GpuReadbackRing.md",
      "source": "agi/particle_voice/risk/GpuReadbackRing.js",
      "import": "/agi/particle_voice/risk/GpuReadbackRing.js",
      "sourceHash": "3f7b6547d5aa87aaad922b56317a296d6f381e8679306f6685e94257ba6d0f33",
      "summary": "GpuReadbackRing.js — R4 Phase -1 risk spike. \"readback-audio.html — 6-8 MAP_READ slots, per-buffer mapAsync(), no global queue.onSubmittedWorkDone() for normal readback.\" — Phase -1. A minimal round-robin ring of MAP_READ|COPY_DST staging buffers. Each slot is copied into and mapped independently; the only synchronization primitive used is that slot's own `mapAsync()` promise — there is no `device.queue.onSubmittedWorkDone()` call anywhere in this module. Backpressure (more than `slotCount` requests in flight) is the caller's responsibility: `acquireFreeSlotIndex()` throws if no slot is free, so a caller must await/release before requesting more than `slotCount` ahead. This is a disposable Phase -1 probe, not the production `streaming/GPUReadbackRing.js` — same technique, smaller surface.",
      "exports": [
        {
          "name": "createGpuReadbackRing",
          "kind": "function",
          "signature": "createGpuReadbackRing(device, slotByteSize, slotCount = 8)",
          "summary": "GpuReadbackRing.js — R4 Phase -1 risk spike. \"readback-audio.html — 6-8 MAP_READ slots, per-buffer mapAsync(), no global queue.onSubmittedWorkDone() for normal readback.\" — Phase -1. A minimal round-robin ring of MAP_READ|COPY_DST staging buffers. Each slot is copied into and mapped independently; the only synchronization primitive used is that slot's own `mapAsync()` promise — there is no `device.queue.onSubmittedWorkDone()` call anywhere in this module. Backpressure (more than `slotCount` requests in flight) is the caller's responsibility: `acquireFreeSlotIndex()` throws if no slot is free, so a caller must await/release before requesting more than `slotCount` ahead. This is a disposable Phase -1 probe, not the production `streaming/GPUReadbackRing.js` — same technique, smaller surface."
        },
        {
          "name": "runPipelinedReadbackBenchmark",
          "kind": "function",
          "signature": "async runPipelinedReadbackBenchmark(device, ring, sourceBuffer, byteSize, iterations, maxInFlight, makeFrame, updateBufferFn)",
          "summary": "Run a pipelined readback benchmark: keeps up to `maxInFlight` mapAsync() requests outstanding at once (never more, never a global wait), writing a fresh frame into `sourceBuffer` before each new request."
        },
        {
          "name": "percentile",
          "kind": "function",
          "signature": "percentile(sortedValues, p)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/HeavySceneKernel",
      "path": "agi/reference/particle_voice/risk/HeavySceneKernel.md",
      "source": "agi/particle_voice/risk/HeavySceneKernel.js",
      "import": "/agi/particle_voice/risk/HeavySceneKernel.js",
      "sourceHash": "86485a1c03599da0a83472d1b4a988408246a4d8312146de2dc8358a39d77107",
      "summary": "HeavySceneKernel.js — R9 Phase -1 risk spike. \"renderer-voice-stress.html — voice compute beside a representative heavy ParticleRealms scene.\" — Phase -1. A fully procedural instanced-triangle render (positions/colors derived from @builtin(instance_index) in the vertex shader, no vertex/instance buffers needed) standing in for \"a representative heavy scene\" — many draw-time vertices without needing real mesh/scene data for a disposable risk spike.",
      "exports": [
        {
          "name": "heavySceneShader",
          "kind": "function",
          "signature": "heavySceneShader()",
          "summary": ""
        },
        {
          "name": "HEAVY_SCENE_VERTEX_ENTRY",
          "kind": "constant",
          "signature": "HEAVY_SCENE_VERTEX_ENTRY",
          "summary": "HeavySceneKernel.js — R9 Phase -1 risk spike. \"renderer-voice-stress.html — voice compute beside a representative heavy ParticleRealms scene.\" — Phase -1. A fully procedural instanced-triangle render (positions/colors derived from @builtin(instance_index) in the vertex shader, no vertex/instance buffers needed) standing in for \"a representative heavy scene\" — many draw-time vertices without needing real mesh/scene data for a disposable risk spike."
        },
        {
          "name": "HEAVY_SCENE_FRAGMENT_ENTRY",
          "kind": "constant",
          "signature": "HEAVY_SCENE_FRAGMENT_ENTRY",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/IntegrationManifest",
      "path": "agi/reference/particle_voice/risk/IntegrationManifest.md",
      "source": "agi/particle_voice/risk/IntegrationManifest.js",
      "import": "/agi/particle_voice/risk/IntegrationManifest.js",
      "sourceHash": "cd58598576660846ac0d682383750b132f3eb7bfe0451a437b5738e934837c07",
      "summary": "IntegrationManifest.js — R0 Phase -1 risk spike data. Every named ParticleRealms module referenced by the ParticleVoice plan's \"Codebase Integration Points\" tables (particle-voice-26357c.md), with the named exports each entry is expected to provide. `integration-path-audit.html` dynamically imports each `path` and checks every name in `exports` is present on the resulting module namespace, producing a pass/fail/missing receipt. Paths are root-relative so they resolve the same regardless of which page imports this manifest (served from the repo root by start_server.py). Exports were verified directly against source (grep for `^export`), not assumed from the plan's prose \"What it provides\" column. Where the plan's description implied an export that does not actually exist at module scope, a `note` field records the discrepancy so the audit page can surface it even on entries that technically \"pass\" (file imports fine, but a *different* name provides the capability than the plan implied).",
      "exports": [
        {
          "name": "INTEGRATION_MANIFEST",
          "kind": "constant",
          "signature": "INTEGRATION_MANIFEST",
          "summary": "IntegrationManifest.js — R0 Phase -1 risk spike data. Every named ParticleRealms module referenced by the ParticleVoice plan's \"Codebase Integration Points\" tables (particle-voice-26357c.md), with the named exports each entry is expected to provide. `integration-path-audit.html` dynamically imports each `path` and checks every name in `exports` is present on the resulting module namespace, producing a pass/fail/missing receipt. Paths are root-relative so they resolve the same regardless of which page imports this manifest (served from the repo root by start_server.py). Exports were verified directly against source (grep for `^export`), not assumed from the plan's prose \"What it provides\" column. Where the plan's description implied an export that does not actually exist at module scope, a `note` field records the discrepancy so the audit page can surface it even on entries that technically \"pass\" (file imports fine, but a *different* name provides the capability than the plan implied)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/IntegrationPathAudit",
      "path": "agi/reference/particle_voice/risk/IntegrationPathAudit.md",
      "source": "agi/particle_voice/risk/IntegrationPathAudit.js",
      "import": "/agi/particle_voice/risk/IntegrationPathAudit.js",
      "sourceHash": "4703d3bae709246ef74517b4bb134c4402ce76338994faee0ab652c95e03960f",
      "summary": "IntegrationPathAudit.js — R0 Phase -1 risk spike runner. \"Dynamic import/export checks for every named ParticleRealms module\" — particle-voice-26357c.md, Phase -1 / R0 Integration exit receipt. For every entry in IntegrationManifest.js this dynamically imports the module and checks that each expected named export is present on the resulting namespace object. No network/file mutation; read-only probing.",
      "exports": [
        {
          "name": "runIntegrationPathAudit",
          "kind": "function",
          "signature": "async runIntegrationPathAudit({ manifest = INTEGRATION_MANIFEST, importer = (path)",
          "summary": "Run the audit against a manifest."
        },
        {
          "name": "buildIntegrationAuditReceipt",
          "kind": "function",
          "signature": "async buildIntegrationAuditReceipt(result)",
          "summary": "Wrap a raw audit result into the immutable JSON receipt described by the R0 exit gate: \"JSON file listing every named import, expected export, actual export, result pass/fail/missing.\""
        },
        {
          "name": "prepareIntegrationAuditReceiptDownload",
          "kind": "function",
          "signature": "prepareIntegrationAuditReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R0_AUDIT_SCHEMA",
          "kind": "constant",
          "signature": "R0_AUDIT_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/KellyLochbaumWaveguide",
      "path": "agi/reference/particle_voice/risk/KellyLochbaumWaveguide.md",
      "source": "agi/particle_voice/risk/KellyLochbaumWaveguide.js",
      "import": "/agi/particle_voice/risk/KellyLochbaumWaveguide.js",
      "sourceHash": "c3a21ba8e7ebcfdc7bef0f5f6e1f030344acc5adc1170a31aabb43f959c93796",
      "summary": "KellyLochbaumWaveguide.js — R6 Phase -1 risk spike. Single-delay-per-section digital waveguide vocal tract model (Kelly & Lochbaum 1962 scattering junctions, as described in e.g. Julius O. Smith's \"Physical Audio Signal Processing\"). N cylindrical tube sections with cross-sectional areas A[0..N-1] give N-1 internal junction reflection coefficients k_i = (A_i - A_{i+1}) / (A_i + A_{i+1}). Boundary conditions: - Glottal end: source flow is injected with a partial reflection (`glottalReflection`) of the wave returning from the tract. - Lip end: an idealized open-end reflection (`lipReflection`, negative) plus a first-difference \"radiation\" filter approximating the differentiating characteristic of lip radiation. All boundary/junction coefficients are kept strictly inside (-1, 1), so the closed-loop lattice is passive/BIBO-stable by construction (no combination of area profile changes can cause unbounded energy growth). Nasal coupling and constriction noise are deliberate simplifications, not a rigorous multi-port (3-way) junction scattering derivation — see createNasalBranch() and step()'s constrictionIndex handling. Phase 2's `NasalTractJunction.js`/`ConstrictionNoise.js` need the rigorous version; this is enough to prove the overall architecture is stable and produces plausible, controllable behavior.",
      "exports": [
        {
          "name": "reflectionCoefficients",
          "kind": "function",
          "signature": "reflectionCoefficients(areas)",
          "summary": "KellyLochbaumWaveguide.js — R6 Phase -1 risk spike. Single-delay-per-section digital waveguide vocal tract model (Kelly & Lochbaum 1962 scattering junctions, as described in e.g. Julius O. Smith's \"Physical Audio Signal Processing\"). N cylindrical tube sections with cross-sectional areas A[0..N-1] give N-1 internal junction reflection coefficients k_i = (A_i - A_{i+1}) / (A_i + A_{i+1}). Boundary conditions: - Glottal end: source flow is injected with a partial reflection (`glottalReflection`) of the wave returning from the tract. - Lip end: an idealized open-end reflection (`lipReflection`, negative) plus a first-difference \"radiation\" filter approximating the differentiating characteristic of lip radiation. All boundary/junction coefficients are kept strictly inside (-1, 1), so the closed-loop lattice is passive/BIBO-stable by construction (no combination of area profile changes can cause unbounded energy growth). Nasal coupling and constriction noise are deliberate simplifications, not a rigorous multi-port (3-way) junction scattering derivation — see createNasalBranch() and step()'s constrictionIndex handling. Phase 2's `NasalTractJunction.js`/`ConstrictionNoise.js` need the rigorous version; this is enough to prove the overall architecture is stable and produces plausible, controllable behavior."
        },
        {
          "name": "uniformAreaProfile",
          "kind": "function",
          "signature": "uniformAreaProfile(numSections, area)",
          "summary": ""
        },
        {
          "name": "shapedAreaProfile",
          "kind": "function",
          "signature": "shapedAreaProfile(numSections, controlPoints)",
          "summary": "Linearly interpolated area profile through named (position, area) control points, position in [0, 1]."
        },
        {
          "name": "createVocalTract",
          "kind": "function",
          "signature": "createVocalTract({ numSections, areas, glottalReflection = 0.85, lipReflection = -0.9 })",
          "summary": ""
        },
        {
          "name": "createNasalBranch",
          "kind": "function",
          "signature": "createNasalBranch({ numSections, areas, nostrilReflection = -0.9 })",
          "summary": "Simplified nasal branch: its own short KL chain, driven by a coupled fraction of an oral-tract tap signal."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/MatmulBenchProbe",
      "path": "agi/reference/particle_voice/risk/MatmulBenchProbe.md",
      "source": "agi/particle_voice/risk/MatmulBenchProbe.js",
      "import": "/agi/particle_voice/risk/MatmulBenchProbe.js",
      "sourceHash": "919734368b13c240185108e99c106e9b528a57204202d296b38b8f19cae4e406",
      "summary": "MatmulBenchProbe.js — R2 Phase -1 risk spike. \"matmul-bench.html — W8A16 packed INT8 x FP16 matmul, FP32 accumulation, FP16 output; representative TTS shapes; full-model cost projection with >=30% headroom.\" — particle-voice-26357c.md, Phase -1. Shapes are PROVISIONAL: Phase 0 (spec freeze) has not happened yet, so the plan does not fix concrete model dimensions. These are derived from C:\\Coding\\PS2\\configs\\r0.yaml's own \"architecture smoke test\" convention (d_model=256, d_ff=4x d_model, n_layers=6) — the same repo's precedent for sizing a first small model before a full spec exists — combined with this plan's own VoiceChunker steady-state chunk bucket (64 frames) and stated mel-bin candidate (128). Revisit once spec/DeviceContract-v0.md exists. Reuses engine primitives instead of reimplementing device/buffer/pipeline plumbing: GpuDevice (engine/core/gpu/GpuDevice.js), GpuBuffer helpers (engine/core/gpu/GpuBuffer.js), and createComputePipelineChecked (agi/llm/kernels/PipelineUtils.js).",
      "exports": [
        {
          "name": "runMatmulBenchProbe",
          "kind": "function",
          "signature": "async runMatmulBenchProbe()",
          "summary": ""
        },
        {
          "name": "buildMatmulBenchReceipt",
          "kind": "function",
          "signature": "async buildMatmulBenchReceipt(result)",
          "summary": "Wrap a raw probe result into the R2 exit receipt."
        },
        {
          "name": "prepareMatmulBenchReceiptDownload",
          "kind": "function",
          "signature": "prepareMatmulBenchReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R2_MATMUL_BENCH_SCHEMA",
          "kind": "constant",
          "signature": "R2_MATMUL_BENCH_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/MatmulReferenceCpu",
      "path": "agi/reference/particle_voice/risk/MatmulReferenceCpu.md",
      "source": "agi/particle_voice/risk/MatmulReferenceCpu.js",
      "import": "/agi/particle_voice/risk/MatmulReferenceCpu.js",
      "sourceHash": "7a6851398ef3919b1c02cf5bb4d75c0edc36e040259214e3907b009cb6e025b6",
      "summary": "MatmulReferenceCpu.js — deterministic test-vector generation and a plain-JS scalar reference matmul for R2 (matmul-bench.html) parity checking. Mirrors the dequantization + accumulation order of MatmulW8A16Kernel.js's `main()` exactly (same k4 outer / b inner loop) so the only expected divergence between CPU (double) and GPU (f32) is floating-point rounding, not algorithmic difference.",
      "exports": [
        {
          "name": "randomInt8Weights",
          "kind": "function",
          "signature": "randomInt8Weights(K, N, seed = 1)",
          "summary": "Int8Array of length K*N, logical layout weights[n*K + k], values in [-127, 127]."
        },
        {
          "name": "randomActivations",
          "kind": "function",
          "signature": "randomActivations(M, K, seed = 2)",
          "summary": "Float32Array of length M*K, layout activations[m*K + k], values in [-1, 1]."
        },
        {
          "name": "randomScales",
          "kind": "function",
          "signature": "randomScales(N, seed = 3)",
          "summary": "Float32Array of length N — typical per-channel INT8 quantization scales."
        },
        {
          "name": "packWeightsInt8x4",
          "kind": "function",
          "signature": "packWeightsInt8x4(weightsInt8, K, N)",
          "summary": "Pack logical [K,N] int8 weights into the u32 layout MatmulW8A16Kernel.js expects."
        },
        {
          "name": "referenceMatmul",
          "kind": "function",
          "signature": "referenceMatmul(activations, weightsInt8, scales, M, K, N)",
          "summary": "Plain-JS reference matmul, same math/order as the WGSL kernel. Returns Float64Array[M*N]."
        },
        {
          "name": "compareResults",
          "kind": "function",
          "signature": "compareResults(gpuResult, referenceResult)",
          "summary": "Max-abs and max-relative error between a GPU result and the CPU reference."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/MatmulW8A16Kernel",
      "path": "agi/reference/particle_voice/risk/MatmulW8A16Kernel.md",
      "source": "agi/particle_voice/risk/MatmulW8A16Kernel.js",
      "import": "/agi/particle_voice/risk/MatmulW8A16Kernel.js",
      "sourceHash": "4722455b8d4b9a404fd972a26842a005b8fff3a90ad085da26365eb8e0579996",
      "summary": "MatmulW8A16Kernel.js — R2 Phase -1 risk spike WGSL generator. No raw `.wgsl` files (Engine Alignment invariant #1): this module exports a `shader(params)` function that returns a WGSL string, same convention as `agi/llm/kernels/shaders/*.js` and the eventual `nn/kernels/matmul/matmul_w8a16.js`. MVP scope for this spike: INT8 weights (4-packed per u32, per-output-channel scale) x FP32 activations, FP32 accumulation, FP32 output. This is a deliberately smaller slice of the plan's stated \"W8A16 packed INT8 x FP16 matmul, FP32 accumulation, FP16 output\" — FP16 activation/output packing needs its own bit-packing design (2xf16 per u32, gated on `shader-f16` from R1) and is left as an explicit follow-up rather than an unverified claim. Weight layout expected by this kernel: - Logical weights are [K, N] (K = input/hidden dim, N = output dim). - Packed as `packedWeights[n * (K/4) + k4]`, a u32 whose 4 bytes are the int8 weights for k = k4*4 + 0..3 (little end = lowest k). - `scales[n]` is the per-output-channel dequantization scale. - K must be a multiple of 4.",
      "exports": [
        {
          "name": "matmulW8a16Shader",
          "kind": "function",
          "signature": "matmulW8a16Shader()",
          "summary": ""
        },
        {
          "name": "MATMUL_W8A16_ENTRY_POINT",
          "kind": "constant",
          "signature": "MATMUL_W8A16_ENTRY_POINT",
          "summary": "MatmulW8A16Kernel.js — R2 Phase -1 risk spike WGSL generator. No raw `.wgsl` files (Engine Alignment invariant #1): this module exports a `shader(params)` function that returns a WGSL string, same convention as `agi/llm/kernels/shaders/*.js` and the eventual `nn/kernels/matmul/matmul_w8a16.js`. MVP scope for this spike: INT8 weights (4-packed per u32, per-output-channel scale) x FP32 activations, FP32 accumulation, FP32 output. This is a deliberately smaller slice of the plan's stated \"W8A16 packed INT8 x FP16 matmul, FP32 accumulation, FP16 output\" — FP16 activation/output packing needs its own bit-packing design (2xf16 per u32, gated on `shader-f16` from R1) and is left as an explicit follow-up rather than an unverified claim. Weight layout expected by this kernel: - Logical weights are [K, N] (K = input/hidden dim, N = output dim). - Packed as `packedWeights[n * (K/4) + k4]`, a u32 whose 4 bytes are the int8 weights for k = k4*4 + 0..3 (little end = lowest k). - `scales[n]` is the per-output-channel dequantization scale. - K must be a multiple of 4."
        },
        {
          "name": "MATMUL_W8A16_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "MATMUL_W8A16_WORKGROUP_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/NeuralPhysiologyState",
      "path": "agi/reference/particle_voice/risk/NeuralPhysiologyState.md",
      "source": "agi/particle_voice/risk/NeuralPhysiologyState.js",
      "import": "/agi/particle_voice/risk/NeuralPhysiologyState.js",
      "sourceHash": "d4942e133aebf22e0c700ba6d5f6a12191915ee7ef0b2e8a46d787e3fee3fcac",
      "summary": "NeuralPhysiologyState.js — R6A Phase -1 risk spike. \"NeuralPhysiologyState schema: RespiratoryDriveHead, GlottalStateHead, TractGestureHead, ArticulationEventHead, UncertaintyHead version 0x00010000.\" — particle-voice-26357c.md, Phase 2 (adopted early here for the R6A wiring receipt). No trained `ArticulationHead` model exists yet (that's Phase 3+). This provides the state SCHEMA plus a deterministic scripted stand-in (\"fake head\") that produces plausible per-frame physiology values as a pure function of time and an `intervention` parameter set — enough to prove the wiring ArticulationHead -> NeuralPhysiologyState -> BreathReservoir/ParticleTract -> renderer actually routes control values through to the final PCM, which is what R6A's exit gate asks for.",
      "exports": [
        {
          "name": "createNeuralPhysiologyState",
          "kind": "function",
          "signature": "createNeuralPhysiologyState({ timestampSeconds, respiratoryDrive, glottalState, tractGesture, articulationEvent, uncertainty, })",
          "summary": ""
        },
        {
          "name": "createScriptedArticulationHead",
          "kind": "function",
          "signature": "createScriptedArticulationHead(intervention = {})",
          "summary": "Deterministic scripted stand-in for a trained ArticulationHead: a short \"utterance\" that opens into a steady vowel then applies a brief closure gesture, with `intervention.respiratoryScale` and `intervention.constrictionOpennessFloor` letting a caller apply a physiology intervention and compare against a baseline run."
        },
        {
          "name": "NEURAL_PHYSIOLOGY_STATE_VERSION",
          "kind": "constant",
          "signature": "NEURAL_PHYSIOLOGY_STATE_VERSION",
          "summary": "NeuralPhysiologyState.js — R6A Phase -1 risk spike. \"NeuralPhysiologyState schema: RespiratoryDriveHead, GlottalStateHead, TractGestureHead, ArticulationEventHead, UncertaintyHead version 0x00010000.\" — particle-voice-26357c.md, Phase 2 (adopted early here for the R6A wiring receipt). No trained `ArticulationHead` model exists yet (that's Phase 3+). This provides the state SCHEMA plus a deterministic scripted stand-in (\"fake head\") that produces plausible per-frame physiology values as a pure function of time and an `intervention` parameter set — enough to prove the wiring ArticulationHead -> NeuralPhysiologyState -> BreathReservoir/ParticleTract -> renderer actually routes control values through to the final PCM, which is what R6A's exit gate asks for."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/OsMediaPermissionProbe",
      "path": "agi/reference/particle_voice/risk/OsMediaPermissionProbe.md",
      "source": "agi/particle_voice/risk/OsMediaPermissionProbe.js",
      "import": "/agi/particle_voice/risk/OsMediaPermissionProbe.js",
      "sourceHash": "775b641f77d994d59d2cf38b6df546cc25a9044317ff469f874b483d3f960a5d",
      "summary": "OsMediaPermissionProbe.js — R16 Phase -1 risk spike. \"Secure context + user gesture + getUserMedia + enumerateDevices + AudioWorklet + SharedArrayBuffer all succeed through kernel.media.* / kernel.audio.* syscalls; media.audio / audio.play / microphone capabilities are correctly required and enforced by guardSyscalls; OsMediaBridge.js never touches raw navigator.mediaDevices.\" — Phase -1. `agi/particle_voice/activity/bridge/OsMediaBridge.js` does not exist yet (Phase -1 precedes Phase 1+ implementation) — that check is a forward contract placeholder here, not yet applicable. Everything else tests the REAL `webgpu-os/kernel/Syscalls.js` (`createSyscalls`, `guardSyscalls`) and `webgpu-os/kernel/Permissions.js` (`Permissions`) directly, not a stand-in — this spike is about the OS integration contract itself.",
      "exports": [
        {
          "name": "runOsMediaPermissionProbe",
          "kind": "function",
          "signature": "async runOsMediaPermissionProbe()",
          "summary": ""
        },
        {
          "name": "buildOsMediaPermissionReceipt",
          "kind": "function",
          "signature": "async buildOsMediaPermissionReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareOsMediaPermissionReceiptDownload",
          "kind": "function",
          "signature": "prepareOsMediaPermissionReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R16_OS_MEDIA_PERMISSION_SCHEMA",
          "kind": "constant",
          "signature": "R16_OS_MEDIA_PERMISSION_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/ParticleEnergyMeter",
      "path": "agi/reference/particle_voice/risk/ParticleEnergyMeter.md",
      "source": "agi/particle_voice/risk/ParticleEnergyMeter.js",
      "import": "/agi/particle_voice/risk/ParticleEnergyMeter.js",
      "sourceHash": "abf80a11fdc5019d8da1daed093b6d2a754ad786b47013015ded6fe4d781806d",
      "summary": "ParticleEnergyMeter.js — R10 Phase -1 risk spike. \"RMS, dBFS, peak, clipping, DC offset, crest factor, attack/release, SNR, low/mid/high band energy, spectral flux; adaptive noise floor while no speech/echo present.\" — Phase -1. Plain-JS CPU implementation (small analysis frames, not a GPU kernel — this is a metering/control-path computation, not a bulk DSP kernel like R3's FFT). Includes its own compact FFT for band energy/spectral flux rather than importing Fft1024Kernel.js, which generates a WGSL string for GPU dispatch, not a callable JS magnitude-spectrum function — a different form for a different execution context, same algorithm family as MatmulReferenceCpu.js is to matmul_w8a16.js.",
      "exports": [
        {
          "name": "createParticleEnergyMeter",
          "kind": "function",
          "signature": "createParticleEnergyMeter({ sampleRate, frameSize = 256, attackMs = 5, releaseMs = 60, noiseFloorRecoveryPerFrame = 0.0008 })",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/ParticleVad",
      "path": "agi/reference/particle_voice/risk/ParticleVad.md",
      "source": "agi/particle_voice/risk/ParticleVad.js",
      "import": "/agi/particle_voice/risk/ParticleVad.js",
      "sourceHash": "956bee93ed0dc39a6adc9930b4538632ba3b717918ceca6635cf1a9897cc2c3b",
      "summary": "ParticleVad.js — R11 Phase -1 risk spike. \"ParticleVAD-1 11-head output smoothness, hysteresis, no flicker; latency p50/p95 of speech-start/end decisions.\" — Phase -1. No trained ParticleVAD-1 model exists yet — this is a heuristic, energy/spectral-flux-driven stand-in (built on R10's ParticleEnergyMeter), not a neural VAD. The plan names \"11 continuous probability heads\" without enumerating all 11 in the sections read for this spike; the 11 names below are a reasonable, clearly-labeled interpretation, not a verified spec. Testing rigor here focuses on the primary `speechActive` head's smoothness/hysteresis/latency, since that is what a heuristic stand-in can meaningfully validate.",
      "exports": [
        {
          "name": "createParticleVad",
          "kind": "function",
          "signature": "createParticleVad({ sampleRate, frameSize = 256, smoothingMs = 30, riseThreshold = 0.55, fallThreshold = 0.35 })",
          "summary": ""
        },
        {
          "name": "VAD_HEAD_NAMES",
          "kind": "constant",
          "signature": "VAD_HEAD_NAMES",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/R4ReadbackAudioWorklet.worklet",
      "path": "agi/reference/particle_voice/risk/R4ReadbackAudioWorklet.worklet.md",
      "source": "agi/particle_voice/risk/R4ReadbackAudioWorklet.worklet.js",
      "import": "/agi/particle_voice/risk/R4ReadbackAudioWorklet.worklet.js",
      "sourceHash": "1d3b3439793159b2564ce26fdb0b656cd168ef2b673b3a445fd62c50479a4d49",
      "summary": "R4ReadbackAudioWorklet.worklet.js — R4 Phase -1 risk spike. \"allocation-free AudioWorklet.\" — Phase -1. Reference/mirror target: engine/audio/synth/PatchRunner.worklet.js (SAB parameter reads, no allocation in process()). Consumes a single-producer/single-consumer PCM ring living in a SharedArrayBuffer (written by the main thread, standing in for what the production path would fill via GPUReadbackRing.js + SharedPCMRing.js). `process()` performs zero allocation: no `new`, no object/array literals, no `await`, no `throw`, no `JSON` — only typed-array indexing and Atomics on pre-existing SharedArrayBuffer-backed views. Control layout (Int32Array, SharedArrayBuffer, 4 x int32): [0] writeIndex   — next PCM slot the producer will write (main thread) [1] readIndex    — next PCM slot this processor will read [2] underrunCount — incremented whenever fewer than one quantum of samples are available [3] processCallCount — incremented every process() call This file cannot be dynamically `import()`-ed from a normal page context: `AudioWorkletProcessor`/`registerProcessor` only exist inside the AudioWorkletGlobalScope. Load it via `audioContext.audioWorklet.addModule(url)`.",
      "exports": [],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/ReadbackAudioProbe",
      "path": "agi/reference/particle_voice/risk/ReadbackAudioProbe.md",
      "source": "agi/particle_voice/risk/ReadbackAudioProbe.js",
      "import": "/agi/particle_voice/risk/ReadbackAudioProbe.js",
      "sourceHash": "ee382595d2205c5bad45378893ad5a64b97d46942e6561188fb10a94e4032e4e",
      "summary": "ReadbackAudioProbe.js — R4 Phase -1 risk spike. Exit gate: \"Per-buffer mapAsync() p50/p95/p99; AudioWorklet survives variable quantum and rebuild; one-hour zero-underrun baseline.\" — Phase -1. Honest scoping note: a literal one-hour automated soak is not run by this probe (impractical inside a single interactive/CI session). This runs a short deterministic soak (SHORT_BASELINE_SOAK_MS) as a scaled-down proxy, clearly labeled as such in the receipt, plus an underrun-detector self-test (proves the zero-underrun count is meaningful, not tautological) and a full teardown+rebuild cycle. The full one-hour soak is left as an explicit manual/CI follow-up — see `oneHourSoak` in the result. \"Variable quantum\" is not directly controllable from stable browser APIs (render quantum size is fixed at 128 in all current stable implementations); this is verified as a static property of the processor (R4ReadbackAudioWorklet.worklet.js reads `channel.length` for its loop bound rather than assuming 128) plus dynamic survival across two independent AudioContext instances (which may differ in `sampleRate`).",
      "exports": [
        {
          "name": "createSharedRing",
          "kind": "function",
          "signature": "createSharedRing(sampleRate)",
          "summary": ""
        },
        {
          "name": "prefillRing",
          "kind": "function",
          "signature": "prefillRing(ring, sampleRate, prefillMs)",
          "summary": "Synchronously write `prefillMs` of audio into the ring before the worklet node is ever pulled. Absorbs the startup race between the interval-based producer's first tick (~PRODUCER_INTERVAL_MS away) and the AudioWorklet's first process() call, which can happen sooner — without this, a handful of transient underruns at cold start are expected, not a sustained-rate problem, but they'd still show up in a \"zero-underrun baseline\" reading."
        },
        {
          "name": "startProducer",
          "kind": "function",
          "signature": "startProducer(ring, sampleRate, initialSamplesProduced = 0)",
          "summary": "Wall-clock-paced producer: writes exactly enough samples each tick to match elapsed real time (minus whatever was already prefilled), so it neither underruns (falls behind) nor overflows the fixed-capacity ring (a fixed-chunk-per-tick producer would race arbitrarily far ahead of the consumer and wrap/corrupt the ring)."
        },
        {
          "name": "createWorkletSetup",
          "kind": "function",
          "signature": "async createWorkletSetup()",
          "summary": ""
        },
        {
          "name": "teardownWorkletSetup",
          "kind": "function",
          "signature": "async teardownWorkletSetup(setup)",
          "summary": ""
        },
        {
          "name": "runReadbackAudioProbe",
          "kind": "function",
          "signature": "async runReadbackAudioProbe()",
          "summary": ""
        },
        {
          "name": "buildReadbackAudioReceipt",
          "kind": "function",
          "signature": "async buildReadbackAudioReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareReadbackAudioReceiptDownload",
          "kind": "function",
          "signature": "prepareReadbackAudioReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "runLongSoak",
          "kind": "function",
          "signature": "async runLongSoak(durationMs)",
          "summary": "Exposed on window for a human/CI to opt into the real one-hour soak manually."
        },
        {
          "name": "R4_READBACK_AUDIO_SCHEMA",
          "kind": "constant",
          "signature": "R4_READBACK_AUDIO_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/ReceiptCrypto",
      "path": "agi/reference/particle_voice/risk/ReceiptCrypto.md",
      "source": "agi/particle_voice/risk/ReceiptCrypto.js",
      "import": "/agi/particle_voice/risk/ReceiptCrypto.js",
      "sourceHash": "6903c6afc41c12cb74b9ee40f4398a91d9816930f3f12257a7a3e8c68bfcfae2",
      "summary": "ReceiptCrypto.js — shared canonicalization + SHA-256 hashing for every Phase -1 risk-spike JSON receipt under `agi/particle_voice/risk/`. Kept tiny and dependency-free so any risk page can import it directly.",
      "exports": [
        {
          "name": "canonicalizeForHash",
          "kind": "function",
          "signature": "canonicalizeForHash(value)",
          "summary": "Recursively sort object keys so hashing is independent of insertion order."
        },
        {
          "name": "sha256HexOf",
          "kind": "function",
          "signature": "async sha256HexOf(value)",
          "summary": "SHA-256 hex digest of a canonicalized JSON value, or null if WebCrypto is unavailable."
        },
        {
          "name": "receiptHashOf",
          "kind": "function",
          "signature": "async receiptHashOf(value)",
          "summary": "Convenience: `sha256:<hex>` prefixed digest, or null."
        },
        {
          "name": "prepareJsonDownload",
          "kind": "function",
          "signature": "prepareJsonDownload(receipt, filenamePrefix)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/RendererVoiceStressProbe",
      "path": "agi/reference/particle_voice/risk/RendererVoiceStressProbe.md",
      "source": "agi/particle_voice/risk/RendererVoiceStressProbe.js",
      "import": "/agi/particle_voice/risk/RendererVoiceStressProbe.js",
      "sourceHash": "a2a49b5f9103ab70f40983bde0956d59882809c0f9a93003b14b11c9f328c83a",
      "summary": "RendererVoiceStressProbe.js — R9 Phase -1 risk spike. Exit gate: \"Voice + heavy scene runs without audio underruns or persistent render frame drops.\" — Phase -1. Runs a heavy procedural instanced-triangle render pass and a batched FFT \"voice compute\" dispatch every animation frame, concurrently with R4's real AudioWorklet + SharedArrayBuffer PCM ring (imported directly, not reimplemented), for a few seconds. Measures both render frame-time health and audio underrun count over the same window.",
      "exports": [
        {
          "name": "runRendererVoiceStressProbe",
          "kind": "function",
          "signature": "async runRendererVoiceStressProbe()",
          "summary": ""
        },
        {
          "name": "buildRendererVoiceStressReceipt",
          "kind": "function",
          "signature": "async buildRendererVoiceStressReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareRendererVoiceStressReceiptDownload",
          "kind": "function",
          "signature": "prepareRendererVoiceStressReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R9_RENDERER_VOICE_STRESS_SCHEMA",
          "kind": "constant",
          "signature": "R9_RENDERER_VOICE_STRESS_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/SignalMetrics",
      "path": "agi/reference/particle_voice/risk/SignalMetrics.md",
      "source": "agi/particle_voice/risk/SignalMetrics.js",
      "import": "/agi/particle_voice/risk/SignalMetrics.js",
      "sourceHash": "4e86e594094b72b81c2e6a8b4a7dacac0c0a0db830c343558c3dd661be5c57d2",
      "summary": "SignalMetrics.js — shared signal-quality helpers for Phase -1 risk pages (extracted out of VoiceBoxWaveguideProbe.js when a third consumer appeared, to avoid a third copy-paste of rms/peakAbs/hasNonFinite).",
      "exports": [
        {
          "name": "rms",
          "kind": "function",
          "signature": "rms(signal, start = 0, end = signal.length)",
          "summary": "SignalMetrics.js — shared signal-quality helpers for Phase -1 risk pages (extracted out of VoiceBoxWaveguideProbe.js when a third consumer appeared, to avoid a third copy-paste of rms/peakAbs/hasNonFinite)."
        },
        {
          "name": "peakAbs",
          "kind": "function",
          "signature": "peakAbs(signal, start = 0, end = signal.length)",
          "summary": ""
        },
        {
          "name": "hasNonFinite",
          "kind": "function",
          "signature": "hasNonFinite(signal)",
          "summary": ""
        },
        {
          "name": "maxAbsDiff",
          "kind": "function",
          "signature": "maxAbsDiff(a, b, startIndex = 0, endIndex = a.length)",
          "summary": ""
        },
        {
          "name": "detectClicks",
          "kind": "function",
          "signature": "detectClicks(signal, windowSize = 256, thresholdMultiplier = 12)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/StftWolaProbe",
      "path": "agi/reference/particle_voice/risk/StftWolaProbe.md",
      "source": "agi/particle_voice/risk/StftWolaProbe.js",
      "import": "/agi/particle_voice/risk/StftWolaProbe.js",
      "sourceHash": "9f75b40f63e418cbcf80db58e911d0939a429202201eedf2d681b4d9871b73f3",
      "summary": "StftWolaProbe.js — R3 Phase -1 risk spike. \"stft-wola.html — 1024-point f32 FFT/IFFT and normalized WOLA for 320-sample hop; identity, impulse, sweep, noise tests.\" — Phase -1. Exit gate: \"Identity tests pass; workgroup limits respected; normalized WOLA ripple below audible threshold.\" Identity tests run a single frame through forward FFT then inverse FFT (both on GPU) and compare to the original signal. The WOLA test runs many overlapping analysis-windowed frames through the same round trip, applies a synthesis window, overlap-adds, and divides by the exact sum-of-squares envelope — with exact normalization the round trip is mathematically identity, so any measured \"ripple\" is real FFT/window/OLA implementation error, not a windowing-shape artifact.",
      "exports": [
        {
          "name": "runStftWolaProbe",
          "kind": "function",
          "signature": "async runStftWolaProbe()",
          "summary": ""
        },
        {
          "name": "buildStftWolaReceipt",
          "kind": "function",
          "signature": "async buildStftWolaReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareStftWolaReceiptDownload",
          "kind": "function",
          "signature": "prepareStftWolaReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R3_STFT_WOLA_SCHEMA",
          "kind": "constant",
          "signature": "R3_STFT_WOLA_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/StreamingContinuityProbe",
      "path": "agi/reference/particle_voice/risk/StreamingContinuityProbe.md",
      "source": "agi/particle_voice/risk/StreamingContinuityProbe.js",
      "import": "/agi/particle_voice/risk/StreamingContinuityProbe.js",
      "sourceHash": "f4d6893db72a4b9c236d7bc60ff856ec2e611b7cebf0611c04be930eb947a099",
      "summary": "StreamingContinuityProbe.js — R5 Phase -1 risk spike orchestrator. Pure JS, no GPU/AudioContext dependency: R5's exit gate is an architectural/correctness property of the counter design (does chunking change the output?), not a GPU performance question, so no kernel is needed to validate it. See StreamingContinuitySource.js for the mechanism.",
      "exports": [
        {
          "name": "runStreamingContinuityProbe",
          "kind": "function",
          "signature": "async runStreamingContinuityProbe()",
          "summary": ""
        },
        {
          "name": "buildStreamingContinuityReceipt",
          "kind": "function",
          "signature": "async buildStreamingContinuityReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareStreamingContinuityReceiptDownload",
          "kind": "function",
          "signature": "prepareStreamingContinuityReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R5_STREAMING_CONTINUITY_SCHEMA",
          "kind": "constant",
          "signature": "R5_STREAMING_CONTINUITY_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/StreamingContinuitySource",
      "path": "agi/reference/particle_voice/risk/StreamingContinuitySource.md",
      "source": "agi/particle_voice/risk/StreamingContinuitySource.js",
      "import": "/agi/particle_voice/risk/StreamingContinuitySource.js",
      "sourceHash": "341d03da1e1b0ffd7eeb86ff7ca668715da617ee4885e39e3ace0cef2d8e1f26",
      "summary": "StreamingContinuitySource.js — R5 Phase -1 risk spike. Exit gate: \"Phase-continuous harmonic/noise across arbitrary chunk boundaries; absolute-counter noise chunk-independent.\" — Phase -1. There is no dedicated filename for R5 in the plan's risk/ page list (it names R0-R4, R6-R16 pages explicitly but not R5) — this file/page covers that exit gate directly. The technique: every sample's value is a pure function of its ABSOLUTE sample index (harmonic phase = 2*pi*f0*n/sampleRate; noise = a counter-based hash of n), with no persistent oscillator/PRNG state threaded between chunks and no chunk-relative counter anywhere. Chunking therefore cannot affect the output — not \"close enough\", bit-identical — because the per-sample computation never reads chunk position at all. This is the mechanism `harmonic_source.js`/`noise_source.js` (Phase 2) must use for random chunk-boundary training and streaming to work.",
      "exports": [
        {
          "name": "noiseAt",
          "kind": "function",
          "signature": "noiseAt(absoluteIndex, seed)",
          "summary": "Counter-based hash PRNG: deterministic pseudo-random float in [-1, 1], pure function of (index, seed)."
        },
        {
          "name": "harmonicAt",
          "kind": "function",
          "signature": "harmonicAt(absoluteIndex, sampleRate, f0Hz)",
          "summary": "Pure function of absolute sample index — no carried oscillator phase state."
        },
        {
          "name": "synthesizeAbsoluteCounter",
          "kind": "function",
          "signature": "synthesizeAbsoluteCounter(totalSamples, sampleRate, f0Hz, noiseSeed, chunkSizes)",
          "summary": "Correct (absolute-counter) synthesis: chunking `chunkSizes` (cycled) has zero effect on the output because each sample only ever reads its absolute index `n`, never a position relative to the current chunk."
        },
        {
          "name": "synthesizeChunkRelativeCounterBuggy",
          "kind": "function",
          "signature": "synthesizeChunkRelativeCounterBuggy(totalSamples, sampleRate, f0Hz, noiseSeed, chunkSizes)",
          "summary": "Deliberately buggy (chunk-relative-counter) synthesis for the self-test: resets its local counter to 0 at the start of every chunk, so output DOES depend on how the signal was chunked — used only to prove the bit-exact comparison in this probe actually catches phase discontinuity."
        },
        {
          "name": "maxAbsDiff",
          "kind": "function",
          "signature": "maxAbsDiff(a, b)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/TinyAutodiff",
      "path": "agi/reference/particle_voice/risk/TinyAutodiff.md",
      "source": "agi/particle_voice/risk/TinyAutodiff.js",
      "import": "/agi/particle_voice/risk/TinyAutodiff.js",
      "sourceHash": "ec5c004232925a8f0fcac03bb0685a7bfdbdf568132330c3640e25bfed94b399",
      "summary": "TinyAutodiff.js — R7 Phase -1 risk spike. Hand-wired forward+backward layers (Linear, Conv1D, ReLU, Sigmoid), losses (MSE, BCE), and an AdamW optimizer — deliberately NOT a general computational-graph autodiff engine. `ParticleTape`/`BackwardGraphCompiler`/ `GradientGraph` (Phase 1, nn/autodiff/) are the real general system; R7's job is to prove models at this parameter scale can be forward+backward trained in-browser at all, not to build that general architecture early. All arrays are plain Float32Array with row/channel-major layouts documented per function; batch=1 throughout (a single fixed sequence/vector per step) is sufficient for R7's memorization-convergence test.",
      "exports": [
        {
          "name": "makeRng",
          "kind": "function",
          "signature": "makeRng(seed)",
          "summary": "TinyAutodiff.js — R7 Phase -1 risk spike. Hand-wired forward+backward layers (Linear, Conv1D, ReLU, Sigmoid), losses (MSE, BCE), and an AdamW optimizer — deliberately NOT a general computational-graph autodiff engine. `ParticleTape`/`BackwardGraphCompiler`/ `GradientGraph` (Phase 1, nn/autodiff/) are the real general system; R7's job is to prove models at this parameter scale can be forward+backward trained in-browser at all, not to build that general architecture early. All arrays are plain Float32Array with row/channel-major layouts documented per function; batch=1 throughout (a single fixed sequence/vector per step) is sufficient for R7's memorization-convergence test."
        },
        {
          "name": "createLinear",
          "kind": "function",
          "signature": "createLinear(inputDim, outputDim, rng)",
          "summary": ""
        },
        {
          "name": "createReLU",
          "kind": "function",
          "signature": "createReLU()",
          "summary": ""
        },
        {
          "name": "createSigmoid",
          "kind": "function",
          "signature": "createSigmoid()",
          "summary": ""
        },
        {
          "name": "createConv1D",
          "kind": "function",
          "signature": "createConv1D(inChannels, outChannels, kernelSize, rng)",
          "summary": ""
        },
        {
          "name": "mseLoss",
          "kind": "function",
          "signature": "mseLoss(pred, target)",
          "summary": ""
        },
        {
          "name": "bceLoss",
          "kind": "function",
          "signature": "bceLoss(pred, target)",
          "summary": ""
        },
        {
          "name": "clipGradGlobalNorm",
          "kind": "function",
          "signature": "clipGradGlobalNorm(gradArrays, maxNorm)",
          "summary": "Clip the global L2 norm across all gradient arrays in place — cheap insurance against a deep stack diverging."
        },
        {
          "name": "createAdamW",
          "kind": "function",
          "signature": "createAdamW(paramArrays, { lr = 0.01, beta1 = 0.9, beta2 = 0.999, eps = 1e-8, weightDecay = 0.01 } = {})",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/TinyModels",
      "path": "agi/reference/particle_voice/risk/TinyModels.md",
      "source": "agi/particle_voice/risk/TinyModels.js",
      "import": "/agi/particle_voice/risk/TinyModels.js",
      "sourceHash": "cfde29bd4820222255a17e49e4d66d8c7fb1246a1116b488b0bacd8458a5dbd5",
      "summary": "TinyModels.js — R7 Phase -1 risk spike model definitions. \"1M-parameter model, 5M Conv1D model, tiny adversarial audio pair\" — particle-voice-26357c.md, Phase -1. Exact param counts land close to but not exactly at 1,000,000/5,000,000 (real counts are reported, not fudged to hit a round number) — the plan's own number is an order-of-magnitude descriptor.",
      "exports": [
        {
          "name": "createTinyMlpModel",
          "kind": "function",
          "signature": "createTinyMlpModel(rng)",
          "summary": "~0.93M-param MLP: Linear(64,650)-ReLU x3 -Linear(650,64)."
        },
        {
          "name": "createTinyConv1dModel",
          "kind": "function",
          "signature": "createTinyConv1dModel(rng, sequenceLength = 16)",
          "summary": "~4.5M-param Conv1D stack: Conv1D(16,384,5)-ReLU, 6x[Conv1D(384,384,5)-ReLU], Conv1D(384,16,5)."
        },
        {
          "name": "createTinyGan",
          "kind": "function",
          "signature": "createTinyGan(rng)",
          "summary": "Tiny generator (noise[8] -> sample[16]) + discriminator (sample[16] -> real-probability)."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/TrainingSpikeProbe",
      "path": "agi/reference/particle_voice/risk/TrainingSpikeProbe.md",
      "source": "agi/particle_voice/risk/TrainingSpikeProbe.js",
      "import": "/agi/particle_voice/risk/TrainingSpikeProbe.js",
      "sourceHash": "34634c487999f5b7f1c22135c140bc03790964bd27e4181e090db8dfdd818309",
      "summary": "TrainingSpikeProbe.js — R7 Phase -1 risk spike orchestrator. Exit gate: \"1M model converges; 5M Conv1D model converges; tiny GAN converges and checkpoints; AdamW memory estimate matches measurement.\" — Phase -1. \"OPFS cache behavior\" and \"device-loss re-upload\" are also named in the risk page description and covered here. Scoping notes (read before trusting a pass): - \"Converges\" here means memorizes a small fixed random input/target pair (loss drops sharply) — a feasibility/mechanics check, not a generalization claim. - \"Device-loss re-upload\" exercises the re-upload PROCEDURE after an intentional device.destroy(); there is no scriptable public API to force an uncontrolled device loss (crash), so that path is not tested.",
      "exports": [
        {
          "name": "runTrainingSpikeProbe",
          "kind": "function",
          "signature": "async runTrainingSpikeProbe()",
          "summary": ""
        },
        {
          "name": "buildTrainingSpikeReceipt",
          "kind": "function",
          "signature": "async buildTrainingSpikeReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareTrainingSpikeReceiptDownload",
          "kind": "function",
          "signature": "prepareTrainingSpikeReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R7_TRAINING_SPIKE_SCHEMA",
          "kind": "constant",
          "signature": "R7_TRAINING_SPIKE_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/VadContinuityProbe",
      "path": "agi/reference/particle_voice/risk/VadContinuityProbe.md",
      "source": "agi/particle_voice/risk/VadContinuityProbe.js",
      "import": "/agi/particle_voice/risk/VadContinuityProbe.js",
      "sourceHash": "52324adc3b4c8c3586f795fbba86bfe2a4e34caf20617ae4d89a2f5d70965f59",
      "summary": "VadContinuityProbe.js — R11 Phase -1 risk spike orchestrator.",
      "exports": [
        {
          "name": "runVadContinuityProbe",
          "kind": "function",
          "signature": "async runVadContinuityProbe()",
          "summary": ""
        },
        {
          "name": "buildVadContinuityReceipt",
          "kind": "function",
          "signature": "async buildVadContinuityReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareVadContinuityReceiptDownload",
          "kind": "function",
          "signature": "prepareVadContinuityReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R11_VAD_CONTINUITY_SCHEMA",
          "kind": "constant",
          "signature": "R11_VAD_CONTINUITY_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/VoiceBoxPhysiologyProbe",
      "path": "agi/reference/particle_voice/risk/VoiceBoxPhysiologyProbe.md",
      "source": "agi/particle_voice/risk/VoiceBoxPhysiologyProbe.js",
      "import": "/agi/particle_voice/risk/VoiceBoxPhysiologyProbe.js",
      "sourceHash": "b2a0067cf8691acb435642bc00cb315d07f58f9e2333f4ef5cd6f785e1244623",
      "summary": "VoiceBoxPhysiologyProbe.js — R6A Phase -1 risk spike orchestrator. Exit gate: \"ArticulationHead -> NeuralPhysiologyState -> BreathReservoir/ParticleTract -> acoustic renderer receipt; physiology intervention changes final PCM.\" — Phase -1. No dedicated filename exists for R6A in the plan's risk/ page list either (same situation as R5) — this page covers that exit gate directly. Wires: createScriptedArticulationHead (stand-in for the trained model) -> NeuralPhysiologyState -> createBreathReservoir -> createGlottalSource + createVocalTract (R6's waveguide, reused directly, not re-implemented) -> PCM. Renders the same scripted utterance twice — once at baseline, once with a reduced-respiratory-drive intervention — and requires the two PCM outputs to measurably differ while both remain stable.",
      "exports": [
        {
          "name": "runVoiceBoxPhysiologyProbe",
          "kind": "function",
          "signature": "async runVoiceBoxPhysiologyProbe()",
          "summary": ""
        },
        {
          "name": "buildVoiceBoxPhysiologyReceipt",
          "kind": "function",
          "signature": "async buildVoiceBoxPhysiologyReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareVoiceBoxPhysiologyReceiptDownload",
          "kind": "function",
          "signature": "prepareVoiceBoxPhysiologyReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R6A_VOICEBOX_PHYSIOLOGY_SCHEMA",
          "kind": "constant",
          "signature": "R6A_VOICEBOX_PHYSIOLOGY_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/VoiceBoxWaveguideProbe",
      "path": "agi/reference/particle_voice/risk/VoiceBoxWaveguideProbe.md",
      "source": "agi/particle_voice/risk/VoiceBoxWaveguideProbe.js",
      "import": "/agi/particle_voice/risk/VoiceBoxWaveguideProbe.js",
      "sourceHash": "fa42835c831bf9082202480a07446c2e7a96dc8d1bade4577a549f93584b189b",
      "summary": "VoiceBoxWaveguideProbe.js — R6 Phase -1 risk spike orchestrator. Exit gate: \"Stable vowels, nasal coupling, closure/release/frication, pitch sweeps with no clicks or energy explosions.\" — Phase -1. Pure JS/CPU (see KellyLochbaumWaveguide.js header for why): this proves the waveguide algorithm itself is stable and produces plausible, controllable behavior. GPU kernel parity (`tract_waveguide.js` etc.) is a separate Phase 2 concern, tested the same way R2 checked matmul parity.",
      "exports": [
        {
          "name": "runVoiceBoxWaveguideProbe",
          "kind": "function",
          "signature": "async runVoiceBoxWaveguideProbe()",
          "summary": ""
        },
        {
          "name": "buildVoiceBoxWaveguideReceipt",
          "kind": "function",
          "signature": "async buildVoiceBoxWaveguideReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareVoiceBoxWaveguideReceiptDownload",
          "kind": "function",
          "signature": "prepareVoiceBoxWaveguideReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R6_VOICEBOX_WAVEGUIDE_SCHEMA",
          "kind": "constant",
          "signature": "R6_VOICEBOX_WAVEGUIDE_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/WeightPagingProbe",
      "path": "agi/reference/particle_voice/risk/WeightPagingProbe.md",
      "source": "agi/particle_voice/risk/WeightPagingProbe.js",
      "import": "/agi/particle_voice/risk/WeightPagingProbe.js",
      "sourceHash": "781fcb693818fca7bf27b02e1954d6b061309a4343fcdbee9521fa919e83e031",
      "summary": "WeightPagingProbe.js — R8 Phase -1 risk spike. \"Weight page download/recovery/page-hash/interrupted-download works; device-loss re-upload succeeds.\" — Phase -1. No dedicated filename exists for R8 in the plan's risk/ page list — named weight-paging.html here. Simulates WeightPageStore.js's core responsibilities: a per-page SHA-256 directory, an interrupted download that must retry (not silently drop data), corruption detection via hash mismatch, and multi-page device-loss re-upload (extends R7's single-buffer version to several pages).",
      "exports": [
        {
          "name": "runWeightPagingProbe",
          "kind": "function",
          "signature": "async runWeightPagingProbe()",
          "summary": ""
        },
        {
          "name": "buildWeightPagingReceipt",
          "kind": "function",
          "signature": "async buildWeightPagingReceipt(result)",
          "summary": ""
        },
        {
          "name": "prepareWeightPagingReceiptDownload",
          "kind": "function",
          "signature": "prepareWeightPagingReceiptDownload(receipt)",
          "summary": ""
        },
        {
          "name": "R8_WEIGHT_PAGING_SCHEMA",
          "kind": "constant",
          "signature": "R8_WEIGHT_PAGING_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/risk/WolaSignals",
      "path": "agi/reference/particle_voice/risk/WolaSignals.md",
      "source": "agi/particle_voice/risk/WolaSignals.js",
      "import": "/agi/particle_voice/risk/WolaSignals.js",
      "sourceHash": "87aae01bb39ae84e1a9a7530bc64e835f0c3b70616dcac4185f1543eb71ea775",
      "summary": "WolaSignals.js — deterministic test signals, Hann window, and CPU-side sum-of-squares WOLA normalization/overlap-add for R3 (stft-wola.html).",
      "exports": [
        {
          "name": "hannWindow",
          "kind": "function",
          "signature": "hannWindow(N)",
          "summary": ""
        },
        {
          "name": "impulseSignal",
          "kind": "function",
          "signature": "impulseSignal(N)",
          "summary": ""
        },
        {
          "name": "sineSweepSignal",
          "kind": "function",
          "signature": "sineSweepSignal(N, sampleRate, f0, f1)",
          "summary": "Linear chirp from f0 to f1 Hz across N samples at sampleRate."
        },
        {
          "name": "whiteNoiseSignal",
          "kind": "function",
          "signature": "whiteNoiseSignal(N, seed = 7)",
          "summary": ""
        },
        {
          "name": "sineSignal",
          "kind": "function",
          "signature": "sineSignal(length, sampleRate, freqHz, amplitude = 1.0)",
          "summary": ""
        },
        {
          "name": "computeSumOfSquaresEnvelope",
          "kind": "function",
          "signature": "computeSumOfSquaresEnvelope(window, hop, totalLength, numFrames)",
          "summary": "sum_k window[t - k*hop]^2 for every output sample t in [0, totalLength)."
        },
        {
          "name": "overlapAdd",
          "kind": "function",
          "signature": "overlapAdd(frames, hop, totalLength)",
          "summary": "Overlap-add windowed frames (each already synthesis-windowed) into a flat buffer."
        },
        {
          "name": "sliceFrames",
          "kind": "function",
          "signature": "sliceFrames(signal, N, hop, numFrames)",
          "summary": "Slice a flat signal into overlapping N-length frames at the given hop (zero-padded past the end)."
        },
        {
          "name": "applyWindow",
          "kind": "function",
          "signature": "applyWindow(frame, window)",
          "summary": ""
        },
        {
          "name": "maxAbsDiff",
          "kind": "function",
          "signature": "maxAbsDiff(a, b, startIndex = 0, endIndex = a.length)",
          "summary": ""
        },
        {
          "name": "peakAbs",
          "kind": "function",
          "signature": "peakAbs(a, startIndex = 0, endIndex = a.length)",
          "summary": ""
        },
        {
          "name": "toDb",
          "kind": "function",
          "signature": "toDb(ratio)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/streaming/GPUReadbackRing",
      "path": "agi/reference/particle_voice/streaming/GPUReadbackRing.md",
      "source": "agi/particle_voice/streaming/GPUReadbackRing.js",
      "import": "/agi/particle_voice/streaming/GPUReadbackRing.js",
      "sourceHash": "ef614f2ef264549bc92360ea15a52ca4af03fbccd68d92d396f9fb6bec598695",
      "summary": "GPUReadbackRing.js — Phase 2 ParticleVoice audio bridge. Production generalization of `risk/GpuReadbackRing.js` (R4)'s proven round-robin `MAP_READ` staging-slot ring — same core technique (each slot is copied into and mapped independently; the ONLY synchronization primitive is that slot's own `mapAsync()` promise, never a global `device.queue.onSubmittedWorkDone()`), generalized from R4's single-fixed-size/offset-0 probe surface to the production needs this module's callers (`ParticleTract.js`'s per-chunk PCM readback, eventually `SharedPCMRing.js`'s producer side) actually have: a byte-offset/length per request (not always the whole buffer from 0), `inFlightCount()` for backpressure introspection instead of only a throw on exhaustion, and GPU buffer accounting via `engine/core/gpu/GpuMetrics.js` (matching `GpuBuffer.js`'s own convention for every other buffer this project creates). R4's exit gate (`ReadbackAudioProbe.js`) already measured this exact technique's p50/p95/p99 readback latency and zero-underrun behavior across an 8-slot ring — this module does not re-derive or change that proven synchronization discipline, only widens its calling surface.",
      "exports": [
        {
          "name": "GPUReadbackRing",
          "kind": "class",
          "signature": "class GPUReadbackRing",
          "summary": ""
        },
        {
          "name": "createGPUReadbackRing",
          "kind": "function",
          "signature": "createGPUReadbackRing(device, slotByteSize, options)",
          "summary": ""
        },
        {
          "name": "DEFAULT_READBACK_SLOT_COUNT",
          "kind": "constant",
          "signature": "DEFAULT_READBACK_SLOT_COUNT",
          "summary": ""
        },
        {
          "name": "MIN_READBACK_SLOT_COUNT",
          "kind": "constant",
          "signature": "MIN_READBACK_SLOT_COUNT",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/streaming/PolyphaseResampler",
      "path": "agi/reference/particle_voice/streaming/PolyphaseResampler.md",
      "source": "agi/particle_voice/streaming/PolyphaseResampler.js",
      "import": "/agi/particle_voice/streaming/PolyphaseResampler.js",
      "sourceHash": "cab38b9f0b74b585dec4daf90c92eab6475519c18ce741132ca4d17edd295324",
      "summary": "PolyphaseResampler.js — Phase 2 ParticleVoice audio bridge. \"ParticleVoice's own DSP runs at 32 kHz internally and resamples via `PolyphaseResampler.js` at the audio bridge boundary\" — `ARCHITECTURE.md` §\"Measured lead values\" / `spec/DeviceContract-v0.md` §7 (measured `AudioContext.sampleRate` 48000 Hz on the reference device). No risk-spike precedent exists for this module (checked `risk/` and `engine/` — the only \"resample\" hits in `engine/` are unrelated texture/render resample passes), so this is a fresh CPU-side (not GPU-kernel) implementation — appropriate for the audio bridge, which is already CPU-side per the plan (`SharedPCMRing.js`, `ParticleVoiceProcessor.js`). Classic Crochiere/Rabiner polyphase interpolator-decimator: for an EXACT integer ratio L/M (`inputSampleRate`/`outputSampleRate` reduced by their GCD — both are integers in practice, e.g. 32000 -> 48000 reduces exactly to L=3, M=2), a single windowed-sinc lowpass FIR (cutoff at `min(inputRate, outputRate)/2`, designed at the upsampled L*inputRate rate to suppress both upsampling images and downsampling aliases) is decomposed into L phase sub-filters of `tapsPerPhase` taps each. Per output sample, only `tapsPerPhase` multiplies are needed regardless of L — the O(tapsPerPhase*L) cost is paid once at construction (filter design), not per sample. STREAMING correctness (critical for a chunked audio bridge, where `WaveguideAcousticState` chunks arrive as small windows, not one whole signal): `process()` keeps a persistent tail of not-yet-fully-consumed input samples across calls (`_history`/`_historyBaseIndex`) and a continuously-advancing upsampled-domain position (`_pos`), so `resampler.process(wholeSignal)` and `chunks.map(c => resampler.process(c))` concatenated produce IDENTICAL output — verified directly in `tests/particle-voice/polyphase-resampler.html`. Known limitation (documented, not hidden): the FIR filter's group delay (~`tapsPerPhase/2` input samples) means the first `tapsPerPhase/2`-ish output samples ramp up from a zero-padded history rather than being bit-perfect from sample 0 — a normal, bounded FIR startup transient, not a correctness bug (every streaming FIR filter has this).",
      "exports": [
        {
          "name": "PolyphaseResampler",
          "kind": "class",
          "signature": "class PolyphaseResampler",
          "summary": ""
        },
        {
          "name": "gcd",
          "kind": "function",
          "signature": "gcd(a, b)",
          "summary": "PolyphaseResampler.js — Phase 2 ParticleVoice audio bridge. \"ParticleVoice's own DSP runs at 32 kHz internally and resamples via `PolyphaseResampler.js` at the audio bridge boundary\" — `ARCHITECTURE.md` §\"Measured lead values\" / `spec/DeviceContract-v0.md` §7 (measured `AudioContext.sampleRate` 48000 Hz on the reference device). No risk-spike precedent exists for this module (checked `risk/` and `engine/` — the only \"resample\" hits in `engine/` are unrelated texture/render resample passes), so this is a fresh CPU-side (not GPU-kernel) implementation — appropriate for the audio bridge, which is already CPU-side per the plan (`SharedPCMRing.js`, `ParticleVoiceProcessor.js`). Classic Crochiere/Rabiner polyphase interpolator-decimator: for an EXACT integer ratio L/M (`inputSampleRate`/`outputSampleRate` reduced by their GCD — both are integers in practice, e.g. 32000 -> 48000 reduces exactly to L=3, M=2), a single windowed-sinc lowpass FIR (cutoff at `min(inputRate, outputRate)/2`, designed at the upsampled L*inputRate rate to suppress both upsampling images and downsampling aliases) is decomposed into L phase sub-filters of `tapsPerPhase` taps each. Per output sample, only `tapsPerPhase` multiplies are needed regardless of L — the O(tapsPerPhase*L) cost is paid once at construction (filter design), not per sample. STREAMING correctness (critical for a chunked audio bridge, where `WaveguideAcousticState` chunks arrive as small windows, not one whole signal): `process()` keeps a persistent tail of not-yet-fully-consumed input samples across calls (`_history`/`_historyBaseIndex`) and a continuously-advancing upsampled-domain position (`_pos`), so `resampler.process(wholeSignal)` and `chunks.map(c => resampler.process(c))` concatenated produce IDENTICAL output — verified directly in `tests/particle-voice/polyphase-resampler.html`. Known limitation (documented, not hidden): the FIR filter's group delay (~`tapsPerPhase/2` input samples) means the first `tapsPerPhase/2`-ish output samples ramp up from a zero-padded history rather than being bit-perfect from sample 0 — a normal, bounded FIR startup transient, not a correctness bug (every streaming FIR filter has this)."
        },
        {
          "name": "designWindowedSincLowpass",
          "kind": "function",
          "signature": "designWindowedSincLowpass(numTaps, cutoff)",
          "summary": "Windowed-sinc lowpass FIR, Hann-windowed, normalized to unity DC gain (`sum(h) === 1`). `cutoff` is normalized to the filter's OWN sample rate (0.5 = that rate's Nyquist) — callers designing a polyphase interpolator pass a cutoff normalized to the UPSAMPLED (L*inputRate) rate, per this module's `buildPolyphaseFilter`."
        },
        {
          "name": "buildPolyphaseFilter",
          "kind": "function",
          "signature": "buildPolyphaseFilter(L, M, tapsPerPhase)",
          "summary": "Builds the L-phase decomposition of a full-length windowed-sinc lowpass sized for L/M polyphase interpolation-decimation."
        },
        {
          "name": "DEFAULT_TAPS_PER_PHASE",
          "kind": "constant",
          "signature": "DEFAULT_TAPS_PER_PHASE",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/streaming/SafetyLimiter",
      "path": "agi/reference/particle_voice/streaming/SafetyLimiter.md",
      "source": "agi/particle_voice/streaming/SafetyLimiter.js",
      "import": "/agi/particle_voice/streaming/SafetyLimiter.js",
      "sourceHash": "3d2fed75098e26a8be33be3b1455a1569cffb40d96a13c2d30bd38b001f61f05",
      "summary": "SafetyLimiter.js — Phase 2 ParticleVoice audio bridge. \"SafetyLimiter.js — soft clip, DC removal, fade.\" No existing DC-blocker/soft-clip/limiter precedent exists in this codebase to reuse (checked `engine/audio/` — `PatchRunner.worklet.js`'s `distortion` node is a bare `Math.tanh(x*drive)` waveshaper, not a limiter/DC-blocker), so this is a fresh CPU-side implementation. Sits at the very end of the audio bridge, downstream of `PolyphaseResampler.js`, as the last line of defense before PCM reaches `SharedPCMRing.js`/the AudioContext — a physics/neural solver misbehaving upstream (an unstable `tract_waveguide.js` reflection coefficient, a runaway `glottal_lf.js` Newton-Raphson solve, etc.) should never be able to produce a harsh digital-clip transient, a DC offset, or a click at an utterance boundary — that is this module's entire job. Three independent, composable stages, applied per-sample in this order: 1. DC removal — the standard DC-blocking filter (Julius O. Smith's well-known form): `y[n] = x[n] - x[n-1] + R*y[n-1]`. At DC this converges to exactly 0 (the `z=1` zero cancels any constant component); `R` close to 1 keeps the notch narrow so audible low frequencies are essentially untouched. `R` is derived via this codebase's own established exponential-pole convention (`risk/BreathReservoir.js`'s `lagRate = 1 - exp(-1/(tau*sampleRate))` pattern) rather than inventing a new formula style: here `R = exp(-2*pi*cornerHz/sampleRate)`. 2. Fade — an explicit, persistent linear gain ramp (`beginFadeIn`/`beginFadeOut`), so an utterance start/stop or a cancellation (`SharedPCMRing.js`'s `resetSharedPCMRing()` discontinuity) can be given a clean few-millisecond ramp instead of an audible click. 3. Soft clip — a `tanh`-saturating soft knee above `softClipThreshold` (default 0.8): transparent (identity) below the threshold, then a C1-continuous (matching slope at the knee, so no audible kink) saturating curve that asymptotically approaches +/-1 but never reaches or exceeds it — i.e. this NEVER hard-clips, by construction. All three stages carry PERSISTENT state across `process()` calls (DC filter memory, fade envelope position) — `reset()` clears all of it in one call, mirroring `SharedPCMRing.js`/`PolyphaseResampler.js`'s reset-on-discontinuity convention, so a caller can reset the whole audio bridge chain in lockstep on cancellation/interruption.",
      "exports": [
        {
          "name": "SafetyLimiter",
          "kind": "class",
          "signature": "class SafetyLimiter",
          "summary": ""
        },
        {
          "name": "softClip",
          "kind": "function",
          "signature": "softClip(x, threshold = DEFAULT_SOFT_CLIP_THRESHOLD)",
          "summary": "Pure, stateless: `tanh`-saturating soft knee. Identity below `threshold` in magnitude; above it, asymptotically approaches `+/-1` but never reaches or exceeds it. C1-continuous at the knee (`tanh'(0) === 1` matches the identity segment's slope exactly)."
        },
        {
          "name": "DEFAULT_DC_BLOCK_CORNER_HZ",
          "kind": "constant",
          "signature": "DEFAULT_DC_BLOCK_CORNER_HZ",
          "summary": "SafetyLimiter.js — Phase 2 ParticleVoice audio bridge. \"SafetyLimiter.js — soft clip, DC removal, fade.\" No existing DC-blocker/soft-clip/limiter precedent exists in this codebase to reuse (checked `engine/audio/` — `PatchRunner.worklet.js`'s `distortion` node is a bare `Math.tanh(x*drive)` waveshaper, not a limiter/DC-blocker), so this is a fresh CPU-side implementation. Sits at the very end of the audio bridge, downstream of `PolyphaseResampler.js`, as the last line of defense before PCM reaches `SharedPCMRing.js`/the AudioContext — a physics/neural solver misbehaving upstream (an unstable `tract_waveguide.js` reflection coefficient, a runaway `glottal_lf.js` Newton-Raphson solve, etc.) should never be able to produce a harsh digital-clip transient, a DC offset, or a click at an utterance boundary — that is this module's entire job. Three independent, composable stages, applied per-sample in this order: 1. DC removal — the standard DC-blocking filter (Julius O. Smith's well-known form): `y[n] = x[n] - x[n-1] + R*y[n-1]`. At DC this converges to exactly 0 (the `z=1` zero cancels any constant component); `R` close to 1 keeps the notch narrow so audible low frequencies are essentially untouched. `R` is derived via this codebase's own established exponential-pole convention (`risk/BreathReservoir.js`'s `lagRate = 1 - exp(-1/(tau*sampleRate))` pattern) rather than inventing a new formula style: here `R = exp(-2*pi*cornerHz/sampleRate)`. 2. Fade — an explicit, persistent linear gain ramp (`beginFadeIn`/`beginFadeOut`), so an utterance start/stop or a cancellation (`SharedPCMRing.js`'s `resetSharedPCMRing()` discontinuity) can be given a clean few-millisecond ramp instead of an audible click. 3. Soft clip — a `tanh`-saturating soft knee above `softClipThreshold` (default 0.8): transparent (identity) below the threshold, then a C1-continuous (matching slope at the knee, so no audible kink) saturating curve that asymptotically approaches +/-1 but never reaches or exceeds it — i.e. this NEVER hard-clips, by construction. All three stages carry PERSISTENT state across `process()` calls (DC filter memory, fade envelope position) — `reset()` clears all of it in one call, mirroring `SharedPCMRing.js`/`PolyphaseResampler.js`'s reset-on-discontinuity convention, so a caller can reset the whole audio bridge chain in lockstep on cancellation/interruption."
        },
        {
          "name": "DEFAULT_SOFT_CLIP_THRESHOLD",
          "kind": "constant",
          "signature": "DEFAULT_SOFT_CLIP_THRESHOLD",
          "summary": ""
        },
        {
          "name": "DEFAULT_FADE_MS",
          "kind": "constant",
          "signature": "DEFAULT_FADE_MS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/streaming/SharedPCMRing",
      "path": "agi/reference/particle_voice/streaming/SharedPCMRing.md",
      "source": "agi/particle_voice/streaming/SharedPCMRing.js",
      "import": "/agi/particle_voice/streaming/SharedPCMRing.js",
      "sourceHash": "cd27717ce41748bd7683f89d36fd0fe5761c9dd55ef57f4ca937e3bd7379727e",
      "summary": "SharedPCMRing.js — Phase 2 ParticleVoice audio bridge. Production generalization of `risk/ReadbackAudioProbe.js` (R4)'s proven `createSharedRing`/`prefillRing`/`startProducer` SharedArrayBuffer PCM ring (single-producer/single-consumer, `[writeIndex, readIndex, underrunCount, processCallCount]` control layout consumed by `R4ReadbackAudioWorklet.worklet.js`'s allocation-free `process()`). Adds the plan's explicit \"generation/sequence IDs\" requirement, which R4's risk spike did not need (a disposable probe never gets reset mid-run): - `generation` (control[4]): bumped by `resetSharedPCMRing()` whenever the producer discards the ring's contents outright (cancellation/ interruption per the plan's Phase 5 \"cancellation resets state cleanly\", or a device-loss GPU recovery restart). The CONSUMER side (`readCurrentGeneration`/the resync check in `worklet/ParticleVoiceProcessor.js`) compares its own cached generation against this value every `process()` call; on mismatch it resyncs `readIndex` to the CURRENT `writeIndex` (dropping whatever stale audio was in the ring before the reset) rather than trusting a `readIndex` that may now point at samples from a discarded utterance. - `writeSequence` (control[5]): incremented once per producer `writeSharedPCMRing()` call (a monotonic chunk counter, not a sample counter) — correlates a ring write with the `WaveguideAcousticState.sampleIndex` that produced it for diagnostics/telemetry; the consumer does not need to read it for correctness (unlike `generation`). The reader-side helper function here (`readAvailable`) is pure arithmetic over caller-supplied typed arrays — no allocation, no closures over per-call state — usable from a non-worklet consumer (e.g. a test harness) without violating an allocation-free constraint. `worklet/ParticleVoiceProcessor.js` (the AudioWorkletProcessor that actually drains this ring in real-time) does NOT import this module — both existing worklet files in this project (`engine/audio/synth/PatchRunner.worklet.js`, `risk/R4ReadbackAudioWorklet.worklet.js`) are self-contained with no ES imports, so `ParticleVoiceProcessor.js` duplicates `CONTROL_INDEX` and the read-position arithmetic inline rather than relying on an unverified assumption that `AudioWorkletGlobalScope` module imports behave identically to this project's other worklet loading paths. Both files' docstrings flag this duplication explicitly so the two `CONTROL_INDEX` definitions cannot silently drift apart unnoticed.",
      "exports": [
        {
          "name": "createSharedPCMRing",
          "kind": "function",
          "signature": "createSharedPCMRing({ sampleRate, capacitySeconds = DEFAULT_RING_CAPACITY_SECONDS })",
          "summary": ""
        },
        {
          "name": "writeSharedPCMRing",
          "kind": "function",
          "signature": "writeSharedPCMRing(ring, samples)",
          "summary": "Producer-side write: copies `samples` into the ring starting at the current `writeIndex`, advancing it and incrementing `writeSequence`. Clamps to available free space (`capacity - 1 - available`, the usual ring-buffer one-slot gap to distinguish full from empty) rather than overflowing past the reader's current position and corrupting not-yet-read samples — R4's own `startProducer` avoided this by pacing writes to wall-clock time so it could never get ahead of the ring's capacity, but a production writer driven by GPU chunk completion (irregular timing) cannot assume that pacing, so this function must be defensive."
        },
        {
          "name": "resetSharedPCMRing",
          "kind": "function",
          "signature": "resetSharedPCMRing(ring)",
          "summary": "Producer-side reset: zeroes both indices and bumps `generation` so the consumer discards its cached read position on its next `process()` call rather than replaying stale audio. Does not zero the PCM data itself (unnecessary — the consumer will resync past it)."
        },
        {
          "name": "readAvailable",
          "kind": "function",
          "signature": "readAvailable(control, capacity)",
          "summary": "Pure, allocation-free: samples currently available to read (does not mutate anything). Safe to call from `process()`."
        },
        {
          "name": "CONTROL_INDEX",
          "kind": "constant",
          "signature": "CONTROL_INDEX",
          "summary": "SharedPCMRing.js — Phase 2 ParticleVoice audio bridge. Production generalization of `risk/ReadbackAudioProbe.js` (R4)'s proven `createSharedRing`/`prefillRing`/`startProducer` SharedArrayBuffer PCM ring (single-producer/single-consumer, `[writeIndex, readIndex, underrunCount, processCallCount]` control layout consumed by `R4ReadbackAudioWorklet.worklet.js`'s allocation-free `process()`). Adds the plan's explicit \"generation/sequence IDs\" requirement, which R4's risk spike did not need (a disposable probe never gets reset mid-run): - `generation` (control[4]): bumped by `resetSharedPCMRing()` whenever the producer discards the ring's contents outright (cancellation/ interruption per the plan's Phase 5 \"cancellation resets state cleanly\", or a device-loss GPU recovery restart). The CONSUMER side (`readCurrentGeneration`/the resync check in `worklet/ParticleVoiceProcessor.js`) compares its own cached generation against this value every `process()` call; on mismatch it resyncs `readIndex` to the CURRENT `writeIndex` (dropping whatever stale audio was in the ring before the reset) rather than trusting a `readIndex` that may now point at samples from a discarded utterance. - `writeSequence` (control[5]): incremented once per producer `writeSharedPCMRing()` call (a monotonic chunk counter, not a sample counter) — correlates a ring write with the `WaveguideAcousticState.sampleIndex` that produced it for diagnostics/telemetry; the consumer does not need to read it for correctness (unlike `generation`). The reader-side helper function here (`readAvailable`) is pure arithmetic over caller-supplied typed arrays — no allocation, no closures over per-call state — usable from a non-worklet consumer (e.g. a test harness) without violating an allocation-free constraint. `worklet/ParticleVoiceProcessor.js` (the AudioWorkletProcessor that actually drains this ring in real-time) does NOT import this module — both existing worklet files in this project (`engine/audio/synth/PatchRunner.worklet.js`, `risk/R4ReadbackAudioWorklet.worklet.js`) are self-contained with no ES imports, so `ParticleVoiceProcessor.js` duplicates `CONTROL_INDEX` and the read-position arithmetic inline rather than relying on an unverified assumption that `AudioWorkletGlobalScope` module imports behave identically to this project's other worklet loading paths. Both files' docstrings flag this duplication explicitly so the two `CONTROL_INDEX` definitions cannot silently drift apart unnoticed."
        },
        {
          "name": "CONTROL_SLOT_COUNT",
          "kind": "constant",
          "signature": "CONTROL_SLOT_COUNT",
          "summary": ""
        },
        {
          "name": "DEFAULT_RING_CAPACITY_SECONDS",
          "kind": "constant",
          "signature": "DEFAULT_RING_CAPACITY_SECONDS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/streaming/VoiceChunker",
      "path": "agi/reference/particle_voice/streaming/VoiceChunker.md",
      "source": "agi/particle_voice/streaming/VoiceChunker.js",
      "import": "/agi/particle_voice/streaming/VoiceChunker.js",
      "sourceHash": "9040300c209ffc11c5a59eec53c97faad951fdd844ca4c1c172c507d5bd62932",
      "summary": "VoiceChunker.js — Phase 2 ParticleVoice audio bridge. \"VoiceChunker.js — legal buckets: first 12/16/24 frames, steady 32/48/64 frames, 16-frame left context, 8-12 frame overlap.\" A \"frame\" here is the Activity frame size (`ARCHITECTURE.md`'s measured-lead-values table: 256 samples @ 32 kHz, 8 ms/frame) — NOT the 100 Hz plan-level analysis frame rate, which `LengthRegulator.js` (Phase 3) reconciles separately. `spec/PRNN-v0.md` §4 (\"Shape buckets\") directly reuses these exact bucket definitions so a compiled model's execution plan only needs to support this small fixed set of shapes rather than arbitrary sequence lengths — this module is the single source of truth those buckets come from, not a second independent copy of them: firstChunkFrames:  [12, 16, 24] steadyChunkFrames: [32, 48, 64] leftContextFrames: 16 overlapFrames:     [8, 12] `risk/StreamingContinuityProbe.js` (R5) already exercised exactly these bucket sizes (`[12, 16, 24, 32, 48, 64]`) as one of its chunk-boundary patterns and proved that an ABSOLUTE (not chunk-relative) sample/phase counter design makes chunking bit-identical to processing a whole signal at once — this module's `totalFramesEmitted` bookkeeping exists for exactly that reason (a caller can derive an absolute frame index from it), not merely as a diagnostic counter. SCOPE (Phase 2, before any real streaming model exists): this module only decides CHUNK SIZE SCHEDULING (which legal bucket to use next, given how many frames are currently available) — it does not itself run a model, apply left-context frames to a real tensor, or overlap-add output audio (that's `overlap_add.js`/`crossfade.js`, already built and verified in Phase 2's DSP kernels; a future model-execution layer composes THOSE with the chunk-size decisions THIS module makes). Latency/deadline tradeoffs (when to prefer a smaller, faster-available bucket over waiting for a larger one) are explicitly `VoiceDeadlineScheduler.js`'s job, not this module's — `nextChunk()` here always greedily picks the LARGEST legal bucket that currently fits, which is the natural default in the absence of an explicit deadline override.",
      "exports": [
        {
          "name": "VoiceChunker",
          "kind": "class",
          "signature": "class VoiceChunker",
          "summary": ""
        },
        {
          "name": "FIRST_CHUNK_FRAME_BUCKETS",
          "kind": "constant",
          "signature": "FIRST_CHUNK_FRAME_BUCKETS",
          "summary": "VoiceChunker.js — Phase 2 ParticleVoice audio bridge. \"VoiceChunker.js — legal buckets: first 12/16/24 frames, steady 32/48/64 frames, 16-frame left context, 8-12 frame overlap.\" A \"frame\" here is the Activity frame size (`ARCHITECTURE.md`'s measured-lead-values table: 256 samples @ 32 kHz, 8 ms/frame) — NOT the 100 Hz plan-level analysis frame rate, which `LengthRegulator.js` (Phase 3) reconciles separately. `spec/PRNN-v0.md` §4 (\"Shape buckets\") directly reuses these exact bucket definitions so a compiled model's execution plan only needs to support this small fixed set of shapes rather than arbitrary sequence lengths — this module is the single source of truth those buckets come from, not a second independent copy of them: firstChunkFrames:  [12, 16, 24] steadyChunkFrames: [32, 48, 64] leftContextFrames: 16 overlapFrames:     [8, 12] `risk/StreamingContinuityProbe.js` (R5) already exercised exactly these bucket sizes (`[12, 16, 24, 32, 48, 64]`) as one of its chunk-boundary patterns and proved that an ABSOLUTE (not chunk-relative) sample/phase counter design makes chunking bit-identical to processing a whole signal at once — this module's `totalFramesEmitted` bookkeeping exists for exactly that reason (a caller can derive an absolute frame index from it), not merely as a diagnostic counter. SCOPE (Phase 2, before any real streaming model exists): this module only decides CHUNK SIZE SCHEDULING (which legal bucket to use next, given how many frames are currently available) — it does not itself run a model, apply left-context frames to a real tensor, or overlap-add output audio (that's `overlap_add.js`/`crossfade.js`, already built and verified in Phase 2's DSP kernels; a future model-execution layer composes THOSE with the chunk-size decisions THIS module makes). Latency/deadline tradeoffs (when to prefer a smaller, faster-available bucket over waiting for a larger one) are explicitly `VoiceDeadlineScheduler.js`'s job, not this module's — `nextChunk()` here always greedily picks the LARGEST legal bucket that currently fits, which is the natural default in the absence of an explicit deadline override."
        },
        {
          "name": "STEADY_CHUNK_FRAME_BUCKETS",
          "kind": "constant",
          "signature": "STEADY_CHUNK_FRAME_BUCKETS",
          "summary": ""
        },
        {
          "name": "LEFT_CONTEXT_FRAMES",
          "kind": "constant",
          "signature": "LEFT_CONTEXT_FRAMES",
          "summary": ""
        },
        {
          "name": "OVERLAP_FRAME_BUCKETS",
          "kind": "constant",
          "signature": "OVERLAP_FRAME_BUCKETS",
          "summary": ""
        },
        {
          "name": "DEFAULT_OVERLAP_FRAMES",
          "kind": "constant",
          "signature": "DEFAULT_OVERLAP_FRAMES",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/streaming/VoiceDeadlineScheduler",
      "path": "agi/reference/particle_voice/streaming/VoiceDeadlineScheduler.md",
      "source": "agi/particle_voice/streaming/VoiceDeadlineScheduler.js",
      "import": "/agi/particle_voice/streaming/VoiceDeadlineScheduler.js",
      "sourceHash": "d5f19b8b05d4c3bbf56ca83b1ab5a36d630931026b0dbea4620ba66c9faed5ee",
      "summary": "VoiceDeadlineScheduler.js — Phase 2 ParticleVoice audio bridge. \"VoiceDeadlineScheduler.js — target >=300 ms, warning 200 ms, emergency 100 ms; GPU budget admission.\" These three thresholds classify how much PLAYBACK RUNWAY remains — how far ahead of the AudioContext's current playback position the produced-but-not-yet-played PCM currently extends (`bufferedAheadMs`, typically derived from `SharedPCMRing.js`'s `readAvailable()` via `bufferedAheadMsFromRing()` below) — into an urgency tier, and maps that tier onto EXISTING scheduling primitives rather than inventing new ones: - `NeuralScheduler.js`'s `'high'|'normal'|'low'` priority buckets (queue ordering among pending `ParticleProgram` runs). - `engine/core/gpu/GpuFrameBudgetBroker.js`'s `workClass === 'render-critical'` bypass (`beforeSubmit()`'s own docstring: \"Render- critical work bypasses the budget\") — this IS the \"GPU budget admission\" the plan names: in the `emergency` tier, this module recommends `workClass: 'render-critical'` so the broker admits the work immediately regardless of the current frame's compute budget, rather than letting a nearly-starved voice ring wait behind unrelated background GPU work. Tier boundaries (this module's own `v0` interpretation of the plan's three named thresholds — documented explicitly since the plan states three thresholds but only two transitions are unambiguous from the wording alone): bufferedAheadMs >= 300         -> 'target'      (healthy, target met) 200 <= bufferedAheadMs < 300   -> 'belowTarget'  (below target, not yet urgent) 100 <= bufferedAheadMs < 200   -> 'warning' bufferedAheadMs < 100          -> 'emergency'",
      "exports": [
        {
          "name": "VoiceDeadlineScheduler",
          "kind": "class",
          "signature": "class VoiceDeadlineScheduler",
          "summary": ""
        },
        {
          "name": "classifyDeadlineTier",
          "kind": "function",
          "signature": "classifyDeadlineTier(bufferedAheadMs)",
          "summary": ""
        },
        {
          "name": "admissionFor",
          "kind": "function",
          "signature": "admissionFor(bufferedAheadMs)",
          "summary": ""
        },
        {
          "name": "bufferedAheadMsFromRing",
          "kind": "function",
          "signature": "bufferedAheadMsFromRing(ring)",
          "summary": "Composes with `SharedPCMRing.js`'s `readAvailable()` — the natural real-world source of `bufferedAheadMs` for a live audio bridge — rather than re-deriving ring-position arithmetic here."
        },
        {
          "name": "TARGET_BUFFERED_MS",
          "kind": "constant",
          "signature": "TARGET_BUFFERED_MS",
          "summary": ""
        },
        {
          "name": "WARNING_BUFFERED_MS",
          "kind": "constant",
          "signature": "WARNING_BUFFERED_MS",
          "summary": ""
        },
        {
          "name": "EMERGENCY_BUFFERED_MS",
          "kind": "constant",
          "signature": "EMERGENCY_BUFFERED_MS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/streaming/VoicePlayback",
      "path": "agi/reference/particle_voice/streaming/VoicePlayback.md",
      "source": "agi/particle_voice/streaming/VoicePlayback.js",
      "import": "/agi/particle_voice/streaming/VoicePlayback.js",
      "sourceHash": "413ad1fdadff4c8f7cfdf8d4274f8f0607fbbbbe1bed35a7709cc255cf257a6b",
      "summary": "VoicePlayback.js — Phase 3 ParticleVoice audio bridge. The last hop of the Phase 3 path: model PCM → resample → `SharedPCMRing` → `AudioWorklet` → audible speech. Every piece it composes was built and verified in Phase 2; this module only wires them, which is why it is small. ParticleVoiceModel (32 kHz) → PolyphaseResampler (32 kHz → AudioContext.sampleRate) → SafetyLimiter is already applied upstream by the model → SharedPCMRing (SAB, single-producer/single-consumer) → ParticleVoiceProcessor (AudioWorkletProcessor) ## The resample is mandatory, not optional The model's internal DSP rate is 32 kHz (R6's proven `SAMPLE_RATE`), but an `AudioContext` picks its own rate — commonly 48 kHz, sometimes 44.1 kHz. Writing 32 kHz samples into a 48 kHz ring without resampling does not error: it plays back **1.5× too fast and a fifth too high**, which sounds like a chipmunk rather than like a bug. `PolyphaseResampler` handles the exact-integer L/M case (32k→48k reduces to L=3, M=2) and is streaming-correct across chunk boundaries, so feeding it per-utterance or per-chunk gives identical output. ## Backpressure is the producer's problem `writeSharedPCMRing()` CLAMPS to available space and returns how much it actually accepted — it never overwrites unread audio. A producer that ignores the return value silently drops the tail of every utterance that does not fit. `enqueue()` therefore loops, awaiting drain, until everything has been accepted, and reports the total written so a caller can assert it. ## What this module deliberately does NOT do It does not own the `AudioContext`. Creating and resuming one requires a user gesture in a real page, its lifetime belongs to the application, and a test harness needs to build its own — so the context and worklet node are passed in via `attach()`. That also keeps this module testable without assuming any particular page structure.",
      "exports": [
        {
          "name": "VoicePlayback",
          "kind": "class",
          "signature": "class VoicePlayback",
          "summary": ""
        },
        {
          "name": "createVoicePlayback",
          "kind": "function",
          "signature": "createVoicePlayback(options)",
          "summary": ""
        },
        {
          "name": "DEFAULT_PLAYBACK_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_PLAYBACK_CONFIG",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "particle_voice/worklet/ParticleVoiceProcessor",
      "path": "agi/reference/particle_voice/worklet/ParticleVoiceProcessor.md",
      "source": "agi/particle_voice/worklet/ParticleVoiceProcessor.js",
      "import": "/agi/particle_voice/worklet/ParticleVoiceProcessor.js",
      "sourceHash": "d5ddc22ad0776a4f1c4ebf078bc9a26ae840576f57ee6079f35f6f917435bb04",
      "summary": "ParticleVoiceProcessor.js — Phase 2 ParticleVoice audio bridge. Production AudioWorkletProcessor consuming `SharedPCMRing.js`'s ring, generalizing `risk/R4ReadbackAudioWorklet.worklet.js` (R4)'s proven allocation-free `process()` (no `new`, no object/array literals, no `await`, no `throw`, no `JSON` — only typed-array indexing and Atomics on pre-existing SharedArrayBuffer-backed views) with the plan's generation-aware resync requirement `SharedPCMRing.js`'s docstring describes. This file is deliberately SELF-CONTAINED (no ES module imports), matching this project's two existing worklet files (`engine/audio/synth/PatchRunner.worklet.js`, `risk/R4ReadbackAudioWorklet.worklet.js`) — `SharedPCMRing.js`'s `CONTROL_INDEX` constants are duplicated here as `CONTROL_INDEX` rather than imported; the two must be kept in sync by hand (flagged in both files' docstrings) rather than relying on an unverified assumption that `AudioWorkletGlobalScope` module imports behave identically to this project's other worklet loading paths. Control layout (Int32Array, SharedArrayBuffer, 6 x int32) — MUST match `SharedPCMRing.js`'s `CONTROL_INDEX` exactly: [0] writeIndex        — next PCM slot the producer will write [1] readIndex         — next PCM slot this processor will read [2] underrunCount     — incremented whenever fewer than one quantum of samples are available [3] processCallCount  — incremented every process() call [4] generation        — bumped by the producer's resetSharedPCMRing(); on change, this processor jumps readIndex to the CURRENT writeIndex (dropping stale pre-reset audio) instead of continuing from a readIndex that may now point at discarded samples. [5] writeSequence     — producer chunk counter; read-only from here, not required for correctness, exposed for parity with SharedPCMRing.js's layout only.",
      "exports": [],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "persistence/CheckpointContracts",
      "path": "agi/reference/persistence/CheckpointContracts.md",
      "source": "agi/persistence/CheckpointContracts.js",
      "import": "/agi/persistence/CheckpointContracts.js",
      "sourceHash": "7d70b1dee5821f3e9c5445cf8a6b3a3a24d00ea2d860f754ec182b9c297225e6",
      "summary": "Accept legacy {config,parameters} documents and return canonical v1 data.",
      "exports": [
        {
          "name": "createNetworkEnvelope",
          "kind": "function",
          "signature": "createNetworkEnvelope(kind, config, parameters)",
          "summary": ""
        },
        {
          "name": "prepareNetworkEnvelope",
          "kind": "function",
          "signature": "prepareNetworkEnvelope(input, expectedKind)",
          "summary": "Accept legacy {config,parameters} documents and return canonical v1 data."
        },
        {
          "name": "createCheckpointEnvelope",
          "kind": "function",
          "signature": "createCheckpointEnvelope(data)",
          "summary": ""
        },
        {
          "name": "prepareCheckpointEnvelope",
          "kind": "function",
          "signature": "prepareCheckpointEnvelope(input)",
          "summary": "Validate both canonical v1 and the pre-envelope checkpoint shape."
        },
        {
          "name": "AGI_NETWORK_SCHEMA",
          "kind": "constant",
          "signature": "AGI_NETWORK_SCHEMA",
          "summary": ""
        },
        {
          "name": "AGI_CHECKPOINT_SCHEMA",
          "kind": "constant",
          "signature": "AGI_CHECKPOINT_SCHEMA",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_EXPORT_SCHEMA",
          "kind": "constant",
          "signature": "AGI_TRAINING_EXPORT_SCHEMA",
          "summary": ""
        },
        {
          "name": "AGI_CURRICULUM_STATE_SCHEMA",
          "kind": "constant",
          "signature": "AGI_CURRICULUM_STATE_SCHEMA",
          "summary": ""
        },
        {
          "name": "AGI_TRAINING_METRICS_SCHEMA",
          "kind": "constant",
          "signature": "AGI_TRAINING_METRICS_SCHEMA",
          "summary": ""
        },
        {
          "name": "AGI_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "AGI_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "rig/BrainVisualizer",
      "path": "agi/reference/rig/BrainVisualizer.md",
      "source": "agi/rig/BrainVisualizer.js",
      "import": "/agi/rig/BrainVisualizer.js",
      "sourceHash": "cdcb1089acc0790674eb8ce4beaf1ff1e2b3a481c3ebc9d299683df93df58350",
      "summary": "Brain Visualizer Visualizes neural network activity on the brain sphere",
      "exports": [
        {
          "name": "BrainVisualizer",
          "kind": "class",
          "signature": "class BrainVisualizer",
          "summary": "Brain Visualizer Visualizes neural network activity on the brain sphere"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "rig/InjectionSystem",
      "path": "agi/reference/rig/InjectionSystem.md",
      "source": "agi/rig/InjectionSystem.js",
      "import": "/agi/rig/InjectionSystem.js",
      "sourceHash": "b384b97f4e6e45069982e5f1d20f80fc59c23759da7c87a7750f211676f93fd2",
      "summary": "Injection System Manages tentacle attachment from brain to ragdoll bones",
      "exports": [
        {
          "name": "InjectionSystem",
          "kind": "class",
          "signature": "class InjectionSystem",
          "summary": "Injection System Manages tentacle attachment from brain to ragdoll bones"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "rig/ParasiteRig",
      "path": "agi/reference/rig/ParasiteRig.md",
      "source": "agi/rig/ParasiteRig.js",
      "import": "/agi/rig/ParasiteRig.js",
      "sourceHash": "8b107096e5395f4c85a419c851ffa4ba049f54b9842026891b7edd245b1b0857",
      "summary": "Parasite Rig The \"brain sphere\" entity that hovers above and controls the ragdoll",
      "exports": [
        {
          "name": "ParasiteRig",
          "kind": "class",
          "signature": "class ParasiteRig",
          "summary": "Parasite Rig The \"brain sphere\" entity that hovers above and controls the ragdoll"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "rig/TentacleRenderer",
      "path": "agi/reference/rig/TentacleRenderer.md",
      "source": "agi/rig/TentacleRenderer.js",
      "import": "/agi/rig/TentacleRenderer.js",
      "sourceHash": "58066109901eef62fbf56d532a1df8cbd13b373f11e48c0ed9ef78fd44659228",
      "summary": "Tentacle Renderer Renders tentacles using lightning/electricity effect",
      "exports": [
        {
          "name": "TentacleRenderer",
          "kind": "class",
          "signature": "class TentacleRenderer",
          "summary": "Tentacle Renderer Renders tentacles using lightning/electricity effect"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "scene/DebugVisualizer",
      "path": "agi/reference/scene/DebugVisualizer.md",
      "source": "agi/scene/DebugVisualizer.js",
      "import": "/agi/scene/DebugVisualizer.js",
      "sourceHash": "964f8fc855e559602a3d576c2f475f7e17fd61b5c3233239300f28b5293c33ee",
      "summary": "Debug Visualizer Renders debug overlays for training visualization",
      "exports": [
        {
          "name": "DebugVisualizer",
          "kind": "class",
          "signature": "class DebugVisualizer",
          "summary": "Debug Visualizer Renders debug overlays for training visualization"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "scene/GroundPlane",
      "path": "agi/reference/scene/GroundPlane.md",
      "source": "agi/scene/GroundPlane.js",
      "import": "/agi/scene/GroundPlane.js",
      "sourceHash": "e9284e9b81cb3630c56999d8fd7b8f305556d7614361ba66529aa1f1ac8fa659",
      "summary": "Ground Plane Infinite grid ground for training environment",
      "exports": [
        {
          "name": "GroundPlane",
          "kind": "class",
          "signature": "class GroundPlane",
          "summary": "Ground Plane Infinite grid ground for training environment"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "scene/SceneRenderer",
      "path": "agi/reference/scene/SceneRenderer.md",
      "source": "agi/scene/SceneRenderer.js",
      "import": "/agi/scene/SceneRenderer.js",
      "sourceHash": "25abe7add02fc13cfdac49e71c33230d25fff79e187fc5cdd5a40c7f75ecae0c",
      "summary": "",
      "exports": [
        {
          "name": "SceneRenderer",
          "kind": "class",
          "signature": "class SceneRenderer",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "scene/TrackingCamera",
      "path": "agi/reference/scene/TrackingCamera.md",
      "source": "agi/scene/TrackingCamera.js",
      "import": "/agi/scene/TrackingCamera.js",
      "sourceHash": "fe8be2ef8487fed5e007c74ca1cd325d043db89f45e490e4e8bfb8f83e34d8ae",
      "summary": "Tracking Camera Smooth camera that follows the ragdoll",
      "exports": [
        {
          "name": "TrackingCamera",
          "kind": "class",
          "signature": "class TrackingCamera",
          "summary": "Tracking Camera Smooth camera that follows the ragdoll"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "scene/TrainingScene",
      "path": "agi/reference/scene/TrainingScene.md",
      "source": "agi/scene/TrainingScene.js",
      "import": "/agi/scene/TrainingScene.js",
      "sourceHash": "bf308868a8cccca4f34704c445fed5b2ed881c21ec03b35662eedbe93c6381ce",
      "summary": "",
      "exports": [
        {
          "name": "TrainingScene",
          "kind": "class",
          "signature": "class TrainingScene",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "studio/core/StudioApp",
      "path": "agi/reference/studio/core/StudioApp.md",
      "source": "agi/studio/core/StudioApp.js",
      "import": "/agi/studio/core/StudioApp.js",
      "sourceHash": "ae3cf3abd3d8ad473bed34d84e4bf5359cacf1a75287d9d38ffa028e5f782c04",
      "summary": "Studio Application Main AGI Studio workspace application",
      "exports": [
        {
          "name": "StudioApp",
          "kind": "class",
          "signature": "class StudioApp",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "studio/core/StudioDirectoryHandleStore",
      "path": "agi/reference/studio/core/StudioDirectoryHandleStore.md",
      "source": "agi/studio/core/StudioDirectoryHandleStore.js",
      "import": "/agi/studio/core/StudioDirectoryHandleStore.js",
      "sourceHash": "c953ece45ab667f0812f2fc48f698e643c754c7f7a308c7f4331aa3b5017589d",
      "summary": "Versioned IndexedDB owner for AGI Studio directory handles.",
      "exports": [
        {
          "name": "AGIStudioHandleStoreError",
          "kind": "class",
          "signature": "class AGIStudioHandleStoreError extends Error",
          "summary": ""
        },
        {
          "name": "StudioDirectoryHandleStore",
          "kind": "class",
          "signature": "class StudioDirectoryHandleStore",
          "summary": ""
        },
        {
          "name": "isAGIStudioDirectoryHandle",
          "kind": "function",
          "signature": "isAGIStudioDirectoryHandle(value)",
          "summary": ""
        },
        {
          "name": "agiStudioDirectoryHandleCurrentKey",
          "kind": "function",
          "signature": "agiStudioDirectoryHandleCurrentKey(slot)",
          "summary": ""
        },
        {
          "name": "prepareAGIStudioDirectoryHandleRecord",
          "kind": "function",
          "signature": "prepareAGIStudioDirectoryHandleRecord(value, expectedSlot)",
          "summary": "Validate a raw v1 handle or exact v2 envelope without serializing the handle."
        },
        {
          "name": "AGI_STUDIO_HANDLE_DB_NAME",
          "kind": "constant",
          "signature": "AGI_STUDIO_HANDLE_DB_NAME",
          "summary": "Versioned IndexedDB owner for AGI Studio directory handles."
        },
        {
          "name": "AGI_STUDIO_HANDLE_STORE_NAME",
          "kind": "constant",
          "signature": "AGI_STUDIO_HANDLE_STORE_NAME",
          "summary": ""
        },
        {
          "name": "AGI_STUDIO_HANDLE_DB_VERSION",
          "kind": "constant",
          "signature": "AGI_STUDIO_HANDLE_DB_VERSION",
          "summary": ""
        },
        {
          "name": "AGI_STUDIO_DIRECTORY_HANDLE_SCHEMA",
          "kind": "constant",
          "signature": "AGI_STUDIO_DIRECTORY_HANDLE_SCHEMA",
          "summary": ""
        },
        {
          "name": "AGI_STUDIO_DIRECTORY_HANDLE_FORMAT",
          "kind": "constant",
          "signature": "AGI_STUDIO_DIRECTORY_HANDLE_FORMAT",
          "summary": ""
        },
        {
          "name": "AGI_STUDIO_DIRECTORY_HANDLE_VERSION",
          "kind": "constant",
          "signature": "AGI_STUDIO_DIRECTORY_HANDLE_VERSION",
          "summary": ""
        },
        {
          "name": "AGI_STUDIO_DIRECTORY_HANDLE_SLOTS",
          "kind": "constant",
          "signature": "AGI_STUDIO_DIRECTORY_HANDLE_SLOTS",
          "summary": ""
        },
        {
          "name": "AGI_STUDIO_HANDLE_LIMITS",
          "kind": "constant",
          "signature": "AGI_STUDIO_HANDLE_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "studio/main",
      "path": "agi/reference/studio/main.md",
      "source": "agi/studio/main.js",
      "import": "/agi/studio/main.js",
      "sourceHash": "8236490f255c697417ba677755c07b3067c1999db3f8788477c3f705d5ee58b3",
      "summary": "",
      "exports": [],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "studio/ui/LoadingProgress",
      "path": "agi/reference/studio/ui/LoadingProgress.md",
      "source": "agi/studio/ui/LoadingProgress.js",
      "import": "/agi/studio/ui/LoadingProgress.js",
      "sourceHash": "ef1c4411a2e8cff7daee838096e98e64aeb42f80b83c01a549ddd5f3470f5dcb",
      "summary": "Loading Progress UI - Shows what's loading and progress",
      "exports": [
        {
          "name": "LoadingProgress",
          "kind": "class",
          "signature": "class LoadingProgress",
          "summary": "Loading Progress UI - Shows what's loading and progress"
        },
        {
          "name": "loadingProgress",
          "kind": "constant",
          "signature": "loadingProgress",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/ComputeGraph",
      "path": "agi/reference/tensor/ComputeGraph.md",
      "source": "agi/tensor/ComputeGraph.js",
      "import": "/agi/tensor/ComputeGraph.js",
      "sourceHash": "26ca9b7e87d7e73cf8f8a75c9dcc10ae3f8b839e09d4eadead6913b9e81649ba",
      "summary": "Compute Graph Manages operation chaining and execution order for tensor operations",
      "exports": [
        {
          "name": "ComputeGraph",
          "kind": "class",
          "signature": "class ComputeGraph",
          "summary": "Compute Graph Manages operation chaining and execution order for tensor operations"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/GradientTape",
      "path": "agi/reference/tensor/GradientTape.md",
      "source": "agi/tensor/GradientTape.js",
      "import": "/agi/tensor/GradientTape.js",
      "sourceHash": "e96aeba07c60f4fbcfe8075ce345aa4b5fd8b38f4763454e74e31ad16969615b",
      "summary": "Gradient Tape - Automatic Differentiation Records operations for backward pass computation",
      "exports": [
        {
          "name": "GradientTape",
          "kind": "class",
          "signature": "class GradientTape",
          "summary": "Gradient Tape - Automatic Differentiation Records operations for backward pass computation"
        },
        {
          "name": "GradientContext",
          "kind": "class",
          "signature": "class GradientContext",
          "summary": "Context manager for gradient tape"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/Tensor",
      "path": "agi/reference/tensor/Tensor.md",
      "source": "agi/tensor/Tensor.js",
      "import": "/agi/tensor/Tensor.js",
      "sourceHash": "684fca9422ac801e2437832d8ddab6095c08198f2a3a826cae4b9686a1ffd61e",
      "summary": "GPU-resident float32 tensor with explicit readback and ownership.",
      "exports": [
        {
          "name": "Tensor",
          "kind": "class",
          "signature": "class Tensor",
          "summary": "GPU-resident float32 tensor with explicit readback and ownership."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/TensorCache",
      "path": "agi/reference/tensor/TensorCache.md",
      "source": "agi/tensor/TensorCache.js",
      "import": "/agi/tensor/TensorCache.js",
      "sourceHash": "0d8979cee9446b90b1e9f552b93dc7e6c641a12ccfdabc01ef644285169a3751",
      "summary": "Tensor Cache - Memory Management for GPU Tensors Manages tensor buffer lifecycle and memory reuse",
      "exports": [
        {
          "name": "TensorCache",
          "kind": "class",
          "signature": "class TensorCache",
          "summary": "Tensor Cache - Memory Management for GPU Tensors Manages tensor buffer lifecycle and memory reuse"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/TensorOps",
      "path": "agi/reference/tensor/TensorOps.md",
      "source": "agi/tensor/TensorOps.js",
      "import": "/agi/tensor/TensorOps.js",
      "sourceHash": "f92f4df6708803a2fae8c8e333bfbc0a61b1a26b2f037a82bfccd69dc485a11e",
      "summary": "GPU-resident float32 elementwise and reduction operations.",
      "exports": [
        {
          "name": "TensorOps",
          "kind": "class",
          "signature": "class TensorOps",
          "summary": "GPU-resident float32 elementwise and reduction operations."
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/TensorOpsAdvanced",
      "path": "agi/reference/tensor/TensorOpsAdvanced.md",
      "source": "agi/tensor/TensorOpsAdvanced.js",
      "import": "/agi/tensor/TensorOpsAdvanced.js",
      "sourceHash": "4646764c86d6e498d4a5b192df9b5d4c7df7fe8435b542b4c6ef9113a459549e",
      "summary": "",
      "exports": [
        {
          "name": "TensorOpsAdvanced",
          "kind": "class",
          "signature": "class TensorOpsAdvanced",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/shaders/activation",
      "path": "agi/reference/tensor/shaders/activation.md",
      "source": "agi/tensor/shaders/activation.js",
      "import": "/agi/tensor/shaders/activation.js",
      "sourceHash": "2c123cb5af1d1adc7bf8699ef1dbe4d8c5af04ae5cbdc7d740a81aad92d86c6c",
      "summary": "Activation Function Compute Shaders ReLU, Tanh, Sigmoid, and their derivatives",
      "exports": [
        {
          "name": "createActivationShader",
          "kind": "function",
          "signature": "createActivationShader(activationType = 'relu', workgroupSize = 256)",
          "summary": "Activation Function Compute Shaders ReLU, Tanh, Sigmoid, and their derivatives"
        },
        {
          "name": "createActivationDerivativeShader",
          "kind": "function",
          "signature": "createActivationDerivativeShader(activationType = 'relu', workgroupSize = 256)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/shaders/matmul",
      "path": "agi/reference/tensor/shaders/matmul.md",
      "source": "agi/tensor/shaders/matmul.js",
      "import": "/agi/tensor/shaders/matmul.js",
      "sourceHash": "0591fa80ce07d12cc1a7dcfe7f6a6e9ddc65b3f1987e43c664238859bb2900b7",
      "summary": "Matrix Multiplication Compute Shader C = A * B where A is [M x K] and B is [K x N]",
      "exports": [
        {
          "name": "createMatmulShader",
          "kind": "function",
          "signature": "createMatmulShader(workgroupSize = 8)",
          "summary": "Matrix Multiplication Compute Shader C = A * B where A is [M x K] and B is [K x N]"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "tensor/shaders/reduction",
      "path": "agi/reference/tensor/shaders/reduction.md",
      "source": "agi/tensor/shaders/reduction.js",
      "import": "/agi/tensor/shaders/reduction.js",
      "sourceHash": "7f3ada19ad8db6a3d564df74178aa7cb8491dd3a7456547dee5e5c864b2bc668",
      "summary": "Reduction Operations Compute Shaders Sum, Max, Min reductions along axes",
      "exports": [
        {
          "name": "createSumReductionShader",
          "kind": "function",
          "signature": "createSumReductionShader(workgroupSize = 256)",
          "summary": "Reduction Operations Compute Shaders Sum, Max, Min reductions along axes"
        },
        {
          "name": "createMaxReductionShader",
          "kind": "function",
          "signature": "createMaxReductionShader(workgroupSize = 256)",
          "summary": ""
        },
        {
          "name": "createMeanReductionShader",
          "kind": "function",
          "signature": "createMeanReductionShader(workgroupSize = 256)",
          "summary": ""
        },
        {
          "name": "createSoftmaxShader",
          "kind": "function",
          "signature": "createSoftmaxShader(workgroupSize = 256)",
          "summary": ""
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "ui/MetricsDisplay",
      "path": "agi/reference/ui/MetricsDisplay.md",
      "source": "agi/ui/MetricsDisplay.js",
      "import": "/agi/ui/MetricsDisplay.js",
      "sourceHash": "bd57b45b09f3d3fb0e7aa3f6661bd2c4dc974362c16de34c4af133b912bd41fb",
      "summary": "Metrics Display Real-time training statistics display",
      "exports": [
        {
          "name": "MetricsDisplay",
          "kind": "class",
          "signature": "class MetricsDisplay",
          "summary": "Metrics Display Real-time training statistics display"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "ui/TrainingUI",
      "path": "agi/reference/ui/TrainingUI.md",
      "source": "agi/ui/TrainingUI.js",
      "import": "/agi/ui/TrainingUI.js",
      "sourceHash": "b00b6b3bf2d60e010b022348ae2ec48b7a9b543d2605278c23c4d44bf93eed64",
      "summary": "Training UI Main control panel for training interface",
      "exports": [
        {
          "name": "TrainingUI",
          "kind": "class",
          "signature": "class TrainingUI",
          "summary": "Training UI Main control panel for training interface"
        }
      ],
      "subsystem": "agi"
    },
    {
      "schemaVersion": 1,
      "title": "EditorApp",
      "path": "editor/reference/EditorApp.md",
      "source": "editor/js/EditorApp.js",
      "import": "/editor/js/EditorApp.js",
      "sourceHash": "15dce8760d6b57df398f8b909cb03eed49dc77b694ce58d828a62985bc95b9dc",
      "summary": "EditorApp - Main application controller (Modular) Uses lazy loading for heavy modules to improve initial load time",
      "exports": [
        {
          "name": "EditorApp",
          "kind": "class",
          "signature": "class EditorApp",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "ProjectManager",
      "path": "editor/reference/ProjectManager.md",
      "source": "editor/js/ProjectManager.js",
      "import": "/editor/js/ProjectManager.js",
      "sourceHash": "6da80fcdde3d1994783f6ae4efb8d78ae4351510d293fe49a37b77a2542a609b",
      "summary": "ProjectManager - Handles project folder selection and initialization",
      "exports": [
        {
          "name": "ProjectManager",
          "kind": "class",
          "signature": "class ProjectManager",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioEditorPanel",
      "path": "editor/reference/components/AudioEditorPanel.md",
      "source": "editor/js/components/AudioEditorPanel.js",
      "import": "/editor/js/components/AudioEditorPanel.js",
      "sourceHash": "766e0e3423425583173c5bb5a9957d72ae0fb41367906d1d8e05637dea823ad9",
      "summary": "AudioEditorPanel.js - Main Audio Editor Panel Composes NodeGraph + Palette + Inspector + Materials + PreviewControls into a single editor tab panel for the engine editor.",
      "exports": [
        {
          "name": "createAudioEditorPanel",
          "kind": "function",
          "signature": "createAudioEditorPanel(parentContainer, options = {})",
          "summary": "Create the audio editor panel."
        },
        {
          "name": "destroyAudioEditorPanel",
          "kind": "function",
          "signature": "destroyAudioEditorPanel(panel)",
          "summary": "Destroy the audio editor panel."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioMotionTimeline",
      "path": "editor/reference/components/AudioMotionTimeline.md",
      "source": "editor/js/components/AudioMotionTimeline.js",
      "import": "/editor/js/components/AudioMotionTimeline.js",
      "sourceHash": "b660052fe2975e6a2a3e73691436ca533a01d3467b30ec2552ab461e6d83077d",
      "summary": "AudioMotionTimeline.js - Sound motion/automation timeline for Audio Editor V1 feature set: - Per-parameter tracks (nodeId + param) - Keyframe authoring (time, value, easing) - Loop + duration + playhead scrubbing - Runtime evaluation using AnimationTrack",
      "exports": [
        {
          "name": "createAudioMotionTimeline",
          "kind": "function",
          "signature": "createAudioMotionTimeline(container, callbacks = {})",
          "summary": ""
        },
        {
          "name": "setMotionPatch",
          "kind": "function",
          "signature": "setMotionPatch(timeline, motionData, options = {})",
          "summary": ""
        },
        {
          "name": "exportMotionPatch",
          "kind": "function",
          "signature": "exportMotionPatch(timeline)",
          "summary": ""
        },
        {
          "name": "evaluateMotionAtTime",
          "kind": "function",
          "signature": "evaluateMotionAtTime(timeline, tSec)",
          "summary": ""
        },
        {
          "name": "evaluateActivityAtTime",
          "kind": "function",
          "signature": "evaluateActivityAtTime(timeline, tSec)",
          "summary": ""
        },
        {
          "name": "resolveAudioMotionTimelineTime",
          "kind": "function",
          "signature": "resolveAudioMotionTimelineTime(timeline, tSec)",
          "summary": ""
        },
        {
          "name": "destroyAudioMotionTimeline",
          "kind": "function",
          "signature": "destroyAudioMotionTimeline(timeline)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioNodeGraph",
      "path": "editor/reference/components/AudioNodeGraph.md",
      "source": "editor/js/components/AudioNodeGraph.js",
      "import": "/editor/js/components/AudioNodeGraph.js",
      "sourceHash": "068e9a4c4007fdd8969ff58c87f32ccb71a50bc0d7aec4a637fb9be303c5e418",
      "summary": "AudioNodeGraph.js - Canvas-Based Node Graph Editor Draggable nodes, wire connections (audio=thick, control=thin/dashed), zoom/pan, selection, and serialization to/from patch JSON.",
      "exports": [
        {
          "name": "createAudioNodeGraph",
          "kind": "function",
          "signature": "createAudioNodeGraph(container, callbacks = {})",
          "summary": "Create an audio node graph editor."
        },
        {
          "name": "addNode",
          "kind": "function",
          "signature": "addNode(graph, type, x, y, params = {})",
          "summary": "Add a node to the graph."
        },
        {
          "name": "removeNode",
          "kind": "function",
          "signature": "removeNode(graph, nodeId)",
          "summary": "Remove a node and its wires."
        },
        {
          "name": "addWire",
          "kind": "function",
          "signature": "addWire(graph, from, to)",
          "summary": "Add a wire between two ports."
        },
        {
          "name": "removeWire",
          "kind": "function",
          "signature": "removeWire(graph, from, to)",
          "summary": "Remove a wire."
        },
        {
          "name": "duplicateNode",
          "kind": "function",
          "signature": "duplicateNode(graph, nodeId)",
          "summary": "Duplicate a node (offset position by 20,20)."
        },
        {
          "name": "disconnectNode",
          "kind": "function",
          "signature": "disconnectNode(graph, nodeId)",
          "summary": "Disconnect all wires from a node."
        },
        {
          "name": "fitToView",
          "kind": "function",
          "signature": "fitToView(graph)",
          "summary": "Fit view to show all nodes."
        },
        {
          "name": "setNodeTypes",
          "kind": "function",
          "signature": "setNodeTypes(graph, types)",
          "summary": "Register available node types."
        },
        {
          "name": "selectNode",
          "kind": "function",
          "signature": "selectNode(graph, nodeId)",
          "summary": "Select a node."
        },
        {
          "name": "exportPatch",
          "kind": "function",
          "signature": "exportPatch(graph)",
          "summary": ""
        },
        {
          "name": "importPatch",
          "kind": "function",
          "signature": "importPatch(graph, patch)",
          "summary": "Import patch JSON into graph."
        },
        {
          "name": "renderGraph",
          "kind": "function",
          "signature": "renderGraph(graph)",
          "summary": "Render the entire graph."
        },
        {
          "name": "startGraphAnimation",
          "kind": "function",
          "signature": "startGraphAnimation(graph)",
          "summary": "Start the animation loop for live waveform + wire animation."
        },
        {
          "name": "stopGraphAnimation",
          "kind": "function",
          "signature": "stopGraphAnimation(graph)",
          "summary": "Stop animation loop."
        },
        {
          "name": "setNodeAnalysers",
          "kind": "function",
          "signature": "setNodeAnalysers(graph, analysers)",
          "summary": "Set per-node analyser taps for live waveform display."
        },
        {
          "name": "setMinimapContainer",
          "kind": "function",
          "signature": "setMinimapContainer(graph, container)",
          "summary": "Set an external container for the minimap (rendered separately from the main canvas)."
        },
        {
          "name": "destroyAudioNodeGraph",
          "kind": "function",
          "signature": "destroyAudioNodeGraph(graph)",
          "summary": "Destroy the graph editor."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioNodeInspector",
      "path": "editor/reference/components/AudioNodeInspector.md",
      "source": "editor/js/components/AudioNodeInspector.js",
      "import": "/editor/js/components/AudioNodeInspector.js",
      "sourceHash": "4ffd492d0752e04b5141017fd58ce7cc6274fbd9d4f1acb61786bd3ecb41c1b9",
      "summary": "AudioNodeInspector.js - Right Panel for Selected Node Parameters Shows parameter knobs/sliders for the selected node. Uses SoundSchema when available for rich typed controls. Falls back to PARAM_HINTS for legacy/unschemaed node types.",
      "exports": [
        {
          "name": "createAudioNodeInspector",
          "kind": "function",
          "signature": "createAudioNodeInspector(container, onParamChanged)",
          "summary": "Create the node inspector panel."
        },
        {
          "name": "updateInspector",
          "kind": "function",
          "signature": "updateInspector(inspector, node)",
          "summary": "Update the inspector to show a node's parameters."
        },
        {
          "name": "destroyAudioNodeInspector",
          "kind": "function",
          "signature": "destroyAudioNodeInspector(inspector)",
          "summary": "Destroy the inspector."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioNodePalette",
      "path": "editor/reference/components/AudioNodePalette.md",
      "source": "editor/js/components/AudioNodePalette.js",
      "import": "/editor/js/components/AudioNodePalette.js",
      "sourceHash": "b4a519c1844fdc8843065d88def5692b13d3c903eee18f661f9749c6af9a7936",
      "summary": "AudioNodePalette.js - Side Panel with Node Types Lists all available node types grouped by category. Supports drag-to-create from palette onto the graph canvas.",
      "exports": [
        {
          "name": "createAudioNodePalette",
          "kind": "function",
          "signature": "createAudioNodePalette(container, onNodeDragStart)",
          "summary": "Create the node palette panel."
        },
        {
          "name": "destroyAudioNodePalette",
          "kind": "function",
          "signature": "destroyAudioNodePalette(palette)",
          "summary": "Destroy the palette."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioPatchEditor",
      "path": "editor/reference/components/AudioPatchEditor.md",
      "source": "editor/js/components/AudioPatchEditor.js",
      "import": "/editor/js/components/AudioPatchEditor.js",
      "sourceHash": "c44eea13f91ac176dc44ae0ae5828b867a2d11705ba76b91c601d531cbf02499",
      "summary": "AudioPatchEditor.js - Live Material Patch Editor for Sound Studio Reads real substance audio definitions from the SubstanceRegistry and lets you tweak them on the spot. Changes feed into the ProceduralPatches runtime override system. Edits persist with scene. Layout: Material list (compact cards) + Dedicated param panel below.",
      "exports": [
        {
          "name": "createAudioPatchEditor",
          "kind": "function",
          "signature": "createAudioPatchEditor(container, callbacks = {})",
          "summary": ""
        },
        {
          "name": "setPatchEditorAudioContext",
          "kind": "function",
          "signature": "setPatchEditorAudioContext(editor, ctx)",
          "summary": ""
        },
        {
          "name": "setPatchEditorApp",
          "kind": "function",
          "signature": "setPatchEditorApp(patchEditor, editorApp)",
          "summary": ""
        },
        {
          "name": "destroyAudioPatchEditor",
          "kind": "function",
          "signature": "destroyAudioPatchEditor(editor)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioPresetBrowser",
      "path": "editor/reference/components/AudioPresetBrowser.md",
      "source": "editor/js/components/AudioPresetBrowser.js",
      "import": "/editor/js/components/AudioPresetBrowser.js",
      "sourceHash": "671b835d508541f9081ba61628e4970d90930454ec0a22e1cd0183db4d6f3fd1",
      "summary": "AudioPresetBrowser.js - Load/Save/Browse Patch Presets Browse built-in presets per substance, load/save patches as JSON.",
      "exports": [
        {
          "name": "getPresetPatch",
          "kind": "function",
          "signature": "getPresetPatch(name)",
          "summary": "Get a preset patch by name."
        },
        {
          "name": "createAudioPresetBrowser",
          "kind": "function",
          "signature": "createAudioPresetBrowser(container, callbacks = {})",
          "summary": "Create the preset browser panel."
        },
        {
          "name": "destroyAudioPresetBrowser",
          "kind": "function",
          "signature": "destroyAudioPresetBrowser(browser)",
          "summary": "Destroy the preset browser."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioPreviewControls",
      "path": "editor/reference/components/AudioPreviewControls.md",
      "source": "editor/js/components/AudioPreviewControls.js",
      "import": "/editor/js/components/AudioPreviewControls.js",
      "sourceHash": "beb0cc41520bc84678d17375eca4c1661b0a69be6d03fd428ec29b75cb76273f",
      "summary": "AudioPreviewControls.js - Professional Transport Bar Play/Pause/Stop with icons, elapsed time display, wave shape selector, volume control with arc knob, and waveform quick-switch.",
      "exports": [
        {
          "name": "createAudioPreviewControls",
          "kind": "function",
          "signature": "createAudioPreviewControls(container, callbacks = {})",
          "summary": "Create the transport controls bar."
        },
        {
          "name": "setPreviewPlaying",
          "kind": "function",
          "signature": "setPreviewPlaying(controls, playing)",
          "summary": "Set playing state externally."
        },
        {
          "name": "destroyAudioPreviewControls",
          "kind": "function",
          "signature": "destroyAudioPreviewControls(controls)",
          "summary": "Destroy preview controls."
        },
        {
          "name": "connectAnalyser",
          "kind": "function",
          "signature": "connectAnalyser()",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/AudioSignalAnalyzer",
      "path": "editor/reference/components/AudioSignalAnalyzer.md",
      "source": "editor/js/components/AudioSignalAnalyzer.js",
      "import": "/editor/js/components/AudioSignalAnalyzer.js",
      "sourceHash": "449c3d3a53e86e85bef226b1f016e3b8a31b606514bea1d48dd52a9d377050bd",
      "summary": "AudioSignalAnalyzer.js - Professional Signal Analysis Panel Full-width bottom panel with switchable visualization modes: - Oscilloscope (time-domain waveform) - Spectrum Analyzer (FFT frequency bars, log scale) - Spectrogram (scrolling waterfall) Plus stereo VU/peak meter and freeze capability.",
      "exports": [
        {
          "name": "createSignalAnalyzer",
          "kind": "function",
          "signature": "createSignalAnalyzer(container)",
          "summary": "Create the signal analyzer panel."
        },
        {
          "name": "connectSignalAnalyzer",
          "kind": "function",
          "signature": "connectSignalAnalyzer(analyzer, analyserNode)",
          "summary": "Connect an AnalyserNode for visualization."
        },
        {
          "name": "disconnectSignalAnalyzer",
          "kind": "function",
          "signature": "disconnectSignalAnalyzer(analyzer)",
          "summary": "Disconnect and stop rendering."
        },
        {
          "name": "destroySignalAnalyzer",
          "kind": "function",
          "signature": "destroySignalAnalyzer(analyzer)",
          "summary": "Destroy the analyzer."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/CollabPanel",
      "path": "editor/reference/components/CollabPanel.md",
      "source": "editor/js/components/CollabPanel.js",
      "import": "/editor/js/components/CollabPanel.js",
      "sourceHash": "09963ebad00e9695a3af0be03441649c310a90d998ca19aa99557ced59be0413",
      "summary": "CollabPanel.js Collaboration sidebar panel for the editor.",
      "exports": [
        {
          "name": "CollabPanel",
          "kind": "class",
          "signature": "class CollabPanel",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/GraphPersistenceContracts",
      "path": "editor/reference/components/GraphPersistenceContracts.md",
      "source": "editor/js/components/GraphPersistenceContracts.js",
      "import": "/editor/js/components/GraphPersistenceContracts.js",
      "sourceHash": "dfe90d08a06bc37381a730f6071b4345ac8ac66bdfb315b7f35aea9b520a781f",
      "summary": "Normalize legacy audio patches and validate the full candidate before use.",
      "exports": [
        {
          "name": "UnsupportedGraphVersionError",
          "kind": "class",
          "signature": "class UnsupportedGraphVersionError extends Error",
          "summary": ""
        },
        {
          "name": "prepareAudioGraphDocument",
          "kind": "function",
          "signature": "prepareAudioGraphDocument(input)",
          "summary": "Normalize legacy audio patches and validate the full candidate before use."
        },
        {
          "name": "prepareMaterialGraphDocument",
          "kind": "function",
          "signature": "prepareMaterialGraphDocument(input, { allowedNodeTypes = null } = {})",
          "summary": "Normalize legacy material graphs and reject dangling connections/future schemas."
        },
        {
          "name": "GRAPH_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "GRAPH_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "AUDIO_GRAPH_SCHEMA",
          "kind": "constant",
          "signature": "AUDIO_GRAPH_SCHEMA",
          "summary": ""
        },
        {
          "name": "MATERIAL_GRAPH_SCHEMA",
          "kind": "constant",
          "signature": "MATERIAL_GRAPH_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/MaterialNodeGraph",
      "path": "editor/reference/components/MaterialNodeGraph.md",
      "source": "editor/js/components/MaterialNodeGraph.js",
      "import": "/editor/js/components/MaterialNodeGraph.js",
      "sourceHash": "932d345d001af2dbb7eeab81b266133893fcbb8e576db5620ffe71298a89284a",
      "summary": "MaterialNodeGraph.js - Canvas-based node graph editor for materials Features: pan/zoom, node drag, port connections, context menu to add nodes, node deletion, bezier connection rendering, port type coloring.",
      "exports": [
        {
          "name": "createNodeGraph",
          "kind": "function",
          "signature": "createNodeGraph(container, options = {})",
          "summary": ""
        },
        {
          "name": "evaluateGraphData",
          "kind": "function",
          "signature": "evaluateGraphData(graphData)",
          "summary": "Standalone evaluator for raw graph data (no canvas UI needed). Used by headless preview animation."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/MaterialNodePresets",
      "path": "editor/reference/components/MaterialNodePresets.md",
      "source": "editor/js/components/MaterialNodePresets.js",
      "import": "/editor/js/components/MaterialNodePresets.js",
      "sourceHash": "405e4ab4e6a46983ec88bad2d34b33a53c8ff5b80de54bce26794a8956a03c3c",
      "summary": "MaterialNodePresets.js - Pre-built node graph recipes for all built-in materials Each preset is a valid node graph using only standard MaterialNodeTypes nodes. These serve as demos showing users how to wire nodes to create materials. Graph structure: { nodes: [...], connections: [...], view: { panX, panY, zoom } } Node: { id, type, x, y, params } Connection: { fromNode, fromPort, toNode, toPort }",
      "exports": [
        {
          "name": "getPresetGraph",
          "kind": "function",
          "signature": "getPresetGraph(materialId)",
          "summary": "Get the preset node graph for a built-in material."
        },
        {
          "name": "hasPresetGraph",
          "kind": "function",
          "signature": "hasPresetGraph(materialId)",
          "summary": "Check if a material has a preset graph."
        },
        {
          "name": "listPresetIds",
          "kind": "function",
          "signature": "listPresetIds()",
          "summary": "List all material IDs that have preset graphs."
        },
        {
          "name": "listSubstancePresetIds",
          "kind": "function",
          "signature": "listSubstancePresetIds()",
          "summary": "Get all substance-linked preset IDs."
        },
        {
          "name": "listAnimatedPresetIds",
          "kind": "function",
          "signature": "listAnimatedPresetIds()",
          "summary": "Get all animated effect preset IDs (lava, water, hologram, etc.)."
        },
        {
          "name": "NODE_GRAPH_PRESETS",
          "kind": "constant",
          "signature": "NODE_GRAPH_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/MaterialNodeTypes",
      "path": "editor/reference/components/MaterialNodeTypes.md",
      "source": "editor/js/components/MaterialNodeTypes.js",
      "import": "/editor/js/components/MaterialNodeTypes.js",
      "sourceHash": "ffda7220fade1a0c479119514992dd67d162e4e502c968a4ec4ccf10c150693c",
      "summary": "MaterialNodeTypes.js - Node type definitions for the material graph editor Modeled after Substance Designer / Material Maker / Unreal Material Editor. Each node type defines inputs, outputs, defaults, and an evaluate function. Port types: 'float', 'vec2', 'vec3', 'vec4', 'color', 'texture'",
      "exports": [
        {
          "name": "defaultForType",
          "kind": "function",
          "signature": "defaultForType(type)",
          "summary": ""
        },
        {
          "name": "PORT_COLORS",
          "kind": "constant",
          "signature": "PORT_COLORS",
          "summary": ""
        },
        {
          "name": "NODE_CATEGORIES",
          "kind": "constant",
          "signature": "NODE_CATEGORIES",
          "summary": ""
        },
        {
          "name": "NODE_TYPES",
          "kind": "constant",
          "signature": "NODE_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/MaterialPanel",
      "path": "editor/reference/components/MaterialPanel.md",
      "source": "editor/js/components/MaterialPanel.js",
      "import": "/editor/js/components/MaterialPanel.js",
      "sourceHash": "93e49cf411fb1158505c830c65d3798296fa5a5d0c3da4f0133dc7e396767516",
      "summary": "MaterialPanel.js - Material Studio Panel Composes Library + PBR Inspector + 3D Preview into an overlay panel. Follows the Sound Studio (AudioEditorPanel.js) architecture.",
      "exports": [
        {
          "name": "createMaterialPanel",
          "kind": "function",
          "signature": "createMaterialPanel(container, options = {})",
          "summary": "Create the material panel contents inside the overlay body."
        },
        {
          "name": "destroyMaterialPanel",
          "kind": "function",
          "signature": "destroyMaterialPanel(panel)",
          "summary": "Destroy the material panel."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/MaterialPatchGraphs",
      "path": "editor/reference/components/MaterialPatchGraphs.md",
      "source": "editor/js/components/MaterialPatchGraphs.js",
      "import": "/editor/js/components/MaterialPatchGraphs.js",
      "sourceHash": "a2e25f86d21e074d5b362db7899a1e86fd457cda9e11153a006451f9044b0078",
      "summary": "MaterialPatchGraphs.js - High-level node graph representations for ProceduralPatches.js These graphs provide design-facing topology for each material family. They intentionally summarize synthesis layers so editor UX stays readable even when runtime patches contain deeper stochastic/detail layers.",
      "exports": [
        {
          "name": "getMaterialGraph",
          "kind": "function",
          "signature": "getMaterialGraph(substanceId)",
          "summary": "Get the node graph for a substance. Returns a deep copy so edits don't mutate the template."
        },
        {
          "name": "MATERIAL_GRAPHS",
          "kind": "constant",
          "signature": "MATERIAL_GRAPHS",
          "summary": "Maps substance IDs to editor-facing graph representations. Graphs are intentionally compact abstractions of runtime synthesis."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/MaterialStrip",
      "path": "editor/reference/components/MaterialStrip.md",
      "source": "editor/js/components/MaterialStrip.js",
      "import": "/editor/js/components/MaterialStrip.js",
      "sourceHash": "1fba3ca727861ab9302f38016464c371ad0d5a3fec91c6cf81662ae553608ac4",
      "summary": "MaterialStrip.js - Compact material browser for bottom panel Horizontal scrollable strip of material thumbnails with preview sidebar. Designed to sit in the bottom panel alongside Console.",
      "exports": [
        {
          "name": "createMaterialStrip",
          "kind": "function",
          "signature": "createMaterialStrip(container, options = {})",
          "summary": ""
        },
        {
          "name": "destroyMaterialStrip",
          "kind": "function",
          "signature": "destroyMaterialStrip(state)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/ParticleEffectControls",
      "path": "editor/reference/components/ParticleEffectControls.md",
      "source": "editor/js/components/ParticleEffectControls.js",
      "import": "/editor/js/components/ParticleEffectControls.js",
      "sourceHash": "d61958379d6ce826791ccbb797e37abc969474e17c238f0e42260ddb48902daa",
      "summary": "ParticleEffectControls.js - Editor UI Controls for Custom Particle Effects Adds controls to the particle emitter inspector panel: - Checkbox to enable custom effects - Effect selector dropdown - Edit button to open shader editor - Parameter sliders for effect params",
      "exports": [
        {
          "name": "ParticleEffectControls",
          "kind": "class",
          "signature": "class ParticleEffectControls",
          "summary": ""
        },
        {
          "name": "createParticleEffectControls",
          "kind": "function",
          "signature": "createParticleEffectControls(options = {})",
          "summary": "Create particle effect controls"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "components/ShaderCodeEditor",
      "path": "editor/reference/components/ShaderCodeEditor.md",
      "source": "editor/js/components/ShaderCodeEditor.js",
      "import": "/editor/js/components/ShaderCodeEditor.js",
      "sourceHash": "8980f7408ced3e545163c0d35a4cc8fa6321b5274d5cb7e6df4d69b362e1a505",
      "summary": "ShaderCodeEditor.js - In-Editor WGSL Code Editor Popup A notepad-style popup for editing custom particle effect shaders. Features: - Syntax highlighting for WGSL - Real-time validation - Live preview - Template snippets - Error display with line numbers",
      "exports": [
        {
          "name": "ShaderCodeEditor",
          "kind": "class",
          "signature": "class ShaderCodeEditor",
          "summary": ""
        },
        {
          "name": "openShaderCodeEditor",
          "kind": "function",
          "signature": "openShaderCodeEditor(effect, options = {})",
          "summary": "Create and open a shader code editor"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "loader-guard",
      "path": "editor/reference/loader-guard.md",
      "source": "editor/js/loader-guard.js",
      "import": "/editor/js/loader-guard.js",
      "sourceHash": "8eabd08df80c70f13ef747bd81298c062fa46bca6f82479449db92ac63a2fce8",
      "summary": "Keep the loading veil's context-menu suppression CSP-safe and scoped to the short interval in which the veil can actually receive pointer input.",
      "exports": [],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "main",
      "path": "editor/reference/main.md",
      "source": "editor/js/main.js",
      "import": "/editor/js/main.js",
      "sourceHash": "9424b5ca76dc78cc0d7368a15cc95591c98ada8218d8dd750bc15eb446826b51",
      "summary": "Main entry point for Game Editor",
      "exports": [],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/ColliderGenerators",
      "path": "editor/reference/modules/ColliderGenerators.md",
      "source": "editor/js/modules/ColliderGenerators.js",
      "import": "/editor/js/modules/ColliderGenerators.js",
      "sourceHash": "983951e3576607473bc3f1f0e5062e9012c7d3326e685888ece3077e14576950",
      "summary": "ColliderGenerators.js - Procedural collider generation utilities Extracted from EditorPhysics.js for modularity Includes: - SDF-based collider generation with anti-aliasing - Line/curve to voxel colliders - Network-based colliders (trees, tunnels, pipes) - Noise-based procedural colliders - Spatial hash for collider queries",
      "exports": [
        {
          "name": "generateCollidersFromSDF",
          "kind": "function",
          "signature": "generateCollidersFromSDF(sdfFunc, bounds, resolution = 10, options = {})",
          "summary": "Generate colliders from ANY SDF function with anti-aliasing"
        },
        {
          "name": "generateConvexMeshFromSDF",
          "kind": "function",
          "signature": "generateConvexMeshFromSDF(sdfFunc, bounds, resolution = 16)",
          "summary": "Generate a CONVEX MESH collider from SDF"
        },
        {
          "name": "colliderVertexHash",
          "kind": "function",
          "signature": "colliderVertexHash(vertices)",
          "summary": ""
        },
        {
          "name": "generateHollowTorusColliders",
          "kind": "function",
          "signature": "generateHollowTorusColliders(majorRadius, minorRadius, wallThickness, resolution = 12)",
          "summary": "Generate hollow torus colliders"
        },
        {
          "name": "generateHollowConeColliders",
          "kind": "function",
          "signature": "generateHollowConeColliders(angle, height, wallThickness, resolution = 12)",
          "summary": "Generate hollow cone/funnel colliders"
        },
        {
          "name": "generateLineColliders",
          "kind": "function",
          "signature": "generateLineColliders(start, end, radius, resolution = 10)",
          "summary": "Generate voxel colliders along a line segment"
        },
        {
          "name": "generateCurveColliders",
          "kind": "function",
          "signature": "generateCurveColliders(points, radius, resolution = 10, segments = 20)",
          "summary": "Generate voxel colliders along a curve"
        },
        {
          "name": "generateCollidersFromNetwork",
          "kind": "function",
          "signature": "generateCollidersFromNetwork(network, resolution = 8)",
          "summary": "Generate colliders from a LineNetwork"
        },
        {
          "name": "generateTreeColliders",
          "kind": "function",
          "signature": "generateTreeColliders(options = {})",
          "summary": "Generate tree-shaped colliders"
        },
        {
          "name": "generateRootColliders",
          "kind": "function",
          "signature": "generateRootColliders(options = {})",
          "summary": "Generate root system colliders"
        },
        {
          "name": "generateTunnelColliders",
          "kind": "function",
          "signature": "generateTunnelColliders(options = {})",
          "summary": "Generate tunnel/cave colliders"
        },
        {
          "name": "generatePipeNetworkColliders",
          "kind": "function",
          "signature": "generatePipeNetworkColliders(nodes, connections, resolution = 8)",
          "summary": "Generate custom pipe/beam network colliders"
        },
        {
          "name": "generateBezierColliders",
          "kind": "function",
          "signature": "generateBezierColliders(p0, p1, p2, p3, radius, resolution = 10)",
          "summary": "Generate colliders along a cubic Bezier curve"
        },
        {
          "name": "generateSplineColliders",
          "kind": "function",
          "signature": "generateSplineColliders(controlPoints, radius, resolution = 10)",
          "summary": "Generate colliders along a Bezier spline"
        },
        {
          "name": "testSphereSphere",
          "kind": "function",
          "signature": "testSphereSphere(c1, r1, c2, r2)",
          "summary": ""
        },
        {
          "name": "testAABBAABB",
          "kind": "function",
          "signature": "testAABBAABB(min1, max1, min2, max2)",
          "summary": ""
        },
        {
          "name": "testSphereAABB",
          "kind": "function",
          "signature": "testSphereAABB(center, radius, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "computeColliderAABB",
          "kind": "function",
          "signature": "computeColliderAABB(colliders)",
          "summary": ""
        },
        {
          "name": "generateNoisyColliders",
          "kind": "function",
          "signature": "generateNoisyColliders(baseSdf, bounds, options = {})",
          "summary": "Generate rocky/organic colliders using noise-displaced SDF"
        },
        {
          "name": "generateRockySphereColliders",
          "kind": "function",
          "signature": "generateRockySphereColliders(center, radius, roughness = 0.15, resolution = 12)",
          "summary": "Generate rocky sphere collider"
        },
        {
          "name": "generateTerrainColliders",
          "kind": "function",
          "signature": "generateTerrainColliders(sizeX, sizeZ, height, resolution = 8, seed = 0)",
          "summary": "Generate terrain chunk collider"
        },
        {
          "name": "generateCaveColliders",
          "kind": "function",
          "signature": "generateCaveColliders(bounds, tunnelRadius = 1.5, resolution = 6, seed = 0)",
          "summary": "Generate cave/hollow rock colliders"
        },
        {
          "name": "initColliderSpatialHash",
          "kind": "function",
          "signature": "initColliderSpatialHash(cellSize = 2.0)",
          "summary": ""
        },
        {
          "name": "addToSpatialHash",
          "kind": "function",
          "signature": "addToSpatialHash(id, colliders, worldPosition = [0, 0, 0])",
          "summary": ""
        },
        {
          "name": "queryNearbyColliders",
          "kind": "function",
          "signature": "queryNearbyColliders(point, radius)",
          "summary": ""
        },
        {
          "name": "clearColliderSpatialHash",
          "kind": "function",
          "signature": "clearColliderSpatialHash()",
          "summary": ""
        },
        {
          "name": "computeBounce",
          "kind": "function",
          "signature": "computeBounce(velocity, normal, restitution = 0.5)",
          "summary": ""
        },
        {
          "name": "applyFriction",
          "kind": "function",
          "signature": "applyFriction(velocity, normal, friction, dt)",
          "summary": ""
        },
        {
          "name": "predictLanding",
          "kind": "function",
          "signature": "predictLanding(start, velocity, gravity = 9.81)",
          "summary": ""
        },
        {
          "name": "generateScatteredColliders",
          "kind": "function",
          "signature": "generateScatteredColliders(options = {})",
          "summary": ""
        },
        {
          "name": "generateRockFieldColliders",
          "kind": "function",
          "signature": "generateRockFieldColliders(options = {})",
          "summary": ""
        },
        {
          "name": "LineNetwork",
          "kind": "re-export",
          "signature": "LineNetwork",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/CollisionDebugOverlay",
      "path": "editor/reference/modules/CollisionDebugOverlay.md",
      "source": "editor/js/modules/CollisionDebugOverlay.js",
      "import": "/editor/js/modules/CollisionDebugOverlay.js",
      "sourceHash": "d7029eedb6dbb3557a6f1d36fbc89f104c81321e3a8c3c24555d263f848d33a2",
      "summary": "CollisionDebugOverlay.js - Visual debug overlay for collision layers and modes Displays collision layer, mask, and mode information for selected entities and optionally renders debug visualizations for collision relationships.",
      "exports": [
        {
          "name": "createCollisionDebugPanel",
          "kind": "function",
          "signature": "createCollisionDebugPanel(editor)",
          "summary": "Create collision debug overlay panel"
        },
        {
          "name": "toggleCollisionDebugOverlay",
          "kind": "function",
          "signature": "toggleCollisionDebugOverlay(editor)",
          "summary": "Toggle collision debug overlay"
        },
        {
          "name": "dumpCollisionInfo",
          "kind": "function",
          "signature": "dumpCollisionInfo(editor)",
          "summary": "Get collision debug info for all entities (for console debugging)"
        },
        {
          "name": "checkCollisionConflicts",
          "kind": "function",
          "signature": "checkCollisionConflicts(editor)",
          "summary": "Check for collision layer conflicts (entities that should collide but don't)"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorAI",
      "path": "editor/reference/modules/EditorAI.md",
      "source": "editor/js/modules/EditorAI.js",
      "import": "/editor/js/modules/EditorAI.js",
      "sourceHash": "4fad73e406a5e7125b4848bee6a9eb0d4d15e2566618dabd83dd90e94e13f0df",
      "summary": "EditorAI.js - AI, Navigation, Steering, and Behavior Trees for Editor Extracted from EditorPhysics.js for modularity",
      "exports": [
        {
          "name": "getOrCreateNavGrid",
          "kind": "function",
          "signature": "getOrCreateNavGrid(options = {})",
          "summary": "Initialize or get the editor's navigation grid"
        },
        {
          "name": "findPath",
          "kind": "function",
          "signature": "findPath(start, goal, options = {})",
          "summary": "Find a path between two world positions"
        },
        {
          "name": "updateNavGridFromColliders",
          "kind": "function",
          "signature": "updateNavGridFromColliders(colliders, walkable = false)",
          "summary": "Mark cells as blocked/walkable based on colliders"
        },
        {
          "name": "smoothPath",
          "kind": "function",
          "signature": "smoothPath(waypoints, smoothing = 0.5)",
          "summary": "Smooth a path using string-pulling"
        },
        {
          "name": "getPathSteering",
          "kind": "function",
          "signature": "getPathSteering(currentPos, waypoints, lookahead = 1.0)",
          "summary": "Get steering direction to follow a path"
        },
        {
          "name": "getNavGridVisualization",
          "kind": "function",
          "signature": "getNavGridVisualization()",
          "summary": "Debug: visualize nav grid walkability"
        },
        {
          "name": "createAIAgent",
          "kind": "function",
          "signature": "createAIAgent(options = {})",
          "summary": "Create an AI agent with steering behaviors"
        },
        {
          "name": "updateAIAgent",
          "kind": "function",
          "signature": "updateAIAgent(agent, behaviors, dt)",
          "summary": "Update AI agent with combined steering behaviors"
        },
        {
          "name": "createFlock",
          "kind": "function",
          "signature": "createFlock(count, options = {})",
          "summary": "Create a flock of AI agents"
        },
        {
          "name": "updateFlock",
          "kind": "function",
          "signature": "updateFlock(agents, dt, options = {})",
          "summary": "Update entire flock with flocking behavior"
        },
        {
          "name": "createPatrolBehavior",
          "kind": "function",
          "signature": "createPatrolBehavior(waypoints)",
          "summary": "Create a simple patrol behavior tree"
        },
        {
          "name": "createChaseFleeBehavior",
          "kind": "function",
          "signature": "createChaseFleeBehavior(chaseRadius = 10, fleeHealth = 20)",
          "summary": "Create a chase/flee behavior tree"
        },
        {
          "name": "tickBehaviorTree",
          "kind": "function",
          "signature": "tickBehaviorTree(tree, blackboard, dt)",
          "summary": "Run a behavior tree tick"
        },
        {
          "name": "createAIPerception",
          "kind": "function",
          "signature": "createAIPerception(options = {})",
          "summary": "Create an AI perception component"
        },
        {
          "name": "canSee",
          "kind": "function",
          "signature": "canSee(perception, position, forward, targetPos)",
          "summary": "Check if an entity can see a target"
        },
        {
          "name": "canHear",
          "kind": "function",
          "signature": "canHear(perception, position, soundPos, soundVolume = 1)",
          "summary": "Check if an entity can hear a sound"
        },
        {
          "name": "updateAIPerception",
          "kind": "function",
          "signature": "updateAIPerception(perception, position, forward, entities, dt)",
          "summary": "Update perception - detect nearby entities"
        },
        {
          "name": "getLastKnownPosition",
          "kind": "function",
          "signature": "getLastKnownPosition(perception, entityId)",
          "summary": "Get last known position of an entity"
        },
        {
          "name": "NODE_STATUS",
          "kind": "re-export",
          "signature": "NODE_STATUS",
          "summary": ""
        },
        {
          "name": "arrive",
          "kind": "re-export",
          "signature": "arrive",
          "summary": ""
        },
        {
          "name": "createAction",
          "kind": "re-export",
          "signature": "createAction",
          "summary": ""
        },
        {
          "name": "createCondition",
          "kind": "re-export",
          "signature": "createCondition",
          "summary": ""
        },
        {
          "name": "createNavGrid",
          "kind": "re-export",
          "signature": "createNavGrid",
          "summary": ""
        },
        {
          "name": "createSelector",
          "kind": "re-export",
          "signature": "createSelector",
          "summary": ""
        },
        {
          "name": "createSequence",
          "kind": "re-export",
          "signature": "createSequence",
          "summary": ""
        },
        {
          "name": "createSteeringAgent",
          "kind": "re-export",
          "signature": "createSteeringAgent",
          "summary": ""
        },
        {
          "name": "evade",
          "kind": "re-export",
          "signature": "evade",
          "summary": ""
        },
        {
          "name": "findPathInNavWorld",
          "kind": "re-export",
          "signature": "findPathInNavWorld",
          "summary": ""
        },
        {
          "name": "findPathOnGrid",
          "kind": "re-export",
          "signature": "findPathOnGrid",
          "summary": ""
        },
        {
          "name": "flee",
          "kind": "re-export",
          "signature": "flee",
          "summary": ""
        },
        {
          "name": "flock",
          "kind": "re-export",
          "signature": "flock",
          "summary": ""
        },
        {
          "name": "gridToWorld",
          "kind": "re-export",
          "signature": "gridToWorld",
          "summary": ""
        },
        {
          "name": "pursue",
          "kind": "re-export",
          "signature": "pursue",
          "summary": ""
        },
        {
          "name": "seek",
          "kind": "re-export",
          "signature": "seek",
          "summary": ""
        },
        {
          "name": "tickNode",
          "kind": "re-export",
          "signature": "tickNode",
          "summary": ""
        },
        {
          "name": "wander",
          "kind": "re-export",
          "signature": "wander",
          "summary": ""
        },
        {
          "name": "worldToGrid",
          "kind": "re-export",
          "signature": "worldToGrid",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorAudio",
      "path": "editor/reference/modules/EditorAudio.md",
      "source": "editor/js/modules/EditorAudio.js",
      "import": "/editor/js/modules/EditorAudio.js",
      "sourceHash": "9b83387e6c1b77bbf2e7ad681bb340ef23c4e893fcc4b6b3c7549d4740fb3f21",
      "summary": "EditorAudio.js - Simulation Audio Bridge for the Editor Manages the runtime AudioEngine lifecycle during play mode: - Initializes AudioEngine on first play - Ticks audio each frame while playing - Stops all sim audio on stop/pause - Bridges substance emitters → procedural audio",
      "exports": [
        {
          "name": "startSimAudio",
          "kind": "function",
          "signature": "async startSimAudio(editor)",
          "summary": "Called when user enters play mode. Initializes engine if needed and starts audio."
        },
        {
          "name": "stopSimAudio",
          "kind": "function",
          "signature": "stopSimAudio()",
          "summary": "Called when user exits play mode (Stop). Stops all active sources with a short fade."
        },
        {
          "name": "pauseSimAudio",
          "kind": "function",
          "signature": "pauseSimAudio()",
          "summary": "Called when user pauses. Suspends the AudioContext (freezes all audio in place)."
        },
        {
          "name": "resumeSimAudio",
          "kind": "function",
          "signature": "async resumeSimAudio()",
          "summary": "Called when user resumes from pause."
        },
        {
          "name": "tickSimAudio",
          "kind": "function",
          "signature": "tickSimAudio(dt)",
          "summary": "Tick the audio engine. Call once per frame while playing."
        },
        {
          "name": "destroySimAudio",
          "kind": "function",
          "signature": "destroySimAudio()",
          "summary": "Full cleanup. Call on editor close."
        },
        {
          "name": "getSimAudioEngine",
          "kind": "function",
          "signature": "getSimAudioEngine()",
          "summary": "Get the current engine instance (for external integration)."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorAudioFX",
      "path": "editor/reference/modules/EditorAudioFX.md",
      "source": "editor/js/modules/EditorAudioFX.js",
      "import": "/editor/js/modules/EditorAudioFX.js",
      "sourceHash": "27933ed0a89b878a1b03628f353cf7b636e4b6dc78f566456cead83085998f23",
      "summary": "EditorAudioFX.js - Procedural Editor Sound Effects All sounds are synthesized with Web Audio API oscillators & noise — no sample files. Provides: loading ambient pad, play/stop/pause chimes, UI clicks, error beeps. Usage: import { editorAudioFX } from './EditorAudioFX.js'; editorAudioFX.init();               // call once after first user gesture editorAudioFX.playChime();           // play-mode enter editorAudioFX.stopChime();           // play-mode exit editorAudioFX.pauseClick();          // pause toggle editorAudioFX.uiClick();             // generic button click editorAudioFX.uiHover();             // hover over interactive element editorAudioFX.errorBeep();           // error / invalid action editorAudioFX.startLoadingAmbient(); // loading screen ambient pad editorAudioFX.stopLoadingAmbient();  // fade out loading pad",
      "exports": [
        {
          "name": "editorAudioFX",
          "kind": "constant",
          "signature": "editorAudioFX",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorCollab",
      "path": "editor/reference/modules/EditorCollab.md",
      "source": "editor/js/modules/EditorCollab.js",
      "import": "/editor/js/modules/EditorCollab.js",
      "sourceHash": "febf26bea6606fe4b8401149e6a7f273502d3da3fcb6f406059c25f7c3c499c0",
      "summary": "EditorCollab.js Editor-side integration for the collab system. Mounts onto EditorApp and wires all hooks. Hooks wired: - EditorHistory.pushAction  → broadcast op to peers - ProjectStorage.saveProject → broadcast snapshot - PrefabLibrary.save/delete  → broadcast prefab ops - Viewport render loop       → presence tick at 10 Hz - EditorApp.enterPlayMode    → broadcast play_sync - EditorApp.togglePause      → broadcast pause_sync - EditorApp.exitPlayMode     → broadcast stop_sync",
      "exports": [
        {
          "name": "initEditorCollab",
          "kind": "function",
          "signature": "initEditorCollab(editor)",
          "summary": "Initialize the collab system and attach it to the editor. Called from EditorApp.initialize() at the end."
        },
        {
          "name": "destroyEditorCollab",
          "kind": "function",
          "signature": "destroyEditorCollab(editor)",
          "summary": "Destroy the collab system and remove all hooks."
        },
        {
          "name": "getCollabState",
          "kind": "function",
          "signature": "getCollabState(editor)",
          "summary": "Get the current collab state from the editor."
        },
        {
          "name": "isCollabActive",
          "kind": "function",
          "signature": "isCollabActive(editor)",
          "summary": ""
        },
        {
          "name": "isCollabConnected",
          "kind": "function",
          "signature": "isCollabConnected(editor)",
          "summary": ""
        },
        {
          "name": "getCollabPeers",
          "kind": "function",
          "signature": "getCollabPeers(editor)",
          "summary": ""
        },
        {
          "name": "getCollabPresenceList",
          "kind": "function",
          "signature": "getCollabPresenceList(editor)",
          "summary": ""
        },
        {
          "name": "getCollabInterpCamera",
          "kind": "function",
          "signature": "getCollabInterpCamera(editor, peerId)",
          "summary": "Get Hermite-interpolated camera for a remote peer (smooth, per-frame). Returns { pos: [x,y,z], target: [x,y,z] } or null."
        },
        {
          "name": "getCollabStats",
          "kind": "function",
          "signature": "getCollabStats(editor)",
          "summary": "Get collab camera interpolation + connection stats for UI display."
        },
        {
          "name": "getCollabRouterStats",
          "kind": "function",
          "signature": "getCollabRouterStats(editor)",
          "summary": "Get message router stats for bandwidth monitoring. Returns { sent, dropped, coalesced, bytesSent, backpressureFrames, rateMultiplier }"
        },
        {
          "name": "getCollabInterpDelay",
          "kind": "function",
          "signature": "getCollabInterpDelay(editor)",
          "summary": "Get the current adaptive interpolation delay (ms). On LAN: ~20ms. On jittery connections: up to 150ms. Auto-adjusts each frame."
        },
        {
          "name": "collabPresenceTick",
          "kind": "function",
          "signature": "collabPresenceTick(editor)",
          "summary": "Called from Viewport render loop to send presence at 10 Hz."
        },
        {
          "name": "exportCollabTimeline",
          "kind": "function",
          "signature": "exportCollabTimeline(editor)",
          "summary": "Export local timeline as JSON download."
        },
        {
          "name": "collabTrackGrab",
          "kind": "function",
          "signature": "collabTrackGrab(editor, entityId)",
          "summary": "Notify collab that local user started grabbing an entity (play mode). Claims per-entity ownership at GRABBED priority so our transforms are authoritative."
        },
        {
          "name": "collabUntrackGrab",
          "kind": "function",
          "signature": "collabUntrackGrab(editor, entityId)",
          "summary": "Notify collab that local user released a grabbed entity. Releases per-entity ownership so default authority resumes."
        },
        {
          "name": "collabClaimSelected",
          "kind": "function",
          "signature": "collabClaimSelected(editor, entityId)",
          "summary": "Claim ownership of an entity at SELECTED priority (inspector editing)."
        },
        {
          "name": "collabReleaseEntity",
          "kind": "function",
          "signature": "collabReleaseEntity(editor, entityId)",
          "summary": "Release ownership of an entity (selected or grabbed)."
        },
        {
          "name": "getCollabEntityOwner",
          "kind": "function",
          "signature": "getCollabEntityOwner(editor, entityId)",
          "summary": "Get the current owner of an entity. Returns { ownerId, priority } or null."
        },
        {
          "name": "isCollabEntityLocallyOwned",
          "kind": "function",
          "signature": "isCollabEntityLocallyOwned(editor, entityId)",
          "summary": "Check if the local peer owns an entity."
        },
        {
          "name": "getCollabGrabGlows",
          "kind": "function",
          "signature": "getCollabGrabGlows(editor)",
          "summary": "Get map of entityId → color hex for entities being grabbed by remote peers. Used by Viewport to render grab glow."
        },
        {
          "name": "isCollabPlayAuthority",
          "kind": "function",
          "signature": "isCollabPlayAuthority(editor)",
          "summary": "Returns true if this peer is the physics authority during play mode. Non-authority peers should skip local physics stepping and instead receive transforms from the authority."
        },
        {
          "name": "collabInterpolateFrame",
          "kind": "function",
          "signature": "collabInterpolateFrame(editor)",
          "summary": "Interpolate buffered remote transforms. Call every render frame on non-authority peers. Smoothly tweens entity positions between received keyframes with a 100ms render delay."
        },
        {
          "name": "hostRoom",
          "kind": "function",
          "signature": "hostRoom(editor, roomId, wordKey, numberKey)",
          "summary": "Host a room. Auto-generates word key and number key if not provided. Starts signaling so peers can discover this host."
        },
        {
          "name": "setCollabRoom",
          "kind": "function",
          "signature": "setCollabRoom(editor, roomId, wordKey, numberKey, hostId, hostFingerprint)",
          "summary": "Join a room with dual-key authentication (all 3 must match the host). Legacy alias: setCollabRoomId calls this."
        },
        {
          "name": "setCollabRoomId",
          "kind": "function",
          "signature": "setCollabRoomId(editor, roomId)",
          "summary": ""
        },
        {
          "name": "setAnonMode",
          "kind": "function",
          "signature": "setAnonMode(editor, enabled)",
          "summary": "Toggle anonymous mode. Must be called BEFORE hostRoom/joinRoom. When enabled: - Peers get random anonymous IDs (different each session) - Real peer IDs are stripped from all ops - TURN-only relay hides IP addresses - Garlic encryption prevents relay from reading message content"
        },
        {
          "name": "leaveRoom",
          "kind": "function",
          "signature": "leaveRoom(editor)",
          "summary": "Leave the current room. Stops signaling and clears peer state. Does NOT destroy the collab system — user can Host/Join again."
        },
        {
          "name": "generateWordKey",
          "kind": "function",
          "signature": "generateWordKey()",
          "summary": "Generate a random word key (two words joined by a dash). 120 words × 120 words = 14,400 combinations per word pair."
        },
        {
          "name": "generateNumberKey",
          "kind": "function",
          "signature": "generateNumberKey()",
          "summary": "Generate a random 6-digit number key. 900,000 combinations (100000-999999). Total key space with words: 120×120×900000 ≈ 12.96 billion combinations."
        },
        {
          "name": "encodeInviteCode",
          "kind": "function",
          "signature": "encodeInviteCode(roomId, wordKey, numberKey, hostId, hostFingerprint)",
          "summary": "Encode room credentials into a single invite code string. Format: PE-<base64url(roomId § wordKey § numberKey § hostId § hostFingerprint)> The hostFingerprint (16 hex chars) allows joiners to verify host identity."
        },
        {
          "name": "decodeInviteCode",
          "kind": "function",
          "signature": "decodeInviteCode(code)",
          "summary": "Decode an invite code back to { roomId, wordKey, numberKey, hostId, hostFingerprint }. Returns null if the code is invalid."
        },
        {
          "name": "setAutoMod",
          "kind": "function",
          "signature": "setAutoMod(editor, enabled)",
          "summary": "Toggle auto-moderation (auto-kick, mute, throttle from integrity violations). Only the host can enable/disable. Off by default."
        },
        {
          "name": "kickPeer",
          "kind": "function",
          "signature": "kickPeer(editor, peerId)",
          "summary": "Kick a peer from the room. Only the host (first connected) should call this. Broadcasts a __kick__ op, then the kicked peer clears its stored credentials."
        },
        {
          "name": "getSavedRoomCredentials",
          "kind": "function",
          "signature": "getSavedRoomCredentials()",
          "summary": "Get saved room credentials from localStorage."
        },
        {
          "name": "clearRoomCredentials",
          "kind": "function",
          "signature": "clearRoomCredentials()",
          "summary": "Clear saved room credentials (called on kick or manual disconnect)."
        },
        {
          "name": "injectCollabStorageDeps",
          "kind": "function",
          "signature": "injectCollabStorageDeps(deps)",
          "summary": ""
        },
        {
          "name": "injectCollabHistoryHelpers",
          "kind": "function",
          "signature": "injectCollabHistoryHelpers(helpers)",
          "summary": ""
        },
        {
          "name": "editorCollabCompositeSuffix",
          "kind": "function",
          "signature": "editorCollabCompositeSuffix(raw)",
          "summary": "Build a composite project ID from room + wordKey + numberKey. The composite is used as the BitTorrent info_hash seed, so only peers with all 3 matching values will discover each other on the swarm. IMPORTANT: NEVER returns a bare roomId. Even without keys, a random salt is included so two users with the same folder name can't collide. The hostId (selfId of host) is mixed in when hosting to guarantee that different hosts with identical room+word+number still get unique swarms. Uses FNV-1a 64-bit (emulated as two 32-bit hashes) for collision resistance."
        },
        {
          "name": "buildEditorCollabCompositeId",
          "kind": "function",
          "signature": "buildEditorCollabCompositeId(roomId, wordKey, numberKey, hostId)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorGuide",
      "path": "editor/reference/modules/EditorGuide.md",
      "source": "editor/js/modules/EditorGuide.js",
      "import": "/editor/js/modules/EditorGuide.js",
      "sourceHash": "bcebabc41b9d2d8a731853d105c324bcdc521fd150b3059788b2f35df5bd0aa2",
      "summary": "EditorGuide.js — Fullscreen interactive guide overlay Future-proof feature list: - ARIA accessibility (role=dialog, aria-modal, focus trap) - Keyboard nav (Arrow keys sidebar, Tab sections, ? global shortcut) - Search / filter across all section text - localStorage progress tracking with completion badges - First-launch auto-show - Guide versioning — \"what's new\" badge on updates - Deep linking via URL hash (#guide-camera) - Scroll progress bar - Reading time estimates per section - Interactive demo placeholder canvases (ready for engine runtime) - Print-friendly CSS (@media print)",
      "exports": [
        {
          "name": "show",
          "kind": "function",
          "signature": "show(sectionId)",
          "summary": ""
        },
        {
          "name": "hide",
          "kind": "function",
          "signature": "hide()",
          "summary": ""
        },
        {
          "name": "toggle",
          "kind": "function",
          "signature": "toggle()",
          "summary": ""
        },
        {
          "name": "isVisible",
          "kind": "function",
          "signature": "isVisible()",
          "summary": ""
        },
        {
          "name": "checkFirstLaunch",
          "kind": "function",
          "signature": "checkFirstLaunch()",
          "summary": ""
        },
        {
          "name": "checkHashLink",
          "kind": "function",
          "signature": "checkHashLink()",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorHistory",
      "path": "editor/reference/modules/EditorHistory.md",
      "source": "editor/js/modules/EditorHistory.js",
      "import": "/editor/js/modules/EditorHistory.js",
      "sourceHash": "9b1878b55f15a8c5eac6585bd068fc313cf524da470f0ff0afbee7599612bf5e",
      "summary": "EditorHistory - Undo/Redo System with Clipboard Support Action types: - transform: Entity position/rotation/scale change - create: Entity creation - delete: Entity deletion - delete_multi: Multiple entity deletion - property: Component property change - model_animation: Imported model clip/playback state change - model_morph_weights: Imported model morph ownership/weight change - rename: Entity rename - reparent: Entity moved to different folder - paste: Paste operation (multiple entities) - folder_create: Folder creation - folder_delete: Folder deletion - folder_rename: Folder rename - component_add: Component added to entity - component_remove: Component removed from entity - selection: Selection change (for group operations) Memory optimizations: - Transform actions use quantized floats (0.001 precision for position) - Batches rapid transform changes into single action Component capture: - All ECS components listed in TRACKED_COMPONENTS are captured - Add new component types to TRACKED_COMPONENTS as they're added to engine",
      "exports": [
        {
          "name": "setCollabBroadcastHook",
          "kind": "function",
          "signature": "setCollabBroadcastHook(fn)",
          "summary": ""
        },
        {
          "name": "setCollabReplayFlag",
          "kind": "function",
          "signature": "setCollabReplayFlag(v)",
          "summary": ""
        },
        {
          "name": "initHistory",
          "kind": "function",
          "signature": "initHistory(editor)",
          "summary": "Initialize history system with editor reference"
        },
        {
          "name": "selectAll",
          "kind": "function",
          "signature": "selectAll()",
          "summary": "Select all entities"
        },
        {
          "name": "pushAction",
          "kind": "function",
          "signature": "pushAction(action)",
          "summary": "Push an action to the undo stack"
        },
        {
          "name": "recordTransform",
          "kind": "function",
          "signature": "recordTransform(entityId, beforePos, beforeRot, beforeScale, afterPos, afterRot, afterScale)",
          "summary": "Record a transform change (with batching and compression)"
        },
        {
          "name": "flushPendingTransform",
          "kind": "function",
          "signature": "flushPendingTransform()",
          "summary": "Force commit any pending transform (call before other operations)"
        },
        {
          "name": "recordCreate",
          "kind": "function",
          "signature": "recordCreate(entityId, entityData)",
          "summary": "Record entity creation"
        },
        {
          "name": "recordDelete",
          "kind": "function",
          "signature": "recordDelete(entityId, entityData)",
          "summary": "Record entity deletion"
        },
        {
          "name": "recordProperty",
          "kind": "function",
          "signature": "recordProperty(entityId, componentName, propertyName, beforeValue, afterValue)",
          "summary": "Record property change"
        },
        {
          "name": "recordModelAnimation",
          "kind": "function",
          "signature": "recordModelAnimation(entityId, beforeValue, afterValue)",
          "summary": ""
        },
        {
          "name": "recordModelMorphWeights",
          "kind": "function",
          "signature": "recordModelMorphWeights(entityId, beforeValue, afterValue)",
          "summary": ""
        },
        {
          "name": "recordRename",
          "kind": "function",
          "signature": "recordRename(entityId, beforeName, afterName)",
          "summary": "Record rename"
        },
        {
          "name": "recordReparent",
          "kind": "function",
          "signature": "recordReparent(entityId, beforeFolderId, afterFolderId)",
          "summary": "Record entity reparent (move to different folder)"
        },
        {
          "name": "recordFolderCreate",
          "kind": "function",
          "signature": "recordFolderCreate(folderId, folderData)",
          "summary": "Record folder creation"
        },
        {
          "name": "recordFolderDelete",
          "kind": "function",
          "signature": "recordFolderDelete(folderId, folderData, childEntities)",
          "summary": "Record folder deletion"
        },
        {
          "name": "recordFolderRename",
          "kind": "function",
          "signature": "recordFolderRename(folderId, beforeName, afterName)",
          "summary": "Record folder rename"
        },
        {
          "name": "recordComponentAdd",
          "kind": "function",
          "signature": "recordComponentAdd(entityId, componentName, componentData)",
          "summary": "Record component added to entity"
        },
        {
          "name": "recordComponentRemove",
          "kind": "function",
          "signature": "recordComponentRemove(entityId, componentName, componentData)",
          "summary": "Record component removed from entity"
        },
        {
          "name": "recordSelectionChange",
          "kind": "function",
          "signature": "recordSelectionChange(beforeSelection, afterSelection)",
          "summary": "Record selection change (for group operations)"
        },
        {
          "name": "undo",
          "kind": "function",
          "signature": "undo()",
          "summary": "Undo last action"
        },
        {
          "name": "redo",
          "kind": "function",
          "signature": "redo()",
          "summary": "Redo last undone action"
        },
        {
          "name": "copy",
          "kind": "function",
          "signature": "copy()",
          "summary": "Copy selected entities to clipboard"
        },
        {
          "name": "cut",
          "kind": "function",
          "signature": "cut()",
          "summary": "Cut selected entities (copy + delete)"
        },
        {
          "name": "paste",
          "kind": "function",
          "signature": "async paste()",
          "summary": "Paste from clipboard"
        },
        {
          "name": "duplicate",
          "kind": "function",
          "signature": "async duplicate()",
          "summary": "Duplicate selected entities"
        },
        {
          "name": "deleteSelected",
          "kind": "function",
          "signature": "deleteSelected()",
          "summary": "Delete selected entities"
        },
        {
          "name": "clearHistory",
          "kind": "function",
          "signature": "clearHistory()",
          "summary": "Clear all history"
        },
        {
          "name": "getHistoryState",
          "kind": "function",
          "signature": "getHistoryState()",
          "summary": "Get history state for debugging"
        },
        {
          "name": "canUndo",
          "kind": "function",
          "signature": "canUndo()",
          "summary": ""
        },
        {
          "name": "canRedo",
          "kind": "function",
          "signature": "canRedo()",
          "summary": ""
        },
        {
          "name": "hasClipboard",
          "kind": "function",
          "signature": "hasClipboard()",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorMeshConversions",
      "path": "editor/reference/modules/EditorMeshConversions.md",
      "source": "editor/js/modules/EditorMeshConversions.js",
      "import": "/editor/js/modules/EditorMeshConversions.js",
      "sourceHash": "2ba141a3a6ac91d4e804c6cffae4e9a42f6fe3c93937e2f4dc0f2b62ab8f66c1",
      "summary": "============================================================================ EditorMeshConversions.js — Mesh conversion operations for editor entities  Bridges Kaolin conversion modules to the editor: - Mesh → Voxel grid (MeshToVoxel) - Mesh → Point cloud (MeshToPoints) - Mesh → Soft Body (AutoTetMesh → PBD sim) - Points → Mesh (PointsToMesh) - SDF → Mesh (SDFToMesh) - Export mesh as OBJ/PLY/STL (MeshIO) ============================================================================",
      "exports": [
        {
          "name": "meshToVoxel",
          "kind": "function",
          "signature": "async meshToVoxel(editor, entityId, opts = {})",
          "summary": "Voxelize an entity's mesh and spawn a new entity with the voxel data."
        },
        {
          "name": "meshToPoints",
          "kind": "function",
          "signature": "async meshToPoints(editor, entityId, opts = {})",
          "summary": "Sample points from an entity's mesh and spawn a point cloud entity."
        },
        {
          "name": "meshToSoftBody",
          "kind": "function",
          "signature": "async meshToSoftBody(editor, entityId, opts = {})",
          "summary": "Convert an entity's mesh to a soft body using AutoTetMesh."
        },
        {
          "name": "pointsToMesh",
          "kind": "function",
          "signature": "async pointsToMesh(editor, entityId, opts = {})",
          "summary": "Reconstruct a mesh from a point cloud entity."
        },
        {
          "name": "sdfToMesh",
          "kind": "function",
          "signature": "async sdfToMesh(sdfFn, opts = {})",
          "summary": "Generate a mesh from an SDF function."
        },
        {
          "name": "exportMesh",
          "kind": "function",
          "signature": "async exportMesh(editor, entityId, format = 'obj')",
          "summary": "Export an entity's mesh as a downloadable file."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorMeshOps",
      "path": "editor/reference/modules/EditorMeshOps.md",
      "source": "editor/js/modules/EditorMeshOps.js",
      "import": "/editor/js/modules/EditorMeshOps.js",
      "sourceHash": "ced3876feeee73fd7e7790e3c1eeebd7330414937bae02d305a76bf1b76665b6",
      "summary": "============================================================================ EditorMeshOps.js — Mesh operations for editor entities  Exposes Kaolin mesh ops (subdivide, smooth, normals, validate, flip) on selected entities. Each op clones the mesh, runs the Kaolin function, re-registers with CustomMeshRegistry + EntityMeshRenderer, and pushes an undo snapshot (hybrid: auto for <50k tris, confirm dialog for larger). ============================================================================",
      "exports": [
        {
          "name": "getMeshDataForEntity",
          "kind": "function",
          "signature": "getMeshDataForEntity(editor, entityId)",
          "summary": "Get mesh geometry data for an entity. Checks CustomMeshRegistry first, then EntityMeshRenderer cache."
        },
        {
          "name": "applyMeshOp",
          "kind": "function",
          "signature": "async applyMeshOp(editor, entityId, opName, params = {})",
          "summary": "Apply a mesh operation to an entity. Pipeline: get mesh → optional undo snapshot → run op → re-register → update entity."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorMetrics",
      "path": "editor/reference/modules/EditorMetrics.md",
      "source": "editor/js/modules/EditorMetrics.js",
      "import": "/editor/js/modules/EditorMetrics.js",
      "sourceHash": "528d723e3e03ac2c4a476a2d8f96b7d74ce8f6f94877e71eb0b918f1f9b19b35",
      "summary": "============================================================================ EditorMetrics.js — 3D mesh comparison metrics for the editor console  Exposes Kaolin metrics (Chamfer Distance, Hausdorff, Volumetric IoU) as editor commands for comparing mesh entities.  Usage (from editor console or script): editor.compareMeshes(entityA, entityB) editor.meshMetrics(entityA, entityB, 'chamfer') ============================================================================",
      "exports": [
        {
          "name": "setupMetricsCommands",
          "kind": "function",
          "signature": "setupMetricsCommands(editor)",
          "summary": "Setup mesh metrics commands on the editor instance. Call once during editor initialization."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorParticleSkinning",
      "path": "editor/reference/modules/EditorParticleSkinning.md",
      "source": "editor/js/modules/EditorParticleSkinning.js",
      "import": "/editor/js/modules/EditorParticleSkinning.js",
      "sourceHash": "b90fd337b2461c7fccc731b67c50846d6b5d23722b20d4cf914c309c0ab0c169",
      "summary": "============================================================================ EditorParticleSkinning.js — Editor bridge for learned deformation skinning  Connects Kaolin's ParticleSkinning pipeline to the editor: 1. Capture deformation snapshots from a running soft body sim 2. Extract PCA deformation modes 3. Compute skinning weights 4. Bake to animation keyframes for replay without physics 5. Runtime preview via skinning evaluator  Usage (from editor console or context menu): editor.skinning.startCapture(entityId) editor.skinning.stopCapture(entityId) editor.skinning.train(entityId, { numModes: 8 }) editor.skinning.bake(entityId, { fps: 60 }) editor.skinning.playBaked(entityId) ============================================================================",
      "exports": [
        {
          "name": "setupSkinningCommands",
          "kind": "function",
          "signature": "setupSkinningCommands(editor)",
          "summary": "Set up particle skinning commands on the editor instance."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorParticles",
      "path": "editor/reference/modules/EditorParticles.md",
      "source": "editor/js/modules/EditorParticles.js",
      "import": "/editor/js/modules/EditorParticles.js",
      "sourceHash": "f012c2c4e04973b5edd1f61e1e501a6bcbe584c18e867eababb4644436420133",
      "summary": "Initialize the particle system for the editor",
      "exports": [
        {
          "name": "applyParticleTimelineSettings",
          "kind": "function",
          "signature": "applyParticleTimelineSettings(editor)",
          "summary": ""
        },
        {
          "name": "initParticleSystem",
          "kind": "function",
          "signature": "async initParticleSystem(editor, device, format)",
          "summary": "Initialize the particle system for the editor"
        },
        {
          "name": "stopParticleAudio",
          "kind": "function",
          "signature": "stopParticleAudio()",
          "summary": "Immediately stop all particle audio (impacts + ambients). Called when exiting play mode (Stop button)."
        },
        {
          "name": "destroyParticleSystem",
          "kind": "function",
          "signature": "destroyParticleSystem()",
          "summary": "Destroy the particle system"
        },
        {
          "name": "syncWorldSystemsToEmitters",
          "kind": "function",
          "signature": "syncWorldSystemsToEmitters()",
          "summary": "Scan all active emitters' physics profiles and ensure required world systems are initialized. Call this after registering emitters or when emitter substances change."
        },
        {
          "name": "registerEmitter",
          "kind": "function",
          "signature": "registerEmitter(entityId, config)",
          "summary": "Register an emitter entity"
        },
        {
          "name": "unregisterEmitter",
          "kind": "function",
          "signature": "unregisterEmitter(entityId)",
          "summary": "Unregister an emitter entity"
        },
        {
          "name": "createComposedSpellEffect",
          "kind": "function",
          "signature": "createComposedSpellEffect(editor, sourceEntityId, elements, baseConfig)",
          "summary": "=== AUTO-BLENDING SPELL EFFECT COMPOSER === Applies composed spell effect properties directly to the source emitter. Does NOT create child entities — modifies the source emitter's visual properties based on the element mix to produce a richer, more layered look. The composer analyzes the element combination and applies: - Optimized color derived from element combo - Adjusted emit rate, size, lifetime for a \"spell-like\" feel - Temperature and material properties from element chemistry Called by \"Create Spell From This\" button in EmitterInspectorCard.js."
        },
        {
          "name": "updateEmitter",
          "kind": "function",
          "signature": "updateEmitter(entityId, config)",
          "summary": "Update emitter configuration"
        },
        {
          "name": "enableEmitter",
          "kind": "function",
          "signature": "enableEmitter(entityId)",
          "summary": "Enable an emitter"
        },
        {
          "name": "disableEmitter",
          "kind": "function",
          "signature": "disableEmitter(entityId)",
          "summary": "Disable an emitter"
        },
        {
          "name": "toggleEmitter",
          "kind": "function",
          "signature": "toggleEmitter(entityId)",
          "summary": "Toggle emitter on/off"
        },
        {
          "name": "isEmitterEnabled",
          "kind": "function",
          "signature": "isEmitterEnabled(entityId)",
          "summary": "Check if emitter is enabled"
        },
        {
          "name": "getEmitter",
          "kind": "function",
          "signature": "getEmitter(entityId)",
          "summary": "Get emitter by entity ID (for inspector UI binding)"
        },
        {
          "name": "hasEmitter",
          "kind": "function",
          "signature": "hasEmitter(entityId)",
          "summary": "Check if an entity has an emitter"
        },
        {
          "name": "saveEmitterToECS",
          "kind": "function",
          "signature": "saveEmitterToECS(editor, entityId)",
          "summary": "Save emitter config to entity metadata for serialization"
        },
        {
          "name": "seedParticleRng",
          "kind": "function",
          "signature": "seedParticleRng(seed, tick = 0)",
          "summary": "Seed the particle RNG with a shared collab seed. Call at play start so all peers produce identical particle sequences."
        },
        {
          "name": "saveAllEmittersToECS",
          "kind": "function",
          "signature": "saveAllEmittersToECS(editor)",
          "summary": ""
        },
        {
          "name": "updateParticleQuality",
          "kind": "function",
          "signature": "updateParticleQuality(editor, frameDt, cameraPosition = null)",
          "summary": "Feed the quality stack once per displayed frame using measured wall-clock time. Fixed simulation ticks must not drive this API because a constant 16.67 ms input hides real render pressure and prevents adaptive quality from reacting."
        },
        {
          "name": "getParticleQualityStackStatus",
          "kind": "function",
          "signature": "getParticleQualityStackStatus()",
          "summary": "Return a serializable, truthful snapshot of every active particle quality layer."
        },
        {
          "name": "stepParticles",
          "kind": "function",
          "signature": "stepParticles(editor, dt)",
          "summary": ""
        },
        {
          "name": "prepareDebugRenderer",
          "kind": "function",
          "signature": "async prepareDebugRenderer(mode)",
          "summary": "Prepare a debug renderer for use (call before switching to debug mode)"
        },
        {
          "name": "isDebugRendererReady",
          "kind": "function",
          "signature": "isDebugRendererReady(mode)",
          "summary": "Check if a debug renderer is ready"
        },
        {
          "name": "renderParticlesDepth",
          "kind": "function",
          "signature": "renderParticlesDepth(pass, camera)",
          "summary": "Render particles to depth texture"
        },
        {
          "name": "renderParticlesNormals",
          "kind": "function",
          "signature": "renderParticlesNormals(pass, camera)",
          "summary": "Render particles normals to texture"
        },
        {
          "name": "renderParticlesAlbedo",
          "kind": "function",
          "signature": "renderParticlesAlbedo(pass, camera)",
          "summary": "Render particles albedo to texture"
        },
        {
          "name": "renderParticlesLighting",
          "kind": "function",
          "signature": "renderParticlesLighting(pass, camera)",
          "summary": "Render particles lighting to texture"
        },
        {
          "name": "renderParticlesVelocity",
          "kind": "function",
          "signature": "renderParticlesVelocity(pass, camera)",
          "summary": "Render particles velocity to texture"
        },
        {
          "name": "renderParticlesAge",
          "kind": "function",
          "signature": "renderParticlesAge(pass, camera)",
          "summary": "Render particles age to texture"
        },
        {
          "name": "renderParticlesEmissive",
          "kind": "function",
          "signature": "renderParticlesEmissive(pass, camera)",
          "summary": "Render particles emissive to texture"
        },
        {
          "name": "renderParticlesSize",
          "kind": "function",
          "signature": "renderParticlesSize(pass, camera)",
          "summary": "Render particles size to texture"
        },
        {
          "name": "renderParticlesThermal",
          "kind": "function",
          "signature": "renderParticlesThermal(pass, camera)",
          "summary": "Render particles thermal/blackbody to texture"
        },
        {
          "name": "setThermalEnabled",
          "kind": "function",
          "signature": "setThermalEnabled(enabled)",
          "summary": "Enable/disable blackbody thermal coloring in the main SDF render. When disabled (default), particles render with base colors only. Use the Thermal debug pass to visualize temperature separately."
        },
        {
          "name": "isThermalEnabled",
          "kind": "function",
          "signature": "isThermalEnabled()",
          "summary": ""
        },
        {
          "name": "renderParticles",
          "kind": "function",
          "signature": "renderParticles(pass, camera, depthTextureView, depthScale)",
          "summary": "Render particles to the current render pass"
        },
        {
          "name": "getParticleCount",
          "kind": "function",
          "signature": "getParticleCount()",
          "summary": "Get current particle count"
        },
        {
          "name": "clearParticles",
          "kind": "function",
          "signature": "clearParticles()",
          "summary": "Clear all particles - kills all living particles immediately"
        },
        {
          "name": "getParticleDecals",
          "kind": "function",
          "signature": "getParticleDecals()",
          "summary": "Get active decals for rendering (from collision events)"
        },
        {
          "name": "getDecalSpawner",
          "kind": "function",
          "signature": "getDecalSpawner()",
          "summary": "Get the decal spawner (for Viewport to create its renderer)"
        },
        {
          "name": "getExtractedParticleLights",
          "kind": "function",
          "signature": "getExtractedParticleLights()",
          "summary": "Get extracted particle lights for scene lighting"
        },
        {
          "name": "getParticleLightSystem",
          "kind": "function",
          "signature": "getParticleLightSystem()",
          "summary": "Get the particle light system handle"
        },
        {
          "name": "getDistortionRenderer",
          "kind": "function",
          "signature": "getDistortionRenderer(width, height, sceneFormat)",
          "summary": "Get or lazy-create the distortion renderer for heat haze effects"
        },
        {
          "name": "initDistortion",
          "kind": "function",
          "signature": "initDistortion(sceneColorView)",
          "summary": "Initialize distortion bind groups (call when scene color view is available)"
        },
        {
          "name": "executeDistortionPass",
          "kind": "function",
          "signature": "executeDistortionPass(encoder, frameData)",
          "summary": "Execute distortion render pass (accumulate UV offsets from hot particles)"
        },
        {
          "name": "executeDistortionComposite",
          "kind": "function",
          "signature": "executeDistortionComposite(pass)",
          "summary": "Composite distortion onto scene"
        },
        {
          "name": "resizeDistortion",
          "kind": "function",
          "signature": "resizeDistortion(width, height)",
          "summary": "Resize distortion texture on viewport resize"
        },
        {
          "name": "getTrailHistorySystem",
          "kind": "function",
          "signature": "getTrailHistorySystem()",
          "summary": "Get the trail history system handle"
        },
        {
          "name": "renderTrailHistoryPass",
          "kind": "function",
          "signature": "renderTrailHistoryPass(pass, viewProj, cameraPos, time)",
          "summary": "Render trail histories as additive fading billboards"
        },
        {
          "name": "getBeamRenderer",
          "kind": "function",
          "signature": "getBeamRenderer(format)",
          "summary": "Get or lazy-create the beam renderer"
        },
        {
          "name": "renderBeamPass",
          "kind": "function",
          "signature": "renderBeamPass(pass, viewProj, viewRight, viewUp, time, segmentCount)",
          "summary": "Render beam particles"
        },
        {
          "name": "getBeamSegmentCount",
          "kind": "function",
          "signature": "getBeamSegmentCount()",
          "summary": "Get the number of beam segments to render. Returns 0 unless beam-type emitters are explicitly active in the scene. Prevents the beam renderer from treating all alive particles as a single chain."
        },
        {
          "name": "updateBeamParams",
          "kind": "function",
          "signature": "updateBeamParams(params)",
          "summary": "Update beam parameters"
        },
        {
          "name": "getExistingMeshRenderer",
          "kind": "function",
          "signature": "getExistingMeshRenderer()",
          "summary": "Get the existing mesh renderer without triggering creation. Returns null if not yet created. Used by shadow caster integration."
        },
        {
          "name": "getMeshRenderer",
          "kind": "function",
          "signature": "getMeshRenderer(format, meshConfig)",
          "summary": "Get or lazy-create the mesh particle renderer"
        },
        {
          "name": "setParticleMeshGeometry",
          "kind": "function",
          "signature": "setParticleMeshGeometry(mesh)",
          "summary": "Set the mesh geometry for particle mesh rendering"
        },
        {
          "name": "renderMeshPass",
          "kind": "function",
          "signature": "renderMeshPass(pass, viewProj, cameraPos, time, instanceCount)",
          "summary": "Render mesh particles"
        },
        {
          "name": "hasLiquidEmitters",
          "kind": "function",
          "signature": "hasLiquidEmitters()",
          "summary": "GAP 6: Query whether any active emitter has liquid-phase particles. Viewport uses this to auto-enable/disable SSFR rendering."
        },
        {
          "name": "getLiquidSurfaceTint",
          "kind": "function",
          "signature": "getLiquidSurfaceTint()",
          "summary": ""
        },
        {
          "name": "getSPHSurfaceRendererHandle",
          "kind": "function",
          "signature": "getSPHSurfaceRendererHandle(format, width, height)",
          "summary": "Get or lazy-create the SPH surface renderer"
        },
        {
          "name": "setSPHSurfaceTintColor",
          "kind": "function",
          "signature": "setSPHSurfaceTintColor(tint)",
          "summary": "GAP 13: Set SSFR tint color from substance [r, g, b]."
        },
        {
          "name": "initSPHComposite",
          "kind": "function",
          "signature": "initSPHComposite(sceneColorView)",
          "summary": "Initialize SPH composite bind group (needs scene color view)"
        },
        {
          "name": "renderSPHSurfacePass",
          "kind": "function",
          "signature": "renderSPHSurfacePass(encoder, options)",
          "summary": "Render SPH fluid surface depth pass"
        },
        {
          "name": "compositeSPHSurfacePass",
          "kind": "function",
          "signature": "compositeSPHSurfacePass(pass)",
          "summary": "Composite SPH surface onto scene"
        },
        {
          "name": "getBondRenderer",
          "kind": "function",
          "signature": "getBondRenderer(format)",
          "summary": "Get or lazy-create the bond renderer"
        },
        {
          "name": "computeAndUploadVisualBonds",
          "kind": "function",
          "signature": "computeAndUploadVisualBonds()",
          "summary": ""
        },
        {
          "name": "renderBondPass",
          "kind": "function",
          "signature": "renderBondPass(pass, viewProj, cameraPos, viewRight, viewUp)",
          "summary": "Render bonds"
        },
        {
          "name": "setBondVisualsEnabled",
          "kind": "function",
          "signature": "setBondVisualsEnabled(enabled)",
          "summary": "Set bond visualization enabled/disabled"
        },
        {
          "name": "setBondRadius",
          "kind": "function",
          "signature": "setBondRadius(radius)",
          "summary": "Set bond radius for proximity detection"
        },
        {
          "name": "getFieldRenderer",
          "kind": "function",
          "signature": "getFieldRenderer(format)",
          "summary": "Get or lazy-create the field renderer"
        },
        {
          "name": "updateFieldVisualization",
          "kind": "function",
          "signature": "updateFieldVisualization(chargedParticles, gridConfig)",
          "summary": "Update field probes from charged particles"
        },
        {
          "name": "renderFieldPass",
          "kind": "function",
          "signature": "renderFieldPass(pass, viewProj, cameraPos, viewRight, viewUp)",
          "summary": "Render field arrows"
        },
        {
          "name": "getOrbitalRenderer",
          "kind": "function",
          "signature": "getOrbitalRenderer(format)",
          "summary": "Get or lazy-create the orbital renderer"
        },
        {
          "name": "renderOrbitalPass",
          "kind": "function",
          "signature": "renderOrbitalPass(pass, viewProj, cameraPos, viewRight, viewUp, instanceCount)",
          "summary": "Render orbital electron clouds"
        },
        {
          "name": "isReady",
          "kind": "function",
          "signature": "isReady()",
          "summary": "Check if particle system is ready"
        },
        {
          "name": "getActiveEmitters",
          "kind": "function",
          "signature": "getActiveEmitters()",
          "summary": "Get active emitters"
        },
        {
          "name": "clearAllEmitters",
          "kind": "function",
          "signature": "clearAllEmitters()",
          "summary": "Clear all emitters and particles (used before scene reload)"
        },
        {
          "name": "spawnBurst",
          "kind": "function",
          "signature": "spawnBurst(position, preset = 'explosion', count = 50)",
          "summary": "Spawn a burst of particles at a position"
        },
        {
          "name": "spawnDustPuff",
          "kind": "function",
          "signature": "spawnDustPuff(position, color, intensity = 0.5, normal)",
          "summary": "Spawn a dust puff at a world position when fragments take damage or break. Uses small, soft point particles colored to match the breaking material. Best-practice references (real-time VFX): - Unreal Niagara: one-shot burst, soft sprite, high drag, gravity settle - Unity VFX Graph: short lifetime, size-over-life bell curve, alpha fade - GDC \"The Art of Destruction\": dust = desaturated material color, 0.2-0.6s"
        },
        {
          "name": "getParticleSettings",
          "kind": "function",
          "signature": "getParticleSettings()",
          "summary": "Get advanced particle system settings"
        },
        {
          "name": "getParticles",
          "kind": "function",
          "signature": "getParticles()",
          "summary": ""
        },
        {
          "name": "setParticleSettings",
          "kind": "function",
          "signature": "setParticleSettings(settings)",
          "summary": "Update advanced particle system settings"
        },
        {
          "name": "getParticlePerformanceStats",
          "kind": "function",
          "signature": "getParticlePerformanceStats()",
          "summary": "Get particle system performance stats"
        },
        {
          "name": "startParticleRewind",
          "kind": "function",
          "signature": "startParticleRewind()",
          "summary": "Start particle time rewind mode"
        },
        {
          "name": "stopParticleRewind",
          "kind": "function",
          "signature": "stopParticleRewind()",
          "summary": "Stop particle rewind and resume simulation"
        },
        {
          "name": "seekParticleTime",
          "kind": "function",
          "signature": "seekParticleTime(timeMs)",
          "summary": "Seek to a specific time in particle history Restores FULL particle state including spawn/death events"
        },
        {
          "name": "setParticleRewindSpeed",
          "kind": "function",
          "signature": "setParticleRewindSpeed(speed)",
          "summary": "Set particle rewind playback speed"
        },
        {
          "name": "getParticleRewindInfo",
          "kind": "function",
          "signature": "getParticleRewindInfo()",
          "summary": "Get particle rewind/snapshot info"
        },
        {
          "name": "isParticleRewinding",
          "kind": "function",
          "signature": "isParticleRewinding()",
          "summary": "Check if particles are currently rewinding"
        },
        {
          "name": "clearParticleSnapshots",
          "kind": "function",
          "signature": "clearParticleSnapshots()",
          "summary": "Clear all particle snapshots"
        },
        {
          "name": "truncateParticleSnapshotsAfterTime",
          "kind": "function",
          "signature": "truncateParticleSnapshotsAfterTime(timeMs)",
          "summary": ""
        },
        {
          "name": "setParticleEasing",
          "kind": "function",
          "signature": "setParticleEasing(easingType)",
          "summary": "Set particle easing type for timeline interpolation"
        },
        {
          "name": "setAdvancedInterpolation",
          "kind": "function",
          "signature": "setAdvancedInterpolation(enabled)",
          "summary": "Enable/disable advanced interpolation (Catmull-Rom/Hermite splines)"
        },
        {
          "name": "getInterpolationMode",
          "kind": "function",
          "signature": "getInterpolationMode()",
          "summary": "Get current interpolation mode"
        },
        {
          "name": "getParticleEasingTypes",
          "kind": "function",
          "signature": "getParticleEasingTypes()",
          "summary": "Get available easing types for particle rewind"
        },
        {
          "name": "initAdvancedFeatures",
          "kind": "function",
          "signature": "initAdvancedFeatures(options = {})",
          "summary": "Initialize advanced particle features (spatial grid, line generation) Call after initParticleSystem for enhanced features"
        },
        {
          "name": "resetQualityScale",
          "kind": "function",
          "signature": "resetQualityScale()",
          "summary": "Reset quality scale to 1.0 - call when entering play mode to ensure consistent emission"
        },
        {
          "name": "updateVolumeSystem",
          "kind": "function",
          "signature": "updateVolumeSystem(encoder, camera)",
          "summary": "Update the hybrid volumetric system (call before render)"
        },
        {
          "name": "renderVolumeSystem",
          "kind": "function",
          "signature": "renderVolumeSystem(pass, sceneColorTexture, sceneDepthTexture)",
          "summary": "Render the hybrid volumetric system"
        },
        {
          "name": "setVolumeMode",
          "kind": "function",
          "signature": "setVolumeMode(mode)",
          "summary": "Set volume render mode"
        },
        {
          "name": "setVolumeEnabled",
          "kind": "function",
          "signature": "setVolumeEnabled(enabled)",
          "summary": "Enable/disable volume rendering"
        },
        {
          "name": "toggleVolumeRendering",
          "kind": "function",
          "signature": "toggleVolumeRendering()",
          "summary": "Toggle volume rendering"
        },
        {
          "name": "isVolumeReady",
          "kind": "function",
          "signature": "isVolumeReady()",
          "summary": "Check if volume system is ready"
        },
        {
          "name": "getVolumeStats",
          "kind": "function",
          "signature": "getVolumeStats()",
          "summary": "Get volume system stats"
        },
        {
          "name": "setVolumeBounds",
          "kind": "function",
          "signature": "setVolumeBounds(min, max)",
          "summary": "Set volume bounds"
        },
        {
          "name": "EMITTER_PRESETS",
          "kind": "constant",
          "signature": "EMITTER_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorPhysicalMaterial",
      "path": "editor/reference/modules/EditorPhysicalMaterial.md",
      "source": "editor/js/modules/EditorPhysicalMaterial.js",
      "import": "/editor/js/modules/EditorPhysicalMaterial.js",
      "sourceHash": "b585613d7811168f062b51013563a5b6ea88e890fabe689d28e22dee3abc25ff",
      "summary": "============================================================================ EditorPhysicalMaterial.js — Runtime bridge for physical material simulation  Connects PhysicalMaterial ECS component to existing physics systems: - Collision → damage accumulation - Damage exceeds threshold → deform (voxel crater) or fracture (Voronoi) - Fracture spawns real ECS entities with Renderable + PhysicsBody + Collider - Material-specific debris FX (dust, sparks, splinters) - Fragment count scales with impact energy - Brittleness determines shatter vs bend behavior  Lazy-loads heavy modules (VoronoiFracture, AutoTetMesh) only when triggered. ============================================================================",
      "exports": [
        {
          "name": "clearPlayState",
          "kind": "function",
          "signature": "clearPlayState()",
          "summary": "Clear all play-session state. Must be called when exiting play mode so that damage/fracture/deformation caches don't persist into the next session."
        },
        {
          "name": "setupPhysicalMaterialBridge",
          "kind": "function",
          "signature": "setupPhysicalMaterialBridge(editor)",
          "summary": ""
        },
        {
          "name": "handleCollision",
          "kind": "function",
          "signature": "handleCollision(editor, entityIdA, entityIdB, impactForce, contactPoint, contactNormal, massA, massB)",
          "summary": "Handle a collision between two entities. Called from EditorPhysics.js contact callback."
        },
        {
          "name": "applyDamage",
          "kind": "function",
          "signature": "applyDamage(editor, entityId, amount)",
          "summary": "Apply direct damage to an entity (e.g., from explosions, scripts)."
        },
        {
          "name": "resetDamage",
          "kind": "function",
          "signature": "resetDamage(editor, entityId)",
          "summary": "Reset damage on an entity."
        },
        {
          "name": "convertToSoftBody",
          "kind": "function",
          "signature": "async convertToSoftBody(editor, entityId)",
          "summary": "Convert a rigid entity to a soft body on-the-fly. Uses AutoTetMesh to generate tet volume, then PBD solver."
        },
        {
          "name": "deformAtImpact",
          "kind": "function",
          "signature": "async deformAtImpact(editor, entityId, contactPoint, contactNormal, normalizedForce)",
          "summary": "Deform mesh at impact point by carving a crater via voxel subtraction. If the carve disconnects pieces, broken-off pieces become fragment entities."
        },
        {
          "name": "fractureEntity",
          "kind": "function",
          "signature": "async fractureEntity(editor, entityId, contactPoint, contactNormal, impactForce, normalizedForce)",
          "summary": "Fracture an entity into visible fragment ECS entities using VoronoiFracture. Each fragment gets its own Renderable, PhysicsBody, and Collider. Fragment count scales with impact energy (Phase D)."
        },
        {
          "name": "updateDebris",
          "kind": "function",
          "signature": "updateDebris(editor)",
          "summary": "Update debris lifecycle — call from physics step. Removes expired debris entities."
        },
        {
          "name": "syncColliderFromMaterial",
          "kind": "function",
          "signature": "syncColliderFromMaterial(editor, entityId)",
          "summary": "Sync collider friction/restitution from material properties. Call after material changes."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorPhysics",
      "path": "editor/reference/modules/EditorPhysics.md",
      "source": "editor/js/modules/EditorPhysics.js",
      "import": "/editor/js/modules/EditorPhysics.js",
      "sourceHash": "9e8c5e79034b3bd00d349ab375562e1270ef24b28495dab5146397de045d9365",
      "summary": "Public API to manually verify collision state (useful for debugging)",
      "exports": [
        {
          "name": "initializePhysicsWorld",
          "kind": "function",
          "signature": "async initializePhysicsWorld(editor)",
          "summary": ""
        },
        {
          "name": "debugVerifyCollisions",
          "kind": "function",
          "signature": "debugVerifyCollisions(editor)",
          "summary": "Public API to manually verify collision state (useful for debugging)"
        },
        {
          "name": "destroyPhysicsWorld",
          "kind": "function",
          "signature": "destroyPhysicsWorld(editor)",
          "summary": ""
        },
        {
          "name": "stepPhysics",
          "kind": "function",
          "signature": "stepPhysics(editor, dt)",
          "summary": ""
        },
        {
          "name": "createHingeJoint",
          "kind": "function",
          "signature": "createHingeJoint(world, bodyA, bodyB, options = {})",
          "summary": "Create a hinge joint between two bodies"
        },
        {
          "name": "createBallJoint",
          "kind": "function",
          "signature": "createBallJoint(world, bodyA, bodyB, options = {})",
          "summary": "Create a ball-socket joint (spherical)"
        },
        {
          "name": "createSpringJoint",
          "kind": "function",
          "signature": "createSpringJoint(world, bodyA, bodyB, options = {})",
          "summary": "Create a spring/distance joint"
        },
        {
          "name": "createParticleChain",
          "kind": "function",
          "signature": "createParticleChain(options = {})",
          "summary": "Create a particle chain using PBD (Position-Based Dynamics)"
        },
        {
          "name": "createChain",
          "kind": "function",
          "signature": "createChain(world, options = {})",
          "summary": "Create a chain of rigid body links"
        },
        {
          "name": "createSoftBody",
          "kind": "function",
          "signature": "createSoftBody(device, options = {})",
          "summary": "Create a soft body simulation"
        },
        {
          "name": "generateSoftBodyParticles",
          "kind": "function",
          "signature": "generateSoftBodyParticles(sdfFunc, bounds, density = 100)",
          "summary": "Generate particles for a soft body in a shape"
        },
        {
          "name": "initFractureSystem",
          "kind": "function",
          "signature": "initFractureSystem(device)",
          "summary": "Initialize fracture system"
        },
        {
          "name": "preFractureMesh",
          "kind": "function",
          "signature": "preFractureMesh(mesh, options = {})",
          "summary": "Pre-fracture a mesh into fragments"
        },
        {
          "name": "generateFragmentColliders",
          "kind": "function",
          "signature": "generateFragmentColliders(fragments, resolution = 6)",
          "summary": "Generate colliders for each fragment"
        },
        {
          "name": "createBreakableCollider",
          "kind": "function",
          "signature": "createBreakableCollider(options = {})",
          "summary": "Create breakable compound collider that fractures on impact"
        },
        {
          "name": "raycast",
          "kind": "function",
          "signature": "raycast(world, origin, direction, maxDistance = 1000)",
          "summary": "Cast a ray into the physics world"
        },
        {
          "name": "raycastCone",
          "kind": "function",
          "signature": "raycastCone(world, origin, direction, coneAngle, rayCount = 8, maxDistance = 100)",
          "summary": "Cast multiple rays in a cone pattern (for shotgun spread, vision cone, etc.)"
        },
        {
          "name": "createTriggerZone",
          "kind": "function",
          "signature": "createTriggerZone(shape, size, position = [0, 0, 0])",
          "summary": "Create a trigger zone collider config"
        },
        {
          "name": "pointInTrigger",
          "kind": "function",
          "signature": "pointInTrigger(point, trigger)",
          "summary": "Check if a point is inside a trigger zone"
        },
        {
          "name": "overlapSphere",
          "kind": "function",
          "signature": "overlapSphere(center, radius, entities)",
          "summary": "Find all entities within a sphere (using spatial hash if available)"
        },
        {
          "name": "overlapBox",
          "kind": "function",
          "signature": "overlapBox(center, halfExtents, entities)",
          "summary": "Find all entities within a box"
        },
        {
          "name": "getColliderForType",
          "kind": "function",
          "signature": "getColliderForType(editor, type)",
          "summary": ""
        },
        {
          "name": "getGeometryForType",
          "kind": "function",
          "signature": "getGeometryForType(type)",
          "summary": ""
        },
        {
          "name": "addSimTime",
          "kind": "function",
          "signature": "addSimTime(editor, dt)",
          "summary": ""
        },
        {
          "name": "recordHistorySnapshot",
          "kind": "function",
          "signature": "recordHistorySnapshot(editor)",
          "summary": ""
        },
        {
          "name": "seekToTime",
          "kind": "function",
          "signature": "seekToTime(editor, targetTime)",
          "summary": ""
        },
        {
          "name": "registerPhysicsSystem",
          "kind": "function",
          "signature": "async registerPhysicsSystem(editor)",
          "summary": ""
        },
        {
          "name": "createGroundPlane",
          "kind": "function",
          "signature": "async createGroundPlane(editor)",
          "summary": ""
        },
        {
          "name": "updatePhysicsWorld",
          "kind": "function",
          "signature": "async updatePhysicsWorld(editor)",
          "summary": ""
        },
        {
          "name": "createMeshColliderDecomposed",
          "kind": "function",
          "signature": "createMeshColliderDecomposed(vertices, indices, options = {})",
          "summary": "Create a mesh collider with automatic convex decomposition for complex shapes. Use this when you have a mesh that's too complex for a single convex hull."
        },
        {
          "name": "createSDFCollider",
          "kind": "function",
          "signature": "createSDFCollider(sdfFunc, bounds, options = {})",
          "summary": "Create a collider from an SDF function with automatic voxelization. Use this for procedural or mathematical shapes."
        },
        {
          "name": "createVoxelCollider",
          "kind": "function",
          "signature": "createVoxelCollider(voxels, sizeX, sizeY, sizeZ, voxelSize = 0.1)",
          "summary": "Create a collider grid from a 3D voxel array. Use this when you already have voxel data."
        },
        {
          "name": "createSDFGridFromFunction",
          "kind": "function",
          "signature": "createSDFGridFromFunction(sdfFunc, bounds, resolution = 32)",
          "summary": "Create an SDF grid for collision detection with complex shapes. Useful for soft-body or particle interactions."
        },
        {
          "name": "checkSDFCollision",
          "kind": "function",
          "signature": "checkSDFCollision(grid, point, radius = 0)",
          "summary": "Check if a point or sphere collides with an SDF grid."
        },
        {
          "name": "createPhysicsChain",
          "kind": "function",
          "signature": "async createPhysicsChain(editor, startPos, endPos, options = {})",
          "summary": "Create articulated chain between two points. Use for physics-based chains, ropes, cables."
        },
        {
          "name": "enableSpeculativeCCDForAll",
          "kind": "function",
          "signature": "enableSpeculativeCCDForAll(editor)",
          "summary": "Enable speculative CCD on all dynamic bodies in the physics world. Helps prevent fast-moving objects from tunneling through thin walls."
        },
        {
          "name": "createBroadPhaseGrid",
          "kind": "function",
          "signature": "createBroadPhaseGrid(cellSize = 1.0)",
          "summary": "Create a spatial hash grid for fast broad-phase collision queries. Useful for custom collision detection with many objects."
        },
        {
          "name": "updateBroadPhaseGrid",
          "kind": "function",
          "signature": "updateBroadPhaseGrid(editor, grid)",
          "summary": "Update all bodies in a spatial hash grid from editor entities."
        },
        {
          "name": "getBroadPhasePairs",
          "kind": "function",
          "signature": "getBroadPhasePairs(grid)",
          "summary": "Get potential collision pairs from broad phase."
        },
        {
          "name": "createPhysicsRope",
          "kind": "constant",
          "signature": "createPhysicsRope",
          "summary": ""
        },
        {
          "name": "createRope",
          "kind": "constant",
          "signature": "createRope",
          "summary": ""
        },
        {
          "name": "BezierSpline",
          "kind": "re-export",
          "signature": "BezierSpline",
          "summary": ""
        },
        {
          "name": "ConstitutiveModel",
          "kind": "re-export",
          "signature": "ConstitutiveModel",
          "summary": ""
        },
        {
          "name": "ConstraintType",
          "kind": "re-export",
          "signature": "ConstraintType",
          "summary": ""
        },
        {
          "name": "CubicBezier",
          "kind": "re-export",
          "signature": "CubicBezier",
          "summary": ""
        },
        {
          "name": "DistanceConstraint",
          "kind": "re-export",
          "signature": "DistanceConstraint",
          "summary": ""
        },
        {
          "name": "FRACTURE_PATTERNS",
          "kind": "re-export",
          "signature": "FRACTURE_PATTERNS",
          "summary": ""
        },
        {
          "name": "GPUSpatialHashGrid",
          "kind": "re-export",
          "signature": "GPUSpatialHashGrid",
          "summary": ""
        },
        {
          "name": "LineNetwork",
          "kind": "re-export",
          "signature": "LineNetwork",
          "summary": ""
        },
        {
          "name": "LineToVoxelizer",
          "kind": "re-export",
          "signature": "LineToVoxelizer",
          "summary": ""
        },
        {
          "name": "MLSMPMSolver",
          "kind": "re-export",
          "signature": "MLSMPMSolver",
          "summary": ""
        },
        {
          "name": "MaterialPresets",
          "kind": "re-export",
          "signature": "MaterialPresets",
          "summary": ""
        },
        {
          "name": "NODE_STATUS",
          "kind": "re-export",
          "signature": "NODE_STATUS",
          "summary": ""
        },
        {
          "name": "NetworkEdge",
          "kind": "re-export",
          "signature": "NetworkEdge",
          "summary": ""
        },
        {
          "name": "NetworkNode",
          "kind": "re-export",
          "signature": "NetworkNode",
          "summary": ""
        },
        {
          "name": "PBDParticle",
          "kind": "re-export",
          "signature": "PBDParticle",
          "summary": ""
        },
        {
          "name": "PBDSolver",
          "kind": "re-export",
          "signature": "PBDSolver",
          "summary": ""
        },
        {
          "name": "ParticleFlags",
          "kind": "re-export",
          "signature": "ParticleFlags",
          "summary": ""
        },
        {
          "name": "SCENT_TYPE",
          "kind": "re-export",
          "signature": "SCENT_TYPE",
          "summary": ""
        },
        {
          "name": "SDFGrid",
          "kind": "re-export",
          "signature": "SDFGrid",
          "summary": ""
        },
        {
          "name": "SDFOperations",
          "kind": "re-export",
          "signature": "SDFOperations",
          "summary": ""
        },
        {
          "name": "SDFPrimitives",
          "kind": "re-export",
          "signature": "SDFPrimitives",
          "summary": ""
        },
        {
          "name": "ShockPropagationSolver",
          "kind": "re-export",
          "signature": "ShockPropagationSolver",
          "summary": ""
        },
        {
          "name": "SpatialHash",
          "kind": "re-export",
          "signature": "SpatialHash",
          "summary": ""
        },
        {
          "name": "SpatialHashGrid",
          "kind": "re-export",
          "signature": "SpatialHashGrid",
          "summary": ""
        },
        {
          "name": "SpeculativeContactsSolver",
          "kind": "re-export",
          "signature": "SpeculativeContactsSolver",
          "summary": ""
        },
        {
          "name": "VoronoiFracture",
          "kind": "re-export",
          "signature": "VoronoiFracture",
          "summary": ""
        },
        {
          "name": "VoxelMaterials",
          "kind": "re-export",
          "signature": "VoxelMaterials",
          "summary": ""
        },
        {
          "name": "aabbAABB",
          "kind": "re-export",
          "signature": "aabbAABB",
          "summary": ""
        },
        {
          "name": "addArticulationToScene",
          "kind": "re-export",
          "signature": "addArticulationToScene",
          "summary": ""
        },
        {
          "name": "addToSpatialHash",
          "kind": "re-export",
          "signature": "addToSpatialHash",
          "summary": ""
        },
        {
          "name": "applyFriction",
          "kind": "re-export",
          "signature": "applyFriction",
          "summary": ""
        },
        {
          "name": "applyShockPropagation",
          "kind": "re-export",
          "signature": "applyShockPropagation",
          "summary": ""
        },
        {
          "name": "arrive",
          "kind": "re-export",
          "signature": "arrive",
          "summary": ""
        },
        {
          "name": "canHear",
          "kind": "re-export",
          "signature": "canHear",
          "summary": ""
        },
        {
          "name": "canSee",
          "kind": "re-export",
          "signature": "canSee",
          "summary": ""
        },
        {
          "name": "clearAllWelds",
          "kind": "re-export",
          "signature": "clearAllWelds",
          "summary": ""
        },
        {
          "name": "clearColliderSpatialHash",
          "kind": "re-export",
          "signature": "clearColliderSpatialHash",
          "summary": ""
        },
        {
          "name": "computeBounce",
          "kind": "re-export",
          "signature": "computeBounce",
          "summary": ""
        },
        {
          "name": "computeColliderAABB",
          "kind": "re-export",
          "signature": "computeColliderAABB",
          "summary": ""
        },
        {
          "name": "createAIAgent",
          "kind": "re-export",
          "signature": "createAIAgent",
          "summary": ""
        },
        {
          "name": "createAIPerception",
          "kind": "re-export",
          "signature": "createAIPerception",
          "summary": ""
        },
        {
          "name": "createAction",
          "kind": "re-export",
          "signature": "createAction",
          "summary": ""
        },
        {
          "name": "createArticulation",
          "kind": "re-export",
          "signature": "createArticulation",
          "summary": ""
        },
        {
          "name": "createChaseFleeBehavior",
          "kind": "re-export",
          "signature": "createChaseFleeBehavior",
          "summary": ""
        },
        {
          "name": "createChildLink",
          "kind": "re-export",
          "signature": "createChildLink",
          "summary": ""
        },
        {
          "name": "createCondition",
          "kind": "re-export",
          "signature": "createCondition",
          "summary": ""
        },
        {
          "name": "createD6Joint",
          "kind": "re-export",
          "signature": "createD6Joint",
          "summary": ""
        },
        {
          "name": "createDangerSense",
          "kind": "re-export",
          "signature": "createDangerSense",
          "summary": ""
        },
        {
          "name": "createDecomposedCollider",
          "kind": "re-export",
          "signature": "createDecomposedCollider",
          "summary": ""
        },
        {
          "name": "createDistanceJoint",
          "kind": "re-export",
          "signature": "createDistanceJoint",
          "summary": ""
        },
        {
          "name": "createFlock",
          "kind": "re-export",
          "signature": "createFlock",
          "summary": ""
        },
        {
          "name": "createNavGrid",
          "kind": "re-export",
          "signature": "createNavGrid",
          "summary": ""
        },
        {
          "name": "createPatrolBehavior",
          "kind": "re-export",
          "signature": "createPatrolBehavior",
          "summary": ""
        },
        {
          "name": "createPhysXRope",
          "kind": "re-export",
          "signature": "createPhysXRope",
          "summary": ""
        },
        {
          "name": "createRevoluteJoint",
          "kind": "re-export",
          "signature": "createRevoluteJoint",
          "summary": ""
        },
        {
          "name": "createRootLink",
          "kind": "re-export",
          "signature": "createRootLink",
          "summary": ""
        },
        {
          "name": "createSDFFromMesh",
          "kind": "re-export",
          "signature": "createSDFFromMesh",
          "summary": ""
        },
        {
          "name": "createScentParticle",
          "kind": "re-export",
          "signature": "createScentParticle",
          "summary": ""
        },
        {
          "name": "createScentSystem",
          "kind": "re-export",
          "signature": "createScentSystem",
          "summary": ""
        },
        {
          "name": "createScentTrail",
          "kind": "re-export",
          "signature": "createScentTrail",
          "summary": ""
        },
        {
          "name": "createSelector",
          "kind": "re-export",
          "signature": "createSelector",
          "summary": ""
        },
        {
          "name": "createSequence",
          "kind": "re-export",
          "signature": "createSequence",
          "summary": ""
        },
        {
          "name": "createSphericalJoint",
          "kind": "re-export",
          "signature": "createSphericalJoint",
          "summary": ""
        },
        {
          "name": "createSteeringAgent",
          "kind": "re-export",
          "signature": "createSteeringAgent",
          "summary": ""
        },
        {
          "name": "decomposeMesh",
          "kind": "re-export",
          "signature": "decomposeMesh",
          "summary": ""
        },
        {
          "name": "elasticCollision",
          "kind": "re-export",
          "signature": "elasticCollision",
          "summary": ""
        },
        {
          "name": "enablePhysXSpeculativeCCD",
          "kind": "re-export",
          "signature": "enablePhysXSpeculativeCCD",
          "summary": ""
        },
        {
          "name": "evade",
          "kind": "re-export",
          "signature": "evade",
          "summary": ""
        },
        {
          "name": "fbm3D",
          "kind": "re-export",
          "signature": "fbm3D",
          "summary": ""
        },
        {
          "name": "findPath",
          "kind": "re-export",
          "signature": "findPath",
          "summary": ""
        },
        {
          "name": "findPathInNavWorld",
          "kind": "re-export",
          "signature": "findPathInNavWorld",
          "summary": ""
        },
        {
          "name": "findPathOnGrid",
          "kind": "re-export",
          "signature": "findPathOnGrid",
          "summary": ""
        },
        {
          "name": "flee",
          "kind": "re-export",
          "signature": "flee",
          "summary": ""
        },
        {
          "name": "flock",
          "kind": "re-export",
          "signature": "flock",
          "summary": ""
        },
        {
          "name": "followScentTrail",
          "kind": "re-export",
          "signature": "followScentTrail",
          "summary": ""
        },
        {
          "name": "generateBezierColliders",
          "kind": "re-export",
          "signature": "generateBezierColliders",
          "summary": ""
        },
        {
          "name": "generateCaveColliders",
          "kind": "re-export",
          "signature": "generateCaveColliders",
          "summary": ""
        },
        {
          "name": "generateCollidersFromNetwork",
          "kind": "re-export",
          "signature": "generateCollidersFromNetwork",
          "summary": ""
        },
        {
          "name": "generateCollidersFromSDF",
          "kind": "re-export",
          "signature": "generateCollidersFromSDF",
          "summary": ""
        },
        {
          "name": "generateConvexMeshFromSDF",
          "kind": "re-export",
          "signature": "generateConvexMeshFromSDF",
          "summary": ""
        },
        {
          "name": "generateCurveColliders",
          "kind": "re-export",
          "signature": "generateCurveColliders",
          "summary": ""
        },
        {
          "name": "generateHollowConeColliders",
          "kind": "re-export",
          "signature": "generateHollowConeColliders",
          "summary": ""
        },
        {
          "name": "generateHollowTorusColliders",
          "kind": "re-export",
          "signature": "generateHollowTorusColliders",
          "summary": ""
        },
        {
          "name": "generateLineColliders",
          "kind": "re-export",
          "signature": "generateLineColliders",
          "summary": ""
        },
        {
          "name": "generateNoisyColliders",
          "kind": "re-export",
          "signature": "generateNoisyColliders",
          "summary": ""
        },
        {
          "name": "generatePipeNetworkColliders",
          "kind": "re-export",
          "signature": "generatePipeNetworkColliders",
          "summary": ""
        },
        {
          "name": "generateRockFieldColliders",
          "kind": "re-export",
          "signature": "generateRockFieldColliders",
          "summary": ""
        },
        {
          "name": "generateRockySphereColliders",
          "kind": "re-export",
          "signature": "generateRockySphereColliders",
          "summary": ""
        },
        {
          "name": "generateRootColliders",
          "kind": "re-export",
          "signature": "generateRootColliders",
          "summary": ""
        },
        {
          "name": "generateScatteredColliders",
          "kind": "re-export",
          "signature": "generateScatteredColliders",
          "summary": ""
        },
        {
          "name": "generateSplineColliders",
          "kind": "re-export",
          "signature": "generateSplineColliders",
          "summary": ""
        },
        {
          "name": "generateTerrainColliders",
          "kind": "re-export",
          "signature": "generateTerrainColliders",
          "summary": ""
        },
        {
          "name": "generateTreeColliders",
          "kind": "re-export",
          "signature": "generateTreeColliders",
          "summary": ""
        },
        {
          "name": "generateTunnelColliders",
          "kind": "re-export",
          "signature": "generateTunnelColliders",
          "summary": ""
        },
        {
          "name": "getArticulationLinkTransforms",
          "kind": "re-export",
          "signature": "getArticulationLinkTransforms",
          "summary": ""
        },
        {
          "name": "getLastKnownPosition",
          "kind": "re-export",
          "signature": "getLastKnownPosition",
          "summary": ""
        },
        {
          "name": "getNavGridVisualization",
          "kind": "re-export",
          "signature": "getNavGridVisualization",
          "summary": ""
        },
        {
          "name": "getOrCreateNavGrid",
          "kind": "re-export",
          "signature": "getOrCreateNavGrid",
          "summary": ""
        },
        {
          "name": "getPathSteering",
          "kind": "re-export",
          "signature": "getPathSteering",
          "summary": ""
        },
        {
          "name": "getPhysXJointCapabilities",
          "kind": "re-export",
          "signature": "getPhysXJointCapabilities",
          "summary": ""
        },
        {
          "name": "gridToWorld",
          "kind": "re-export",
          "signature": "gridToWorld",
          "summary": ""
        },
        {
          "name": "initColliderSpatialHash",
          "kind": "re-export",
          "signature": "initColliderSpatialHash",
          "summary": ""
        },
        {
          "name": "linearMotion",
          "kind": "re-export",
          "signature": "linearMotion",
          "summary": ""
        },
        {
          "name": "mulberry32",
          "kind": "re-export",
          "signature": "mulberry32",
          "summary": ""
        },
        {
          "name": "perlin3D",
          "kind": "re-export",
          "signature": "perlin3D",
          "summary": ""
        },
        {
          "name": "planeCollisionResponse",
          "kind": "re-export",
          "signature": "planeCollisionResponse",
          "summary": ""
        },
        {
          "name": "pointInAABB",
          "kind": "re-export",
          "signature": "pointInAABB",
          "summary": ""
        },
        {
          "name": "pointInSphere",
          "kind": "re-export",
          "signature": "pointInSphere",
          "summary": ""
        },
        {
          "name": "predictLanding",
          "kind": "re-export",
          "signature": "predictLanding",
          "summary": ""
        },
        {
          "name": "projectileMotion",
          "kind": "re-export",
          "signature": "projectileMotion",
          "summary": ""
        },
        {
          "name": "projectilePosition",
          "kind": "re-export",
          "signature": "projectilePosition",
          "summary": ""
        },
        {
          "name": "pursue",
          "kind": "re-export",
          "signature": "pursue",
          "summary": ""
        },
        {
          "name": "queryNearbyColliders",
          "kind": "re-export",
          "signature": "queryNearbyColliders",
          "summary": ""
        },
        {
          "name": "randomInSphere",
          "kind": "re-export",
          "signature": "randomInSphere",
          "summary": ""
        },
        {
          "name": "randomOnSphere",
          "kind": "re-export",
          "signature": "randomOnSphere",
          "summary": ""
        },
        {
          "name": "raycastWorld",
          "kind": "re-export",
          "signature": "raycastWorld",
          "summary": ""
        },
        {
          "name": "ridged3D",
          "kind": "re-export",
          "signature": "ridged3D",
          "summary": ""
        },
        {
          "name": "sdfBox3D",
          "kind": "re-export",
          "signature": "sdfBox3D",
          "summary": ""
        },
        {
          "name": "sdfCapsule",
          "kind": "re-export",
          "signature": "sdfCapsule",
          "summary": ""
        },
        {
          "name": "sdfCone",
          "kind": "re-export",
          "signature": "sdfCone",
          "summary": ""
        },
        {
          "name": "sdfCylinder",
          "kind": "re-export",
          "signature": "sdfCylinder",
          "summary": ""
        },
        {
          "name": "sdfIntersect",
          "kind": "re-export",
          "signature": "sdfIntersect",
          "summary": ""
        },
        {
          "name": "sdfOnion",
          "kind": "re-export",
          "signature": "sdfOnion",
          "summary": ""
        },
        {
          "name": "sdfSmoothUnion",
          "kind": "re-export",
          "signature": "sdfSmoothUnion",
          "summary": ""
        },
        {
          "name": "sdfSphere",
          "kind": "re-export",
          "signature": "sdfSphere",
          "summary": ""
        },
        {
          "name": "sdfSubtract",
          "kind": "re-export",
          "signature": "sdfSubtract",
          "summary": ""
        },
        {
          "name": "sdfTorus",
          "kind": "re-export",
          "signature": "sdfTorus",
          "summary": ""
        },
        {
          "name": "sdfUnion",
          "kind": "re-export",
          "signature": "sdfUnion",
          "summary": ""
        },
        {
          "name": "seek",
          "kind": "re-export",
          "signature": "seek",
          "summary": ""
        },
        {
          "name": "senseDanger",
          "kind": "re-export",
          "signature": "senseDanger",
          "summary": ""
        },
        {
          "name": "setAutoWeld",
          "kind": "re-export",
          "signature": "setAutoWeld",
          "summary": ""
        },
        {
          "name": "setRandomSeed",
          "kind": "re-export",
          "signature": "setRandomSeed",
          "summary": ""
        },
        {
          "name": "simplex3D",
          "kind": "re-export",
          "signature": "simplex3D",
          "summary": ""
        },
        {
          "name": "smellAt",
          "kind": "re-export",
          "signature": "smellAt",
          "summary": ""
        },
        {
          "name": "smoothPath",
          "kind": "re-export",
          "signature": "smoothPath",
          "summary": ""
        },
        {
          "name": "sphereAABB",
          "kind": "re-export",
          "signature": "sphereAABB",
          "summary": ""
        },
        {
          "name": "sphereCollisionResponse",
          "kind": "re-export",
          "signature": "sphereCollisionResponse",
          "summary": ""
        },
        {
          "name": "sphereSphere",
          "kind": "re-export",
          "signature": "sphereSphere",
          "summary": ""
        },
        {
          "name": "straightLine",
          "kind": "re-export",
          "signature": "straightLine",
          "summary": ""
        },
        {
          "name": "testAABBAABB",
          "kind": "re-export",
          "signature": "testAABBAABB",
          "summary": ""
        },
        {
          "name": "testSphereAABB",
          "kind": "re-export",
          "signature": "testSphereAABB",
          "summary": ""
        },
        {
          "name": "testSphereSphere",
          "kind": "re-export",
          "signature": "testSphereSphere",
          "summary": ""
        },
        {
          "name": "tickBehaviorTree",
          "kind": "re-export",
          "signature": "tickBehaviorTree",
          "summary": ""
        },
        {
          "name": "tickNode",
          "kind": "re-export",
          "signature": "tickNode",
          "summary": ""
        },
        {
          "name": "updateAIAgent",
          "kind": "re-export",
          "signature": "updateAIAgent",
          "summary": ""
        },
        {
          "name": "updateAIPerception",
          "kind": "re-export",
          "signature": "updateAIPerception",
          "summary": ""
        },
        {
          "name": "updateFlock",
          "kind": "re-export",
          "signature": "updateFlock",
          "summary": ""
        },
        {
          "name": "updateNavGridFromColliders",
          "kind": "re-export",
          "signature": "updateNavGridFromColliders",
          "summary": ""
        },
        {
          "name": "voronoi3D",
          "kind": "re-export",
          "signature": "voronoi3D",
          "summary": ""
        },
        {
          "name": "wander",
          "kind": "re-export",
          "signature": "wander",
          "summary": ""
        },
        {
          "name": "worldToGrid",
          "kind": "re-export",
          "signature": "worldToGrid",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorPhysicsSim",
      "path": "editor/reference/modules/EditorPhysicsSim.md",
      "source": "editor/js/modules/EditorPhysicsSim.js",
      "import": "/editor/js/modules/EditorPhysicsSim.js",
      "sourceHash": "78a1d8ac11b0233db08531ed42d155eaf8764a7000fdaa17cfd8be833dacf68e",
      "summary": "EditorPhysicsSim.js - Physics Simulation Management for Editor Manages rope, wire, hair, cloth, and soft body simulations in the editor. Uses PBD solver with OGC contact model for penetration-free simulation.",
      "exports": [
        {
          "name": "initRopeSimulation",
          "kind": "function",
          "signature": "initRopeSimulation(editor, entityId, position, opts)",
          "summary": "Initialize rope simulation for an entity"
        },
        {
          "name": "initRopeSimulationBetweenPoints",
          "kind": "function",
          "signature": "initRopeSimulationBetweenPoints(editor, entityId, startPos, endPos, opts)",
          "summary": "Initialize rope simulation between two points (for tool-created ropes)"
        },
        {
          "name": "initRopeSimulationFromComponent",
          "kind": "function",
          "signature": "initRopeSimulationFromComponent(editor, entityId)",
          "summary": ""
        },
        {
          "name": "initPhysXRopeSimulation",
          "kind": "function",
          "signature": "initPhysXRopeSimulation(editor, entityId, startPos, endPos, opts)",
          "summary": "Initialize PhysX articulation-based rope simulation Uses NVIDIA PhysX for more stable, unified physics simulation"
        },
        {
          "name": "initGPURopeSimulation",
          "kind": "function",
          "signature": "initGPURopeSimulation(editor, entityId, startPos, endPos, opts)",
          "summary": "Initialize GPU-based rope simulation using unified particle system Uses GPU constraint solver for native rope physics (Phase 2)"
        },
        {
          "name": "initWireSimulation",
          "kind": "function",
          "signature": "initWireSimulation(editor, entityId, position, opts)",
          "summary": ""
        },
        {
          "name": "initHairSimulation",
          "kind": "function",
          "signature": "initHairSimulation(editor, entityId, position, opts)",
          "summary": ""
        },
        {
          "name": "initChainSimulation",
          "kind": "function",
          "signature": "initChainSimulation(editor, entityId, position, opts)",
          "summary": ""
        },
        {
          "name": "initClothSimulation",
          "kind": "function",
          "signature": "async initClothSimulation(editor, entityId, position, opts)",
          "summary": ""
        },
        {
          "name": "initSoftBodySimulation",
          "kind": "function",
          "signature": "initSoftBodySimulation(editor, entityId, position, opts)",
          "summary": ""
        },
        {
          "name": "initSoftBodyFromMesh",
          "kind": "function",
          "signature": "async initSoftBodyFromMesh(editor, entityId, meshPositions, meshIndices, opts = {})",
          "summary": "Initialize a soft body from an arbitrary surface mesh using AutoTetMesh. Converts the surface mesh to a tetrahedral volume mesh, then creates PBD particles and constraints from the tet nodes."
        },
        {
          "name": "initBalloonSimulation",
          "kind": "function",
          "signature": "initBalloonSimulation(editor, entityId, position, opts)",
          "summary": "Initialize balloon simulation (pressure-based soft body)"
        },
        {
          "name": "initFluidSimulation",
          "kind": "function",
          "signature": "initFluidSimulation(editor, entityId, position, opts)",
          "summary": "Initialize fluid simulation (SPH density-based)"
        },
        {
          "name": "stepPhysicsSimulations",
          "kind": "function",
          "signature": "stepPhysicsSimulations(editor, dt)",
          "summary": "Step all physics simulations"
        },
        {
          "name": "syncSimulationsToComponents",
          "kind": "function",
          "signature": "syncSimulationsToComponents(editor)",
          "summary": "Sync all active simulation particle data to ECS components. Call this before saving the scene to ensure particles are persisted."
        },
        {
          "name": "initTwistedRopeSimulation",
          "kind": "function",
          "signature": "initTwistedRopeSimulation(editor, entityId, startPos, endPos, opts = {})",
          "summary": "Initialize a twisted rope simulation with multiple threads Creates helical thread arrangement that twists together like real rope fibers"
        },
        {
          "name": "destroyPhysicsSimulation",
          "kind": "function",
          "signature": "destroyPhysicsSimulation(editor, entityId, options = {})",
          "summary": "Destroy a physics simulation."
        },
        {
          "name": "updateRopeForAnchorMove",
          "kind": "function",
          "signature": "updateRopeForAnchorMove(editor, ropeEntityId)",
          "summary": ""
        },
        {
          "name": "updateRopesForEntityMove",
          "kind": "function",
          "signature": "updateRopesForEntityMove(editor, movedEntityId)",
          "summary": "Check all ropes that are attached to a given entity and update them. Call this when an entity's transform changes in edit mode."
        },
        {
          "name": "setupPhysicsSim",
          "kind": "function",
          "signature": "setupPhysicsSim(editor)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorPointCloud",
      "path": "editor/reference/modules/EditorPointCloud.md",
      "source": "editor/js/modules/EditorPointCloud.js",
      "import": "/editor/js/modules/EditorPointCloud.js",
      "sourceHash": "f3a03b54c3fb686b110725b8d33341df54fb0f2587163fbecc495b1970faed3f",
      "summary": "============================================================================ EditorPointCloud.js — Point cloud entity management  Handles spawning point cloud entities from asset files (PLY/PCD/XYZ), managing the PointCloud component, and bridging to the EntityMeshRenderer point-sprite render pass. ============================================================================",
      "exports": [
        {
          "name": "spawnPointCloudAsset",
          "kind": "function",
          "signature": "async spawnPointCloudAsset(editor, asset)",
          "summary": "Load a point cloud asset, parse it, and create an entity in the scene."
        },
        {
          "name": "spawnPointCloudEntity",
          "kind": "function",
          "signature": "spawnPointCloudEntity(editor, pcData, opts = {})",
          "summary": "Create a point cloud entity from raw point data."
        },
        {
          "name": "unregisterPointCloud",
          "kind": "function",
          "signature": "unregisterPointCloud(editor, entityId)",
          "summary": "Unregister a point cloud entity from the renderer."
        },
        {
          "name": "getPointCloudData",
          "kind": "function",
          "signature": "getPointCloudData(editor, entityId)",
          "summary": "Get point cloud data for an entity (reads PointCloud component)."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorScene",
      "path": "editor/reference/modules/EditorScene.md",
      "source": "editor/js/modules/EditorScene.js",
      "import": "/editor/js/modules/EditorScene.js",
      "sourceHash": "4ba84c30c28325f8e9d73656ca97c42d1e2fd070ea24db7f408b7fcd702225fb",
      "summary": "Get all entities in a welded group (parent + all children) If the entity is a child, finds its parent and returns the whole group If the entity is a parent, returns itself + all children If not welded, returns just the entity",
      "exports": [
        {
          "name": "createEntity",
          "kind": "function",
          "signature": "createEntity(editor, name = 'Entity', options = {})",
          "summary": ""
        },
        {
          "name": "selectEntity",
          "kind": "function",
          "signature": "selectEntity(editor, entityId)",
          "summary": ""
        },
        {
          "name": "getWeldedGroup",
          "kind": "function",
          "signature": "getWeldedGroup(editor, entityId)",
          "summary": "Get all entities in a welded group (parent + all children) If the entity is a child, finds its parent and returns the whole group If the entity is a parent, returns itself + all children If not welded, returns just the entity"
        },
        {
          "name": "deleteEntity",
          "kind": "function",
          "signature": "async deleteEntity(editor, entityId)",
          "summary": ""
        },
        {
          "name": "createFolder",
          "kind": "function",
          "signature": "createFolder(editor, name = 'New Folder', parentId = null)",
          "summary": ""
        },
        {
          "name": "setFolderParent",
          "kind": "function",
          "signature": "setFolderParent(editor, folderId, parentId)",
          "summary": ""
        },
        {
          "name": "renameEntity",
          "kind": "function",
          "signature": "renameEntity(editor, entityId, newName)",
          "summary": ""
        },
        {
          "name": "renameFolder",
          "kind": "function",
          "signature": "renameFolder(editor, folderId, newName)",
          "summary": ""
        },
        {
          "name": "deleteFolder",
          "kind": "function",
          "signature": "deleteFolder(editor, folderId)",
          "summary": ""
        },
        {
          "name": "setEntityParent",
          "kind": "function",
          "signature": "setEntityParent(editor, entityId, parentId)",
          "summary": ""
        },
        {
          "name": "moveEntityToFolder",
          "kind": "function",
          "signature": "moveEntityToFolder(editor, entityId, folderId)",
          "summary": ""
        },
        {
          "name": "captureWorldSnapshot",
          "kind": "function",
          "signature": "captureWorldSnapshot(editor)",
          "summary": ""
        },
        {
          "name": "captureWorldSnapshotDelta",
          "kind": "function",
          "signature": "captureWorldSnapshotDelta(editor)",
          "summary": ""
        },
        {
          "name": "restoreWorldSnapshot",
          "kind": "function",
          "signature": "restoreWorldSnapshot(editor, snapshot)",
          "summary": ""
        },
        {
          "name": "loadScene",
          "kind": "function",
          "signature": "async loadScene(editor, scenePath)",
          "summary": ""
        },
        {
          "name": "saveScene",
          "kind": "function",
          "signature": "async saveScene(editor)",
          "summary": ""
        },
        {
          "name": "cleanupInvalidEntities",
          "kind": "function",
          "signature": "cleanupInvalidEntities(editor, intervalMs = 1000)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorSettings",
      "path": "editor/reference/modules/EditorSettings.md",
      "source": "editor/js/modules/EditorSettings.js",
      "import": "/editor/js/modules/EditorSettings.js",
      "sourceHash": "64488e796fd27229ba052fac79f30e4a6f0a6d2154a85487ae43f3b595b327dd",
      "summary": "EditorSettings.js - Global Editor Settings with Persistence Features: - Centralized settings management - localStorage persistence - Settings UI with categories/tabs - Live preview of changes",
      "exports": [
        {
          "name": "showSettingsDialog",
          "kind": "function",
          "signature": "showSettingsDialog()",
          "summary": ""
        },
        {
          "name": "editorSettings",
          "kind": "constant",
          "signature": "editorSettings",
          "summary": ""
        },
        {
          "name": "DEFAULT_SETTINGS",
          "kind": "re-export",
          "signature": "DEFAULT_SETTINGS",
          "summary": ""
        },
        {
          "name": "SETTINGS_METADATA",
          "kind": "re-export",
          "signature": "SETTINGS_METADATA",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorSpawnMenu",
      "path": "editor/reference/modules/EditorSpawnMenu.md",
      "source": "editor/js/modules/EditorSpawnMenu.js",
      "import": "/editor/js/modules/EditorSpawnMenu.js",
      "sourceHash": "1e434a69cf2af629f3ad5efecd698e3e785f3e9aa9377fa7ea6a4ef3de578e70",
      "summary": "",
      "exports": [
        {
          "name": "setupSpawnMenu",
          "kind": "function",
          "signature": "setupSpawnMenu(editor)",
          "summary": ""
        },
        {
          "name": "renderSpawnCategories",
          "kind": "function",
          "signature": "renderSpawnCategories(editor)",
          "summary": ""
        },
        {
          "name": "renderSpawnGrid",
          "kind": "function",
          "signature": "renderSpawnGrid(editor)",
          "summary": ""
        },
        {
          "name": "spawnFromMenu",
          "kind": "function",
          "signature": "spawnFromMenu(editor, item)",
          "summary": ""
        },
        {
          "name": "createEmitter",
          "kind": "function",
          "signature": "createEmitter(editor, markerEntityId, type = 'gas')",
          "summary": ""
        },
        {
          "name": "getEmitterColor",
          "kind": "function",
          "signature": "getEmitterColor(type)",
          "summary": ""
        },
        {
          "name": "toggleSpawnMenu",
          "kind": "function",
          "signature": "toggleSpawnMenu(editor)",
          "summary": ""
        },
        {
          "name": "openSpawnMenu",
          "kind": "function",
          "signature": "openSpawnMenu(editor)",
          "summary": ""
        },
        {
          "name": "closeSpawnMenu",
          "kind": "function",
          "signature": "closeSpawnMenu(editor)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorTools",
      "path": "editor/reference/modules/EditorTools.md",
      "source": "editor/js/modules/EditorTools.js",
      "import": "/editor/js/modules/EditorTools.js",
      "sourceHash": "32096585bb4126a4ff0bd2c6500b8c8b9633c3ae11ba61a817ae96d1f1b8681e",
      "summary": "EditorTools.js - GMod-style Tool System Manages interactive tools like chain tool, weld tool, constraint tool. Tools are activated from spawn menu and handle click events in viewport.",
      "exports": [
        {
          "name": "ToolManager",
          "kind": "class",
          "signature": "class ToolManager",
          "summary": ""
        },
        {
          "name": "setupTools",
          "kind": "function",
          "signature": "setupTools(editor)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorTransitions",
      "path": "editor/reference/modules/EditorTransitions.md",
      "source": "editor/js/modules/EditorTransitions.js",
      "import": "/editor/js/modules/EditorTransitions.js",
      "sourceHash": "cbc2634692fd4b08241eade27eb6796d12a9656b03268f9f02d65f2eadffdd86",
      "summary": "EditorTransitions.js - Transition Effects System Features: - Multiple transition effects (fade, dissolve, pixelate, wipe, zoom, etc.) - Canvas-based effects for complex transitions - Random effect selection - Configurable duration and easing - Can be used for dialogs, scenes, or any UI element",
      "exports": [
        {
          "name": "transitions",
          "kind": "constant",
          "signature": "transitions",
          "summary": ""
        },
        {
          "name": "EASINGS",
          "kind": "re-export",
          "signature": "EASINGS",
          "summary": ""
        },
        {
          "name": "TRANSITIONS",
          "kind": "re-export",
          "signature": "TRANSITIONS",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorUI",
      "path": "editor/reference/modules/EditorUI.md",
      "source": "editor/js/modules/EditorUI.js",
      "import": "/editor/js/modules/EditorUI.js",
      "sourceHash": "db12507910225fd10e28fa70c6c7d8dc5f3a61b78fc90657c76b20e23815140f",
      "summary": "============================================================================ EditorUI.js - UI Setup and Menu Handling ============================================================================",
      "exports": [
        {
          "name": "showPrompt",
          "kind": "function",
          "signature": "showPrompt(title, message, defaultValue = '')",
          "summary": "Show a custom prompt dialog"
        },
        {
          "name": "showConfirm",
          "kind": "function",
          "signature": "showConfirm(title, message, options = {})",
          "summary": "Show a custom confirm dialog"
        },
        {
          "name": "showAlert",
          "kind": "function",
          "signature": "showAlert(title, message)",
          "summary": "Show a custom alert dialog"
        },
        {
          "name": "setupInspectorTabs",
          "kind": "function",
          "signature": "setupInspectorTabs(editor)",
          "summary": ""
        },
        {
          "name": "setupResizablePanels",
          "kind": "function",
          "signature": "setupResizablePanels(editor)",
          "summary": ""
        },
        {
          "name": "setupConsoleResize",
          "kind": "function",
          "signature": "setupConsoleResize(editor, saveSizes)",
          "summary": ""
        },
        {
          "name": "setupToolbar",
          "kind": "function",
          "signature": "setupToolbar(editor)",
          "summary": ""
        },
        {
          "name": "setupSceneSelector",
          "kind": "function",
          "signature": "setupSceneSelector(editor)",
          "summary": "Setup scene selector dropdown in viewport header"
        },
        {
          "name": "refreshSceneSelector",
          "kind": "function",
          "signature": "async refreshSceneSelector(editor)",
          "summary": "Refresh scene selector with available scenes"
        },
        {
          "name": "setupViewportToolbar",
          "kind": "function",
          "signature": "setupViewportToolbar(editor)",
          "summary": ""
        },
        {
          "name": "updateToolbarState",
          "kind": "function",
          "signature": "updateToolbarState(editor)",
          "summary": ""
        },
        {
          "name": "handleMenuAction",
          "kind": "function",
          "signature": "async handleMenuAction(editor, action)",
          "summary": ""
        },
        {
          "name": "setupTimelineScrubbing",
          "kind": "function",
          "signature": "setupTimelineScrubbing(editor)",
          "summary": ""
        },
        {
          "name": "updateTimelineUI",
          "kind": "function",
          "signature": "updateTimelineUI(editor, skipMarkers = false)",
          "summary": ""
        },
        {
          "name": "setupBottomTabs",
          "kind": "function",
          "signature": "setupBottomTabs(editor)",
          "summary": ""
        },
        {
          "name": "setupConsole",
          "kind": "function",
          "signature": "setupConsole(editor)",
          "summary": ""
        },
        {
          "name": "addConsoleLine",
          "kind": "function",
          "signature": "addConsoleLine(editor, type, text)",
          "summary": ""
        },
        {
          "name": "isTypingInUi",
          "kind": "function",
          "signature": "isTypingInUi()",
          "summary": ""
        },
        {
          "name": "showContextMenu",
          "kind": "re-export",
          "signature": "showContextMenu",
          "summary": ""
        },
        {
          "name": "toast",
          "kind": "re-export",
          "signature": "toast",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorUIComponents",
      "path": "editor/reference/modules/EditorUIComponents.md",
      "source": "editor/js/modules/EditorUIComponents.js",
      "import": "/editor/js/modules/EditorUIComponents.js",
      "sourceHash": "04f1f44a2520ebb1afaa4d136175eb50c1041d1c3175556256ae786ea045b2ce",
      "summary": "Show a toast notification",
      "exports": [
        {
          "name": "showToast",
          "kind": "function",
          "signature": "showToast(message, options = {})",
          "summary": "Show a toast notification"
        },
        {
          "name": "setTheme",
          "kind": "function",
          "signature": "setTheme(themeName)",
          "summary": "Apply a theme by name - delegates to themeManager"
        },
        {
          "name": "getCurrentTheme",
          "kind": "function",
          "signature": "getCurrentTheme()",
          "summary": "Get current theme name"
        },
        {
          "name": "getThemes",
          "kind": "function",
          "signature": "getThemes()",
          "summary": "Get all available themes"
        },
        {
          "name": "initTheme",
          "kind": "function",
          "signature": "initTheme()",
          "summary": "Initialize theme from localStorage"
        },
        {
          "name": "showThemePicker",
          "kind": "function",
          "signature": "showThemePicker()",
          "summary": "Show theme picker dialog with categories"
        },
        {
          "name": "showContextMenu",
          "kind": "function",
          "signature": "showContextMenu(event, items)",
          "summary": "Show a custom context menu"
        },
        {
          "name": "hideContextMenu",
          "kind": "function",
          "signature": "hideContextMenu()",
          "summary": ""
        },
        {
          "name": "initTooltips",
          "kind": "function",
          "signature": "initTooltips()",
          "summary": "Initialize tooltip system"
        },
        {
          "name": "showShortcutsHelp",
          "kind": "function",
          "signature": "showShortcutsHelp()",
          "summary": "Show keyboard shortcuts overlay"
        },
        {
          "name": "initUIComponents",
          "kind": "function",
          "signature": "initUIComponents()",
          "summary": ""
        },
        {
          "name": "toast",
          "kind": "constant",
          "signature": "toast",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EditorWelding",
      "path": "editor/reference/modules/EditorWelding.md",
      "source": "editor/js/modules/EditorWelding.js",
      "import": "/editor/js/modules/EditorWelding.js",
      "sourceHash": "73359e558661f8e3f890de8cc23a17e4484ad7e2bf061ff4de7cd1b5ddb4fa5b",
      "summary": "EditorWelding.js - Auto-weld system for physics bodies Extracted from EditorPhysics.js for modularity Features: - Auto-weld colliding bodies into rigid compounds - D6 joint-based welding with PhysX optimizations - ECS component persistence for scene save/load - Emitter weld pre-scanning",
      "exports": [
        {
          "name": "createFixedJoint",
          "kind": "function",
          "signature": "createFixedJoint(editor, bodyA, bodyB, entityB)",
          "summary": "Create a fixed joint between two bodies Uses D6 joint locked in all axes with PhysX optimizations"
        },
        {
          "name": "restoreWeldsFromComponents",
          "kind": "function",
          "signature": "restoreWeldsFromComponents(editor)",
          "summary": "Restore welds from WeldConstraint components (for scene load)"
        },
        {
          "name": "performInitialWelding",
          "kind": "function",
          "signature": "performInitialWelding(editor)",
          "summary": "Perform initial welding of nearby bodies before simulation starts. Graph-based approach: 1. Filter eligible entities (skip ragdolls, skinned meshes, spheres/capsules) 2. Find all directly-touching pairs via AABB overlap 3. Create joints for each touching pair 4. detectWeldGroups (called after) finds connected components from joints Spheres and capsules are excluded because they are projectiles/characters, not structural elements. Only box/convexMesh entities form weldable structures."
        },
        {
          "name": "setAutoWeld",
          "kind": "function",
          "signature": "setAutoWeld(editor, enabled)",
          "summary": "Enable/disable auto-welding of colliding bodies"
        },
        {
          "name": "processWeldContacts",
          "kind": "function",
          "signature": "processWeldContacts(editor)",
          "summary": "Process potential welds by checking body proximity (runtime)"
        },
        {
          "name": "clearAllWelds",
          "kind": "function",
          "signature": "clearAllWelds(editor)",
          "summary": "Break all welds and reset"
        },
        {
          "name": "preScanEmitterWelds",
          "kind": "function",
          "signature": "preScanEmitterWelds(editor)",
          "summary": "Pre-scan to detect which emitters should be welded based on AABB surface proximity. Uses entity scale and physics body extents to compute surface-to-surface distance, so emitters touching any face of a large/tall object get welded correctly."
        },
        {
          "name": "detectWeldGroups",
          "kind": "function",
          "signature": "detectWeldGroups(editor)",
          "summary": "Detect connected components of welded entities (weld groups). Runs AFTER performInitialWelding — uses editor.weldParentChildren + weldJoints. Outputs stored on editor: weldGroups: Map<rootEntityId, Set<memberEntityIds>>  (root included in set) weldChildToRoot: Map<childEntityId, rootEntityId>    (O(1) render skip) weldGroupLocalTransforms: Map<entityId, {localPos, localRot, localScale}>"
        },
        {
          "name": "buildWeldGroupMeshes",
          "kind": "function",
          "signature": "buildWeldGroupMeshes(editor, entityMeshRenderer, inferMeshTypeFn)",
          "summary": "Build merged meshes for each weld group and register them with EntityMeshRenderer. Follows Unity CombineMeshes pattern: transform child vertices into root's local space. Also stores per-member mesh segment info for per-frame vertex updates."
        },
        {
          "name": "syncWeldedEntities",
          "kind": "function",
          "signature": "syncWeldedEntities(editor, rotateVectorByQuatFn)",
          "summary": "Sync welded child entity transforms to their parent bodies Called from stepPhysics loop"
        },
        {
          "name": "rotateVectorByQuat",
          "kind": "re-export",
          "signature": "rotateVectorByQuat",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/EntitySchema",
      "path": "editor/reference/modules/EntitySchema.md",
      "source": "editor/js/modules/EntitySchema.js",
      "import": "/editor/js/modules/EntitySchema.js",
      "sourceHash": "9075a367d2be34df865573d3fb839aab0817e1be22ba69790ace78085e9e65c5",
      "summary": "Generate a full JSON schema for an entity",
      "exports": [
        {
          "name": "generateEntitySchema",
          "kind": "function",
          "signature": "generateEntitySchema(editor, entityId)",
          "summary": "Generate a full JSON schema for an entity"
        },
        {
          "name": "generateSceneSchema",
          "kind": "function",
          "signature": "generateSceneSchema(editor)",
          "summary": "Generate schemas for all entities in the scene"
        },
        {
          "name": "exportSceneToJSON",
          "kind": "function",
          "signature": "exportSceneToJSON(editor, pretty = true)",
          "summary": "Export scene schema to JSON string"
        },
        {
          "name": "debugEntitySchema",
          "kind": "function",
          "signature": "debugEntitySchema(editor, entityId)",
          "summary": "Print entity schema to console (for debugging)"
        },
        {
          "name": "debugSceneSchema",
          "kind": "function",
          "signature": "debugSceneSchema(editor)",
          "summary": "Print full scene schema to console (for debugging)"
        },
        {
          "name": "getRelationshipSummary",
          "kind": "function",
          "signature": "getRelationshipSummary(editor, entityId)",
          "summary": "Get a summary of entity relationships"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/GeometryBuilders",
      "path": "editor/reference/modules/GeometryBuilders.md",
      "source": "editor/js/modules/GeometryBuilders.js",
      "import": "/editor/js/modules/GeometryBuilders.js",
      "sourceHash": "a1c318aeafa8252015706b6eb5c40a20a1a5fa7d03904b1158970f4670ac0274",
      "summary": "GeometryBuilders.js - Procedural geometry generation for physics colliders Extracted from EditorPhysics.js for modularity",
      "exports": [
        {
          "name": "createWedgeGeometry",
          "kind": "function",
          "signature": "createWedgeGeometry()",
          "summary": "Create wedge/ramp geometry - flat bottom, sloped top"
        },
        {
          "name": "createPrismGeometry",
          "kind": "function",
          "signature": "createPrismGeometry()",
          "summary": "Create hexagonal prism geometry"
        },
        {
          "name": "createStairsGeometry",
          "kind": "function",
          "signature": "createStairsGeometry()",
          "summary": "Create stairs geometry (4 steps)"
        },
        {
          "name": "createArchGeometry",
          "kind": "function",
          "signature": "createArchGeometry()",
          "summary": "Create arch geometry with legs and curved top"
        },
        {
          "name": "createHelixGeometry",
          "kind": "function",
          "signature": "createHelixGeometry()",
          "summary": "Create helix/spring geometry"
        },
        {
          "name": "createGearGeometry",
          "kind": "function",
          "signature": "createGearGeometry()",
          "summary": "Create gear geometry with teeth"
        },
        {
          "name": "createStarGeometry",
          "kind": "function",
          "signature": "createStarGeometry()",
          "summary": "Create 5-point star geometry"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/HotkeyManager",
      "path": "editor/reference/modules/HotkeyManager.md",
      "source": "editor/js/modules/HotkeyManager.js",
      "import": "/editor/js/modules/HotkeyManager.js",
      "sourceHash": "c134ea2f1ecafdb513b204b761cee9edc47377d43af5597634f0e5c0dd9aa21a",
      "summary": "HotkeyManager.js - Centralized Hotkey System with YAML-style Configuration Features: - Centralized hotkey definitions - Easy configuration via config object (YAML-style) - Runtime hotkey rebinding - Hotkey editor UI - localStorage persistence for custom bindings - Conflict detection",
      "exports": [
        {
          "name": "showHotkeyEditor",
          "kind": "function",
          "signature": "showHotkeyEditor()",
          "summary": ""
        },
        {
          "name": "DEFAULT_HOTKEYS",
          "kind": "re-export",
          "signature": "DEFAULT_HOTKEYS",
          "summary": ""
        },
        {
          "name": "hotkeyManager",
          "kind": "re-export",
          "signature": "hotkeyManager",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/LoadingManager",
      "path": "editor/reference/modules/LoadingManager.md",
      "source": "editor/js/modules/LoadingManager.js",
      "import": "/editor/js/modules/LoadingManager.js",
      "sourceHash": "50cda92dbe845c1833c7a286b8e8241b932b65df03453c7964b6db79878964c5",
      "summary": "LoadingManager.js - Advanced loading system with progress tracking Manages dynamic loading of editor components with real progress, stage tracking, and a polished loading screen UI.",
      "exports": [
        {
          "name": "LoadingManager",
          "kind": "class",
          "signature": "class LoadingManager",
          "summary": "LoadingManager - Tracks and displays loading progress"
        },
        {
          "name": "getLoadingManager",
          "kind": "function",
          "signature": "getLoadingManager()",
          "summary": ""
        },
        {
          "name": "loadingStage",
          "kind": "function",
          "signature": "loadingStage(stageId, subtitle = '')",
          "summary": ""
        },
        {
          "name": "loadingProgress",
          "kind": "function",
          "signature": "loadingProgress(progress)",
          "summary": ""
        },
        {
          "name": "loadingComplete",
          "kind": "function",
          "signature": "loadingComplete(stageId)",
          "summary": ""
        },
        {
          "name": "loadingFinish",
          "kind": "function",
          "signature": "loadingFinish()",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/ModelImporter",
      "path": "editor/reference/modules/ModelImporter.md",
      "source": "editor/js/modules/ModelImporter.js",
      "import": "/editor/js/modules/ModelImporter.js",
      "sourceHash": "3729d7852026829e792ba1b102941908c8965d475d84c88e09f2ed7f6cad7e18",
      "summary": "============================================================================ ModelImporter.js - OBJ / glTF / GLB parsers + entity spawning ============================================================================",
      "exports": [
        {
          "name": "parseModelFile",
          "kind": "function",
          "signature": "async parseModelFile(file)",
          "summary": "Parse a model File into geometry data."
        },
        {
          "name": "parsePointCloudFile",
          "kind": "function",
          "signature": "async parsePointCloudFile(file)",
          "summary": "Parse a point cloud file into point data."
        },
        {
          "name": "parseOBJ",
          "kind": "function",
          "signature": "parseOBJ(text)",
          "summary": "Parse Wavefront OBJ text into indexed geometry. Handles v, vn, vt, f directives. Triangulates quads."
        },
        {
          "name": "parseGLB",
          "kind": "function",
          "signature": "parseGLB(arrayBuffer, modelName)",
          "summary": "Parse a GLB (binary glTF 2.0) ArrayBuffer. Extracts all mesh primitives as flat position/normal/uv/index arrays."
        },
        {
          "name": "parseGLTFJson",
          "kind": "function",
          "signature": "parseGLTFJson(gltf, binBuffer, modelName)",
          "summary": "Parse glTF JSON + optional binary buffer into mesh geometries."
        },
        {
          "name": "extractGLTFNodeAnimationGraph",
          "kind": "function",
          "signature": "extractGLTFNodeAnimationGraph(gltf)",
          "summary": ""
        },
        {
          "name": "collectGLTFNodeInstances",
          "kind": "function",
          "signature": "collectGLTFNodeInstances(gltf, suppliedGraph = null)",
          "summary": ""
        },
        {
          "name": "createModelInstanceId",
          "kind": "function",
          "signature": "createModelInstanceId()",
          "summary": ""
        },
        {
          "name": "createModelPartDescriptors",
          "kind": "function",
          "signature": "createModelPartDescriptors(result, assetId, instanceId, existingParts = null)",
          "summary": ""
        },
        {
          "name": "computeModelBounds",
          "kind": "function",
          "signature": "computeModelBounds(result)",
          "summary": ""
        },
        {
          "name": "registerModelRuntimeMaterials",
          "kind": "function",
          "signature": "async registerModelRuntimeMaterials(editor, result, parts)",
          "summary": ""
        },
        {
          "name": "registerModelRuntimeMeshes",
          "kind": "function",
          "signature": "async registerModelRuntimeMeshes(editor, result, parts, modelInstanceId = null, modelAnimation = null, modelMorphWeights = null,)",
          "summary": ""
        },
        {
          "name": "spawnModelAsset",
          "kind": "function",
          "signature": "async spawnModelAsset(editor, asset)",
          "summary": "Load a model asset, register its mesh, and create an entity in the scene."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/PrefabLibrary",
      "path": "editor/reference/modules/PrefabLibrary.md",
      "source": "editor/js/modules/PrefabLibrary.js",
      "import": "/editor/js/modules/PrefabLibrary.js",
      "sourceHash": "cb7cf17ba1d40b8ac2a95a69e559b0fdff30b9e0eafc56523c134e4a4b6f8dce",
      "summary": "PrefabManager.js - Folder-based Prefab System (File-based) Based on J:\\game2 implementation - proper file persistence Every entity folder is a prefab that can be: - Exported to Assets/Prefabs/*.prefab.json - Imported/instantiated into any scene - Updated (re-export overwrites) - Listed and browsed",
      "exports": [
        {
          "name": "exportFolderAsPrefab",
          "kind": "function",
          "signature": "exportFolderAsPrefab(editor, folderId)",
          "summary": "Export a folder as a prefab data structure"
        },
        {
          "name": "setCollabPrefabHooks",
          "kind": "function",
          "signature": "setCollabPrefabHooks(onSave, onDelete)",
          "summary": ""
        },
        {
          "name": "savePrefabToFile",
          "kind": "function",
          "signature": "async savePrefabToFile(editor, prefab)",
          "summary": "Save prefab to Assets/Prefabs/ directory"
        },
        {
          "name": "exportFolder",
          "kind": "function",
          "signature": "async exportFolder(editor, folderId)",
          "summary": "Export folder and save to file (combined operation)"
        },
        {
          "name": "listPrefabs",
          "kind": "function",
          "signature": "async listPrefabs(editor)",
          "summary": "List all available prefabs in Assets/Prefabs/"
        },
        {
          "name": "loadPrefabFile",
          "kind": "function",
          "signature": "async loadPrefabFile(editor, fileName)",
          "summary": "Load prefab from file"
        },
        {
          "name": "loadPrefabByUUID",
          "kind": "function",
          "signature": "async loadPrefabByUUID(editor, uuid)",
          "summary": "Load prefab by UUID"
        },
        {
          "name": "instantiatePrefab",
          "kind": "function",
          "signature": "instantiatePrefab(editor, prefab, targetFolderId = null, offset = [0, 0, 0])",
          "summary": "Instantiate a prefab in the scene"
        },
        {
          "name": "importPrefab",
          "kind": "function",
          "signature": "async importPrefab(editor, fileName, targetFolderId = null, offset = [0, 0, 0])",
          "summary": "Import prefab from file and instantiate"
        },
        {
          "name": "deletePrefab",
          "kind": "function",
          "signature": "async deletePrefab(editor, fileName)",
          "summary": "Delete prefab file"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/ProjectStorage",
      "path": "editor/reference/modules/ProjectStorage.md",
      "source": "editor/js/modules/ProjectStorage.js",
      "import": "/editor/js/modules/ProjectStorage.js",
      "sourceHash": "b412f8d2437921bce22b46c044e8b11da0435b6e755c38412420b103d96bd690",
      "summary": "ProjectManager - Save/load/export projects (pure browser, no Node.js) Uses IndexedDB + File System Access API",
      "exports": [
        {
          "name": "setCollabSaveHook",
          "kind": "function",
          "signature": "setCollabSaveHook(fn)",
          "summary": ""
        },
        {
          "name": "saveProject",
          "kind": "function",
          "signature": "async saveProject(project)",
          "summary": "Save project to IndexedDB"
        },
        {
          "name": "loadProject",
          "kind": "function",
          "signature": "async loadProject(projectUuid)",
          "summary": "Load project from IndexedDB"
        },
        {
          "name": "listProjects",
          "kind": "function",
          "signature": "async listProjects()",
          "summary": "List all projects"
        },
        {
          "name": "deleteProject",
          "kind": "function",
          "signature": "async deleteProject(projectUuid)",
          "summary": "Delete project"
        },
        {
          "name": "getLastProjectUuid",
          "kind": "function",
          "signature": "getLastProjectUuid()",
          "summary": "Get last opened project UUID"
        },
        {
          "name": "createProject",
          "kind": "function",
          "signature": "createProject(name = 'New Project')",
          "summary": "Create new project"
        },
        {
          "name": "exportProject",
          "kind": "function",
          "signature": "async exportProject(project, options = {})",
          "summary": "Export project to ZIP for distribution Strips editor-only data and packs for runtime"
        },
        {
          "name": "downloadProjectBackup",
          "kind": "function",
          "signature": "async downloadProjectBackup(project)",
          "summary": "Download project as JSON file (backup)"
        },
        {
          "name": "importProjectFromFile",
          "kind": "function",
          "signature": "async importProjectFromFile(file)",
          "summary": "Import project from JSON file"
        },
        {
          "name": "enableAutoSave",
          "kind": "function",
          "signature": "enableAutoSave(project, intervalMs = 60000)",
          "summary": ""
        },
        {
          "name": "disableAutoSave",
          "kind": "function",
          "signature": "disableAutoSave()",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "modules/SubScene",
      "path": "editor/reference/modules/SubScene.md",
      "source": "editor/js/modules/SubScene.js",
      "import": "/editor/js/modules/SubScene.js",
      "sourceHash": "c4a015897c6e42b368c893ce975b6c0ff9803833c5a63f787bc5acad715bb79d",
      "summary": "============================================================================ SubScene.js — Parallel scene layer for debris, fragments & world environment  Lives alongside the editor scene but is NOT part of it. Objects here: - Are NOT in editor.scene.entities - Are NOT selectable, saveable, or undoable - Have their own PhysX bodies for physics simulation - Are rendered via EntityMeshRenderer in a dedicated pass - Have automatic lifecycle (fade, expire, cleanup)  Categories: 'debris'   — tiny short-lived particles (dust, sparks, splinters) 'fragment' — larger breakoff chunks from fractured meshes 'env'      — persistent world environment objects (no auto-expire)  Usage: const sub = editor.subScene; sub.spawn({ category: 'debris', meshType: 'cube', position, velocity, ... }); sub.spawnFragment(parentEntityId, { meshType, position, ... }); sub.tick(dt);          // called from stepPhysics sub.render(rp, vp, emr); // called from Viewport sub.clear();           // on play→edit transition ============================================================================",
      "exports": [
        {
          "name": "SubScene",
          "kind": "class",
          "signature": "class SubScene",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "panels/AssetPanel",
      "path": "editor/reference/panels/AssetPanel.md",
      "source": "editor/js/panels/AssetPanel.js",
      "import": "/editor/js/panels/AssetPanel.js",
      "sourceHash": "7ede4830fa3b0f3dd3e1c9c067a13ddb6996f909e3a23351977c5b789da55f86",
      "summary": "============================================================================ AssetPanel.js - Bottom-panel asset browser (Unity/Unreal-inspired) ============================================================================",
      "exports": [
        {
          "name": "setupAssetPanel",
          "kind": "function",
          "signature": "setupAssetPanel(editor)",
          "summary": ""
        },
        {
          "name": "renderAssetGrid",
          "kind": "function",
          "signature": "renderAssetGrid()",
          "summary": ""
        },
        {
          "name": "getSelectedAssetUuid",
          "kind": "function",
          "signature": "getSelectedAssetUuid()",
          "summary": ""
        },
        {
          "name": "refreshAssets",
          "kind": "function",
          "signature": "refreshAssets()",
          "summary": ""
        },
        {
          "name": "sampleAssetAnimationTransforms",
          "kind": "function",
          "signature": "sampleAssetAnimationTransforms(gltf, animIdx, time, binStart, buf)",
          "summary": ""
        },
        {
          "name": "base64ToArrayBuffer",
          "kind": "function",
          "signature": "base64ToArrayBuffer(base64)",
          "summary": ""
        },
        {
          "name": "handleRemoteAssetImport",
          "kind": "function",
          "signature": "async handleRemoteAssetImport(payload)",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "panels/Hierarchy",
      "path": "editor/reference/panels/Hierarchy.md",
      "source": "editor/js/panels/Hierarchy.js",
      "import": "/editor/js/panels/Hierarchy.js",
      "sourceHash": "92e5c243b81dd668f5c3df0833c79a150cc650d1c96dbd084a7a8113690cc298",
      "summary": "HierarchyPanel - Entity tree view",
      "exports": [
        {
          "name": "HierarchyPanel",
          "kind": "class",
          "signature": "class HierarchyPanel",
          "summary": "HierarchyPanel - Entity tree view"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "panels/Inspector",
      "path": "editor/reference/panels/Inspector.md",
      "source": "editor/js/panels/Inspector.js",
      "import": "/editor/js/panels/Inspector.js",
      "sourceHash": "800e63996182932ce48dca62638920636eae86737aadbfdba21b62c8f093d42d",
      "summary": "InspectorPanel - Component property editor",
      "exports": [
        {
          "name": "InspectorPanel",
          "kind": "class",
          "signature": "class InspectorPanel",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "panels/SpellGeneratorPanel",
      "path": "editor/reference/panels/SpellGeneratorPanel.md",
      "source": "editor/js/panels/SpellGeneratorPanel.js",
      "import": "/editor/js/panels/SpellGeneratorPanel.js",
      "sourceHash": "1352f7889193570da9c22f163a4bee80f2eefdfd2a78f40d49448657d7102914",
      "summary": "SpellGeneratorPanel.js - Spell Generator Editor UI A panel for procedurally generating spells in the editor. Features: - Element selection (with combination preview) - Spell type selection - Modifier toggles - Power level slider - Live preview - Save to spell library",
      "exports": [
        {
          "name": "SpellGeneratorPanel",
          "kind": "class",
          "signature": "class SpellGeneratorPanel",
          "summary": ""
        },
        {
          "name": "createSpellGeneratorPanel",
          "kind": "function",
          "signature": "createSpellGeneratorPanel(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "panels/Viewport",
      "path": "editor/reference/panels/Viewport.md",
      "source": "editor/js/panels/Viewport.js",
      "import": "/editor/js/panels/Viewport.js",
      "sourceHash": "74c753272ac0ba29420760ee99ea09b3f5a1cb742f114bbd03ef9786ae506ea8",
      "summary": "",
      "exports": [
        {
          "name": "ViewportPanel",
          "kind": "class",
          "signature": "class ViewportPanel",
          "summary": ""
        },
        {
          "name": "clearMeshTypeCache",
          "kind": "re-export",
          "signature": "clearMeshTypeCache",
          "summary": ""
        },
        {
          "name": "inferEntityMeshTypeAndColor",
          "kind": "re-export",
          "signature": "inferEntityMeshTypeAndColor",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "project/AssetRegistry",
      "path": "editor/reference/project/AssetRegistry.md",
      "source": "editor/js/project/AssetRegistry.js",
      "import": "/editor/js/project/AssetRegistry.js",
      "sourceHash": "0642841e85cdaab6722229f350ace053cf4e9799c00d5cc96e58e9f2ff29e859",
      "summary": "AssetRegistry.js - UUID-based asset management Adapted from J:\\game2 - handles: - Asset registration and UUID assignment - Path ↔ UUID lookup - Lazy loading of asset data - Asset index persistence (Assets/index.json) - Import and update operations",
      "exports": [
        {
          "name": "UnsupportedAssetIndexVersionError",
          "kind": "class",
          "signature": "class UnsupportedAssetIndexVersionError extends Error",
          "summary": ""
        },
        {
          "name": "AssetRegistry",
          "kind": "class",
          "signature": "class AssetRegistry",
          "summary": ""
        },
        {
          "name": "prepareAssetIndex",
          "kind": "function",
          "signature": "prepareAssetIndex(input)",
          "summary": ""
        },
        {
          "name": "getAssetTypeFromExtension",
          "kind": "function",
          "signature": "getAssetTypeFromExtension(filename)",
          "summary": "Get asset type from file extension"
        },
        {
          "name": "getAssetRegistry",
          "kind": "function",
          "signature": "getAssetRegistry()",
          "summary": ""
        },
        {
          "name": "initAssetRegistry",
          "kind": "function",
          "signature": "async initAssetRegistry(projectDir)",
          "summary": ""
        },
        {
          "name": "ASSET_INDEX_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "ASSET_INDEX_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "ASSET_TYPES",
          "kind": "constant",
          "signature": "ASSET_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "project/AutoSave",
      "path": "editor/reference/project/AutoSave.md",
      "source": "editor/js/project/AutoSave.js",
      "import": "/editor/js/project/AutoSave.js",
      "sourceHash": "d948e46bc8254e6c26a3dad857ec670d6179028c5449571d6deda157c6815553",
      "summary": "Wrap editor methods to track dirty state",
      "exports": [
        {
          "name": "DirtyTracker",
          "kind": "class",
          "signature": "class DirtyTracker",
          "summary": ""
        },
        {
          "name": "AutoSaveManager",
          "kind": "class",
          "signature": "class AutoSaveManager",
          "summary": ""
        },
        {
          "name": "setupDirtyTracking",
          "kind": "function",
          "signature": "setupDirtyTracking(editor, autoSaveManager)",
          "summary": "Wrap editor methods to track dirty state"
        },
        {
          "name": "setupSaveShortcut",
          "kind": "function",
          "signature": "setupSaveShortcut(autoSaveManager)",
          "summary": "Setup Ctrl+S shortcut"
        },
        {
          "name": "setupNewSceneShortcut",
          "kind": "function",
          "signature": "setupNewSceneShortcut(editor)",
          "summary": "Setup Ctrl+N for new scene"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "project/ProjectCompatibility",
      "path": "editor/reference/project/ProjectCompatibility.md",
      "source": "editor/js/project/ProjectCompatibility.js",
      "import": "/editor/js/project/ProjectCompatibility.js",
      "sourceHash": "7eb298a0667049e0218024d39c4963b6f782aa0632a849b425edbd60c3ec82cd",
      "summary": "Normalize a persisted/imported project without mutating the source object.",
      "exports": [
        {
          "name": "prepareProjectSettings",
          "kind": "function",
          "signature": "prepareProjectSettings(input)",
          "summary": ""
        },
        {
          "name": "prepareProjectRecord",
          "kind": "function",
          "signature": "prepareProjectRecord(input, { deserializeMaps = true } = {})",
          "summary": "Normalize a persisted/imported project without mutating the source object."
        },
        {
          "name": "PROJECT_SETTINGS_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "PROJECT_SETTINGS_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "PROJECT_RECORD_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "PROJECT_RECORD_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "project/ProjectExporter",
      "path": "editor/reference/project/ProjectExporter.md",
      "source": "editor/js/project/ProjectExporter.js",
      "import": "/editor/js/project/ProjectExporter.js",
      "sourceHash": "122818ce60344f4ba53fc8ff290abfb97d1ddbc6b7d2bb6e2d7f332bca367b91",
      "summary": "Pack data into binary format Format: [magic:4][version:4][indexOffset:4][...blobs...][index]",
      "exports": [
        {
          "name": "packData",
          "kind": "function",
          "signature": "packData(entries)",
          "summary": "Pack data into binary format Format: [magic:4][version:4][indexOffset:4][...blobs...][index]"
        },
        {
          "name": "unpackData",
          "kind": "function",
          "signature": "unpackData(buffer)",
          "summary": "Unpack binary data (for runtime)"
        },
        {
          "name": "exportScene",
          "kind": "function",
          "signature": "async exportScene(editor, sceneData)",
          "summary": "Export a single scene to packed binary"
        },
        {
          "name": "exportProject",
          "kind": "function",
          "signature": "async exportProject(editor, sceneDataList, options = {})",
          "summary": "Export full project with multiple scenes"
        },
        {
          "name": "downloadZip",
          "kind": "function",
          "signature": "downloadZip(zipBuffer, filename = 'game-export.zip')",
          "summary": ""
        },
        {
          "name": "exportAndDownload",
          "kind": "function",
          "signature": "async exportAndDownload(editor, sceneDataList, options = {})",
          "summary": "Export and download project"
        },
        {
          "name": "RuntimeLoader",
          "kind": "re-export",
          "signature": "RuntimeLoader",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "project/ProjectLauncher",
      "path": "editor/reference/project/ProjectLauncher.md",
      "source": "editor/js/project/ProjectLauncher.js",
      "import": "/editor/js/project/ProjectLauncher.js",
      "sourceHash": "db928ae3a5aa441dc590f518de189ce7b4646cf4fad04503d1ab5821150dea7d",
      "summary": "ProjectLauncher.js - Startup screen with recent projects Adapted from J:\\game2 - Unity Hub / Godot style launcher: - Recent projects list with thumbnails - New project / Open project buttons - Project templates (future)",
      "exports": [
        {
          "name": "getRecentProjects",
          "kind": "function",
          "signature": "getRecentProjects()",
          "summary": ""
        },
        {
          "name": "addRecentProject",
          "kind": "function",
          "signature": "addRecentProject(project)",
          "summary": ""
        },
        {
          "name": "removeRecentProject",
          "kind": "function",
          "signature": "removeRecentProject(projectName)",
          "summary": ""
        },
        {
          "name": "clearRecentProjects",
          "kind": "function",
          "signature": "clearRecentProjects()",
          "summary": ""
        },
        {
          "name": "createLauncherUI",
          "kind": "function",
          "signature": "createLauncherUI()",
          "summary": ""
        },
        {
          "name": "renderRecentProjects",
          "kind": "function",
          "signature": "renderRecentProjects(container)",
          "summary": ""
        },
        {
          "name": "injectLauncherStyles",
          "kind": "function",
          "signature": "injectLauncherStyles()",
          "summary": ""
        },
        {
          "name": "showLauncher",
          "kind": "function",
          "signature": "async showLauncher(onProjectSelected)",
          "summary": ""
        },
        {
          "name": "hideLauncher",
          "kind": "function",
          "signature": "hideLauncher()",
          "summary": "Hide launcher (for when editor is already initialized)"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "project/SceneManager",
      "path": "editor/reference/project/SceneManager.md",
      "source": "editor/js/project/SceneManager.js",
      "import": "/editor/js/project/SceneManager.js",
      "sourceHash": "bfda4a9f7fbda4f8c4aa1829a5169029a5013e5e12cae0f94d531ef312bdc3f6",
      "summary": "SceneManager.js - Scene loading, saving, and management Handles: - Scene file I/O (Scenes/*.scene.json) - Scene serialization/deserialization - Multi-scene support - Scene switching",
      "exports": [
        {
          "name": "layerMask",
          "kind": "function",
          "signature": "layerMask(...layers)",
          "summary": ""
        },
        {
          "name": "hasLayer",
          "kind": "function",
          "signature": "hasLayer(mask, layer)",
          "summary": ""
        },
        {
          "name": "prepareSceneForImport",
          "kind": "function",
          "signature": "prepareSceneForImport(input)",
          "summary": "Validate and fully normalize a serialized scene before touching live editor state. Missing schemaVersion is the legacy v1 format; future versions fail closed."
        },
        {
          "name": "createSceneData",
          "kind": "function",
          "signature": "createSceneData(name = 'Untitled')",
          "summary": "Create empty scene data with full Unity/Godot-style structure"
        },
        {
          "name": "serializeScene",
          "kind": "function",
          "signature": "serializeScene(editor, sceneName = null)",
          "summary": "Serialize current editor scene to JSON-compatible object"
        },
        {
          "name": "deserializeScene",
          "kind": "function",
          "signature": "async deserializeScene(editor, sceneData)",
          "summary": "Validate and stage a complete scene before replacing live editor state. If an unexpected runtime failure occurs while applying it, restore the previously serialized scene so callers never inherit a half-loaded scene."
        },
        {
          "name": "clearScene",
          "kind": "function",
          "signature": "clearScene(editor)",
          "summary": "Clear all entities and folders from scene"
        },
        {
          "name": "saveSceneToFile",
          "kind": "function",
          "signature": "async saveSceneToFile(editor, sceneName = null)",
          "summary": "Save scene to file system"
        },
        {
          "name": "loadSceneFromFile",
          "kind": "function",
          "signature": "async loadSceneFromFile(editor, fileName)",
          "summary": "Load scene from file system"
        },
        {
          "name": "listScenes",
          "kind": "function",
          "signature": "async listScenes(editor)",
          "summary": "List all scenes in project"
        },
        {
          "name": "deleteSceneFile",
          "kind": "function",
          "signature": "async deleteSceneFile(editor, fileName)",
          "summary": "Delete scene file"
        },
        {
          "name": "newScene",
          "kind": "function",
          "signature": "newScene(editor, name = 'Untitled')",
          "summary": "Create new scene (clears current and sets name)"
        },
        {
          "name": "findEntitiesByLayer",
          "kind": "function",
          "signature": "findEntitiesByLayer(editor, layer)",
          "summary": "Find all entities on a specific layer"
        },
        {
          "name": "findEntitiesByLayerMask",
          "kind": "function",
          "signature": "findEntitiesByLayerMask(editor, mask)",
          "summary": "Find all entities matching a layer mask"
        },
        {
          "name": "findEntitiesByTag",
          "kind": "function",
          "signature": "findEntitiesByTag(editor, tag)",
          "summary": "Find all entities with a specific tag"
        },
        {
          "name": "findEntityByTag",
          "kind": "function",
          "signature": "findEntityByTag(editor, tag)",
          "summary": "Find first entity with a specific tag"
        },
        {
          "name": "findEnabledEntities",
          "kind": "function",
          "signature": "findEnabledEntities(editor)",
          "summary": "Find all enabled entities (active in scene)"
        },
        {
          "name": "findEntitiesByRenderFlags",
          "kind": "function",
          "signature": "findEntitiesByRenderFlags(editor, flags, matchAll = true)",
          "summary": "Find all entities with specific render flags"
        },
        {
          "name": "findPrefabInstances",
          "kind": "function",
          "signature": "findPrefabInstances(editor, prefabUuid = null)",
          "summary": "Find all prefab instances"
        },
        {
          "name": "getEntityConnections",
          "kind": "function",
          "signature": "getEntityConnections(editor, entityId)",
          "summary": "Get all connections for an entity (both incoming and outgoing)"
        },
        {
          "name": "addConnection",
          "kind": "function",
          "signature": "addConnection(editor, fromEntity, signal, toEntity, method, flags = 0, binds = [])",
          "summary": "Add a signal connection between entities"
        },
        {
          "name": "removeConnection",
          "kind": "function",
          "signature": "removeConnection(editor, fromEntity, signal, toEntity, method)",
          "summary": "Remove a signal connection"
        },
        {
          "name": "setEntityLayer",
          "kind": "function",
          "signature": "setEntityLayer(editor, entityId, layer)",
          "summary": "Set entity layer"
        },
        {
          "name": "setEntityTag",
          "kind": "function",
          "signature": "setEntityTag(editor, entityId, tag)",
          "summary": "Set entity tag"
        },
        {
          "name": "addEntityTag",
          "kind": "function",
          "signature": "addEntityTag(editor, entityId, tag)",
          "summary": "Add tag to entity's tags array"
        },
        {
          "name": "removeEntityTag",
          "kind": "function",
          "signature": "removeEntityTag(editor, entityId, tag)",
          "summary": "Remove tag from entity's tags array"
        },
        {
          "name": "setEntityRenderFlags",
          "kind": "function",
          "signature": "setEntityRenderFlags(editor, entityId, flags)",
          "summary": "Set entity render flags"
        },
        {
          "name": "setEntityEnabled",
          "kind": "function",
          "signature": "setEntityEnabled(editor, entityId, enabled)",
          "summary": "Set entity enabled state"
        },
        {
          "name": "SCENE_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "SCENE_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "LAYERS",
          "kind": "constant",
          "signature": "LAYERS",
          "summary": ""
        },
        {
          "name": "LAYER_NAMES",
          "kind": "constant",
          "signature": "LAYER_NAMES",
          "summary": ""
        },
        {
          "name": "BUILTIN_TAGS",
          "kind": "constant",
          "signature": "BUILTIN_TAGS",
          "summary": ""
        },
        {
          "name": "RENDER_FLAGS",
          "kind": "constant",
          "signature": "RENDER_FLAGS",
          "summary": ""
        },
        {
          "name": "DEFAULT_RENDER_FLAGS",
          "kind": "constant",
          "signature": "DEFAULT_RENDER_FLAGS",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "project/index",
      "path": "editor/reference/project/index.md",
      "source": "editor/js/project/index.js",
      "import": "/editor/js/project/index.js",
      "sourceHash": "6ef6d15c18d36cc7b26856ae7110d19faded52af27be953343ce0f1de68b9341",
      "summary": "",
      "exports": [
        {
          "name": "ASSET_TYPES",
          "kind": "re-export",
          "signature": "ASSET_TYPES",
          "summary": ""
        },
        {
          "name": "AssetRegistry",
          "kind": "re-export",
          "signature": "AssetRegistry",
          "summary": ""
        },
        {
          "name": "AutoSaveManager",
          "kind": "re-export",
          "signature": "AutoSaveManager",
          "summary": ""
        },
        {
          "name": "BUILTIN_TAGS",
          "kind": "re-export",
          "signature": "BUILTIN_TAGS",
          "summary": ""
        },
        {
          "name": "DEFAULT_RENDER_FLAGS",
          "kind": "re-export",
          "signature": "DEFAULT_RENDER_FLAGS",
          "summary": ""
        },
        {
          "name": "DirtyTracker",
          "kind": "re-export",
          "signature": "DirtyTracker",
          "summary": ""
        },
        {
          "name": "LAYERS",
          "kind": "re-export",
          "signature": "LAYERS",
          "summary": ""
        },
        {
          "name": "LAYER_NAMES",
          "kind": "re-export",
          "signature": "LAYER_NAMES",
          "summary": ""
        },
        {
          "name": "ProjectExporter",
          "kind": "re-export",
          "signature": "ProjectExporter",
          "summary": ""
        },
        {
          "name": "ProjectLauncher",
          "kind": "re-export",
          "signature": "ProjectLauncher",
          "summary": ""
        },
        {
          "name": "RENDER_FLAGS",
          "kind": "re-export",
          "signature": "RENDER_FLAGS",
          "summary": ""
        },
        {
          "name": "SceneManager",
          "kind": "re-export",
          "signature": "SceneManager",
          "summary": ""
        },
        {
          "name": "addConnection",
          "kind": "re-export",
          "signature": "addConnection",
          "summary": ""
        },
        {
          "name": "addEntityTag",
          "kind": "re-export",
          "signature": "addEntityTag",
          "summary": ""
        },
        {
          "name": "addRecentProject",
          "kind": "re-export",
          "signature": "addRecentProject",
          "summary": ""
        },
        {
          "name": "clearRecentProjects",
          "kind": "re-export",
          "signature": "clearRecentProjects",
          "summary": ""
        },
        {
          "name": "clearScene",
          "kind": "re-export",
          "signature": "clearScene",
          "summary": ""
        },
        {
          "name": "createSceneData",
          "kind": "re-export",
          "signature": "createSceneData",
          "summary": ""
        },
        {
          "name": "deleteSceneFile",
          "kind": "re-export",
          "signature": "deleteSceneFile",
          "summary": ""
        },
        {
          "name": "deserializeScene",
          "kind": "re-export",
          "signature": "deserializeScene",
          "summary": ""
        },
        {
          "name": "downloadZip",
          "kind": "re-export",
          "signature": "downloadZip",
          "summary": ""
        },
        {
          "name": "exportAndDownload",
          "kind": "re-export",
          "signature": "exportAndDownload",
          "summary": ""
        },
        {
          "name": "exportProject",
          "kind": "re-export",
          "signature": "exportProject",
          "summary": ""
        },
        {
          "name": "exportScene",
          "kind": "re-export",
          "signature": "exportScene",
          "summary": ""
        },
        {
          "name": "findEnabledEntities",
          "kind": "re-export",
          "signature": "findEnabledEntities",
          "summary": ""
        },
        {
          "name": "findEntitiesByLayer",
          "kind": "re-export",
          "signature": "findEntitiesByLayer",
          "summary": ""
        },
        {
          "name": "findEntitiesByLayerMask",
          "kind": "re-export",
          "signature": "findEntitiesByLayerMask",
          "summary": ""
        },
        {
          "name": "findEntitiesByRenderFlags",
          "kind": "re-export",
          "signature": "findEntitiesByRenderFlags",
          "summary": ""
        },
        {
          "name": "findEntitiesByTag",
          "kind": "re-export",
          "signature": "findEntitiesByTag",
          "summary": ""
        },
        {
          "name": "findEntityByTag",
          "kind": "re-export",
          "signature": "findEntityByTag",
          "summary": ""
        },
        {
          "name": "findPrefabInstances",
          "kind": "re-export",
          "signature": "findPrefabInstances",
          "summary": ""
        },
        {
          "name": "getAssetRegistry",
          "kind": "re-export",
          "signature": "getAssetRegistry",
          "summary": ""
        },
        {
          "name": "getAssetTypeFromExtension",
          "kind": "re-export",
          "signature": "getAssetTypeFromExtension",
          "summary": ""
        },
        {
          "name": "getEntityConnections",
          "kind": "re-export",
          "signature": "getEntityConnections",
          "summary": ""
        },
        {
          "name": "getRecentProjects",
          "kind": "re-export",
          "signature": "getRecentProjects",
          "summary": ""
        },
        {
          "name": "hasLayer",
          "kind": "re-export",
          "signature": "hasLayer",
          "summary": ""
        },
        {
          "name": "hideLauncher",
          "kind": "re-export",
          "signature": "hideLauncher",
          "summary": ""
        },
        {
          "name": "initAssetRegistry",
          "kind": "re-export",
          "signature": "initAssetRegistry",
          "summary": ""
        },
        {
          "name": "layerMask",
          "kind": "re-export",
          "signature": "layerMask",
          "summary": ""
        },
        {
          "name": "listScenes",
          "kind": "re-export",
          "signature": "listScenes",
          "summary": ""
        },
        {
          "name": "loadSceneFromFile",
          "kind": "re-export",
          "signature": "loadSceneFromFile",
          "summary": ""
        },
        {
          "name": "newScene",
          "kind": "re-export",
          "signature": "newScene",
          "summary": ""
        },
        {
          "name": "packData",
          "kind": "re-export",
          "signature": "packData",
          "summary": ""
        },
        {
          "name": "removeConnection",
          "kind": "re-export",
          "signature": "removeConnection",
          "summary": ""
        },
        {
          "name": "removeEntityTag",
          "kind": "re-export",
          "signature": "removeEntityTag",
          "summary": ""
        },
        {
          "name": "removeRecentProject",
          "kind": "re-export",
          "signature": "removeRecentProject",
          "summary": ""
        },
        {
          "name": "saveSceneToFile",
          "kind": "re-export",
          "signature": "saveSceneToFile",
          "summary": ""
        },
        {
          "name": "serializeScene",
          "kind": "re-export",
          "signature": "serializeScene",
          "summary": ""
        },
        {
          "name": "setEntityEnabled",
          "kind": "re-export",
          "signature": "setEntityEnabled",
          "summary": ""
        },
        {
          "name": "setEntityLayer",
          "kind": "re-export",
          "signature": "setEntityLayer",
          "summary": ""
        },
        {
          "name": "setEntityRenderFlags",
          "kind": "re-export",
          "signature": "setEntityRenderFlags",
          "summary": ""
        },
        {
          "name": "setEntityTag",
          "kind": "re-export",
          "signature": "setEntityTag",
          "summary": ""
        },
        {
          "name": "setupDirtyTracking",
          "kind": "re-export",
          "signature": "setupDirtyTracking",
          "summary": ""
        },
        {
          "name": "setupNewSceneShortcut",
          "kind": "re-export",
          "signature": "setupNewSceneShortcut",
          "summary": ""
        },
        {
          "name": "setupSaveShortcut",
          "kind": "re-export",
          "signature": "setupSaveShortcut",
          "summary": ""
        },
        {
          "name": "showLauncher",
          "kind": "re-export",
          "signature": "showLauncher",
          "summary": ""
        },
        {
          "name": "unpackData",
          "kind": "re-export",
          "signature": "unpackData",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/SpawnableItem",
      "path": "editor/reference/spawnables/SpawnableItem.md",
      "source": "editor/js/spawnables/SpawnableItem.js",
      "import": "/editor/js/spawnables/SpawnableItem.js",
      "sourceHash": "8d3d8fbec0a5103ab4115ba186faebbe915687531cbc334c8954188364317463",
      "summary": "SpawnableItem - Base class for all spawnable objects in the editor. Physics collider options: - Override getCollider() to define custom colliders - Use helper imports from EditorPhysics for advanced physics: - generateCollidersFromSDF(sdfFunc, bounds, resolution) - createMeshColliderDecomposed(vertices, indices, options) - createSDFCollider(sdfFunc, bounds, options) - createVoxelCollider(voxels, sizeX, sizeY, sizeZ, voxelSize) ```js import { generateCollidersFromSDF } from '../../modules/EditorPhysics.js'; static getCollider() { return { shape: 'box', halfExtents: [0.01, 0.01, 0.01], compoundColliders: generateCollidersFromSDF( (x, y, z) => mySDF(x, y, z), { min: [-1, -1, -1], max: [1, 1, 1] }, 12 ), }; } ```",
      "exports": [
        {
          "name": "SpawnableItem",
          "kind": "class",
          "signature": "class SpawnableItem",
          "summary": "SpawnableItem - Base class for all spawnable objects in the editor. Physics collider options: - Override getCollider() to define custom colliders - Use helper imports from EditorPhysics for advanced physics: - generateCollidersFromSDF(sdfFunc, bounds, resolution) - createMeshColliderDecomposed(vertices, indices, options) - createSDFCollider(sdfFunc, bounds, options) - createVoxelCollider(voxels, sizeX, sizeY, sizeZ, voxelSize) ```js import { generateCollidersFromSDF } from '../../modules/EditorPhysics.js'; static getCollider() { return { shape: 'box', halfExtents: [0.01, 0.01, 0.01], compoundColliders: generateCollidersFromSDF( (x, y, z) => mySDF(x, y, z), { min: [-1, -1, -1], max: [1, 1, 1] }, 12 ), }; } ```"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/cameras/Camera",
      "path": "editor/reference/spawnables/cameras/Camera.md",
      "source": "editor/js/spawnables/cameras/Camera.js",
      "import": "/editor/js/spawnables/cameras/Camera.js",
      "sourceHash": "373d99038e659a5b8c9b48c59fb0d90b8d6bfb01b326c6b82a4e40dcbf85ed8f",
      "summary": "",
      "exports": [
        {
          "name": "Camera",
          "kind": "class",
          "signature": "class Camera extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Arch",
      "path": "editor/reference/spawnables/complex/Arch.md",
      "source": "editor/js/spawnables/complex/Arch.js",
      "import": "/editor/js/spawnables/complex/Arch.js",
      "sourceHash": "a96c9e4bccf76ae59b891e014866ff082dc127d8b4890e6b8201f7ad5dd39c15",
      "summary": "",
      "exports": [
        {
          "name": "Arch",
          "kind": "class",
          "signature": "class Arch extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/CSGShape",
      "path": "editor/reference/spawnables/complex/CSGShape.md",
      "source": "editor/js/spawnables/complex/CSGShape.js",
      "import": "/editor/js/spawnables/complex/CSGShape.js",
      "sourceHash": "33c3c6862d88d3a4e1c889f50c277045c972df47aaabcb82181ca89a264cf24e",
      "summary": "============================================================================ CSGShape.js — CSG Boolean operations on mesh entities  Select 2 mesh entities → right-click → CSG Union / Subtract / Intersect V1: Voxelize both → VoxelOps boolean → SDFToMesh marching cubes reconstruct V2: Voxelize both → VoxelOps boolean → DualContouring for sharp features ============================================================================",
      "exports": [
        {
          "name": "performCSG",
          "kind": "function",
          "signature": "async performCSG(editor, entityIdA, entityIdB, operation = 'union', opts = {})",
          "summary": "Perform a CSG boolean operation on two mesh entities."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Gear",
      "path": "editor/reference/spawnables/complex/Gear.md",
      "source": "editor/js/spawnables/complex/Gear.js",
      "import": "/editor/js/spawnables/complex/Gear.js",
      "sourceHash": "4275567fb6f9a9aa30cdfcbd967b4d982f8e4341edccfdabffdf8f1af69bb84b",
      "summary": "",
      "exports": [
        {
          "name": "Gear",
          "kind": "class",
          "signature": "class Gear extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Helix",
      "path": "editor/reference/spawnables/complex/Helix.md",
      "source": "editor/js/spawnables/complex/Helix.js",
      "import": "/editor/js/spawnables/complex/Helix.js",
      "sourceHash": "bfee49e017a88b56cfc267024d5c2b804930ee6a35894b50fe925b711a322a0e",
      "summary": "",
      "exports": [
        {
          "name": "Helix",
          "kind": "class",
          "signature": "class Helix extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Prism",
      "path": "editor/reference/spawnables/complex/Prism.md",
      "source": "editor/js/spawnables/complex/Prism.js",
      "import": "/editor/js/spawnables/complex/Prism.js",
      "sourceHash": "19a5024860b31323106b0a30c2d63ae33ac2de2fc82b86ed0a8ae9ebaf4fbd48",
      "summary": "",
      "exports": [
        {
          "name": "Prism",
          "kind": "class",
          "signature": "class Prism extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Pyramid",
      "path": "editor/reference/spawnables/complex/Pyramid.md",
      "source": "editor/js/spawnables/complex/Pyramid.js",
      "import": "/editor/js/spawnables/complex/Pyramid.js",
      "sourceHash": "523e067543404a729fa519d07a32f495c207d98949c1c3b80591899f3a4b144b",
      "summary": "",
      "exports": [
        {
          "name": "Pyramid",
          "kind": "class",
          "signature": "class Pyramid extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/SDFShape",
      "path": "editor/reference/spawnables/complex/SDFShape.md",
      "source": "editor/js/spawnables/complex/SDFShape.js",
      "import": "/editor/js/spawnables/complex/SDFShape.js",
      "sourceHash": "d915ac0c6428410d673e6a288f68746cc5bcd80c60e39952ef1135cc27897b93",
      "summary": "",
      "exports": [
        {
          "name": "SDFShape",
          "kind": "class",
          "signature": "class SDFShape extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Stairs",
      "path": "editor/reference/spawnables/complex/Stairs.md",
      "source": "editor/js/spawnables/complex/Stairs.js",
      "import": "/editor/js/spawnables/complex/Stairs.js",
      "sourceHash": "0a0d107c1702209cb6cedcd7be8f06c28ac58c90dd1a75679ecc2181079d008b",
      "summary": "",
      "exports": [
        {
          "name": "Stairs",
          "kind": "class",
          "signature": "class Stairs extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Star",
      "path": "editor/reference/spawnables/complex/Star.md",
      "source": "editor/js/spawnables/complex/Star.js",
      "import": "/editor/js/spawnables/complex/Star.js",
      "sourceHash": "22be327fc9f38b152f8812d758b9e49cd448f52f68d8ca89eb597966f9e788bd",
      "summary": "",
      "exports": [
        {
          "name": "Star",
          "kind": "class",
          "signature": "class Star extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/complex/Wedge",
      "path": "editor/reference/spawnables/complex/Wedge.md",
      "source": "editor/js/spawnables/complex/Wedge.js",
      "import": "/editor/js/spawnables/complex/Wedge.js",
      "sourceHash": "b1db40a7a8e5aa94aae028ddf9da9a4c7245dcada86800445d7938af9df43687",
      "summary": "",
      "exports": [
        {
          "name": "Wedge",
          "kind": "class",
          "signature": "class Wedge extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/emitters/ParticleEmitter",
      "path": "editor/reference/spawnables/emitters/ParticleEmitter.md",
      "source": "editor/js/spawnables/emitters/ParticleEmitter.js",
      "import": "/editor/js/spawnables/emitters/ParticleEmitter.js",
      "sourceHash": "0f6094887e4f28a8bf9011d9e7c6a8bf134bc411d6a30f3f4689fc716d464b5c",
      "summary": "",
      "exports": [
        {
          "name": "ParticleEmitter",
          "kind": "class",
          "signature": "class ParticleEmitter extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/emitters/PhaseEmitters",
      "path": "editor/reference/spawnables/emitters/PhaseEmitters.md",
      "source": "editor/js/spawnables/emitters/PhaseEmitters.js",
      "import": "/editor/js/spawnables/emitters/PhaseEmitters.js",
      "sourceHash": "21043cc003c9a7477aeea843d30b7e6884bc868609a06484ee9bf52980b56a4e",
      "summary": "",
      "exports": [
        {
          "name": "FireEmitter",
          "kind": "constant",
          "signature": "FireEmitter",
          "summary": ""
        },
        {
          "name": "SmokeEmitter",
          "kind": "constant",
          "signature": "SmokeEmitter",
          "summary": ""
        },
        {
          "name": "SteamEmitter",
          "kind": "constant",
          "signature": "SteamEmitter",
          "summary": ""
        },
        {
          "name": "WaterEmitter",
          "kind": "constant",
          "signature": "WaterEmitter",
          "summary": ""
        },
        {
          "name": "FountainEmitter",
          "kind": "constant",
          "signature": "FountainEmitter",
          "summary": ""
        },
        {
          "name": "LavaEmitter",
          "kind": "constant",
          "signature": "LavaEmitter",
          "summary": ""
        },
        {
          "name": "SnowEmitter",
          "kind": "constant",
          "signature": "SnowEmitter",
          "summary": ""
        },
        {
          "name": "SparksEmitter",
          "kind": "constant",
          "signature": "SparksEmitter",
          "summary": ""
        },
        {
          "name": "DebrisEmitter",
          "kind": "constant",
          "signature": "DebrisEmitter",
          "summary": ""
        },
        {
          "name": "PlasmaEmitter",
          "kind": "constant",
          "signature": "PlasmaEmitter",
          "summary": ""
        },
        {
          "name": "MagicEmitter",
          "kind": "constant",
          "signature": "MagicEmitter",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/index",
      "path": "editor/reference/spawnables/index.md",
      "source": "editor/js/spawnables/index.js",
      "import": "/editor/js/spawnables/index.js",
      "sourceHash": "595aa31072a16cd734c338631a1f908df25824e2116306b23df370e1140eacb8",
      "summary": "",
      "exports": [
        {
          "name": "getSpawnable",
          "kind": "function",
          "signature": "getSpawnable(id)",
          "summary": ""
        },
        {
          "name": "getSpawnablesByCategory",
          "kind": "function",
          "signature": "getSpawnablesByCategory(category)",
          "summary": ""
        },
        {
          "name": "getAllCategories",
          "kind": "function",
          "signature": "getAllCategories()",
          "summary": ""
        },
        {
          "name": "getAllSpawnables",
          "kind": "function",
          "signature": "getAllSpawnables()",
          "summary": ""
        },
        {
          "name": "spawnables",
          "kind": "constant",
          "signature": "spawnables",
          "summary": ""
        },
        {
          "name": "spawnableRegistry",
          "kind": "constant",
          "signature": "spawnableRegistry",
          "summary": ""
        },
        {
          "name": "categories",
          "kind": "constant",
          "signature": "categories",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/lights/DirectionalLight",
      "path": "editor/reference/spawnables/lights/DirectionalLight.md",
      "source": "editor/js/spawnables/lights/DirectionalLight.js",
      "import": "/editor/js/spawnables/lights/DirectionalLight.js",
      "sourceHash": "68e2d9c5b23fa7cbe36f7013759eff47784d3a5c527353f175d7788e90cfb32c",
      "summary": "",
      "exports": [
        {
          "name": "DirectionalLight",
          "kind": "class",
          "signature": "class DirectionalLight extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/lights/PointLight",
      "path": "editor/reference/spawnables/lights/PointLight.md",
      "source": "editor/js/spawnables/lights/PointLight.js",
      "import": "/editor/js/spawnables/lights/PointLight.js",
      "sourceHash": "b14c8f757628b2ea39a44610abbf250a4fc858f11d5775a8a3256a2f6cfc2449",
      "summary": "",
      "exports": [
        {
          "name": "PointLight",
          "kind": "class",
          "signature": "class PointLight extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/lights/SpotLight",
      "path": "editor/reference/spawnables/lights/SpotLight.md",
      "source": "editor/js/spawnables/lights/SpotLight.js",
      "import": "/editor/js/spawnables/lights/SpotLight.js",
      "sourceHash": "eafd370d38d63f7348b618400e3a67795cd81a7b9961ddfdcb21a9c31d5d92e1",
      "summary": "",
      "exports": [
        {
          "name": "SpotLight",
          "kind": "class",
          "signature": "class SpotLight extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Balloon",
      "path": "editor/reference/spawnables/physics/Balloon.md",
      "source": "editor/js/spawnables/physics/Balloon.js",
      "import": "/editor/js/spawnables/physics/Balloon.js",
      "sourceHash": "dabc368d2716c7738c65c676720f0f354b39888c674054038ce16841d9ab3861",
      "summary": "",
      "exports": [
        {
          "name": "Balloon",
          "kind": "class",
          "signature": "class Balloon extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Chain",
      "path": "editor/reference/spawnables/physics/Chain.md",
      "source": "editor/js/spawnables/physics/Chain.js",
      "import": "/editor/js/spawnables/physics/Chain.js",
      "sourceHash": "3ec6d2b59ab238906d4c4f6b5956e2e16c8d0b706a990c035e6e177280e8af22",
      "summary": "",
      "exports": [
        {
          "name": "Chain",
          "kind": "class",
          "signature": "class Chain extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Cloth",
      "path": "editor/reference/spawnables/physics/Cloth.md",
      "source": "editor/js/spawnables/physics/Cloth.js",
      "import": "/editor/js/spawnables/physics/Cloth.js",
      "sourceHash": "daa01e7b3324d11b95a12cdfb7243713132161f628099254ded2c001497c1c54",
      "summary": "",
      "exports": [
        {
          "name": "Cloth",
          "kind": "class",
          "signature": "class Cloth extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Fluid",
      "path": "editor/reference/spawnables/physics/Fluid.md",
      "source": "editor/js/spawnables/physics/Fluid.js",
      "import": "/editor/js/spawnables/physics/Fluid.js",
      "sourceHash": "723aa8d478a1254a151d7d966faf1d36ce04e038ff85018f614af2e4987e32e1",
      "summary": "",
      "exports": [
        {
          "name": "Fluid",
          "kind": "class",
          "signature": "class Fluid extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Hair",
      "path": "editor/reference/spawnables/physics/Hair.md",
      "source": "editor/js/spawnables/physics/Hair.js",
      "import": "/editor/js/spawnables/physics/Hair.js",
      "sourceHash": "fa67f44ccd2519563f8a6777f829976372491396cf6cf0dfc102d1f2f973beec",
      "summary": "",
      "exports": [
        {
          "name": "Hair",
          "kind": "class",
          "signature": "class Hair extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Ragdoll",
      "path": "editor/reference/spawnables/physics/Ragdoll.md",
      "source": "editor/js/spawnables/physics/Ragdoll.js",
      "import": "/editor/js/spawnables/physics/Ragdoll.js",
      "sourceHash": "51fbbc0849780fc09037b47a777daa32638ae8482b588e6653f75a9031e96bee",
      "summary": "",
      "exports": [
        {
          "name": "Ragdoll",
          "kind": "class",
          "signature": "class Ragdoll extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Rope",
      "path": "editor/reference/spawnables/physics/Rope.md",
      "source": "editor/js/spawnables/physics/Rope.js",
      "import": "/editor/js/spawnables/physics/Rope.js",
      "sourceHash": "77ba73989bb0eb85d247005402fc0d1d46ace877555eadc27ef7f882d5724569",
      "summary": "",
      "exports": [
        {
          "name": "Rope",
          "kind": "class",
          "signature": "class Rope extends SpawnableItem",
          "summary": ""
        },
        {
          "name": "FIBER_MATERIALS",
          "kind": "re-export",
          "signature": "FIBER_MATERIALS",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/RopeSchema",
      "path": "editor/reference/spawnables/physics/RopeSchema.md",
      "source": "editor/js/spawnables/physics/RopeSchema.js",
      "import": "/editor/js/spawnables/physics/RopeSchema.js",
      "sourceHash": "6467fdf238bb85fe79cb3513ddce92f719731e6ce66e34afee5b293e757c2f36",
      "summary": "============================================================================= ROPE SCHEMA - Shared schema for RopeTool and PhysicsRopeComponentEditor =============================================================================",
      "exports": [
        {
          "name": "getFiberMaterial",
          "kind": "function",
          "signature": "getFiberMaterial(name)",
          "summary": "Get fiber material properties by name"
        },
        {
          "name": "applyFiberMaterial",
          "kind": "function",
          "signature": "applyFiberMaterial(data, materialName)",
          "summary": "Apply fiber material preset to rope data"
        },
        {
          "name": "FIBER_MATERIALS",
          "kind": "constant",
          "signature": "FIBER_MATERIALS",
          "summary": "Fiber material properties - affects both physics and rendering"
        },
        {
          "name": "ROPE_DEFAULTS",
          "kind": "constant",
          "signature": "ROPE_DEFAULTS",
          "summary": "Default values for rope properties"
        },
        {
          "name": "MATERIAL_PRESETS",
          "kind": "constant",
          "signature": "MATERIAL_PRESETS",
          "summary": "Material presets for quick setup"
        },
        {
          "name": "FIBER_MATERIAL_OPTIONS",
          "kind": "constant",
          "signature": "FIBER_MATERIAL_OPTIONS",
          "summary": "Fiber material options for dropdown"
        },
        {
          "name": "ROPE_INSPECTOR_SCHEMA",
          "kind": "constant",
          "signature": "ROPE_INSPECTOR_SCHEMA",
          "summary": "Unified inspector schema for rope properties Used by both RopeTool and PhysicsRopeComponentEditor Organized into logical groups with the most commonly used options first"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/SoftBody",
      "path": "editor/reference/spawnables/physics/SoftBody.md",
      "source": "editor/js/spawnables/physics/SoftBody.js",
      "import": "/editor/js/spawnables/physics/SoftBody.js",
      "sourceHash": "b23d60ae989bb6d57de17539a065a789b0ed29b0657193cec4fd4aef30d961c3",
      "summary": "",
      "exports": [
        {
          "name": "SoftBody",
          "kind": "class",
          "signature": "class SoftBody extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/physics/Wire",
      "path": "editor/reference/spawnables/physics/Wire.md",
      "source": "editor/js/spawnables/physics/Wire.js",
      "import": "/editor/js/spawnables/physics/Wire.js",
      "sourceHash": "9d95a3abc8add1dc4152c298a1dd1d4d1e0f1a1edff3052688acb5813c682084",
      "summary": "",
      "exports": [
        {
          "name": "Wire",
          "kind": "class",
          "signature": "class Wire extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/primitives/Capsule",
      "path": "editor/reference/spawnables/primitives/Capsule.md",
      "source": "editor/js/spawnables/primitives/Capsule.js",
      "import": "/editor/js/spawnables/primitives/Capsule.js",
      "sourceHash": "24cd6928e080999525051c4ba39cdfd23fa0e0fd98ff3b7f9e711b0db18a211d",
      "summary": "",
      "exports": [
        {
          "name": "Capsule",
          "kind": "class",
          "signature": "class Capsule extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/primitives/Cone",
      "path": "editor/reference/spawnables/primitives/Cone.md",
      "source": "editor/js/spawnables/primitives/Cone.js",
      "import": "/editor/js/spawnables/primitives/Cone.js",
      "sourceHash": "8761e98ef72045d9bef0892e3e97cc7d2a04fc8eccd6b7ae40650e36ee22ab0a",
      "summary": "",
      "exports": [
        {
          "name": "Cone",
          "kind": "class",
          "signature": "class Cone extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/primitives/Cube",
      "path": "editor/reference/spawnables/primitives/Cube.md",
      "source": "editor/js/spawnables/primitives/Cube.js",
      "import": "/editor/js/spawnables/primitives/Cube.js",
      "sourceHash": "b7f0d0a0262792eee13c0b9d5c6c6c6883e8ab899c2d98055f40257da644fdc8",
      "summary": "",
      "exports": [
        {
          "name": "Cube",
          "kind": "class",
          "signature": "class Cube extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/primitives/Cylinder",
      "path": "editor/reference/spawnables/primitives/Cylinder.md",
      "source": "editor/js/spawnables/primitives/Cylinder.js",
      "import": "/editor/js/spawnables/primitives/Cylinder.js",
      "sourceHash": "37023f7fd64ad3d14fccbeed0dab29f64e96e2fa287c4466c8416aff28075dc3",
      "summary": "",
      "exports": [
        {
          "name": "Cylinder",
          "kind": "class",
          "signature": "class Cylinder extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/primitives/Plane",
      "path": "editor/reference/spawnables/primitives/Plane.md",
      "source": "editor/js/spawnables/primitives/Plane.js",
      "import": "/editor/js/spawnables/primitives/Plane.js",
      "sourceHash": "2da477b1d1ef7579bead9778849ee2584dcafa3641beabd2db9ae75fab16ba83",
      "summary": "",
      "exports": [
        {
          "name": "Plane",
          "kind": "class",
          "signature": "class Plane extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/primitives/Sphere",
      "path": "editor/reference/spawnables/primitives/Sphere.md",
      "source": "editor/js/spawnables/primitives/Sphere.js",
      "import": "/editor/js/spawnables/primitives/Sphere.js",
      "sourceHash": "f0e528d593584f73e347c1e3947705cea5343e41855b0803536388a05bbd0553",
      "summary": "",
      "exports": [
        {
          "name": "Sphere",
          "kind": "class",
          "signature": "class Sphere extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/primitives/Torus",
      "path": "editor/reference/spawnables/primitives/Torus.md",
      "source": "editor/js/spawnables/primitives/Torus.js",
      "import": "/editor/js/spawnables/primitives/Torus.js",
      "sourceHash": "825162aac20dd5baec3991e82f67dd516570ed6c249225ae7d8852a4c77b45ec",
      "summary": "",
      "exports": [
        {
          "name": "Torus",
          "kind": "class",
          "signature": "class Torus extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/tools/ConstraintTool",
      "path": "editor/reference/spawnables/tools/ConstraintTool.md",
      "source": "editor/js/spawnables/tools/ConstraintTool.js",
      "import": "/editor/js/spawnables/tools/ConstraintTool.js",
      "sourceHash": "6e590ec574f3a1d6a2bcc482f4345b18340aa625570b2a9cc82d3e525e496d62",
      "summary": "",
      "exports": [
        {
          "name": "ConstraintTool",
          "kind": "class",
          "signature": "class ConstraintTool extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/tools/RemoverTool",
      "path": "editor/reference/spawnables/tools/RemoverTool.md",
      "source": "editor/js/spawnables/tools/RemoverTool.js",
      "import": "/editor/js/spawnables/tools/RemoverTool.js",
      "sourceHash": "77f116c0956e25ba142b02d0fd8b8674ef15d09538efa9c07df04402fa1d084c",
      "summary": "",
      "exports": [
        {
          "name": "RemoverTool",
          "kind": "class",
          "signature": "class RemoverTool extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/tools/RopeTool",
      "path": "editor/reference/spawnables/tools/RopeTool.md",
      "source": "editor/js/spawnables/tools/RopeTool.js",
      "import": "/editor/js/spawnables/tools/RopeTool.js",
      "sourceHash": "b295a96d0acc33f420f798e0427db3904e167a5f56ad3be852bf7aff99df7828",
      "summary": "",
      "exports": [
        {
          "name": "RopeTool",
          "kind": "class",
          "signature": "class RopeTool extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/tools/SpringTool",
      "path": "editor/reference/spawnables/tools/SpringTool.md",
      "source": "editor/js/spawnables/tools/SpringTool.js",
      "import": "/editor/js/spawnables/tools/SpringTool.js",
      "sourceHash": "969e5dd429a1fe9fc46c0a17dd995e446fbaf960e43911a99de030c3eb4d630f",
      "summary": "",
      "exports": [
        {
          "name": "SpringTool",
          "kind": "class",
          "signature": "class SpringTool extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "spawnables/tools/WeldTool",
      "path": "editor/reference/spawnables/tools/WeldTool.md",
      "source": "editor/js/spawnables/tools/WeldTool.js",
      "import": "/editor/js/spawnables/tools/WeldTool.js",
      "sourceHash": "ef05323b964962e45aaf5d2c6daca79b5ed32ebe478ffb84ad6af472116b6501",
      "summary": "",
      "exports": [
        {
          "name": "WeldTool",
          "kind": "class",
          "signature": "class WeldTool extends SpawnableItem",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "storage/EditorPreferenceContracts",
      "path": "editor/reference/storage/EditorPreferenceContracts.md",
      "source": "editor/js/storage/EditorPreferenceContracts.js",
      "import": "/editor/js/storage/EditorPreferenceContracts.js",
      "sourceHash": "baa643eca439808d555ccc80d22f3198869ba478397fc0d355d6de8962a2a8d3",
      "summary": "Canonical localStorage contracts for structured editor preferences. The original keys remain v1 rollback mirrors. Current clients publish the legacy payload first and the v2 envelope last. The envelope remembers the exact legacy JSON it accompanied, allowing a later write from an older tab to be detected and read instead of being shadowed by stale v2 data.",
      "exports": [
        {
          "name": "EditorPreferenceContractError",
          "kind": "class",
          "signature": "class EditorPreferenceContractError extends Error",
          "summary": ""
        },
        {
          "name": "readEditorSettings",
          "kind": "function",
          "signature": "readEditorSettings(storage)",
          "summary": ""
        },
        {
          "name": "writeEditorSettings",
          "kind": "function",
          "signature": "writeEditorSettings(value, storage)",
          "summary": ""
        },
        {
          "name": "clearEditorSettings",
          "kind": "function",
          "signature": "clearEditorSettings(storage)",
          "summary": ""
        },
        {
          "name": "readEditorHotkeys",
          "kind": "function",
          "signature": "readEditorHotkeys(storage)",
          "summary": ""
        },
        {
          "name": "writeEditorHotkeys",
          "kind": "function",
          "signature": "writeEditorHotkeys(value, storage)",
          "summary": ""
        },
        {
          "name": "clearEditorHotkeys",
          "kind": "function",
          "signature": "clearEditorHotkeys(storage)",
          "summary": ""
        },
        {
          "name": "readRecentProjects",
          "kind": "function",
          "signature": "readRecentProjects(storage)",
          "summary": ""
        },
        {
          "name": "writeRecentProjects",
          "kind": "function",
          "signature": "writeRecentProjects(value, storage)",
          "summary": ""
        },
        {
          "name": "clearRecentProjectsRecord",
          "kind": "function",
          "signature": "clearRecentProjectsRecord(storage)",
          "summary": ""
        },
        {
          "name": "readWorldEnvironment",
          "kind": "function",
          "signature": "readWorldEnvironment(storage)",
          "summary": ""
        },
        {
          "name": "writeWorldEnvironment",
          "kind": "function",
          "signature": "writeWorldEnvironment(value, storage)",
          "summary": ""
        },
        {
          "name": "readWorldPostprocess",
          "kind": "function",
          "signature": "readWorldPostprocess(storage)",
          "summary": ""
        },
        {
          "name": "writeWorldPostprocess",
          "kind": "function",
          "signature": "writeWorldPostprocess(value, storage)",
          "summary": ""
        },
        {
          "name": "readWorldPanelCollapse",
          "kind": "function",
          "signature": "readWorldPanelCollapse(storage)",
          "summary": ""
        },
        {
          "name": "writeWorldPanelCollapse",
          "kind": "function",
          "signature": "writeWorldPanelCollapse(value, storage)",
          "summary": ""
        },
        {
          "name": "readCollabRoom",
          "kind": "function",
          "signature": "readCollabRoom(storage)",
          "summary": ""
        },
        {
          "name": "writeCollabRoom",
          "kind": "function",
          "signature": "writeCollabRoom(value, storage)",
          "summary": ""
        },
        {
          "name": "clearCollabRoom",
          "kind": "function",
          "signature": "clearCollabRoom(storage)",
          "summary": ""
        },
        {
          "name": "readAudioMotion",
          "kind": "function",
          "signature": "readAudioMotion(storage)",
          "summary": ""
        },
        {
          "name": "writeAudioMotion",
          "kind": "function",
          "signature": "writeAudioMotion(value, storage)",
          "summary": ""
        },
        {
          "name": "readAudioFavorites",
          "kind": "function",
          "signature": "readAudioFavorites(storage)",
          "summary": ""
        },
        {
          "name": "writeAudioFavorites",
          "kind": "function",
          "signature": "writeAudioFavorites(value, storage)",
          "summary": ""
        },
        {
          "name": "readAudioRecents",
          "kind": "function",
          "signature": "readAudioRecents(storage)",
          "summary": ""
        },
        {
          "name": "writeAudioRecents",
          "kind": "function",
          "signature": "writeAudioRecents(value, storage)",
          "summary": ""
        },
        {
          "name": "EDITOR_PREFERENCE_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "EDITOR_PREFERENCE_SCHEMA_VERSION",
          "summary": "Canonical localStorage contracts for structured editor preferences. The original keys remain v1 rollback mirrors. Current clients publish the legacy payload first and the v2 envelope last. The envelope remembers the exact legacy JSON it accompanied, allowing a later write from an older tab to be detected and read instead of being shadowed by stale v2 data."
        },
        {
          "name": "EDITOR_PREFERENCE_MAX_RECORD_BYTES",
          "kind": "constant",
          "signature": "EDITOR_PREFERENCE_MAX_RECORD_BYTES",
          "summary": ""
        },
        {
          "name": "EDITOR_PREFERENCE_CONTRACTS",
          "kind": "constant",
          "signature": "EDITOR_PREFERENCE_CONTRACTS",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "storage/GameEditorDatabase",
      "path": "editor/reference/storage/GameEditorDatabase.md",
      "source": "editor/js/storage/GameEditorDatabase.js",
      "import": "/editor/js/storage/GameEditorDatabase.js",
      "sourceHash": "919572adb5c8e5e38c64501e08be49397d748da4149becacf2fb092861c34635",
      "summary": "The single schema owner for editor IndexedDB persistence. Version 1 was opened independently by main.js and ProjectStorage.js, which meant only the first caller's object store was created. Version 2 expands the database to contain both stores without removing any version-1 data.",
      "exports": [
        {
          "name": "closeGameEditorDatabase",
          "kind": "function",
          "signature": "closeGameEditorDatabase()",
          "summary": ""
        },
        {
          "name": "openGameEditorDatabase",
          "kind": "function",
          "signature": "openGameEditorDatabase()",
          "summary": ""
        },
        {
          "name": "GAME_EDITOR_DB_NAME",
          "kind": "constant",
          "signature": "GAME_EDITOR_DB_NAME",
          "summary": "The single schema owner for editor IndexedDB persistence. Version 1 was opened independently by main.js and ProjectStorage.js, which meant only the first caller's object store was created. Version 2 expands the database to contain both stores without removing any version-1 data."
        },
        {
          "name": "GAME_EDITOR_DB_VERSION",
          "kind": "constant",
          "signature": "GAME_EDITOR_DB_VERSION",
          "summary": ""
        },
        {
          "name": "PROJECT_HANDLES_STORE",
          "kind": "constant",
          "signature": "PROJECT_HANDLES_STORE",
          "summary": ""
        },
        {
          "name": "PROJECTS_STORE",
          "kind": "constant",
          "signature": "PROJECTS_STORE",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/cyberpunk",
      "path": "editor/reference/themes/cyberpunk.md",
      "source": "editor/js/themes/cyberpunk.js",
      "import": "/editor/js/themes/cyberpunk.js",
      "sourceHash": "01d96011663fc488e8c1a728199f0ecb8cf6ccf7442d99c0f1d165d920ecffbf",
      "summary": "Cyberpunk Theme - Neon pink and cyan",
      "exports": [
        {
          "name": "themeCyberpunk",
          "kind": "constant",
          "signature": "themeCyberpunk",
          "summary": "Cyberpunk Theme - Neon pink and cyan"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/dark",
      "path": "editor/reference/themes/dark.md",
      "source": "editor/js/themes/dark.js",
      "import": "/editor/js/themes/dark.js",
      "sourceHash": "2562929b9f74e2ae1e4b77c7adfe52037abf012350917bff42566f5ab5834771",
      "summary": "Dark Theme - Default editor theme",
      "exports": [
        {
          "name": "themeDark",
          "kind": "constant",
          "signature": "themeDark",
          "summary": "Dark Theme - Default editor theme"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/index",
      "path": "editor/reference/themes/index.md",
      "source": "editor/js/themes/index.js",
      "import": "/editor/js/themes/index.js",
      "sourceHash": "f30d19f264bf5adee0759fb64421bbb783cd1d3d5a3c3747ab33fbddf6b35a25",
      "summary": "Theme System Index Central theme management with modular theme files",
      "exports": [
        {
          "name": "themes",
          "kind": "constant",
          "signature": "themes",
          "summary": ""
        },
        {
          "name": "themeManager",
          "kind": "constant",
          "signature": "themeManager",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/light",
      "path": "editor/reference/themes/light.md",
      "source": "editor/js/themes/light.js",
      "import": "/editor/js/themes/light.js",
      "sourceHash": "a9756ae07055ca2eed8cca4076e16f3f30ea481ba408abbea5825575fce94587",
      "summary": "Light Theme - Clean bright interface",
      "exports": [
        {
          "name": "themeLight",
          "kind": "constant",
          "signature": "themeLight",
          "summary": "Light Theme - Clean bright interface"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/matrix",
      "path": "editor/reference/themes/matrix.md",
      "source": "editor/js/themes/matrix.js",
      "import": "/editor/js/themes/matrix.js",
      "sourceHash": "0d8ab2841c7b55b443961e4f96c24c2cc35452493de7dcfedf1122ae9ac715fc",
      "summary": "Matrix Theme - Hacker green aesthetic",
      "exports": [
        {
          "name": "themeMatrix",
          "kind": "constant",
          "signature": "themeMatrix",
          "summary": "Matrix Theme - Hacker green aesthetic"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/midnight",
      "path": "editor/reference/themes/midnight.md",
      "source": "editor/js/themes/midnight.js",
      "import": "/editor/js/themes/midnight.js",
      "sourceHash": "1f30dcc3fd0977c841142cc18484a199f527be2adeb0d1f19c96f47b9f8318e4",
      "summary": "Midnight Blue Theme - Deep blue professional theme",
      "exports": [
        {
          "name": "themeMidnight",
          "kind": "constant",
          "signature": "themeMidnight",
          "summary": "Midnight Blue Theme - Deep blue professional theme"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/monokai",
      "path": "editor/reference/themes/monokai.md",
      "source": "editor/js/themes/monokai.js",
      "import": "/editor/js/themes/monokai.js",
      "sourceHash": "efbfed2e342ca71ce9ea3b3d435e9b6b70644750e328ff1ac3c55910fa94a14b",
      "summary": "Monokai Theme - Classic code editor colors",
      "exports": [
        {
          "name": "themeMonokai",
          "kind": "constant",
          "signature": "themeMonokai",
          "summary": "Monokai Theme - Classic code editor colors"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/nord",
      "path": "editor/reference/themes/nord.md",
      "source": "editor/js/themes/nord.js",
      "import": "/editor/js/themes/nord.js",
      "sourceHash": "204cad676eba278d247f54f2e06125b0e257f412eb5cc171c5f78af904e3639e",
      "summary": "Nord Theme - Arctic, north-bluish color palette",
      "exports": [
        {
          "name": "themeNord",
          "kind": "constant",
          "signature": "themeNord",
          "summary": "Nord Theme - Arctic, north-bluish color palette"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/ocean",
      "path": "editor/reference/themes/ocean.md",
      "source": "editor/js/themes/ocean.js",
      "import": "/editor/js/themes/ocean.js",
      "sourceHash": "ff0fc759e25e09c31cb4c85a2b08450a5320238c21cae7e92f741ae8f9ccf65e",
      "summary": "Ocean Theme - Deep sea blues and teals",
      "exports": [
        {
          "name": "themeOcean",
          "kind": "constant",
          "signature": "themeOcean",
          "summary": "Ocean Theme - Deep sea blues and teals"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/purple",
      "path": "editor/reference/themes/purple.md",
      "source": "editor/js/themes/purple.js",
      "import": "/editor/js/themes/purple.js",
      "sourceHash": "4957ca0ac55c9cf68ea5e4ee50e867f258e5793098b070e4ff0f427499f84bd9",
      "summary": "Purple Haze Theme - Vibrant purple aesthetic",
      "exports": [
        {
          "name": "themePurple",
          "kind": "constant",
          "signature": "themePurple",
          "summary": "Purple Haze Theme - Vibrant purple aesthetic"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "themes/solarized",
      "path": "editor/reference/themes/solarized.md",
      "source": "editor/js/themes/solarized.js",
      "import": "/editor/js/themes/solarized.js",
      "sourceHash": "cff589dc6e883e521cab2c2e24b6700282068bad183d92c31dc83fe36971814e",
      "summary": "Solarized Dark Theme - Ethan Schoonover's iconic palette",
      "exports": [
        {
          "name": "themeSolarized",
          "kind": "constant",
          "signature": "themeSolarized",
          "summary": "Solarized Dark Theme - Ethan Schoonover's iconic palette"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/CompressionManager",
      "path": "editor/reference/utils/CompressionManager.md",
      "source": "editor/js/utils/CompressionManager.js",
      "import": "/editor/js/utils/CompressionManager.js",
      "sourceHash": "388712d64979a40361c510ee48e21baea129a5f366d7b121636fe2e29981697c",
      "summary": "CompressionManager - Manages background compression via WebWorker Provides async compression/decompression for timeline and undo history",
      "exports": [
        {
          "name": "initCompressionWorker",
          "kind": "function",
          "signature": "initCompressionWorker()",
          "summary": "Initialize the compression worker"
        },
        {
          "name": "compressSnapshot",
          "kind": "function",
          "signature": "async compressSnapshot(snapshot)",
          "summary": ""
        },
        {
          "name": "computeDelta",
          "kind": "function",
          "signature": "async computeDelta(prev, current)",
          "summary": ""
        },
        {
          "name": "decompressSnapshot",
          "kind": "function",
          "signature": "async decompressSnapshot(compressed)",
          "summary": ""
        },
        {
          "name": "estimateCompressedSize",
          "kind": "function",
          "signature": "estimateCompressedSize(data)",
          "summary": "Get memory estimate for compressed data"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/DialogAnimations",
      "path": "editor/reference/utils/DialogAnimations.md",
      "source": "editor/js/utils/DialogAnimations.js",
      "import": "/editor/js/utils/DialogAnimations.js",
      "sourceHash": "d0906c8a193d6e0eb300d1483f43a4e5a07662e4ade8beffcfd58687a2f68cc9",
      "summary": "DialogAnimations.js - Smooth open/close animations for all dialogs Provides consistent animation utilities for modals and dialogs",
      "exports": [
        {
          "name": "smoothCloseDialog",
          "kind": "function",
          "signature": "smoothCloseDialog(dialog, duration = 300)",
          "summary": "Smoothly close a dialog with fade-out animation"
        },
        {
          "name": "smoothCloseModal",
          "kind": "function",
          "signature": "smoothCloseModal(modal, duration = 300)",
          "summary": "Smoothly close a modal with fade-out animation"
        },
        {
          "name": "closeOnBackdropClick",
          "kind": "function",
          "signature": "closeOnBackdropClick(dialog, contentSelector = '.editor-dialog-box, .modal-content, .settings-dialog')",
          "summary": "Close dialog on backdrop click (outside content area)"
        },
        {
          "name": "closeOnEscape",
          "kind": "function",
          "signature": "closeOnEscape(dialog)",
          "summary": "Close dialog on Escape key"
        },
        {
          "name": "setupDialogCloseHandlers",
          "kind": "function",
          "signature": "setupDialogCloseHandlers(dialog, options = {})",
          "summary": "Setup all standard dialog close handlers"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/FrameSpikeDetector",
      "path": "editor/reference/utils/FrameSpikeDetector.md",
      "source": "editor/js/utils/FrameSpikeDetector.js",
      "import": "/editor/js/utils/FrameSpikeDetector.js",
      "sourceHash": "03e62fbfbc0a4e09fde3ba4758d9a25818a70797f8f3d69392bd60af209648f5",
      "summary": "FrameSpikeDetector.js - Detect and log frame time spikes Monitors frame times and logs detailed information when spikes occur, helping identify performance bottlenecks and optimization opportunities.",
      "exports": [
        {
          "name": "FrameSpikeDetector",
          "kind": "class",
          "signature": "class FrameSpikeDetector",
          "summary": "FrameSpikeDetector.js - Detect and log frame time spikes Monitors frame times and logs detailed information when spikes occur, helping identify performance bottlenecks and optimization opportunities."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/FrustumCulling",
      "path": "editor/reference/utils/FrustumCulling.md",
      "source": "editor/js/utils/FrustumCulling.js",
      "import": "/editor/js/utils/FrustumCulling.js",
      "sourceHash": "59f878cb600c910cdac917199b413b636fc8ef9b3315464cd7002ee0ef0c0899",
      "summary": "Extract and normalize frustum planes from a 4×4 view-projection matrix. Uses Gribb-Hartmann method (column-major matrix). Must be called once per frame before any culling tests.",
      "exports": [
        {
          "name": "extractFrustumPlanes",
          "kind": "function",
          "signature": "extractFrustumPlanes(vp)",
          "summary": "Extract and normalize frustum planes from a 4×4 view-projection matrix. Uses Gribb-Hartmann method (column-major matrix). Must be called once per frame before any culling tests."
        },
        {
          "name": "isSphereInFrustum",
          "kind": "function",
          "signature": "isSphereInFrustum(center, radius, planes)",
          "summary": "Test if a bounding sphere is inside or intersects the frustum."
        },
        {
          "name": "isAABBInFrustum",
          "kind": "function",
          "signature": "isAABBInFrustum(minX, minY, minZ, maxX, maxY, maxZ, planes)",
          "summary": "Test if a world-space AABB intersects the frustum. Uses the P-vertex method: for each plane pick the AABB corner most in the direction of the plane normal (the \"positive\" vertex). If that corner is behind the plane, the entire box is outside."
        },
        {
          "name": "isAABBCenterExtentsInFrustum",
          "kind": "function",
          "signature": "isAABBCenterExtentsInFrustum(cx, cy, cz, ex, ey, ez, planes)",
          "summary": "Convenience: test AABB from center + half-extents (world space). Converts to min/max and delegates."
        },
        {
          "name": "isEntityAABBVisible",
          "kind": "function",
          "signature": "isEntityAABBVisible(entityPos, entityScale, localCenter, localExtents, planes)",
          "summary": "High-level entity visibility test using AABB. Takes the mesh's local-space AABB center+extents, the entity's world position and scale, and produces the world-space AABB for frustum testing."
        },
        {
          "name": "isEntitySphereVisible",
          "kind": "function",
          "signature": "isEntitySphereVisible(position, scale, baseRadius)",
          "summary": "Legacy: entity visibility using bounding sphere (kept for broad-phase / fallback)."
        },
        {
          "name": "getCullingStats",
          "kind": "function",
          "signature": "getCullingStats()",
          "summary": ""
        },
        {
          "name": "resetStats",
          "kind": "function",
          "signature": "resetStats()",
          "summary": ""
        },
        {
          "name": "getFrustumPlanes",
          "kind": "function",
          "signature": "getFrustumPlanes()",
          "summary": "Get current frustum planes (for debugging / external use)"
        },
        {
          "name": "getFrustumCorners",
          "kind": "function",
          "signature": "getFrustumCorners(invViewProjMatrix)",
          "summary": "Calculate frustum corners in world space (for debug visualization)"
        },
        {
          "name": "frustumContainsAABB",
          "kind": "re-export",
          "signature": "frustumContainsAABB",
          "summary": ""
        },
        {
          "name": "frustumContainsSphere",
          "kind": "re-export",
          "signature": "frustumContainsSphere",
          "summary": ""
        },
        {
          "name": "frustumFromMatrix",
          "kind": "re-export",
          "signature": "frustumFromMatrix",
          "summary": ""
        },
        {
          "name": "frustumNormalizePlanes",
          "kind": "re-export",
          "signature": "frustumNormalizePlanes",
          "summary": ""
        },
        {
          "name": "frustumTestAABB",
          "kind": "re-export",
          "signature": "frustumTestAABB",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/GPUBufferPool",
      "path": "editor/reference/utils/GPUBufferPool.md",
      "source": "editor/js/utils/GPUBufferPool.js",
      "import": "/editor/js/utils/GPUBufferPool.js",
      "sourceHash": "c611b996bb56ae4f1ca94a1f74d51baf8cd5678309f0d3340072c7dbb7172ae7",
      "summary": "Get a buffer from pool or create new one",
      "exports": [
        {
          "name": "getBuffer",
          "kind": "function",
          "signature": "getBuffer(device, size, usage, label = '')",
          "summary": "Get a buffer from pool or create new one"
        },
        {
          "name": "releaseBuffer",
          "kind": "function",
          "signature": "releaseBuffer(buffer, usage)",
          "summary": "Return a buffer to the pool"
        },
        {
          "name": "getPoolStats",
          "kind": "function",
          "signature": "getPoolStats()",
          "summary": "Get pool statistics"
        },
        {
          "name": "clearPools",
          "kind": "function",
          "signature": "clearPools()",
          "summary": "Clear all pools and destroy buffers"
        },
        {
          "name": "trimPools",
          "kind": "function",
          "signature": "trimPools(keepCount = 2)",
          "summary": "Trim pools to reduce memory"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/InterpolationCurves",
      "path": "editor/reference/utils/InterpolationCurves.md",
      "source": "editor/js/utils/InterpolationCurves.js",
      "import": "/editor/js/utils/InterpolationCurves.js",
      "sourceHash": "15f592eb2709edb8548608bb2cde818fdadf4af39a722a7c9be0d46f872db374",
      "summary": "Animation track - keyframe-based animation",
      "exports": [
        {
          "name": "AnimationTrack",
          "kind": "class",
          "signature": "class AnimationTrack",
          "summary": "Animation track - keyframe-based animation"
        },
        {
          "name": "Tween",
          "kind": "class",
          "signature": "class Tween",
          "summary": "Tween - simple value animation"
        },
        {
          "name": "smoothstep",
          "kind": "function",
          "signature": "smoothstep(t)",
          "summary": "Smoothstep interpolation (Hermite)"
        },
        {
          "name": "smootherstep",
          "kind": "function",
          "signature": "smootherstep(t)",
          "summary": "Smootherstep (Ken Perlin's improved version)"
        },
        {
          "name": "springInterpolation",
          "kind": "function",
          "signature": "springInterpolation(t, stiffness = 100, damping = 10)",
          "summary": "Spring interpolation with damping"
        },
        {
          "name": "bounceInterpolation",
          "kind": "function",
          "signature": "bounceInterpolation(t)",
          "summary": "Bounce interpolation"
        },
        {
          "name": "lerp",
          "kind": "function",
          "signature": "lerp(from, to, t, easing = 'linear')",
          "summary": "Interpolate between two values with easing"
        },
        {
          "name": "lerpVec3",
          "kind": "function",
          "signature": "lerpVec3(from, to, t, easing = 'linear')",
          "summary": "Interpolate between two vec3s with easing"
        },
        {
          "name": "slerp",
          "kind": "function",
          "signature": "slerp(q1, q2, t, easing = 'linear')",
          "summary": "Spherical linear interpolation for quaternions (SLERP)"
        },
        {
          "name": "catmullRom",
          "kind": "function",
          "signature": "catmullRom(points, t, closed = false)",
          "summary": "Catmull-Rom spline interpolation (passes through all control points)"
        },
        {
          "name": "bSpline",
          "kind": "function",
          "signature": "bSpline(points, t, degree = 3)",
          "summary": "B-Spline interpolation (smooth curve, doesn't pass through control points)"
        },
        {
          "name": "hermite",
          "kind": "function",
          "signature": "hermite(p0, m0, p1, m1, t)",
          "summary": "Hermite spline interpolation"
        },
        {
          "name": "EASING_FUNCTIONS",
          "kind": "constant",
          "signature": "EASING_FUNCTIONS",
          "summary": ""
        },
        {
          "name": "CubicBezier",
          "kind": "re-export",
          "signature": "CubicBezier",
          "summary": ""
        },
        {
          "name": "easeInBack",
          "kind": "re-export",
          "signature": "easeInBack",
          "summary": ""
        },
        {
          "name": "easeInCirc",
          "kind": "re-export",
          "signature": "easeInCirc",
          "summary": ""
        },
        {
          "name": "easeInCubic",
          "kind": "re-export",
          "signature": "easeInCubic",
          "summary": ""
        },
        {
          "name": "easeInElastic",
          "kind": "re-export",
          "signature": "easeInElastic",
          "summary": ""
        },
        {
          "name": "easeInExpo",
          "kind": "re-export",
          "signature": "easeInExpo",
          "summary": ""
        },
        {
          "name": "easeInOutBack",
          "kind": "re-export",
          "signature": "easeInOutBack",
          "summary": ""
        },
        {
          "name": "easeInOutCirc",
          "kind": "re-export",
          "signature": "easeInOutCirc",
          "summary": ""
        },
        {
          "name": "easeInOutCubic",
          "kind": "re-export",
          "signature": "easeInOutCubic",
          "summary": ""
        },
        {
          "name": "easeInOutElastic",
          "kind": "re-export",
          "signature": "easeInOutElastic",
          "summary": ""
        },
        {
          "name": "easeInOutExpo",
          "kind": "re-export",
          "signature": "easeInOutExpo",
          "summary": ""
        },
        {
          "name": "easeInOutQuad",
          "kind": "re-export",
          "signature": "easeInOutQuad",
          "summary": ""
        },
        {
          "name": "easeInOutQuart",
          "kind": "re-export",
          "signature": "easeInOutQuart",
          "summary": ""
        },
        {
          "name": "easeInOutQuint",
          "kind": "re-export",
          "signature": "easeInOutQuint",
          "summary": ""
        },
        {
          "name": "easeInOutSine",
          "kind": "re-export",
          "signature": "easeInOutSine",
          "summary": ""
        },
        {
          "name": "easeInQuad",
          "kind": "re-export",
          "signature": "easeInQuad",
          "summary": ""
        },
        {
          "name": "easeInQuart",
          "kind": "re-export",
          "signature": "easeInQuart",
          "summary": ""
        },
        {
          "name": "easeInQuint",
          "kind": "re-export",
          "signature": "easeInQuint",
          "summary": ""
        },
        {
          "name": "easeInSine",
          "kind": "re-export",
          "signature": "easeInSine",
          "summary": ""
        },
        {
          "name": "easeLinear",
          "kind": "re-export",
          "signature": "easeLinear",
          "summary": ""
        },
        {
          "name": "easeOutBack",
          "kind": "re-export",
          "signature": "easeOutBack",
          "summary": ""
        },
        {
          "name": "easeOutCirc",
          "kind": "re-export",
          "signature": "easeOutCirc",
          "summary": ""
        },
        {
          "name": "easeOutCubic",
          "kind": "re-export",
          "signature": "easeOutCubic",
          "summary": ""
        },
        {
          "name": "easeOutElastic",
          "kind": "re-export",
          "signature": "easeOutElastic",
          "summary": ""
        },
        {
          "name": "easeOutExpo",
          "kind": "re-export",
          "signature": "easeOutExpo",
          "summary": ""
        },
        {
          "name": "easeOutQuad",
          "kind": "re-export",
          "signature": "easeOutQuad",
          "summary": ""
        },
        {
          "name": "easeOutQuart",
          "kind": "re-export",
          "signature": "easeOutQuart",
          "summary": ""
        },
        {
          "name": "easeOutQuint",
          "kind": "re-export",
          "signature": "easeOutQuint",
          "summary": ""
        },
        {
          "name": "easeOutSine",
          "kind": "re-export",
          "signature": "easeOutSine",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/MemoryIntegration",
      "path": "editor/reference/utils/MemoryIntegration.md",
      "source": "editor/js/utils/MemoryIntegration.js",
      "import": "/editor/js/utils/MemoryIntegration.js",
      "sourceHash": "cd2fe6cdd7b0ed3a6891d326f9d5135313dc8899ec9a35c01def8ffd8f607e7d",
      "summary": "MemoryIntegration.js - Wires up off-heap memory to editor/engine systems Integrates OffHeapMemoryManager with: - Particle snapshot system (large frame buffers → WASM/Worker) - Editor history (old undo entries → IDB) - Asset cache (loaded assets → Worker memory) - Profiler timeline (frame history → off-heap)",
      "exports": [
        {
          "name": "initMemoryIntegration",
          "kind": "function",
          "signature": "async initMemoryIntegration(gpuDevice = null)",
          "summary": "Initialize memory integration"
        },
        {
          "name": "getMemoryPressure",
          "kind": "function",
          "signature": "getMemoryPressure()",
          "summary": "Get current memory pressure (0-1)"
        },
        {
          "name": "shouldOffload",
          "kind": "function",
          "signature": "shouldOffload()",
          "summary": "Check if we should offload to off-heap storage"
        },
        {
          "name": "storeParticleFrame",
          "kind": "function",
          "signature": "async storeParticleFrame(frameIndex, frameData)",
          "summary": "Store particle frame in off-heap memory Large frames (>100KB) go to worker memory"
        },
        {
          "name": "retrieveParticleFrame",
          "kind": "function",
          "signature": "async retrieveParticleFrame(frameIndex)",
          "summary": "Retrieve particle frame from off-heap storage"
        },
        {
          "name": "freeParticleFrame",
          "kind": "function",
          "signature": "async freeParticleFrame(frameIndex)",
          "summary": ""
        },
        {
          "name": "archiveHistoryEntry",
          "kind": "function",
          "signature": "async archiveHistoryEntry(index, entry)",
          "summary": "Store old history entry to IDB when memory pressure is high"
        },
        {
          "name": "retrieveHistoryEntry",
          "kind": "function",
          "signature": "async retrieveHistoryEntry(index)",
          "summary": "Retrieve archived history entry from IDB"
        },
        {
          "name": "cacheAsset",
          "kind": "function",
          "signature": "async cacheAsset(uuid, data)",
          "summary": "Store large asset in worker memory"
        },
        {
          "name": "retrieveCachedAsset",
          "kind": "function",
          "signature": "async retrieveCachedAsset(uuid, asText = false)",
          "summary": "Retrieve cached asset from worker memory"
        },
        {
          "name": "storeProfilerFrames",
          "kind": "function",
          "signature": "storeProfilerFrames(frames)",
          "summary": "Store profiler frame batch in WASM memory"
        },
        {
          "name": "getMemoryStats",
          "kind": "function",
          "signature": "async getMemoryStats()",
          "summary": "Get comprehensive memory stats"
        },
        {
          "name": "formatMemoryForProfiler",
          "kind": "function",
          "signature": "formatMemoryForProfiler(stats)",
          "summary": "Format memory stats for profiler display"
        },
        {
          "name": "getManager",
          "kind": "function",
          "signature": "getManager()",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/ObjectPool",
      "path": "editor/reference/utils/ObjectPool.md",
      "source": "editor/js/utils/ObjectPool.js",
      "import": "/editor/js/utils/ObjectPool.js",
      "sourceHash": "4b5a94b58d6822b5d0b9a6b7cf858c5cf84ca8f1af947f93706d5d1b750ef984",
      "summary": "Get a Float32Array of specified size from pool",
      "exports": [
        {
          "name": "getFloat32Array",
          "kind": "function",
          "signature": "getFloat32Array(size)",
          "summary": "Get a Float32Array of specified size from pool"
        },
        {
          "name": "releaseFloat32Array",
          "kind": "function",
          "signature": "releaseFloat32Array(arr)",
          "summary": "Return a Float32Array to the pool"
        },
        {
          "name": "getArray",
          "kind": "function",
          "signature": "getArray()",
          "summary": "Get a generic array from pool"
        },
        {
          "name": "releaseArray",
          "kind": "function",
          "signature": "releaseArray(arr)",
          "summary": "Return a generic array to the pool"
        },
        {
          "name": "getVec3",
          "kind": "function",
          "signature": "getVec3(x = 0, y = 0, z = 0)",
          "summary": "Get a vec3 [x, y, z] from pool"
        },
        {
          "name": "releaseVec3",
          "kind": "function",
          "signature": "releaseVec3(v)",
          "summary": "Return a vec3 to pool"
        },
        {
          "name": "getVec4",
          "kind": "function",
          "signature": "getVec4(x = 0, y = 0, z = 0, w = 1)",
          "summary": "Get a vec4 [x, y, z, w] from pool"
        },
        {
          "name": "releaseVec4",
          "kind": "function",
          "signature": "releaseVec4(v)",
          "summary": "Return a vec4 to pool"
        },
        {
          "name": "getMat4",
          "kind": "function",
          "signature": "getMat4()",
          "summary": "Get a mat4 (16 floats) from pool"
        },
        {
          "name": "releaseMat4",
          "kind": "function",
          "signature": "releaseMat4(m)",
          "summary": "Return a mat4 to pool"
        },
        {
          "name": "getPoolStats",
          "kind": "function",
          "signature": "getPoolStats()",
          "summary": "Get pool statistics"
        },
        {
          "name": "clearPools",
          "kind": "function",
          "signature": "clearPools()",
          "summary": "Clear all pools (for memory pressure situations)"
        },
        {
          "name": "trimPools",
          "kind": "function",
          "signature": "trimPools(keepRatio = 0.5)",
          "summary": "Trim pools to reduce memory (keep some for reuse)"
        },
        {
          "name": "transformPool",
          "kind": "constant",
          "signature": "transformPool",
          "summary": ""
        },
        {
          "name": "snapshotEntityPool",
          "kind": "constant",
          "signature": "snapshotEntityPool",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/OffHeapMemory",
      "path": "editor/reference/utils/OffHeapMemory.md",
      "source": "editor/js/utils/OffHeapMemory.js",
      "import": "/editor/js/utils/OffHeapMemory.js",
      "sourceHash": "9c486be0279902350b24eacd1e64d7a1e3e0eef52dd1bcf87ad31e27185149a8",
      "summary": "OffHeapMemory.js - MAXIMUM Memory Expansion System Pushes browser memory limits to the absolute maximum using every available strategy: 1. Multi-WASM Pool - Multiple 4GB WASM modules (up to 16GB+ total) 2. Worker Memory Pool - Each worker has its own ~4GB heap 3. SharedArrayBuffer - Zero-copy cross-worker/thread communication 4. GPU Buffer Storage - VRAM is separate from system RAM limits 5. IndexedDB Sharding - Multiple databases for unlimited persistent storage 6. ArrayBuffer Pooling - Aggressive reuse to minimize GC pressure 7. Memory Pressure Management - Auto-offloading and tiered storage THEORETICAL MAXIMUM: - 4 WASM modules × 4GB = 16GB - 8 Workers × 4GB heap = 32GB (but shared address space limits this) - GPU buffers = Limited by VRAM (8-24GB on modern GPUs) - IndexedDB = Unlimited (disk-backed) PRACTICAL MAXIMUM: ~8-16GB usable off-heap memory",
      "exports": [
        {
          "name": "MultiWasmMemoryPool",
          "kind": "class",
          "signature": "class MultiWasmMemoryPool",
          "summary": "Multi-WASM Memory Pool Creates multiple WASM memory instances, each up to 4GB Total capacity: up to 16GB off-heap"
        },
        {
          "name": "ArrayBufferPool",
          "kind": "class",
          "signature": "class ArrayBufferPool",
          "summary": "ArrayBuffer pool for reducing GC pressure Reuses buffers instead of creating new ones"
        },
        {
          "name": "GPUBufferStorage",
          "kind": "class",
          "signature": "class GPUBufferStorage",
          "summary": "GPU buffer storage for large data Keeps data in VRAM instead of JS heap"
        },
        {
          "name": "IndexedDBStorage",
          "kind": "class",
          "signature": "class IndexedDBStorage",
          "summary": "IndexedDB storage for large persistent data"
        },
        {
          "name": "WorkerMemoryPool",
          "kind": "class",
          "signature": "class WorkerMemoryPool",
          "summary": "Worker-based memory expansion Each Web Worker has its own JS heap (~4GB potential) Spawn multiple workers to multiply available memory"
        },
        {
          "name": "SharedRingBuffer",
          "kind": "class",
          "signature": "class SharedRingBuffer",
          "summary": "SharedArrayBuffer Ring Buffer Zero-copy data sharing between main thread and workers Requires Cross-Origin-Isolation headers"
        },
        {
          "name": "MaxGPUBufferStorage",
          "kind": "class",
          "signature": "class MaxGPUBufferStorage extends GPUBufferStorage",
          "summary": "Maximum GPU Buffer Storage Aggressively uses VRAM for data storage"
        },
        {
          "name": "OffHeapMemoryManager",
          "kind": "class",
          "signature": "class OffHeapMemoryManager",
          "summary": "MAXIMUM Memory Expansion Manager Combines ALL strategies for absolute maximum memory capacity"
        },
        {
          "name": "invalidateLegacyOffHeapCaches",
          "kind": "function",
          "signature": "async invalidateLegacyOffHeapCaches(indexedDBApi = globalThis.indexedDB)",
          "summary": ""
        },
        {
          "name": "getOffHeapManager",
          "kind": "function",
          "signature": "getOffHeapManager()",
          "summary": ""
        },
        {
          "name": "initOffHeapManager",
          "kind": "function",
          "signature": "async initOffHeapManager(device = null, options = {})",
          "summary": ""
        },
        {
          "name": "OFFHEAP_CACHE_NAMESPACE",
          "kind": "constant",
          "signature": "OFFHEAP_CACHE_NAMESPACE",
          "summary": ""
        },
        {
          "name": "OFFHEAP_CACHE_VERSION",
          "kind": "constant",
          "signature": "OFFHEAP_CACHE_VERSION",
          "summary": ""
        },
        {
          "name": "OFFHEAP_CACHE_DB_NAME",
          "kind": "constant",
          "signature": "OFFHEAP_CACHE_DB_NAME",
          "summary": ""
        },
        {
          "name": "OFFHEAP_LEGACY_CACHE_DB_NAMES",
          "kind": "constant",
          "signature": "OFFHEAP_LEGACY_CACHE_DB_NAMES",
          "summary": ""
        },
        {
          "name": "WasmMemoryPool",
          "kind": "constant",
          "signature": "WasmMemoryPool",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/PhysicsBodyPool",
      "path": "editor/reference/utils/PhysicsBodyPool.md",
      "source": "editor/js/utils/PhysicsBodyPool.js",
      "import": "/editor/js/utils/PhysicsBodyPool.js",
      "sourceHash": "38f7c419908abc9483ee5b89ec23beb008e85bc4965af46389b7f2dd8a36dff5",
      "summary": "Get a body handle from pool or signal that new one is needed",
      "exports": [
        {
          "name": "getPooledBody",
          "kind": "function",
          "signature": "getPooledBody(simMode, colliderShape)",
          "summary": "Get a body handle from pool or signal that new one is needed"
        },
        {
          "name": "releaseBody",
          "kind": "function",
          "signature": "releaseBody(physicsWorld, bodyHandle, simMode, colliderShape)",
          "summary": "Return a body to the pool for reuse"
        },
        {
          "name": "resetPooledBody",
          "kind": "function",
          "signature": "resetPooledBody(physicsWorld, bodyHandle, position, rotation, scale)",
          "summary": "Reset a pooled body for reuse with new transform"
        },
        {
          "name": "getPoolStats",
          "kind": "function",
          "signature": "getPoolStats()",
          "summary": "Get pool statistics"
        },
        {
          "name": "clearPools",
          "kind": "function",
          "signature": "clearPools(physicsWorld)",
          "summary": "Clear all pools (destroys pooled bodies)"
        },
        {
          "name": "trimPools",
          "kind": "function",
          "signature": "trimPools(keepCount = 5)",
          "summary": "Trim pools to reduce memory"
        },
        {
          "name": "BODY_TYPES",
          "kind": "re-export",
          "signature": "BODY_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/RenderBundleCache",
      "path": "editor/reference/utils/RenderBundleCache.md",
      "source": "editor/js/utils/RenderBundleCache.js",
      "import": "/editor/js/utils/RenderBundleCache.js",
      "sourceHash": "435b4b2309494af850cd462728e09854185e25137376dd16cef7f0e9e4996df9",
      "summary": "Create or get cached render bundle",
      "exports": [
        {
          "name": "getOrCreateBundle",
          "kind": "function",
          "signature": "getOrCreateBundle(device, key, version, descriptor, recordFn)",
          "summary": "Create or get cached render bundle"
        },
        {
          "name": "invalidateBundle",
          "kind": "function",
          "signature": "invalidateBundle(key)",
          "summary": "Invalidate a specific bundle (force re-record next frame)"
        },
        {
          "name": "invalidateBundlesWithPrefix",
          "kind": "function",
          "signature": "invalidateBundlesWithPrefix(prefix)",
          "summary": "Invalidate all bundles matching a prefix"
        },
        {
          "name": "clearBundleCache",
          "kind": "function",
          "signature": "clearBundleCache()",
          "summary": "Clear all cached bundles"
        },
        {
          "name": "pruneOldBundles",
          "kind": "function",
          "signature": "pruneOldBundles(maxAgeMs = 60000)",
          "summary": "Remove bundles not used recently"
        },
        {
          "name": "getCacheStats",
          "kind": "function",
          "signature": "getCacheStats()",
          "summary": "Get cache statistics"
        },
        {
          "name": "createStandardDescriptor",
          "kind": "function",
          "signature": "createStandardDescriptor(colorFormat = 'bgra8unorm', depthFormat = 'depth24plus')",
          "summary": "Helper to create standard descriptor for color + depth rendering"
        },
        {
          "name": "executeBundles",
          "kind": "function",
          "signature": "executeBundles(passEncoder, bundles)",
          "summary": "Execute render bundles in a render pass"
        },
        {
          "name": "EngineRenderBundleCache",
          "kind": "re-export",
          "signature": "EngineRenderBundleCache",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/SIMDMath",
      "path": "editor/reference/utils/SIMDMath.md",
      "source": "editor/js/utils/SIMDMath.js",
      "import": "/editor/js/utils/SIMDMath.js",
      "sourceHash": "7c63032b5269c92c8a44ab789195c733b46b1aa6246998c4c86172b755552a2e",
      "summary": "Create a batch of vec3s in SoA format",
      "exports": [
        {
          "name": "createVec3Batch",
          "kind": "function",
          "signature": "createVec3Batch(count)",
          "summary": "Create a batch of vec3s in SoA format"
        },
        {
          "name": "vec3ArrayToBatch",
          "kind": "function",
          "signature": "vec3ArrayToBatch(vectors)",
          "summary": "Create batch from array of [x,y,z] vectors"
        },
        {
          "name": "batchToVec3Array",
          "kind": "function",
          "signature": "batchToVec3Array(batch)",
          "summary": "Convert batch back to array of [x,y,z]"
        },
        {
          "name": "batchAdd",
          "kind": "function",
          "signature": "batchAdd(a, b, out = createVec3Batch(a.count)",
          "summary": "Batch add: out = a + b"
        },
        {
          "name": "batchSub",
          "kind": "function",
          "signature": "batchSub(a, b, out = createVec3Batch(a.count)",
          "summary": "Batch subtract: out = a - b"
        },
        {
          "name": "batchScale",
          "kind": "function",
          "signature": "batchScale(a, scalar, out = createVec3Batch(a.count)",
          "summary": "Batch scale: out = a * scalar"
        },
        {
          "name": "batchMul",
          "kind": "function",
          "signature": "batchMul(a, b, out = createVec3Batch(a.count)",
          "summary": "Batch multiply component-wise: out = a * b"
        },
        {
          "name": "batchDot",
          "kind": "function",
          "signature": "batchDot(a, b, out = new Float32Array(a.count)",
          "summary": "Batch dot product: out[i] = dot(a[i], b[i])"
        },
        {
          "name": "batchCross",
          "kind": "function",
          "signature": "batchCross(a, b, out = createVec3Batch(a.count)",
          "summary": "Batch cross product: out = a × b"
        },
        {
          "name": "batchLengthSq",
          "kind": "function",
          "signature": "batchLengthSq(a, out = new Float32Array(a.count)",
          "summary": "Batch length squared: out[i] = |a[i]|²"
        },
        {
          "name": "batchLength",
          "kind": "function",
          "signature": "batchLength(a, out = new Float32Array(a.count)",
          "summary": "Batch length: out[i] = |a[i]|"
        },
        {
          "name": "batchNormalize",
          "kind": "function",
          "signature": "batchNormalize(a, out = createVec3Batch(a.count)",
          "summary": "Batch normalize: out[i] = normalize(a[i])"
        },
        {
          "name": "batchLerp",
          "kind": "function",
          "signature": "batchLerp(a, b, t, out = createVec3Batch(a.count)",
          "summary": "Batch lerp: out = lerp(a, b, t)"
        },
        {
          "name": "batchTransform",
          "kind": "function",
          "signature": "batchTransform(batch, m, out = createVec3Batch(batch.count)",
          "summary": "Batch transform by 4x4 matrix"
        },
        {
          "name": "batchDistanceToPoint",
          "kind": "function",
          "signature": "batchDistanceToPoint(batch, point, out = new Float32Array(batch.count)",
          "summary": "Batch distance to point"
        },
        {
          "name": "batchDistanceSqToPoint",
          "kind": "function",
          "signature": "batchDistanceSqToPoint(batch, point, out = new Float32Array(batch.count)",
          "summary": "Batch distance squared to point (faster, for comparisons)"
        },
        {
          "name": "batchFindWithinRadius",
          "kind": "function",
          "signature": "batchFindWithinRadius(batch, point, radius)",
          "summary": "Find indices within radius of point"
        },
        {
          "name": "batchFindKNearest",
          "kind": "function",
          "signature": "batchFindKNearest(batch, point, k)",
          "summary": "Find K nearest neighbors"
        },
        {
          "name": "batchComputeAABB",
          "kind": "function",
          "signature": "batchComputeAABB(batch)",
          "summary": "Batch AABB computation"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/SpatialIndex",
      "path": "editor/reference/utils/SpatialIndex.md",
      "source": "editor/js/utils/SpatialIndex.js",
      "import": "/editor/js/utils/SpatialIndex.js",
      "sourceHash": "ce07bd44a5fc58434a7d2a31fc067d039310487ad753ce81e013ccede4c9244d",
      "summary": "Simple Octree for dynamic entity queries Better for frequently changing scenes than BVH",
      "exports": [
        {
          "name": "Octree",
          "kind": "class",
          "signature": "class Octree",
          "summary": "Simple Octree for dynamic entity queries Better for frequently changing scenes than BVH"
        },
        {
          "name": "EntitySpatialIndex",
          "kind": "class",
          "signature": "class EntitySpatialIndex",
          "summary": "EntitySpatialIndex - Manages spatial indexing for editor entities"
        },
        {
          "name": "BVHBuilder",
          "kind": "re-export",
          "signature": "BVHBuilder",
          "summary": ""
        },
        {
          "name": "BVHNode",
          "kind": "re-export",
          "signature": "BVHNode",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/TextureCompression",
      "path": "editor/reference/utils/TextureCompression.md",
      "source": "editor/js/utils/TextureCompression.js",
      "import": "/editor/js/utils/TextureCompression.js",
      "sourceHash": "41f6e7d6b4ff7ec44bb32b57773db17a5b8dcdd0c8017055fefda182d41816ab",
      "summary": "TextureCompression - WebGPU compressed texture format support. Supports: - BC formats (Desktop: DXT/S3TC) - ASTC formats (Mobile/Apple) - ETC2 formats (Android/WebGL fallback)",
      "exports": [
        {
          "name": "detectCompressedFormats",
          "kind": "function",
          "signature": "detectCompressedFormats(adapter)",
          "summary": "Detect supported compressed texture formats."
        },
        {
          "name": "getOptimalFormat",
          "kind": "function",
          "signature": "getOptimalFormat(adapter, needsAlpha = true)",
          "summary": "Get optimal texture format for device."
        },
        {
          "name": "getCompressedSize",
          "kind": "function",
          "signature": "getCompressedSize(width, height, format)",
          "summary": "Calculate compressed texture size."
        },
        {
          "name": "getMemorySavings",
          "kind": "function",
          "signature": "getMemorySavings(width, height, compressedFormat)",
          "summary": "Calculate memory savings percentage."
        },
        {
          "name": "getQualitySizeScore",
          "kind": "function",
          "signature": "getQualitySizeScore(width, height, format, options = {})",
          "summary": "Calculate a quality-size report for picker and audit UI."
        },
        {
          "name": "createCompressedTexture",
          "kind": "function",
          "signature": "createCompressedTexture(device, adapter, descriptor)",
          "summary": "Create compressed texture with fallback."
        },
        {
          "name": "getFormatInfo",
          "kind": "function",
          "signature": "getFormatInfo(format)",
          "summary": "Get format info for display."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "utils/WeakCache",
      "path": "editor/reference/utils/WeakCache.md",
      "source": "editor/js/utils/WeakCache.js",
      "import": "/editor/js/utils/WeakCache.js",
      "sourceHash": "56411761902844f58da03283d3f8b22627c15e1d731c5bedc1e79dbdc33435e8",
      "summary": "WeakValueMap - Map with weak references to values Values are auto-removed when garbage collected",
      "exports": [
        {
          "name": "WeakValueMap",
          "kind": "class",
          "signature": "class WeakValueMap",
          "summary": "WeakValueMap - Map with weak references to values Values are auto-removed when garbage collected"
        },
        {
          "name": "LRUCache",
          "kind": "class",
          "signature": "class LRUCache",
          "summary": "LRUCache - Least Recently Used cache with max size"
        },
        {
          "name": "TTLCache",
          "kind": "class",
          "signature": "class TTLCache",
          "summary": "TTLCache - Cache with time-to-live expiration"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/AuraRenderer",
      "path": "editor/reference/viewport/AuraRenderer.md",
      "source": "editor/js/viewport/AuraRenderer.js",
      "import": "/editor/js/viewport/AuraRenderer.js",
      "sourceHash": "8456893608ffdb4fc3c6ef6ab0aca21b16b199a18cc77098b5edb3495edadd60",
      "summary": "AuraRenderer — System 1: Outer Energy Shell / Aura Layer ========================================================= Renders the actual model mesh at slightly expanded scale with electric blue-cyan color — same approach as SkinRenderer but bigger and more transparent. No hull approximation needed; the real mesh IS the aura shell. LAYER ROLE: Outermost visible layer — glowing energy field that exactly traces the body shape at AURA_SCALE (8% larger than entity scale). VISUAL: - Full-res model mesh, electric blue-cyan [0.2, 0.7, 1.0, 0.15] - Scale multiplied by AURA_SCALE so it sits slightly outside the skin - High roughness for a soft diffuse glow look DATA SOURCE: EntityMeshRenderer already has 'custom_<uuid>' registered. No extra work. INDEPENDENCE: - No imports needed beyond EntityMeshRenderer (draw) - No reference to SkinRenderer, SkeletonRenderer, SDFColliderRenderer",
      "exports": [
        {
          "name": "AuraRenderer",
          "kind": "class",
          "signature": "class AuraRenderer",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/CameraController",
      "path": "editor/reference/viewport/CameraController.md",
      "source": "editor/js/viewport/CameraController.js",
      "import": "/editor/js/viewport/CameraController.js",
      "sourceHash": "0f3cf6284abebfff96e9c7edf52ce7b0fae14991b940d46703ee6ae908490459",
      "summary": "",
      "exports": [
        {
          "name": "CameraController",
          "kind": "class",
          "signature": "class CameraController",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/CollabOverlayRenderer",
      "path": "editor/reference/viewport/CollabOverlayRenderer.md",
      "source": "editor/js/viewport/CollabOverlayRenderer.js",
      "import": "/editor/js/viewport/CollabOverlayRenderer.js",
      "sourceHash": "e5081da39c3b05c3657b2423b59f5afe6fee567013f27e6b5838a1d69d054dfa",
      "summary": "CollabOverlayRenderer.js Renders peer cameras as small 3D camcorder-style pyramids in the viewport, with colored tint matching the peer's chosen color and a floating name label. Uses the existing EntityMeshRenderer to draw pyramids (no new GPU pipelines needed). Name labels are HTML overlays positioned via 3D→2D projection.",
      "exports": [
        {
          "name": "CollabOverlayRenderer",
          "kind": "class",
          "signature": "class CollabOverlayRenderer",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/GhostPreviewRenderer",
      "path": "editor/reference/viewport/GhostPreviewRenderer.md",
      "source": "editor/js/viewport/GhostPreviewRenderer.js",
      "import": "/editor/js/viewport/GhostPreviewRenderer.js",
      "sourceHash": "f5fba947677b0d389645ab7efc411b55dd416f1480714d8040c2fa90c0a5addf",
      "summary": "",
      "exports": [
        {
          "name": "GhostPreviewRenderer",
          "kind": "class",
          "signature": "class GhostPreviewRenderer",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/SDFColliderRenderer",
      "path": "editor/reference/viewport/SDFColliderRenderer.md",
      "source": "editor/js/viewport/SDFColliderRenderer.js",
      "import": "/editor/js/viewport/SDFColliderRenderer.js",
      "sourceHash": "a31e779474372f262f8866dc8fc0158cc25e822f6b13f88dd28ffe5de82ff887",
      "summary": "",
      "exports": [
        {
          "name": "SDFColliderRenderer",
          "kind": "class",
          "signature": "class SDFColliderRenderer",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/ShapeWireframes",
      "path": "editor/reference/viewport/ShapeWireframes.md",
      "source": "editor/js/viewport/ShapeWireframes.js",
      "import": "/editor/js/viewport/ShapeWireframes.js",
      "sourceHash": "420ffad89328f100b5c1b77088cee47b5b0eb0189ce6eab94064cb94e843be6a",
      "summary": "ShapeWireframes.js — Shared shape-specific wireframe generators ================================================================ Used by SkeletonRenderer, SkinRenderer, and AuraRenderer to render shape-accurate wireframe overlays that match the SDF collider shapes. Each generator returns { joints: [[x,y,z],...], edges: [[i,j],...] } in LOCAL space. The caller transforms to world space.",
      "exports": [
        {
          "name": "generateShapeWireframe",
          "kind": "function",
          "signature": "generateShapeWireframe(meshType, es, ep, er, doRot)",
          "summary": "Generate a shape-specific wireframe for an entity."
        },
        {
          "name": "quatFromDir",
          "kind": "function",
          "signature": "quatFromDir(dx, dy, dz)",
          "summary": "Compute quaternion that aligns Y-axis [0,1,0] with direction [dx,dy,dz]. Exported for use in renderers that draw capsule sticks between joints."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/SkeletonRenderer",
      "path": "editor/reference/viewport/SkeletonRenderer.md",
      "source": "editor/js/viewport/SkeletonRenderer.js",
      "import": "/editor/js/viewport/SkeletonRenderer.js",
      "sourceHash": "e7d4dbd709b5d554151d2f13c28b7264f2d82e653e3a3a024dcf50f00592acb6",
      "summary": "SkeletonRenderer — System 3: X-Ray Skeleton / Bone Layer ========================================================= Renders the internal skeleton as solid physical geometry — gold ball joints at each bone pivot, ivory metallic bone sticks connecting them. Think medical X-ray imaging or the internal rig view in a 3D animation tool. LAYER ROLE: Innermost visible layer — inside the skin capsules. Fully opaque metallic geometry. Shows the exact bone hierarchy as a physical rig. VISUAL: Ball joints: gold [1.0, 0.85, 0.3, 1.0], metallic=0.9, roughness=0.15 Bone sticks: ivory [0.95, 0.9, 0.8, 1.0], metallic=0.85, roughness=0.2 Sizes scaled by body height — proportionally correct DATA SOURCE: getAnimatedBoneShapes() → .joints[] (all joint world positions + child links) INDEPENDENCE: - Imports ONLY from SkeletalAnimation.js (data) and EntityMeshRenderer (draw) - No reference to AuraRenderer, SkinRenderer, SDFColliderRenderer - Can be deleted without affecting any other system EDIT MODE vs PLAY MODE: Edit: animated bone joints from getAnimatedBoneShapes() Play (ragdoll): bone positions from live physics bodies",
      "exports": [
        {
          "name": "SkeletonRenderer",
          "kind": "class",
          "signature": "class SkeletonRenderer",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/SkinRenderer",
      "path": "editor/reference/viewport/SkinRenderer.md",
      "source": "editor/js/viewport/SkinRenderer.js",
      "import": "/editor/js/viewport/SkinRenderer.js",
      "sourceHash": "56e1889b47b491894bbe347759f68e378db4413251762af53a0762f31cf99f95",
      "summary": "SkinRenderer — System 2: High-Detail Body Skin ================================================ Renders the ACTUAL mesh geometry of the entity, semi-transparent, with a warm skin tone. Full triangle count of the imported model — this is NOT a hull approximation. The mesh IS the skin layer. LAYER ROLE: Inner visible layer — shows the real body geometry as a translucent skin shell. Since it uses the same mesh as the actual entity render, it is perfectly shape-accurate at full detail. VISUAL: - Full-res model mesh, warm skin tone [0.9, 0.6, 0.4, 0.28] - Rendered via the existing 'custom_<uuid>' mesh key already in EntityMeshRenderer - No separate mesh registration needed — the mesh is already uploaded DATA SOURCE: EntityMeshRenderer already has the 'custom_<uuid>' mesh registered when the entity loads. No separate computation needed — just pass entity transform directly. INDEPENDENCE: - No external imports needed beyond EntityMeshRenderer (draw) - No reference to AuraRenderer, SkeletonRenderer, SDFColliderRenderer",
      "exports": [
        {
          "name": "SkinRenderer",
          "kind": "class",
          "signature": "class SkinRenderer",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/SurfaceGridRenderer",
      "path": "editor/reference/viewport/SurfaceGridRenderer.md",
      "source": "editor/js/viewport/SurfaceGridRenderer.js",
      "import": "/editor/js/viewport/SurfaceGridRenderer.js",
      "sourceHash": "5e59066084c974ded5200d0a3b1faecb515b662ec38cb375cecaa2ab5d4efb2d",
      "summary": "SurfaceGridRenderer.js GMod-style surface grid overlay for precise tool placement Shows a transparent green grid aligned to the surface normal",
      "exports": [
        {
          "name": "SurfaceGridRenderer",
          "kind": "class",
          "signature": "class SurfaceGridRenderer",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/ViewportMeshUtils",
      "path": "editor/reference/viewport/ViewportMeshUtils.md",
      "source": "editor/js/viewport/ViewportMeshUtils.js",
      "import": "/editor/js/viewport/ViewportMeshUtils.js",
      "sourceHash": "d6a6704aa13454e7e3ded7da3955846153918de2125a8df9354938df0066c3ba",
      "summary": "ViewportMeshUtils - Mesh type inference and color mapping utilities Extracted from Viewport.js for modularity",
      "exports": [
        {
          "name": "getSpawnIdLower",
          "kind": "function",
          "signature": "getSpawnIdLower(entityMeta)",
          "summary": "Get lowercase spawnId for an entityMeta (no caching — small string allocs are cheaper than WeakMap GC overhead)"
        },
        {
          "name": "isEmitterEntity",
          "kind": "function",
          "signature": "isEmitterEntity(entityMeta)",
          "summary": "Check if entityMeta represents an emitter"
        },
        {
          "name": "getEntityMeshTypes",
          "kind": "function",
          "signature": "getEntityMeshTypes(entityMeta, fallbackMeshType = null)",
          "summary": ""
        },
        {
          "name": "getEntityMeshParts",
          "kind": "function",
          "signature": "getEntityMeshParts(entityMeta, fallbackMeshType = null)",
          "summary": ""
        },
        {
          "name": "getModelPartLocalMatrix",
          "kind": "function",
          "signature": "getModelPartLocalMatrix(part, animatedMatrix = null)",
          "summary": ""
        },
        {
          "name": "composeEntityPartMatrix",
          "kind": "function",
          "signature": "composeEntityPartMatrix(position, rotation, scale, part, animatedMatrix = null)",
          "summary": ""
        },
        {
          "name": "transformAabbByMatrix",
          "kind": "function",
          "signature": "transformAabbByMatrix(bounds, matrix)",
          "summary": ""
        },
        {
          "name": "getAggregateMeshBounds",
          "kind": "function",
          "signature": "getAggregateMeshBounds(entityMeta, meshRenderer, fallbackMeshType = null, resolveAnimatedMatrix = null)",
          "summary": ""
        },
        {
          "name": "inferMeshMaterial",
          "kind": "function",
          "signature": "inferMeshMaterial(meshType)",
          "summary": "Get PBR material properties for a mesh type"
        },
        {
          "name": "inferEntityMeshTypeAndColor",
          "kind": "function",
          "signature": "inferEntityMeshTypeAndColor(entityMeta)",
          "summary": "Infer mesh type and color from entity metadata Results are cached for performance"
        },
        {
          "name": "clearMeshTypeCache",
          "kind": "function",
          "signature": "clearMeshTypeCache()",
          "summary": "Clear mesh type cache (call when entities are added/removed/renamed)"
        },
        {
          "name": "snapToGrid",
          "kind": "function",
          "signature": "snapToGrid(value, gridSize, enabled)",
          "summary": "Snap a value to grid"
        },
        {
          "name": "DEFAULT_COLOR",
          "kind": "re-export",
          "signature": "DEFAULT_COLOR",
          "summary": ""
        },
        {
          "name": "MESH_TYPE_COLORS",
          "kind": "re-export",
          "signature": "MESH_TYPE_COLORS",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/ViewportProfiler",
      "path": "editor/reference/viewport/ViewportProfiler.md",
      "source": "editor/js/viewport/ViewportProfiler.js",
      "import": "/editor/js/viewport/ViewportProfiler.js",
      "sourceHash": "750e6d51fe652b34b79d0df1b853823de999463ce03420cd85fc48845a886cf4",
      "summary": "ViewportProfiler - Performance profiler UI for the viewport Extracted from Viewport.js for modularity",
      "exports": [
        {
          "name": "ViewportProfiler",
          "kind": "class",
          "signature": "class ViewportProfiler",
          "summary": ""
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/ViewportRaycasting",
      "path": "editor/reference/viewport/ViewportRaycasting.md",
      "source": "editor/js/viewport/ViewportRaycasting.js",
      "import": "/editor/js/viewport/ViewportRaycasting.js",
      "sourceHash": "aab744e4f628740bea2ded19bb0457fff83e07c1cc845bee2fcefd12265d4807",
      "summary": "ViewportRaycasting.js - Pure raycasting math utilities Extracted from Viewport.js for modularity",
      "exports": [
        {
          "name": "rayGroundPlaneIntersect",
          "kind": "function",
          "signature": "rayGroundPlaneIntersect(rayOrigin, rayDir, planeY = 0)",
          "summary": "Ray-ground plane intersection"
        },
        {
          "name": "raySegmentDistance",
          "kind": "function",
          "signature": "raySegmentDistance(rayOrigin, rayDir, segA, segB)",
          "summary": "Calculate distance from ray to line segment (for rope picking)"
        },
        {
          "name": "raySphereIntersect",
          "kind": "function",
          "signature": "raySphereIntersect(rayOrigin, rayDir, sphereCenter, radius)",
          "summary": "Ray-sphere intersection test"
        },
        {
          "name": "rotatePointByQuaternion",
          "kind": "function",
          "signature": "rotatePointByQuaternion(point, quat)",
          "summary": "Rotate a point by quaternion"
        },
        {
          "name": "multiplyQuaternions",
          "kind": "function",
          "signature": "multiplyQuaternions(a, b)",
          "summary": "Multiply two quaternions: result = a * b"
        },
        {
          "name": "rayOBBIntersect",
          "kind": "function",
          "signature": "rayOBBIntersect(rayOrigin, rayDir, boxCenter, boxRotation, halfExtents)",
          "summary": "Ray-OBB (Oriented Bounding Box) intersection"
        },
        {
          "name": "closestPointOnAxis",
          "kind": "function",
          "signature": "closestPointOnAxis(rayOrigin, rayDir, axisOrigin, axisDir)",
          "summary": "Closest point on axis from ray"
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/stages/FixedStepStages",
      "path": "editor/reference/viewport/stages/FixedStepStages.md",
      "source": "editor/js/viewport/stages/FixedStepStages.js",
      "import": "/editor/js/viewport/stages/FixedStepStages.js",
      "sourceHash": "a47d08836d2629a90568ccbc1624487771562c3309f0396e2c5f3701070871c3",
      "summary": "FixedStepStages — Physics, elastic drag, sim audio, particle step. These run 0..N times per frame on a fixed timestep accumulator. Only active in play mode (condition-gated).",
      "exports": [
        {
          "name": "registerFixedStepStages",
          "kind": "function",
          "signature": "registerFixedStepStages(pipeline, vp)",
          "summary": "Register all fixedStep-phase stages into the pipeline."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/stages/PostRenderStages",
      "path": "editor/reference/viewport/stages/PostRenderStages.md",
      "source": "editor/js/viewport/stages/PostRenderStages.js",
      "import": "/editor/js/viewport/stages/PostRenderStages.js",
      "sourceHash": "9e94d6f9f61ca501cba58a619e65410bc717ccde6eb69c3b95a86201ffbff715",
      "summary": "PostRenderStages — Composite passes, post-FX, GPU submit, profiler, spike detection, collab presence. During the transitional period, post-render work still lives inside Viewport.renderFrame(). These stages will be populated one-by-one as code is extracted.",
      "exports": [
        {
          "name": "registerPostRenderStages",
          "kind": "function",
          "signature": "registerPostRenderStages(pipeline, vp)",
          "summary": "Register all postRender-phase stages into the pipeline."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/stages/RenderStages",
      "path": "editor/reference/viewport/stages/RenderStages.md",
      "source": "editor/js/viewport/stages/RenderStages.js",
      "import": "/editor/js/viewport/stages/RenderStages.js",
      "sourceHash": "a98b5d5df8ab2502210769ef84efd71d8cf353142b99b859fc612abd776a010a",
      "summary": "RenderStages — GPU render pass stages: debug targets, volume compute, clear pass, grid, entities, physics lines, cloth, surface grid, particles, diagnostics, SDF colliders, bone directions, gizmos. During the transitional period, the main renderFrame() body still runs inline. These stages will be populated one-by-one as code is extracted from Viewport.renderFrame(). Stage order values reserve gaps (10, 20, 30…) so new stages can be inserted between existing ones without renumbering.",
      "exports": [
        {
          "name": "registerRenderStages",
          "kind": "function",
          "signature": "registerRenderStages(pipeline, vp)",
          "summary": "Register all render-phase stages into the pipeline."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "viewport/stages/UpdateStages",
      "path": "editor/reference/viewport/stages/UpdateStages.md",
      "source": "editor/js/viewport/stages/UpdateStages.js",
      "import": "/editor/js/viewport/stages/UpdateStages.js",
      "sourceHash": "ba2e50edc6527a13cae7f49c699ac4d5568a61bfcde124de823b2ff859a94ddc",
      "summary": "UpdateStages — Per-frame update logic: timing, vGPU, camera, matrices, lights, animation, frustum, collab, stats UI, cleanup. Runs once per frame before GPU render passes.",
      "exports": [
        {
          "name": "registerUpdateStages",
          "kind": "function",
          "signature": "registerUpdateStages(pipeline, vp)",
          "summary": "Register all update-phase stages into the pipeline."
        }
      ],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "workers/CollabSignalWorker",
      "path": "editor/reference/workers/CollabSignalWorker.md",
      "source": "editor/js/workers/CollabSignalWorker.js",
      "import": "/editor/js/workers/CollabSignalWorker.js",
      "sourceHash": "b432979ffa2747b6e60d4ae1562351b249c0241d08c1ed78edf65b672a7e71e9",
      "summary": "CollabSignalWorker.js — SharedWorker In-memory SDP relay for all editor tabs on the same machine. Runs once per origin, shared across all tabs. Message types (client → worker): HELLO    { peerId, username } OFFER    { from, to, offerId, payload } ANSWER   { from, to, offerId, payload } CANDIDATE { from, to, offerId, payload } LEAVE    { peerId } LIST     (request peer list) Message types (worker → client): HELLO_ACK   { peerId, peers: [{peerId, username}] } PEER_JOINED { peerId, username } PEER_LEFT   { peerId } OFFER       { from, to, offerId, payload } ANSWER      { from, to, offerId, payload } CANDIDATE   { from, to, offerId, payload } LIST        { peers: [{peerId, username}] }",
      "exports": [],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "workers/CompressionWorker",
      "path": "editor/reference/workers/CompressionWorker.md",
      "source": "editor/js/workers/CompressionWorker.js",
      "import": "/editor/js/workers/CompressionWorker.js",
      "sourceHash": "da8c2f3f14a29e9c2dce9912936eef946bf180e835d7cea7b5e0423a72bc8b10",
      "summary": "CompressionWorker - Offloads timeline/history compression to background thread Uses delta+entropy residual encoding for lossless reconstruction",
      "exports": [],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "workers/ProfilerCanvasWorker",
      "path": "editor/reference/workers/ProfilerCanvasWorker.md",
      "source": "editor/js/workers/ProfilerCanvasWorker.js",
      "import": "/editor/js/workers/ProfilerCanvasWorker.js",
      "sourceHash": "f8c087f2eada652469df7f1ca9ac12d12cc481164bd979ec154ad7071d29c150",
      "summary": "ProfilerCanvasWorker.js - OffscreenCanvas worker for profiler rendering Moves ALL canvas rendering off the main thread: - Timeline graph - Thread lanes - Flame graph bars Main thread only sends frame data, worker handles all drawing.",
      "exports": [],
      "subsystem": "editor"
    },
    {
      "schemaVersion": 1,
      "title": "EcsImports",
      "path": "engine/reference/EcsImports.md",
      "source": "engine/EcsImports.js",
      "import": "/engine/EcsImports.js",
      "sourceHash": "b34f5d45409cca55fac88d7cbd4ea3f85d5cd27da9a535a5a77b3544a1ddd966",
      "summary": "",
      "exports": [
        {
          "name": "World",
          "kind": "constant",
          "signature": "World",
          "summary": ""
        },
        {
          "name": "Camera",
          "kind": "constant",
          "signature": "Camera",
          "summary": ""
        },
        {
          "name": "Light",
          "kind": "constant",
          "signature": "Light",
          "summary": ""
        },
        {
          "name": "PhysicsBody",
          "kind": "constant",
          "signature": "PhysicsBody",
          "summary": ""
        },
        {
          "name": "Collider",
          "kind": "constant",
          "signature": "Collider",
          "summary": ""
        },
        {
          "name": "Transform",
          "kind": "constant",
          "signature": "Transform",
          "summary": ""
        },
        {
          "name": "ParticleEmitter",
          "kind": "constant",
          "signature": "ParticleEmitter",
          "summary": ""
        },
        {
          "name": "NetReplicated",
          "kind": "constant",
          "signature": "NetReplicated",
          "summary": ""
        },
        {
          "name": "ReplicationProfiles",
          "kind": "constant",
          "signature": "ReplicationProfiles",
          "summary": ""
        },
        {
          "name": "Storage",
          "kind": "constant",
          "signature": "Storage",
          "summary": ""
        },
        {
          "name": "createCamera",
          "kind": "constant",
          "signature": "createCamera",
          "summary": ""
        },
        {
          "name": "createLight",
          "kind": "constant",
          "signature": "createLight",
          "summary": ""
        },
        {
          "name": "createPhysicsBody",
          "kind": "constant",
          "signature": "createPhysicsBody",
          "summary": ""
        },
        {
          "name": "createCollider",
          "kind": "constant",
          "signature": "createCollider",
          "summary": ""
        },
        {
          "name": "createTransform",
          "kind": "constant",
          "signature": "createTransform",
          "summary": ""
        },
        {
          "name": "createParticleEmitter",
          "kind": "constant",
          "signature": "createParticleEmitter",
          "summary": ""
        },
        {
          "name": "createNetReplicated",
          "kind": "constant",
          "signature": "createNetReplicated",
          "summary": ""
        },
        {
          "name": "setEntityComponent",
          "kind": "constant",
          "signature": "setEntityComponent",
          "summary": ""
        },
        {
          "name": "getEntityComponent",
          "kind": "constant",
          "signature": "getEntityComponent",
          "summary": ""
        },
        {
          "name": "removeEntityComponent",
          "kind": "constant",
          "signature": "removeEntityComponent",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "EngineBootstrap",
      "path": "engine/reference/EngineBootstrap.md",
      "source": "engine/EngineBootstrap.js",
      "import": "/engine/EngineBootstrap.js",
      "sourceHash": "5505cfd446c76de676c7da6c248e1e33232dd3ab1421b16eb9968df018a7db1b",
      "summary": "EngineBootstrap.js - Unified engine import for games and tests Single import point for all engine functionality: - Math utilities - ECS (Entity Component System) - Rendering (meshes, shaders, pipelines) - Tools (inspector, camera, physics sandbox) - GPU utilities (buffers, WebGPU init) - Simulation (particles, fluids) - Configuration",
      "exports": [
        {
          "name": "Engine",
          "kind": "constant",
          "signature": "Engine",
          "summary": ""
        },
        {
          "name": "ADAPTIVE_QUALITY_TIERS",
          "kind": "re-export",
          "signature": "ADAPTIVE_QUALITY_TIERS",
          "summary": ""
        },
        {
          "name": "AGI_CORE_FULL",
          "kind": "re-export",
          "signature": "AGI_CORE_FULL",
          "summary": ""
        },
        {
          "name": "AGI_CORE_VERSION",
          "kind": "re-export",
          "signature": "AGI_CORE_VERSION",
          "summary": ""
        },
        {
          "name": "AI",
          "kind": "re-export",
          "signature": "AI",
          "summary": ""
        },
        {
          "name": "AdaptiveQualityGovernor",
          "kind": "re-export",
          "signature": "AdaptiveQualityGovernor",
          "summary": ""
        },
        {
          "name": "Anatomy",
          "kind": "re-export",
          "signature": "Anatomy",
          "summary": ""
        },
        {
          "name": "Animation",
          "kind": "re-export",
          "signature": "Animation",
          "summary": ""
        },
        {
          "name": "AnimationLearning",
          "kind": "re-export",
          "signature": "AnimationLearning",
          "summary": ""
        },
        {
          "name": "Assets",
          "kind": "re-export",
          "signature": "Assets",
          "summary": ""
        },
        {
          "name": "Audio",
          "kind": "re-export",
          "signature": "Audio",
          "summary": ""
        },
        {
          "name": "BUILD_TAG",
          "kind": "re-export",
          "signature": "BUILD_TAG",
          "summary": ""
        },
        {
          "name": "BVHBuilder",
          "kind": "re-export",
          "signature": "BVHBuilder",
          "summary": ""
        },
        {
          "name": "BVHNode",
          "kind": "re-export",
          "signature": "BVHNode",
          "summary": ""
        },
        {
          "name": "CAMERA_CONTROLLER_LIMITS",
          "kind": "re-export",
          "signature": "CAMERA_CONTROLLER_LIMITS",
          "summary": ""
        },
        {
          "name": "CORE_STORYLETS",
          "kind": "re-export",
          "signature": "CORE_STORYLETS",
          "summary": ""
        },
        {
          "name": "CitySystem",
          "kind": "re-export",
          "signature": "CitySystem",
          "summary": ""
        },
        {
          "name": "Collab",
          "kind": "re-export",
          "signature": "Collab",
          "summary": ""
        },
        {
          "name": "Compat",
          "kind": "re-export",
          "signature": "Compat",
          "summary": ""
        },
        {
          "name": "Config",
          "kind": "re-export",
          "signature": "Config",
          "summary": ""
        },
        {
          "name": "ContractSystem",
          "kind": "re-export",
          "signature": "ContractSystem",
          "summary": ""
        },
        {
          "name": "Core",
          "kind": "re-export",
          "signature": "Core",
          "summary": ""
        },
        {
          "name": "CrimeType",
          "kind": "re-export",
          "signature": "CrimeType",
          "summary": ""
        },
        {
          "name": "DEFAULT_CONFIG",
          "kind": "re-export",
          "signature": "DEFAULT_CONFIG",
          "summary": ""
        },
        {
          "name": "DEFAULT_CRYSTAL_PARAMS",
          "kind": "re-export",
          "signature": "DEFAULT_CRYSTAL_PARAMS",
          "summary": ""
        },
        {
          "name": "DEFAULT_PHYSICS",
          "kind": "re-export",
          "signature": "DEFAULT_PHYSICS",
          "summary": ""
        },
        {
          "name": "DEFAULT_RENDER",
          "kind": "re-export",
          "signature": "DEFAULT_RENDER",
          "summary": ""
        },
        {
          "name": "DEFAULT_STANDARD_INPUT_ACTION_MAP",
          "kind": "re-export",
          "signature": "DEFAULT_STANDARD_INPUT_ACTION_MAP",
          "summary": ""
        },
        {
          "name": "DialogueRunner",
          "kind": "re-export",
          "signature": "DialogueRunner",
          "summary": ""
        },
        {
          "name": "DialogueSystem",
          "kind": "re-export",
          "signature": "DialogueSystem",
          "summary": ""
        },
        {
          "name": "DirectorEventType",
          "kind": "re-export",
          "signature": "DirectorEventType",
          "summary": ""
        },
        {
          "name": "DomainGraph",
          "kind": "re-export",
          "signature": "DomainGraph",
          "summary": ""
        },
        {
          "name": "DriveType",
          "kind": "re-export",
          "signature": "DriveType",
          "summary": ""
        },
        {
          "name": "EDITOR_FULL",
          "kind": "re-export",
          "signature": "EDITOR_FULL",
          "summary": ""
        },
        {
          "name": "EDITOR_STARTED",
          "kind": "re-export",
          "signature": "EDITOR_STARTED",
          "summary": ""
        },
        {
          "name": "EDITOR_VERSION",
          "kind": "re-export",
          "signature": "EDITOR_VERSION",
          "summary": ""
        },
        {
          "name": "ELEMENTS",
          "kind": "re-export",
          "signature": "ELEMENTS",
          "summary": ""
        },
        {
          "name": "EMITTER_TYPES",
          "kind": "re-export",
          "signature": "EMITTER_TYPES",
          "summary": ""
        },
        {
          "name": "ENGINE_FULL",
          "kind": "re-export",
          "signature": "ENGINE_FULL",
          "summary": ""
        },
        {
          "name": "ENGINE_STARTED",
          "kind": "re-export",
          "signature": "ENGINE_STARTED",
          "summary": ""
        },
        {
          "name": "ENGINE_VERSION",
          "kind": "re-export",
          "signature": "ENGINE_VERSION",
          "summary": ""
        },
        {
          "name": "EPSILON",
          "kind": "re-export",
          "signature": "EPSILON",
          "summary": ""
        },
        {
          "name": "EquipSlot",
          "kind": "re-export",
          "signature": "EquipSlot",
          "summary": ""
        },
        {
          "name": "EventGraph",
          "kind": "re-export",
          "signature": "EventGraph",
          "summary": ""
        },
        {
          "name": "FactionAction",
          "kind": "re-export",
          "signature": "FactionAction",
          "summary": ""
        },
        {
          "name": "FactionGraph",
          "kind": "re-export",
          "signature": "FactionGraph",
          "summary": ""
        },
        {
          "name": "FluidPhase",
          "kind": "re-export",
          "signature": "FluidPhase",
          "summary": ""
        },
        {
          "name": "GPUTimestampProfiler",
          "kind": "re-export",
          "signature": "GPUTimestampProfiler",
          "summary": ""
        },
        {
          "name": "GRAB_CONTROLLER_LIMITS",
          "kind": "re-export",
          "signature": "GRAB_CONTROLLER_LIMITS",
          "summary": ""
        },
        {
          "name": "HiZPass",
          "kind": "re-export",
          "signature": "HiZPass",
          "summary": ""
        },
        {
          "name": "INF_T",
          "kind": "re-export",
          "signature": "INF_T",
          "summary": ""
        },
        {
          "name": "ImageHeatHazePass",
          "kind": "re-export",
          "signature": "ImageHeatHazePass",
          "summary": ""
        },
        {
          "name": "IndexedClusterCuller",
          "kind": "re-export",
          "signature": "IndexedClusterCuller",
          "summary": ""
        },
        {
          "name": "InstinctGraph",
          "kind": "re-export",
          "signature": "InstinctGraph",
          "summary": ""
        },
        {
          "name": "Inventory",
          "kind": "re-export",
          "signature": "Inventory",
          "summary": ""
        },
        {
          "name": "ItemOwnership",
          "kind": "re-export",
          "signature": "ItemOwnership",
          "summary": ""
        },
        {
          "name": "ItemSoulSystem",
          "kind": "re-export",
          "signature": "ItemSoulSystem",
          "summary": ""
        },
        {
          "name": "LawGraph",
          "kind": "re-export",
          "signature": "LawGraph",
          "summary": ""
        },
        {
          "name": "LifePhases",
          "kind": "re-export",
          "signature": "LifePhases",
          "summary": ""
        },
        {
          "name": "Math",
          "kind": "re-export",
          "signature": "Math",
          "summary": ""
        },
        {
          "name": "MessageChannel",
          "kind": "re-export",
          "signature": "MessageChannel",
          "summary": ""
        },
        {
          "name": "MotionClip",
          "kind": "re-export",
          "signature": "MotionClip",
          "summary": ""
        },
        {
          "name": "MotionDataset",
          "kind": "re-export",
          "signature": "MotionDataset",
          "summary": ""
        },
        {
          "name": "MotionMatcher",
          "kind": "re-export",
          "signature": "MotionMatcher",
          "summary": ""
        },
        {
          "name": "NPCBrain",
          "kind": "re-export",
          "signature": "NPCBrain",
          "summary": ""
        },
        {
          "name": "Network",
          "kind": "re-export",
          "signature": "Network",
          "summary": ""
        },
        {
          "name": "NodeType",
          "kind": "re-export",
          "signature": "NodeType",
          "summary": ""
        },
        {
          "name": "PARTICLE_PHASE_STRIDE",
          "kind": "re-export",
          "signature": "PARTICLE_PHASE_STRIDE",
          "summary": ""
        },
        {
          "name": "PARTICLE_QUALITY_PRESETS",
          "kind": "re-export",
          "signature": "PARTICLE_QUALITY_PRESETS",
          "summary": ""
        },
        {
          "name": "PLAUNA_FULL",
          "kind": "re-export",
          "signature": "PLAUNA_FULL",
          "summary": ""
        },
        {
          "name": "PLAUNA_VERSION",
          "kind": "re-export",
          "signature": "PLAUNA_VERSION",
          "summary": ""
        },
        {
          "name": "PROXY_MODE",
          "kind": "re-export",
          "signature": "PROXY_MODE",
          "summary": ""
        },
        {
          "name": "PROXY_TIER",
          "kind": "re-export",
          "signature": "PROXY_TIER",
          "summary": ""
        },
        {
          "name": "PathTracingPass",
          "kind": "re-export",
          "signature": "PathTracingPass",
          "summary": ""
        },
        {
          "name": "PerceptionGraph",
          "kind": "re-export",
          "signature": "PerceptionGraph",
          "summary": ""
        },
        {
          "name": "PerceptionLevel",
          "kind": "re-export",
          "signature": "PerceptionLevel",
          "summary": ""
        },
        {
          "name": "Phase",
          "kind": "re-export",
          "signature": "Phase",
          "summary": ""
        },
        {
          "name": "PhysXPhysicsWorld",
          "kind": "re-export",
          "signature": "PhysXPhysicsWorld",
          "summary": ""
        },
        {
          "name": "PowerGraph",
          "kind": "re-export",
          "signature": "PowerGraph",
          "summary": ""
        },
        {
          "name": "ProxyBillboardAlign",
          "kind": "re-export",
          "signature": "ProxyBillboardAlign",
          "summary": ""
        },
        {
          "name": "ProxyGBufferPass",
          "kind": "re-export",
          "signature": "ProxyGBufferPass",
          "summary": ""
        },
        {
          "name": "ProxyGeometrySystem",
          "kind": "re-export",
          "signature": "ProxyGeometrySystem",
          "summary": ""
        },
        {
          "name": "ProxyMaskPass",
          "kind": "re-export",
          "signature": "ProxyMaskPass",
          "summary": ""
        },
        {
          "name": "ProxyOctahedralCache",
          "kind": "re-export",
          "signature": "ProxyOctahedralCache",
          "summary": ""
        },
        {
          "name": "ProxySDF",
          "kind": "re-export",
          "signature": "ProxySDF",
          "summary": ""
        },
        {
          "name": "ProxyShadePass",
          "kind": "re-export",
          "signature": "ProxyShadePass",
          "summary": ""
        },
        {
          "name": "PunishmentType",
          "kind": "re-export",
          "signature": "PunishmentType",
          "summary": ""
        },
        {
          "name": "RASTERIZER_MODE",
          "kind": "re-export",
          "signature": "RASTERIZER_MODE",
          "summary": ""
        },
        {
          "name": "RAY_PICKER_LIMITS",
          "kind": "re-export",
          "signature": "RAY_PICKER_LIMITS",
          "summary": ""
        },
        {
          "name": "ROOM_PICKING_LIMITS",
          "kind": "re-export",
          "signature": "ROOM_PICKING_LIMITS",
          "summary": ""
        },
        {
          "name": "ReSTIRGIPass",
          "kind": "re-export",
          "signature": "ReSTIRGIPass",
          "summary": ""
        },
        {
          "name": "Render",
          "kind": "re-export",
          "signature": "Render",
          "summary": ""
        },
        {
          "name": "ResolveSystem",
          "kind": "re-export",
          "signature": "ResolveSystem",
          "summary": ""
        },
        {
          "name": "Rig",
          "kind": "re-export",
          "signature": "Rig",
          "summary": ""
        },
        {
          "name": "RuleCategory",
          "kind": "re-export",
          "signature": "RuleCategory",
          "summary": ""
        },
        {
          "name": "RuleEffect",
          "kind": "re-export",
          "signature": "RuleEffect",
          "summary": ""
        },
        {
          "name": "RuleGraph",
          "kind": "re-export",
          "signature": "RuleGraph",
          "summary": ""
        },
        {
          "name": "SANDBOX_BEHAVIOR",
          "kind": "re-export",
          "signature": "SANDBOX_BEHAVIOR",
          "summary": ""
        },
        {
          "name": "SANDBOX_FLAGS",
          "kind": "re-export",
          "signature": "SANDBOX_FLAGS",
          "summary": ""
        },
        {
          "name": "SANDBOX_INTERACTION",
          "kind": "re-export",
          "signature": "SANDBOX_INTERACTION",
          "summary": ""
        },
        {
          "name": "SANDBOX_OBJECT",
          "kind": "re-export",
          "signature": "SANDBOX_OBJECT",
          "summary": ""
        },
        {
          "name": "SANDBOX_OBJECTS",
          "kind": "re-export",
          "signature": "SANDBOX_OBJECTS",
          "summary": ""
        },
        {
          "name": "SANDBOX_PHASE",
          "kind": "re-export",
          "signature": "SANDBOX_PHASE",
          "summary": ""
        },
        {
          "name": "SANDBOX_REACTION",
          "kind": "re-export",
          "signature": "SANDBOX_REACTION",
          "summary": ""
        },
        {
          "name": "SANDBOX_REFERENCE_TEMPERATURE_K",
          "kind": "re-export",
          "signature": "SANDBOX_REFERENCE_TEMPERATURE_K",
          "summary": ""
        },
        {
          "name": "SANDBOX_SPECIES_CAPACITY",
          "kind": "re-export",
          "signature": "SANDBOX_SPECIES_CAPACITY",
          "summary": ""
        },
        {
          "name": "SANDBOX_SUBSTANCE_CODE_BASE",
          "kind": "re-export",
          "signature": "SANDBOX_SUBSTANCE_CODE_BASE",
          "summary": ""
        },
        {
          "name": "SANDBOX_TEMPERATURE_STEP_K",
          "kind": "re-export",
          "signature": "SANDBOX_TEMPERATURE_STEP_K",
          "summary": ""
        },
        {
          "name": "SAVE_SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "SAVE_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "SCREEN_RAY_LIMITS",
          "kind": "re-export",
          "signature": "SCREEN_RAY_LIMITS",
          "summary": ""
        },
        {
          "name": "SOUL_STAGE_NAMES",
          "kind": "re-export",
          "signature": "SOUL_STAGE_NAMES",
          "summary": ""
        },
        {
          "name": "SPAWN_TYPE_CATEGORIES",
          "kind": "re-export",
          "signature": "SPAWN_TYPE_CATEGORIES",
          "summary": ""
        },
        {
          "name": "SPAWN_TYPE_COLORS",
          "kind": "re-export",
          "signature": "SPAWN_TYPE_COLORS",
          "summary": ""
        },
        {
          "name": "SPAWN_TYPE_MESHES",
          "kind": "re-export",
          "signature": "SPAWN_TYPE_MESHES",
          "summary": ""
        },
        {
          "name": "SPELL_EFFECT_TYPES",
          "kind": "re-export",
          "signature": "SPELL_EFFECT_TYPES",
          "summary": ""
        },
        {
          "name": "SPELL_PASS_TYPES",
          "kind": "re-export",
          "signature": "SPELL_PASS_TYPES",
          "summary": ""
        },
        {
          "name": "STANDARD_CAMERA_LIMITS",
          "kind": "re-export",
          "signature": "STANDARD_CAMERA_LIMITS",
          "summary": ""
        },
        {
          "name": "STANDARD_INPUT_LIMITS",
          "kind": "re-export",
          "signature": "STANDARD_INPUT_LIMITS",
          "summary": ""
        },
        {
          "name": "STATES",
          "kind": "re-export",
          "signature": "STATES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_DIRTY",
          "kind": "re-export",
          "signature": "STATE_FIRST_DIRTY",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_ECS_METADATA_VERSION",
          "kind": "re-export",
          "signature": "STATE_FIRST_ECS_METADATA_VERSION",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_EXECUTION_BACKEND",
          "kind": "re-export",
          "signature": "STATE_FIRST_EXECUTION_BACKEND",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_PARITY_STATUS",
          "kind": "re-export",
          "signature": "STATE_FIRST_PARITY_STATUS",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_QUALITY_PROFILE",
          "kind": "re-export",
          "signature": "STATE_FIRST_QUALITY_PROFILE",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_REPRESENTATION",
          "kind": "re-export",
          "signature": "STATE_FIRST_REPRESENTATION",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_REPRESENTATION_NAMES",
          "kind": "re-export",
          "signature": "STATE_FIRST_REPRESENTATION_NAMES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_INDEX_BYTES",
          "kind": "re-export",
          "signature": "STATE_FIRST_RETAINED_INDEX_BYTES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_RECORD_BYTES",
          "kind": "re-export",
          "signature": "STATE_FIRST_RETAINED_RECORD_BYTES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_RECORD_FLOATS",
          "kind": "re-export",
          "signature": "STATE_FIRST_RETAINED_RECORD_FLOATS",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE",
          "kind": "re-export",
          "signature": "STATE_FIRST_SOURCE",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE_KIND",
          "kind": "re-export",
          "signature": "STATE_FIRST_SOURCE_KIND",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE_VERSION",
          "kind": "re-export",
          "signature": "STATE_FIRST_SOURCE_VERSION",
          "summary": ""
        },
        {
          "name": "STATS",
          "kind": "re-export",
          "signature": "STATS",
          "summary": ""
        },
        {
          "name": "SVGFDenoise",
          "kind": "re-export",
          "signature": "SVGFDenoise",
          "summary": ""
        },
        {
          "name": "SaveSystem",
          "kind": "re-export",
          "signature": "SaveSystem",
          "summary": ""
        },
        {
          "name": "SchemaValidator",
          "kind": "re-export",
          "signature": "SchemaValidator",
          "summary": ""
        },
        {
          "name": "SimLevel",
          "kind": "re-export",
          "signature": "SimLevel",
          "summary": ""
        },
        {
          "name": "SimulationManager",
          "kind": "re-export",
          "signature": "SimulationManager",
          "summary": ""
        },
        {
          "name": "SituationBucket",
          "kind": "re-export",
          "signature": "SituationBucket",
          "summary": ""
        },
        {
          "name": "SituationGraph",
          "kind": "re-export",
          "signature": "SituationGraph",
          "summary": ""
        },
        {
          "name": "SkeletonHierarchy",
          "kind": "re-export",
          "signature": "SkeletonHierarchy",
          "summary": ""
        },
        {
          "name": "SoulGraph",
          "kind": "re-export",
          "signature": "SoulGraph",
          "summary": ""
        },
        {
          "name": "SoulGraphMessaging",
          "kind": "re-export",
          "signature": "SoulGraphMessaging",
          "summary": ""
        },
        {
          "name": "SoulStage",
          "kind": "re-export",
          "signature": "SoulStage",
          "summary": ""
        },
        {
          "name": "State",
          "kind": "re-export",
          "signature": "State",
          "summary": ""
        },
        {
          "name": "StateFirstEcsSourceAdapter",
          "kind": "re-export",
          "signature": "StateFirstEcsSourceAdapter",
          "summary": ""
        },
        {
          "name": "StateFirstExecutionBackend",
          "kind": "re-export",
          "signature": "StateFirstExecutionBackend",
          "summary": ""
        },
        {
          "name": "StateFirstGpuCuller",
          "kind": "re-export",
          "signature": "StateFirstGpuCuller",
          "summary": ""
        },
        {
          "name": "StateFirstRasterizer",
          "kind": "re-export",
          "signature": "StateFirstRasterizer",
          "summary": ""
        },
        {
          "name": "StateFirstRetainedStorage",
          "kind": "re-export",
          "signature": "StateFirstRetainedStorage",
          "summary": ""
        },
        {
          "name": "StateFirstSourceBridge",
          "kind": "re-export",
          "signature": "StateFirstSourceBridge",
          "summary": ""
        },
        {
          "name": "StoryGraph",
          "kind": "re-export",
          "signature": "StoryGraph",
          "summary": ""
        },
        {
          "name": "StoryletRarity",
          "kind": "re-export",
          "signature": "StoryletRarity",
          "summary": ""
        },
        {
          "name": "Structural",
          "kind": "re-export",
          "signature": "Structural",
          "summary": ""
        },
        {
          "name": "SurfaceCacheExtractor",
          "kind": "re-export",
          "signature": "SurfaceCacheExtractor",
          "summary": ""
        },
        {
          "name": "Surfaces",
          "kind": "re-export",
          "signature": "Surfaces",
          "summary": ""
        },
        {
          "name": "TLASBuilder",
          "kind": "re-export",
          "signature": "TLASBuilder",
          "summary": ""
        },
        {
          "name": "TransferType",
          "kind": "re-export",
          "signature": "TransferType",
          "summary": ""
        },
        {
          "name": "UnderwaterSiltField",
          "kind": "re-export",
          "signature": "UnderwaterSiltField",
          "summary": ""
        },
        {
          "name": "VERSION_BANNER",
          "kind": "re-export",
          "signature": "VERSION_BANNER",
          "summary": ""
        },
        {
          "name": "VoiceStyle",
          "kind": "re-export",
          "signature": "VoiceStyle",
          "summary": ""
        },
        {
          "name": "Voxel",
          "kind": "re-export",
          "signature": "Voxel",
          "summary": ""
        },
        {
          "name": "World",
          "kind": "re-export",
          "signature": "World",
          "summary": ""
        },
        {
          "name": "WorldDirector",
          "kind": "re-export",
          "signature": "WorldDirector",
          "summary": ""
        },
        {
          "name": "addGhostToSelection",
          "kind": "re-export",
          "signature": "addGhostToSelection",
          "summary": ""
        },
        {
          "name": "applyBoundaries",
          "kind": "re-export",
          "signature": "applyBoundaries",
          "summary": ""
        },
        {
          "name": "applyEngineConfigToPhysics",
          "kind": "re-export",
          "signature": "applyEngineConfigToPhysics",
          "summary": ""
        },
        {
          "name": "applyEngineConfigToState",
          "kind": "re-export",
          "signature": "applyEngineConfigToState",
          "summary": ""
        },
        {
          "name": "applyPhaseVisuals",
          "kind": "re-export",
          "signature": "applyPhaseVisuals",
          "summary": ""
        },
        {
          "name": "attachFluidWorld",
          "kind": "re-export",
          "signature": "attachFluidWorld",
          "summary": ""
        },
        {
          "name": "attachInputListeners",
          "kind": "re-export",
          "signature": "attachInputListeners",
          "summary": ""
        },
        {
          "name": "attachInspectorPanel",
          "kind": "re-export",
          "signature": "attachInspectorPanel",
          "summary": ""
        },
        {
          "name": "attachPhysicsSandboxInspector",
          "kind": "re-export",
          "signature": "attachPhysicsSandboxInspector",
          "summary": ""
        },
        {
          "name": "augmentGeoWithSkeleton",
          "kind": "re-export",
          "signature": "augmentGeoWithSkeleton",
          "summary": ""
        },
        {
          "name": "bakeNoiseTexture",
          "kind": "re-export",
          "signature": "bakeNoiseTexture",
          "summary": ""
        },
        {
          "name": "beatFrequency",
          "kind": "re-export",
          "signature": "beatFrequency",
          "summary": ""
        },
        {
          "name": "beginStandardRenderPass",
          "kind": "re-export",
          "signature": "beginStandardRenderPass",
          "summary": ""
        },
        {
          "name": "bootstrapApp",
          "kind": "re-export",
          "signature": "bootstrapApp",
          "summary": ""
        },
        {
          "name": "branchNode",
          "kind": "re-export",
          "signature": "branchNode",
          "summary": ""
        },
        {
          "name": "buildColliderBuffer",
          "kind": "re-export",
          "signature": "buildColliderBuffer",
          "summary": ""
        },
        {
          "name": "buildEffectKeyFromElements",
          "kind": "re-export",
          "signature": "buildEffectKeyFromElements",
          "summary": ""
        },
        {
          "name": "buildFluidDomainFromColliders",
          "kind": "re-export",
          "signature": "buildFluidDomainFromColliders",
          "summary": ""
        },
        {
          "name": "buildFluidSources",
          "kind": "re-export",
          "signature": "buildFluidSources",
          "summary": ""
        },
        {
          "name": "buildJointPositionDataset",
          "kind": "re-export",
          "signature": "buildJointPositionDataset",
          "summary": ""
        },
        {
          "name": "buildMotionFeatureIndex",
          "kind": "re-export",
          "signature": "buildMotionFeatureIndex",
          "summary": ""
        },
        {
          "name": "buildNeighborGrid",
          "kind": "re-export",
          "signature": "buildNeighborGrid",
          "summary": ""
        },
        {
          "name": "buildViewProjData",
          "kind": "re-export",
          "signature": "buildViewProjData",
          "summary": ""
        },
        {
          "name": "cameraCollisionOptionsReport",
          "kind": "re-export",
          "signature": "cameraCollisionOptionsReport",
          "summary": ""
        },
        {
          "name": "cameraControllerEntityReport",
          "kind": "re-export",
          "signature": "cameraControllerEntityReport",
          "summary": ""
        },
        {
          "name": "cameraControllerStepReport",
          "kind": "re-export",
          "signature": "cameraControllerStepReport",
          "summary": ""
        },
        {
          "name": "cameraEntityBoundsReport",
          "kind": "re-export",
          "signature": "cameraEntityBoundsReport",
          "summary": ""
        },
        {
          "name": "cameraEntityFocusReport",
          "kind": "re-export",
          "signature": "cameraEntityFocusReport",
          "summary": ""
        },
        {
          "name": "cameraFocusReport",
          "kind": "re-export",
          "signature": "cameraFocusReport",
          "summary": ""
        },
        {
          "name": "cameraFocusTransitionReport",
          "kind": "re-export",
          "signature": "cameraFocusTransitionReport",
          "summary": ""
        },
        {
          "name": "cameraModeSwitchReport",
          "kind": "re-export",
          "signature": "cameraModeSwitchReport",
          "summary": ""
        },
        {
          "name": "cancelGrabCandidate",
          "kind": "re-export",
          "signature": "cancelGrabCandidate",
          "summary": ""
        },
        {
          "name": "choiceNode",
          "kind": "re-export",
          "signature": "choiceNode",
          "summary": ""
        },
        {
          "name": "chooseStateFirstRepresentation",
          "kind": "re-export",
          "signature": "chooseStateFirstRepresentation",
          "summary": ""
        },
        {
          "name": "clamp",
          "kind": "re-export",
          "signature": "clamp",
          "summary": ""
        },
        {
          "name": "clearFluidDensity",
          "kind": "re-export",
          "signature": "clearFluidDensity",
          "summary": ""
        },
        {
          "name": "clearFluidSimWorld",
          "kind": "re-export",
          "signature": "clearFluidSimWorld",
          "summary": ""
        },
        {
          "name": "clearFreezeRegion",
          "kind": "re-export",
          "signature": "clearFreezeRegion",
          "summary": ""
        },
        {
          "name": "clearGrabForEntity",
          "kind": "re-export",
          "signature": "clearGrabForEntity",
          "summary": ""
        },
        {
          "name": "compareLongRangeVectors",
          "kind": "re-export",
          "signature": "compareLongRangeVectors",
          "summary": ""
        },
        {
          "name": "computeAimBetweenEntities",
          "kind": "re-export",
          "signature": "computeAimBetweenEntities",
          "summary": ""
        },
        {
          "name": "computeAimFromEntityToPoint",
          "kind": "re-export",
          "signature": "computeAimFromEntityToPoint",
          "summary": ""
        },
        {
          "name": "computeVisualPower",
          "kind": "re-export",
          "signature": "computeVisualPower",
          "summary": ""
        },
        {
          "name": "configureParticleLongRange",
          "kind": "re-export",
          "signature": "configureParticleLongRange",
          "summary": ""
        },
        {
          "name": "configurePhysicsSandboxScene",
          "kind": "re-export",
          "signature": "configurePhysicsSandboxScene",
          "summary": ""
        },
        {
          "name": "consumeMouseDelta",
          "kind": "re-export",
          "signature": "consumeMouseDelta",
          "summary": ""
        },
        {
          "name": "consumeZoomDelta",
          "kind": "re-export",
          "signature": "consumeZoomDelta",
          "summary": ""
        },
        {
          "name": "createAdaptiveQualityGovernor",
          "kind": "re-export",
          "signature": "createAdaptiveQualityGovernor",
          "summary": ""
        },
        {
          "name": "createAllState",
          "kind": "re-export",
          "signature": "createAllState",
          "summary": ""
        },
        {
          "name": "createAudioEngine",
          "kind": "re-export",
          "signature": "createAudioEngine",
          "summary": ""
        },
        {
          "name": "createAudioState",
          "kind": "re-export",
          "signature": "createAudioState",
          "summary": ""
        },
        {
          "name": "createBoundaryPipeline",
          "kind": "re-export",
          "signature": "createBoundaryPipeline",
          "summary": ""
        },
        {
          "name": "createBoundaryShader",
          "kind": "re-export",
          "signature": "createBoundaryShader",
          "summary": ""
        },
        {
          "name": "createCamera",
          "kind": "re-export",
          "signature": "createCamera",
          "summary": ""
        },
        {
          "name": "createCameraState",
          "kind": "re-export",
          "signature": "createCameraState",
          "summary": ""
        },
        {
          "name": "createCharacterAudioBridge",
          "kind": "re-export",
          "signature": "createCharacterAudioBridge",
          "summary": ""
        },
        {
          "name": "createCity",
          "kind": "re-export",
          "signature": "createCity",
          "summary": ""
        },
        {
          "name": "createCollider",
          "kind": "re-export",
          "signature": "createCollider",
          "summary": ""
        },
        {
          "name": "createConfigState",
          "kind": "re-export",
          "signature": "createConfigState",
          "summary": ""
        },
        {
          "name": "createCrimeRecord",
          "kind": "re-export",
          "signature": "createCrimeRecord",
          "summary": ""
        },
        {
          "name": "createCrystallizationPipeline",
          "kind": "re-export",
          "signature": "createCrystallizationPipeline",
          "summary": ""
        },
        {
          "name": "createCrystallizationShader",
          "kind": "re-export",
          "signature": "createCrystallizationShader",
          "summary": ""
        },
        {
          "name": "createCubeGeometry",
          "kind": "re-export",
          "signature": "createCubeGeometry",
          "summary": ""
        },
        {
          "name": "createCylinderGeometry",
          "kind": "re-export",
          "signature": "createCylinderGeometry",
          "summary": ""
        },
        {
          "name": "createDefaultFromSchema",
          "kind": "re-export",
          "signature": "createDefaultFromSchema",
          "summary": ""
        },
        {
          "name": "createEcsState",
          "kind": "re-export",
          "signature": "createEcsState",
          "summary": ""
        },
        {
          "name": "createEmitter",
          "kind": "re-export",
          "signature": "createEmitter",
          "summary": ""
        },
        {
          "name": "createEmittersForEffect",
          "kind": "re-export",
          "signature": "createEmittersForEffect",
          "summary": ""
        },
        {
          "name": "createEngineMesh",
          "kind": "re-export",
          "signature": "createEngineMesh",
          "summary": ""
        },
        {
          "name": "createEntity",
          "kind": "re-export",
          "signature": "createEntity",
          "summary": ""
        },
        {
          "name": "createEvent",
          "kind": "re-export",
          "signature": "createEvent",
          "summary": ""
        },
        {
          "name": "createFaction",
          "kind": "re-export",
          "signature": "createFaction",
          "summary": ""
        },
        {
          "name": "createFluidSimWorld",
          "kind": "re-export",
          "signature": "createFluidSimWorld",
          "summary": ""
        },
        {
          "name": "createFluidWaterPass",
          "kind": "re-export",
          "signature": "createFluidWaterPass",
          "summary": ""
        },
        {
          "name": "createFmmSystem",
          "kind": "re-export",
          "signature": "createFmmSystem",
          "summary": ""
        },
        {
          "name": "createGhostSelectionState",
          "kind": "re-export",
          "signature": "createGhostSelectionState",
          "summary": ""
        },
        {
          "name": "createGpuState",
          "kind": "re-export",
          "signature": "createGpuState",
          "summary": ""
        },
        {
          "name": "createGrabState",
          "kind": "re-export",
          "signature": "createGrabState",
          "summary": ""
        },
        {
          "name": "createGroundGeometry",
          "kind": "re-export",
          "signature": "createGroundGeometry",
          "summary": ""
        },
        {
          "name": "createInputController",
          "kind": "re-export",
          "signature": "createInputController",
          "summary": ""
        },
        {
          "name": "createInputState",
          "kind": "re-export",
          "signature": "createInputState",
          "summary": ""
        },
        {
          "name": "createInspectorConfig",
          "kind": "re-export",
          "signature": "createInspectorConfig",
          "summary": ""
        },
        {
          "name": "createInventory",
          "kind": "re-export",
          "signature": "createInventory",
          "summary": ""
        },
        {
          "name": "createLight",
          "kind": "re-export",
          "signature": "createLight",
          "summary": ""
        },
        {
          "name": "createLocalStorageAdapter",
          "kind": "re-export",
          "signature": "createLocalStorageAdapter",
          "summary": ""
        },
        {
          "name": "createMPMBuffers",
          "kind": "re-export",
          "signature": "createMPMBuffers",
          "summary": ""
        },
        {
          "name": "createMPMPipelines",
          "kind": "re-export",
          "signature": "createMPMPipelines",
          "summary": ""
        },
        {
          "name": "createMPMWorld",
          "kind": "re-export",
          "signature": "createMPMWorld",
          "summary": ""
        },
        {
          "name": "createMainLoop",
          "kind": "re-export",
          "signature": "createMainLoop",
          "summary": ""
        },
        {
          "name": "createMeshLookup",
          "kind": "re-export",
          "signature": "createMeshLookup",
          "summary": ""
        },
        {
          "name": "createMeshParticleBuffers",
          "kind": "re-export",
          "signature": "createMeshParticleBuffers",
          "summary": ""
        },
        {
          "name": "createMessage",
          "kind": "re-export",
          "signature": "createMessage",
          "summary": ""
        },
        {
          "name": "createMinimalWorld",
          "kind": "re-export",
          "signature": "createMinimalWorld",
          "summary": ""
        },
        {
          "name": "createNBodySystem",
          "kind": "re-export",
          "signature": "createNBodySystem",
          "summary": ""
        },
        {
          "name": "createNeighborGridSystem",
          "kind": "re-export",
          "signature": "createNeighborGridSystem",
          "summary": ""
        },
        {
          "name": "createNoiseTextureSystem",
          "kind": "re-export",
          "signature": "createNoiseTextureSystem",
          "summary": ""
        },
        {
          "name": "createOscillator",
          "kind": "re-export",
          "signature": "createOscillator",
          "summary": ""
        },
        {
          "name": "createOscillatorBank",
          "kind": "re-export",
          "signature": "createOscillatorBank",
          "summary": ""
        },
        {
          "name": "createOwnedItem",
          "kind": "re-export",
          "signature": "createOwnedItem",
          "summary": ""
        },
        {
          "name": "createParticleBillboardDataBindGroup",
          "kind": "re-export",
          "signature": "createParticleBillboardDataBindGroup",
          "summary": ""
        },
        {
          "name": "createParticleBillboardRenderer",
          "kind": "re-export",
          "signature": "createParticleBillboardRenderer",
          "summary": ""
        },
        {
          "name": "createParticleMeshEwaldSystem",
          "kind": "re-export",
          "signature": "createParticleMeshEwaldSystem",
          "summary": ""
        },
        {
          "name": "createParticleQualityManager",
          "kind": "re-export",
          "signature": "createParticleQualityManager",
          "summary": ""
        },
        {
          "name": "createParticleSimWorld",
          "kind": "re-export",
          "signature": "createParticleSimWorld",
          "summary": ""
        },
        {
          "name": "createParticlesState",
          "kind": "re-export",
          "signature": "createParticlesState",
          "summary": ""
        },
        {
          "name": "createPhaseChangeBuffers",
          "kind": "re-export",
          "signature": "createPhaseChangeBuffers",
          "summary": ""
        },
        {
          "name": "createPhysXVehicle",
          "kind": "re-export",
          "signature": "createPhysXVehicle",
          "summary": ""
        },
        {
          "name": "createPhysicsBody",
          "kind": "re-export",
          "signature": "createPhysicsBody",
          "summary": ""
        },
        {
          "name": "createPhysicsState",
          "kind": "re-export",
          "signature": "createPhysicsState",
          "summary": ""
        },
        {
          "name": "createPlaneGeometry",
          "kind": "re-export",
          "signature": "createPlaneGeometry",
          "summary": ""
        },
        {
          "name": "createPower",
          "kind": "re-export",
          "signature": "createPower",
          "summary": ""
        },
        {
          "name": "createQuery",
          "kind": "re-export",
          "signature": "createQuery",
          "summary": ""
        },
        {
          "name": "createRayPicker",
          "kind": "re-export",
          "signature": "createRayPicker",
          "summary": ""
        },
        {
          "name": "createRenderState",
          "kind": "re-export",
          "signature": "createRenderState",
          "summary": ""
        },
        {
          "name": "createRule",
          "kind": "re-export",
          "signature": "createRule",
          "summary": ""
        },
        {
          "name": "createSandboxMaterialCatalog",
          "kind": "re-export",
          "signature": "createSandboxMaterialCatalog",
          "summary": ""
        },
        {
          "name": "createSandboxSpeciesLut",
          "kind": "re-export",
          "signature": "createSandboxSpeciesLut",
          "summary": ""
        },
        {
          "name": "createSceneFileInput",
          "kind": "re-export",
          "signature": "createSceneFileInput",
          "summary": ""
        },
        {
          "name": "createSeedInjectionParams",
          "kind": "re-export",
          "signature": "createSeedInjectionParams",
          "summary": ""
        },
        {
          "name": "createShaderLoader",
          "kind": "re-export",
          "signature": "createShaderLoader",
          "summary": ""
        },
        {
          "name": "createSkyboxGeometry",
          "kind": "re-export",
          "signature": "createSkyboxGeometry",
          "summary": ""
        },
        {
          "name": "createSmokeState",
          "kind": "re-export",
          "signature": "createSmokeState",
          "summary": ""
        },
        {
          "name": "createSmokeVolumeRenderer",
          "kind": "re-export",
          "signature": "createSmokeVolumeRenderer",
          "summary": ""
        },
        {
          "name": "createSolidMaskTexture",
          "kind": "re-export",
          "signature": "createSolidMaskTexture",
          "summary": ""
        },
        {
          "name": "createSpawnState",
          "kind": "re-export",
          "signature": "createSpawnState",
          "summary": ""
        },
        {
          "name": "createSpellEffectPass",
          "kind": "re-export",
          "signature": "createSpellEffectPass",
          "summary": ""
        },
        {
          "name": "createSpellForce",
          "kind": "re-export",
          "signature": "createSpellForce",
          "summary": ""
        },
        {
          "name": "createSphereGeometry",
          "kind": "re-export",
          "signature": "createSphereGeometry",
          "summary": ""
        },
        {
          "name": "createStandardEntityRenderResources",
          "kind": "re-export",
          "signature": "createStandardEntityRenderResources",
          "summary": ""
        },
        {
          "name": "createStandardRoomRenderer",
          "kind": "re-export",
          "signature": "createStandardRoomRenderer",
          "summary": ""
        },
        {
          "name": "createStateFirstEcsSourceAdapter",
          "kind": "re-export",
          "signature": "createStateFirstEcsSourceAdapter",
          "summary": ""
        },
        {
          "name": "createStateFirstExecutionBackend",
          "kind": "re-export",
          "signature": "createStateFirstExecutionBackend",
          "summary": ""
        },
        {
          "name": "createStateFirstGpuCuller",
          "kind": "re-export",
          "signature": "createStateFirstGpuCuller",
          "summary": ""
        },
        {
          "name": "createStateFirstRasterizer",
          "kind": "re-export",
          "signature": "createStateFirstRasterizer",
          "summary": ""
        },
        {
          "name": "createStateFirstRetainedStorage",
          "kind": "re-export",
          "signature": "createStateFirstRetainedStorage",
          "summary": ""
        },
        {
          "name": "createStateFirstSourceBridge",
          "kind": "re-export",
          "signature": "createStateFirstSourceBridge",
          "summary": ""
        },
        {
          "name": "createStorageBuffer",
          "kind": "re-export",
          "signature": "createStorageBuffer",
          "summary": ""
        },
        {
          "name": "createStorylet",
          "kind": "re-export",
          "signature": "createStorylet",
          "summary": ""
        },
        {
          "name": "createTransform",
          "kind": "re-export",
          "signature": "createTransform",
          "summary": ""
        },
        {
          "name": "createUniformBuffer",
          "kind": "re-export",
          "signature": "createUniformBuffer",
          "summary": ""
        },
        {
          "name": "createUnitCubeMesh",
          "kind": "re-export",
          "signature": "createUnitCubeMesh",
          "summary": ""
        },
        {
          "name": "createVoxelWorldRenderer",
          "kind": "re-export",
          "signature": "createVoxelWorldRenderer",
          "summary": ""
        },
        {
          "name": "createWaterPassState",
          "kind": "re-export",
          "signature": "createWaterPassState",
          "summary": ""
        },
        {
          "name": "createWorld",
          "kind": "re-export",
          "signature": "createWorld",
          "summary": ""
        },
        {
          "name": "createWorldFluidDomain",
          "kind": "re-export",
          "signature": "createWorldFluidDomain",
          "summary": ""
        },
        {
          "name": "defaultResolveEquipSlot",
          "kind": "re-export",
          "signature": "defaultResolveEquipSlot",
          "summary": ""
        },
        {
          "name": "defineComponentType",
          "kind": "re-export",
          "signature": "defineComponentType",
          "summary": ""
        },
        {
          "name": "deleteEntity",
          "kind": "re-export",
          "signature": "deleteEntity",
          "summary": ""
        },
        {
          "name": "deleteSelectedEntity",
          "kind": "re-export",
          "signature": "deleteSelectedEntity",
          "summary": ""
        },
        {
          "name": "deriveColorFromElements",
          "kind": "re-export",
          "signature": "deriveColorFromElements",
          "summary": ""
        },
        {
          "name": "destroyAudioEngine",
          "kind": "re-export",
          "signature": "destroyAudioEngine",
          "summary": ""
        },
        {
          "name": "destroyBuffer",
          "kind": "re-export",
          "signature": "destroyBuffer",
          "summary": ""
        },
        {
          "name": "destroyBuffers",
          "kind": "re-export",
          "signature": "destroyBuffers",
          "summary": ""
        },
        {
          "name": "destroyCharacterAudioBridge",
          "kind": "re-export",
          "signature": "destroyCharacterAudioBridge",
          "summary": ""
        },
        {
          "name": "destroyEntity",
          "kind": "re-export",
          "signature": "destroyEntity",
          "summary": ""
        },
        {
          "name": "destroyFluidWaterPass",
          "kind": "re-export",
          "signature": "destroyFluidWaterPass",
          "summary": ""
        },
        {
          "name": "destroyFmmSystem",
          "kind": "re-export",
          "signature": "destroyFmmSystem",
          "summary": ""
        },
        {
          "name": "destroyMPMWorld",
          "kind": "re-export",
          "signature": "destroyMPMWorld",
          "summary": ""
        },
        {
          "name": "destroyNBodySystem",
          "kind": "re-export",
          "signature": "destroyNBodySystem",
          "summary": ""
        },
        {
          "name": "destroyNeighborGridSystem",
          "kind": "re-export",
          "signature": "destroyNeighborGridSystem",
          "summary": ""
        },
        {
          "name": "destroyNoiseTextureSystem",
          "kind": "re-export",
          "signature": "destroyNoiseTextureSystem",
          "summary": ""
        },
        {
          "name": "destroyParticleMeshEwaldSystem",
          "kind": "re-export",
          "signature": "destroyParticleMeshEwaldSystem",
          "summary": ""
        },
        {
          "name": "destroyParticleSimWorld",
          "kind": "re-export",
          "signature": "destroyParticleSimWorld",
          "summary": ""
        },
        {
          "name": "destroyPhaseChangeBuffers",
          "kind": "re-export",
          "signature": "destroyPhaseChangeBuffers",
          "summary": ""
        },
        {
          "name": "destroyWorldFluidDomain",
          "kind": "re-export",
          "signature": "destroyWorldFluidDomain",
          "summary": ""
        },
        {
          "name": "detachInputListeners",
          "kind": "re-export",
          "signature": "detachInputListeners",
          "summary": ""
        },
        {
          "name": "directLongRangeAccelerations",
          "kind": "re-export",
          "signature": "directLongRangeAccelerations",
          "summary": ""
        },
        {
          "name": "discoverStateFirstSource",
          "kind": "re-export",
          "signature": "discoverStateFirstSource",
          "summary": ""
        },
        {
          "name": "downloadScene",
          "kind": "re-export",
          "signature": "downloadScene",
          "summary": ""
        },
        {
          "name": "drawMesh",
          "kind": "re-export",
          "signature": "drawMesh",
          "summary": ""
        },
        {
          "name": "drawMeshes",
          "kind": "re-export",
          "signature": "drawMeshes",
          "summary": ""
        },
        {
          "name": "encodeEntitiesClusterCulling",
          "kind": "re-export",
          "signature": "encodeEntitiesClusterCulling",
          "summary": ""
        },
        {
          "name": "encodeIndexedMeshClusterCulling",
          "kind": "re-export",
          "signature": "encodeIndexedMeshClusterCulling",
          "summary": ""
        },
        {
          "name": "encodeOctahedralNormal",
          "kind": "re-export",
          "signature": "encodeOctahedralNormal",
          "summary": ""
        },
        {
          "name": "endNode",
          "kind": "re-export",
          "signature": "endNode",
          "summary": ""
        },
        {
          "name": "ensureDepthTexture",
          "kind": "re-export",
          "signature": "ensureDepthTexture",
          "summary": ""
        },
        {
          "name": "ensureSceneColorTexture",
          "kind": "re-export",
          "signature": "ensureSceneColorTexture",
          "summary": ""
        },
        {
          "name": "entityPickingOptionsReport",
          "kind": "re-export",
          "signature": "entityPickingOptionsReport",
          "summary": ""
        },
        {
          "name": "estimateFmmMemory",
          "kind": "re-export",
          "signature": "estimateFmmMemory",
          "summary": ""
        },
        {
          "name": "estimateParticleMeshMemory",
          "kind": "re-export",
          "signature": "estimateParticleMeshMemory",
          "summary": ""
        },
        {
          "name": "executeFmm",
          "kind": "re-export",
          "signature": "executeFmm",
          "summary": ""
        },
        {
          "name": "executeNBody",
          "kind": "re-export",
          "signature": "executeNBody",
          "summary": ""
        },
        {
          "name": "executeParticleMeshEwald",
          "kind": "re-export",
          "signature": "executeParticleMeshEwald",
          "summary": ""
        },
        {
          "name": "exportSceneToJson",
          "kind": "re-export",
          "signature": "exportSceneToJson",
          "summary": ""
        },
        {
          "name": "extractFrozenParticles",
          "kind": "re-export",
          "signature": "extractFrozenParticles",
          "summary": ""
        },
        {
          "name": "extractFrozenShape",
          "kind": "re-export",
          "signature": "extractFrozenShape",
          "summary": ""
        },
        {
          "name": "extractMotionClipFromFbxAscii",
          "kind": "re-export",
          "signature": "extractMotionClipFromFbxAscii",
          "summary": ""
        },
        {
          "name": "extractMotionClipFromGltf",
          "kind": "re-export",
          "signature": "extractMotionClipFromGltf",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxAsciiEntries",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromFbxAsciiEntries",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxDirectoryHandle",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromFbxDirectoryHandle",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxFiles",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromFbxFiles",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromGltf",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromGltf",
          "summary": ""
        },
        {
          "name": "extractOriginTags",
          "kind": "re-export",
          "signature": "extractOriginTags",
          "summary": ""
        },
        {
          "name": "fillRagdollFeature",
          "kind": "re-export",
          "signature": "fillRagdollFeature",
          "summary": ""
        },
        {
          "name": "fmmCellCoordinate",
          "kind": "re-export",
          "signature": "fmmCellCoordinate",
          "summary": ""
        },
        {
          "name": "fmmInteractionCells",
          "kind": "re-export",
          "signature": "fmmInteractionCells",
          "summary": ""
        },
        {
          "name": "fmmLevelCellCount",
          "kind": "re-export",
          "signature": "fmmLevelCellCount",
          "summary": ""
        },
        {
          "name": "fmmLevelOffset",
          "kind": "re-export",
          "signature": "fmmLevelOffset",
          "summary": ""
        },
        {
          "name": "fmmMortonCellIndex",
          "kind": "re-export",
          "signature": "fmmMortonCellIndex",
          "summary": ""
        },
        {
          "name": "fmmSelectDepth",
          "kind": "re-export",
          "signature": "fmmSelectDepth",
          "summary": ""
        },
        {
          "name": "fmmTotalCellCount",
          "kind": "re-export",
          "signature": "fmmTotalCellCount",
          "summary": ""
        },
        {
          "name": "focusThirdPersonCamera",
          "kind": "re-export",
          "signature": "focusThirdPersonCamera",
          "summary": ""
        },
        {
          "name": "focusThirdPersonCameraOnEntities",
          "kind": "re-export",
          "signature": "focusThirdPersonCameraOnEntities",
          "summary": ""
        },
        {
          "name": "forEachEntity",
          "kind": "re-export",
          "signature": "forEachEntity",
          "summary": ""
        },
        {
          "name": "generateMeshParticlesIntoParticlesState",
          "kind": "re-export",
          "signature": "generateMeshParticlesIntoParticlesState",
          "summary": ""
        },
        {
          "name": "generateMeshParticlesIntoWorld",
          "kind": "re-export",
          "signature": "generateMeshParticlesIntoWorld",
          "summary": ""
        },
        {
          "name": "generateOrigin",
          "kind": "re-export",
          "signature": "generateOrigin",
          "summary": ""
        },
        {
          "name": "generateProceduralSkeleton",
          "kind": "re-export",
          "signature": "generateProceduralSkeleton",
          "summary": ""
        },
        {
          "name": "generateProlateSplitTable",
          "kind": "re-export",
          "signature": "generateProlateSplitTable",
          "summary": ""
        },
        {
          "name": "generateProlateWindowTable",
          "kind": "re-export",
          "signature": "generateProlateWindowTable",
          "summary": ""
        },
        {
          "name": "getActiveGhost",
          "kind": "re-export",
          "signature": "getActiveGhost",
          "summary": ""
        },
        {
          "name": "getActiveGhostWorldPosition",
          "kind": "re-export",
          "signature": "getActiveGhostWorldPosition",
          "summary": ""
        },
        {
          "name": "getAvailableSpawnTypes",
          "kind": "re-export",
          "signature": "getAvailableSpawnTypes",
          "summary": ""
        },
        {
          "name": "getCameraEyeBasisFromState",
          "kind": "re-export",
          "signature": "getCameraEyeBasisFromState",
          "summary": ""
        },
        {
          "name": "getComponentDefinition",
          "kind": "re-export",
          "signature": "getComponentDefinition",
          "summary": ""
        },
        {
          "name": "getComponentSchema",
          "kind": "re-export",
          "signature": "getComponentSchema",
          "summary": ""
        },
        {
          "name": "getElements",
          "kind": "re-export",
          "signature": "getElements",
          "summary": ""
        },
        {
          "name": "getEmitterPreset",
          "kind": "re-export",
          "signature": "getEmitterPreset",
          "summary": ""
        },
        {
          "name": "getEmitterTypes",
          "kind": "re-export",
          "signature": "getEmitterTypes",
          "summary": ""
        },
        {
          "name": "getEntityComponent",
          "kind": "re-export",
          "signature": "getEntityComponent",
          "summary": ""
        },
        {
          "name": "getEntityWorldPosition",
          "kind": "re-export",
          "signature": "getEntityWorldPosition",
          "summary": ""
        },
        {
          "name": "getGhostPreviewInfo",
          "kind": "re-export",
          "signature": "getGhostPreviewInfo",
          "summary": ""
        },
        {
          "name": "getGhostWorldPosition",
          "kind": "re-export",
          "signature": "getGhostWorldPosition",
          "summary": ""
        },
        {
          "name": "getInputActionMap",
          "kind": "re-export",
          "signature": "getInputActionMap",
          "summary": ""
        },
        {
          "name": "getInputActions",
          "kind": "re-export",
          "signature": "getInputActions",
          "summary": ""
        },
        {
          "name": "getKeys",
          "kind": "re-export",
          "signature": "getKeys",
          "summary": ""
        },
        {
          "name": "getLastMousePosition",
          "kind": "re-export",
          "signature": "getLastMousePosition",
          "summary": ""
        },
        {
          "name": "getMovementAxes",
          "kind": "re-export",
          "signature": "getMovementAxes",
          "summary": ""
        },
        {
          "name": "getNeighborGridBuffers",
          "kind": "re-export",
          "signature": "getNeighborGridBuffers",
          "summary": ""
        },
        {
          "name": "getParticleLongRangeState",
          "kind": "re-export",
          "signature": "getParticleLongRangeState",
          "summary": ""
        },
        {
          "name": "getPickRayForCanvasFromScreen",
          "kind": "re-export",
          "signature": "getPickRayForCanvasFromScreen",
          "summary": ""
        },
        {
          "name": "getPickRayFromState",
          "kind": "re-export",
          "signature": "getPickRayFromState",
          "summary": ""
        },
        {
          "name": "getRegisteredSystems",
          "kind": "re-export",
          "signature": "getRegisteredSystems",
          "summary": ""
        },
        {
          "name": "getSpawnTypeColor",
          "kind": "re-export",
          "signature": "getSpawnTypeColor",
          "summary": ""
        },
        {
          "name": "getSpawnTypeMeshKey",
          "kind": "re-export",
          "signature": "getSpawnTypeMeshKey",
          "summary": ""
        },
        {
          "name": "getSpawnTypesByCategory",
          "kind": "re-export",
          "signature": "getSpawnTypesByCategory",
          "summary": ""
        },
        {
          "name": "getStandardCameraEyeBasis",
          "kind": "re-export",
          "signature": "getStandardCameraEyeBasis",
          "summary": ""
        },
        {
          "name": "getStates",
          "kind": "re-export",
          "signature": "getStates",
          "summary": ""
        },
        {
          "name": "getVertexBufferLayoutForMesh",
          "kind": "re-export",
          "signature": "getVertexBufferLayoutForMesh",
          "summary": ""
        },
        {
          "name": "grabControllerEntityReport",
          "kind": "re-export",
          "signature": "grabControllerEntityReport",
          "summary": ""
        },
        {
          "name": "grabControllerRayReport",
          "kind": "re-export",
          "signature": "grabControllerRayReport",
          "summary": ""
        },
        {
          "name": "grabControllerTimingReport",
          "kind": "re-export",
          "signature": "grabControllerTimingReport",
          "summary": ""
        },
        {
          "name": "initAudioEngine",
          "kind": "re-export",
          "signature": "initAudioEngine",
          "summary": ""
        },
        {
          "name": "initEcsWorld",
          "kind": "re-export",
          "signature": "initEcsWorld",
          "summary": ""
        },
        {
          "name": "initFluidSimWorldLazy",
          "kind": "re-export",
          "signature": "initFluidSimWorldLazy",
          "summary": ""
        },
        {
          "name": "initFmmBindGroups",
          "kind": "re-export",
          "signature": "initFmmBindGroups",
          "summary": ""
        },
        {
          "name": "initGpuState",
          "kind": "re-export",
          "signature": "initGpuState",
          "summary": ""
        },
        {
          "name": "initNBodyBindGroups",
          "kind": "re-export",
          "signature": "initNBodyBindGroups",
          "summary": ""
        },
        {
          "name": "initNeighborGridBindGroups",
          "kind": "re-export",
          "signature": "initNeighborGridBindGroups",
          "summary": ""
        },
        {
          "name": "initParticleMeshEwaldBindGroups",
          "kind": "re-export",
          "signature": "initParticleMeshEwaldBindGroups",
          "summary": ""
        },
        {
          "name": "initParticleSystem",
          "kind": "re-export",
          "signature": "initParticleSystem",
          "summary": ""
        },
        {
          "name": "initSimulationRendering",
          "kind": "re-export",
          "signature": "initSimulationRendering",
          "summary": ""
        },
        {
          "name": "initSlotTracking",
          "kind": "re-export",
          "signature": "initSlotTracking",
          "summary": ""
        },
        {
          "name": "initSmokeRenderer",
          "kind": "re-export",
          "signature": "initSmokeRenderer",
          "summary": ""
        },
        {
          "name": "initWebGpuCanvas",
          "kind": "re-export",
          "signature": "initWebGpuCanvas",
          "summary": ""
        },
        {
          "name": "injectFreezeSeeds",
          "kind": "re-export",
          "signature": "injectFreezeSeeds",
          "summary": ""
        },
        {
          "name": "injectHeatSeeds",
          "kind": "re-export",
          "signature": "injectHeatSeeds",
          "summary": ""
        },
        {
          "name": "injectMeltedFluid",
          "kind": "re-export",
          "signature": "injectMeltedFluid",
          "summary": ""
        },
        {
          "name": "inverseLerp",
          "kind": "re-export",
          "signature": "inverseLerp",
          "summary": ""
        },
        {
          "name": "isPhysXVehicleSupported",
          "kind": "re-export",
          "signature": "isPhysXVehicleSupported",
          "summary": ""
        },
        {
          "name": "isWebGpuSupported",
          "kind": "re-export",
          "signature": "isWebGpuSupported",
          "summary": ""
        },
        {
          "name": "lerp",
          "kind": "re-export",
          "signature": "lerp",
          "summary": ""
        },
        {
          "name": "listComponentDefinitions",
          "kind": "re-export",
          "signature": "listComponentDefinitions",
          "summary": ""
        },
        {
          "name": "loadSceneFromFile",
          "kind": "re-export",
          "signature": "loadSceneFromFile",
          "summary": ""
        },
        {
          "name": "loadSceneFromJson",
          "kind": "re-export",
          "signature": "loadSceneFromJson",
          "summary": ""
        },
        {
          "name": "mapTagsToOrigin",
          "kind": "re-export",
          "signature": "mapTagsToOrigin",
          "summary": ""
        },
        {
          "name": "mat4FromRotationTranslation",
          "kind": "re-export",
          "signature": "mat4FromRotationTranslation",
          "summary": ""
        },
        {
          "name": "mat4Identity",
          "kind": "re-export",
          "signature": "mat4Identity",
          "summary": ""
        },
        {
          "name": "mat4Inverse",
          "kind": "re-export",
          "signature": "mat4Inverse",
          "summary": ""
        },
        {
          "name": "mat4LookAt",
          "kind": "re-export",
          "signature": "mat4LookAt",
          "summary": ""
        },
        {
          "name": "mat4Multiply",
          "kind": "re-export",
          "signature": "mat4Multiply",
          "summary": ""
        },
        {
          "name": "mat4Orthographic",
          "kind": "re-export",
          "signature": "mat4Orthographic",
          "summary": ""
        },
        {
          "name": "mat4OrthographicWebGPU",
          "kind": "re-export",
          "signature": "mat4OrthographicWebGPU",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveDeg",
          "kind": "re-export",
          "signature": "mat4PerspectiveDeg",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveDegWebGPU",
          "kind": "re-export",
          "signature": "mat4PerspectiveDegWebGPU",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveRad",
          "kind": "re-export",
          "signature": "mat4PerspectiveRad",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveRadWebGPU",
          "kind": "re-export",
          "signature": "mat4PerspectiveRadWebGPU",
          "summary": ""
        },
        {
          "name": "mat4Scale",
          "kind": "re-export",
          "signature": "mat4Scale",
          "summary": ""
        },
        {
          "name": "mat4Translate",
          "kind": "re-export",
          "signature": "mat4Translate",
          "summary": ""
        },
        {
          "name": "mixElementPower",
          "kind": "re-export",
          "signature": "mixElementPower",
          "summary": ""
        },
        {
          "name": "network",
          "kind": "re-export",
          "signature": "network",
          "summary": ""
        },
        {
          "name": "node",
          "kind": "re-export",
          "signature": "node",
          "summary": ""
        },
        {
          "name": "normalizeElementPower",
          "kind": "re-export",
          "signature": "normalizeElementPower",
          "summary": ""
        },
        {
          "name": "normalizeFmmConfig",
          "kind": "re-export",
          "signature": "normalizeFmmConfig",
          "summary": ""
        },
        {
          "name": "normalizeParticleMeshConfig",
          "kind": "re-export",
          "signature": "normalizeParticleMeshConfig",
          "summary": ""
        },
        {
          "name": "packSandboxCell",
          "kind": "re-export",
          "signature": "packSandboxCell",
          "summary": ""
        },
        {
          "name": "packSandboxObject",
          "kind": "re-export",
          "signature": "packSandboxObject",
          "summary": ""
        },
        {
          "name": "parseSceneJson",
          "kind": "re-export",
          "signature": "parseSceneJson",
          "summary": ""
        },
        {
          "name": "particleAI",
          "kind": "re-export",
          "signature": "particleAI",
          "summary": ""
        },
        {
          "name": "particleAIUtility",
          "kind": "re-export",
          "signature": "particleAIUtility",
          "summary": ""
        },
        {
          "name": "particleAIVehicles",
          "kind": "re-export",
          "signature": "particleAIVehicles",
          "summary": ""
        },
        {
          "name": "particleAnatomy",
          "kind": "re-export",
          "signature": "particleAnatomy",
          "summary": ""
        },
        {
          "name": "particleAssets",
          "kind": "re-export",
          "signature": "particleAssets",
          "summary": ""
        },
        {
          "name": "particleMathGeometry",
          "kind": "re-export",
          "signature": "particleMathGeometry",
          "summary": ""
        },
        {
          "name": "particleMathRandom",
          "kind": "re-export",
          "signature": "particleMathRandom",
          "summary": ""
        },
        {
          "name": "particlePBD",
          "kind": "re-export",
          "signature": "particlePBD",
          "summary": ""
        },
        {
          "name": "particlePhysXPhysicsWorld",
          "kind": "re-export",
          "signature": "particlePhysXPhysicsWorld",
          "summary": ""
        },
        {
          "name": "particlePhysXVehicle",
          "kind": "re-export",
          "signature": "particlePhysXVehicle",
          "summary": ""
        },
        {
          "name": "particleRig",
          "kind": "re-export",
          "signature": "particleRig",
          "summary": ""
        },
        {
          "name": "particleState",
          "kind": "re-export",
          "signature": "particleState",
          "summary": ""
        },
        {
          "name": "particleStructural",
          "kind": "re-export",
          "signature": "particleStructural",
          "summary": ""
        },
        {
          "name": "particleSubstances",
          "kind": "re-export",
          "signature": "particleSubstances",
          "summary": ""
        },
        {
          "name": "particleSurfaces",
          "kind": "re-export",
          "signature": "particleSurfaces",
          "summary": ""
        },
        {
          "name": "particleVoxel",
          "kind": "re-export",
          "signature": "particleVoxel",
          "summary": ""
        },
        {
          "name": "phaseCoherence",
          "kind": "re-export",
          "signature": "phaseCoherence",
          "summary": ""
        },
        {
          "name": "pickEntityFromRay",
          "kind": "re-export",
          "signature": "pickEntityFromRay",
          "summary": ""
        },
        {
          "name": "pickRoomSurfaceFromRay",
          "kind": "re-export",
          "signature": "pickRoomSurfaceFromRay",
          "summary": ""
        },
        {
          "name": "pickingRayReport",
          "kind": "re-export",
          "signature": "pickingRayReport",
          "summary": ""
        },
        {
          "name": "playBuffer",
          "kind": "re-export",
          "signature": "playBuffer",
          "summary": ""
        },
        {
          "name": "playStandardGamepadHaptics",
          "kind": "re-export",
          "signature": "playStandardGamepadHaptics",
          "summary": ""
        },
        {
          "name": "pollInputGamepad",
          "kind": "re-export",
          "signature": "pollInputGamepad",
          "summary": ""
        },
        {
          "name": "projectImagePointToViewport",
          "kind": "re-export",
          "signature": "projectImagePointToViewport",
          "summary": ""
        },
        {
          "name": "prolateSplitFourierResponse",
          "kind": "re-export",
          "signature": "prolateSplitFourierResponse",
          "summary": ""
        },
        {
          "name": "quatConjugate",
          "kind": "re-export",
          "signature": "quatConjugate",
          "summary": ""
        },
        {
          "name": "quatDifference",
          "kind": "re-export",
          "signature": "quatDifference",
          "summary": ""
        },
        {
          "name": "quatFromAxisAngle",
          "kind": "re-export",
          "signature": "quatFromAxisAngle",
          "summary": ""
        },
        {
          "name": "quatFromEuler",
          "kind": "re-export",
          "signature": "quatFromEuler",
          "summary": ""
        },
        {
          "name": "quatIdentity",
          "kind": "re-export",
          "signature": "quatIdentity",
          "summary": ""
        },
        {
          "name": "quatInverse",
          "kind": "re-export",
          "signature": "quatInverse",
          "summary": ""
        },
        {
          "name": "quatLookAt",
          "kind": "re-export",
          "signature": "quatLookAt",
          "summary": ""
        },
        {
          "name": "quatMultiply",
          "kind": "re-export",
          "signature": "quatMultiply",
          "summary": ""
        },
        {
          "name": "quatNormalize",
          "kind": "re-export",
          "signature": "quatNormalize",
          "summary": ""
        },
        {
          "name": "quatRotateTowards",
          "kind": "re-export",
          "signature": "quatRotateTowards",
          "summary": ""
        },
        {
          "name": "quatRotateVec3",
          "kind": "re-export",
          "signature": "quatRotateVec3",
          "summary": ""
        },
        {
          "name": "quatSlerp",
          "kind": "re-export",
          "signature": "quatSlerp",
          "summary": ""
        },
        {
          "name": "rayPickerOptionsReport",
          "kind": "re-export",
          "signature": "rayPickerOptionsReport",
          "summary": ""
        },
        {
          "name": "rayTerminationWGSL",
          "kind": "re-export",
          "signature": "rayTerminationWGSL",
          "summary": ""
        },
        {
          "name": "readFmmDiagnostics",
          "kind": "re-export",
          "signature": "readFmmDiagnostics",
          "summary": ""
        },
        {
          "name": "readParticleMeshEwaldDiagnostics",
          "kind": "re-export",
          "signature": "readParticleMeshEwaldDiagnostics",
          "summary": ""
        },
        {
          "name": "rebindStandardInputAction",
          "kind": "re-export",
          "signature": "rebindStandardInputAction",
          "summary": ""
        },
        {
          "name": "rebuildSolidMask",
          "kind": "re-export",
          "signature": "rebuildSolidMask",
          "summary": ""
        },
        {
          "name": "registerAudioEvent",
          "kind": "re-export",
          "signature": "registerAudioEvent",
          "summary": ""
        },
        {
          "name": "registerFootstepEvents",
          "kind": "re-export",
          "signature": "registerFootstepEvents",
          "summary": ""
        },
        {
          "name": "registerSystem",
          "kind": "re-export",
          "signature": "registerSystem",
          "summary": ""
        },
        {
          "name": "releaseGrabbed",
          "kind": "re-export",
          "signature": "releaseGrabbed",
          "summary": ""
        },
        {
          "name": "remap",
          "kind": "re-export",
          "signature": "remap",
          "summary": ""
        },
        {
          "name": "removeCharacter",
          "kind": "re-export",
          "signature": "removeCharacter",
          "summary": ""
        },
        {
          "name": "removeEntityComponent",
          "kind": "re-export",
          "signature": "removeEntityComponent",
          "summary": ""
        },
        {
          "name": "removeEntityFromStorage",
          "kind": "re-export",
          "signature": "removeEntityFromStorage",
          "summary": ""
        },
        {
          "name": "renderEntities",
          "kind": "re-export",
          "signature": "renderEntities",
          "summary": ""
        },
        {
          "name": "renderFluidWater",
          "kind": "re-export",
          "signature": "renderFluidWater",
          "summary": ""
        },
        {
          "name": "renderLightCube",
          "kind": "re-export",
          "signature": "renderLightCube",
          "summary": ""
        },
        {
          "name": "renderParticleBillboards",
          "kind": "re-export",
          "signature": "renderParticleBillboards",
          "summary": ""
        },
        {
          "name": "renderRoom",
          "kind": "re-export",
          "signature": "renderRoom",
          "summary": ""
        },
        {
          "name": "renderSpellEffects",
          "kind": "re-export",
          "signature": "renderSpellEffects",
          "summary": ""
        },
        {
          "name": "renderVolumetricSmoke",
          "kind": "re-export",
          "signature": "renderVolumetricSmoke",
          "summary": ""
        },
        {
          "name": "resizeFluidWaterPass",
          "kind": "re-export",
          "signature": "resizeFluidWaterPass",
          "summary": ""
        },
        {
          "name": "resolveFootstepMaterial",
          "kind": "re-export",
          "signature": "resolveFootstepMaterial",
          "summary": ""
        },
        {
          "name": "resolvePickFovRadians",
          "kind": "re-export",
          "signature": "resolvePickFovRadians",
          "summary": ""
        },
        {
          "name": "resolveSpawnAppearance",
          "kind": "re-export",
          "signature": "resolveSpawnAppearance",
          "summary": ""
        },
        {
          "name": "resonanceWeight",
          "kind": "re-export",
          "signature": "resonanceWeight",
          "summary": ""
        },
        {
          "name": "restirGuidePolicyWGSL",
          "kind": "re-export",
          "signature": "restirGuidePolicyWGSL",
          "summary": ""
        },
        {
          "name": "resumeAudioEngine",
          "kind": "re-export",
          "signature": "resumeAudioEngine",
          "summary": ""
        },
        {
          "name": "roomPickingOptionsReport",
          "kind": "re-export",
          "signature": "roomPickingOptionsReport",
          "summary": ""
        },
        {
          "name": "rootAlgebraBasisName",
          "kind": "re-export",
          "signature": "rootAlgebraBasisName",
          "summary": ""
        },
        {
          "name": "rootAlgebraCompileExecutionPlan",
          "kind": "re-export",
          "signature": "rootAlgebraCompileExecutionPlan",
          "summary": ""
        },
        {
          "name": "rootAlgebraDimension",
          "kind": "re-export",
          "signature": "rootAlgebraDimension",
          "summary": ""
        },
        {
          "name": "rootAlgebraEncodedMultiply",
          "kind": "re-export",
          "signature": "rootAlgebraEncodedMultiply",
          "summary": ""
        },
        {
          "name": "rootAlgebraEncodedTrace",
          "kind": "re-export",
          "signature": "rootAlgebraEncodedTrace",
          "summary": ""
        },
        {
          "name": "rootAlgebraEvaluateExecutionPlan",
          "kind": "re-export",
          "signature": "rootAlgebraEvaluateExecutionPlan",
          "summary": ""
        },
        {
          "name": "rootAlgebraExecutionPlanWGSL",
          "kind": "re-export",
          "signature": "rootAlgebraExecutionPlanWGSL",
          "summary": ""
        },
        {
          "name": "rootAlgebraFindSimpleZeroDivisors",
          "kind": "re-export",
          "signature": "rootAlgebraFindSimpleZeroDivisors",
          "summary": ""
        },
        {
          "name": "rootAlgebraFormatElement",
          "kind": "re-export",
          "signature": "rootAlgebraFormatElement",
          "summary": ""
        },
        {
          "name": "rootAlgebraGenerateTable",
          "kind": "re-export",
          "signature": "rootAlgebraGenerateTable",
          "summary": ""
        },
        {
          "name": "rootAlgebraGeneratorName",
          "kind": "re-export",
          "signature": "rootAlgebraGeneratorName",
          "summary": ""
        },
        {
          "name": "rootAlgebraMask",
          "kind": "re-export",
          "signature": "rootAlgebraMask",
          "summary": ""
        },
        {
          "name": "rootAlgebraMultiply",
          "kind": "re-export",
          "signature": "rootAlgebraMultiply",
          "summary": ""
        },
        {
          "name": "rootAlgebraPropertyReport",
          "kind": "re-export",
          "signature": "rootAlgebraPropertyReport",
          "summary": ""
        },
        {
          "name": "rootAlgebraReverseMaskBits",
          "kind": "re-export",
          "signature": "rootAlgebraReverseMaskBits",
          "summary": ""
        },
        {
          "name": "rootAlgebraSearchEncodedMultipliers",
          "kind": "re-export",
          "signature": "rootAlgebraSearchEncodedMultipliers",
          "summary": ""
        },
        {
          "name": "rootAlgebraSquare",
          "kind": "re-export",
          "signature": "rootAlgebraSquare",
          "summary": ""
        },
        {
          "name": "rootAlgebraTraceMultiply",
          "kind": "re-export",
          "signature": "rootAlgebraTraceMultiply",
          "summary": ""
        },
        {
          "name": "rootAlgebraValidate",
          "kind": "re-export",
          "signature": "rootAlgebraValidate",
          "summary": ""
        },
        {
          "name": "runApp",
          "kind": "re-export",
          "signature": "runApp",
          "summary": ""
        },
        {
          "name": "sampleAmplitudeModulated",
          "kind": "re-export",
          "signature": "sampleAmplitudeModulated",
          "summary": ""
        },
        {
          "name": "sampleOscillator",
          "kind": "re-export",
          "signature": "sampleOscillator",
          "summary": ""
        },
        {
          "name": "samplePhaseModulated",
          "kind": "re-export",
          "signature": "samplePhaseModulated",
          "summary": ""
        },
        {
          "name": "sampleRingModulated",
          "kind": "re-export",
          "signature": "sampleRingModulated",
          "summary": ""
        },
        {
          "name": "sampleWave",
          "kind": "re-export",
          "signature": "sampleWave",
          "summary": ""
        },
        {
          "name": "sandboxBucketToTemperature",
          "kind": "re-export",
          "signature": "sandboxBucketToTemperature",
          "summary": ""
        },
        {
          "name": "sandboxSpeciesIdForSubstance",
          "kind": "re-export",
          "signature": "sandboxSpeciesIdForSubstance",
          "summary": ""
        },
        {
          "name": "saturate",
          "kind": "re-export",
          "signature": "saturate",
          "summary": ""
        },
        {
          "name": "screenCameraBasisReport",
          "kind": "re-export",
          "signature": "screenCameraBasisReport",
          "summary": ""
        },
        {
          "name": "screenCameraStateReport",
          "kind": "re-export",
          "signature": "screenCameraStateReport",
          "summary": ""
        },
        {
          "name": "screenPickInputReport",
          "kind": "re-export",
          "signature": "screenPickInputReport",
          "summary": ""
        },
        {
          "name": "serializeBVHForGPU",
          "kind": "re-export",
          "signature": "serializeBVHForGPU",
          "summary": ""
        },
        {
          "name": "serializeScene",
          "kind": "re-export",
          "signature": "serializeScene",
          "summary": ""
        },
        {
          "name": "setActiveGhostBasePosition",
          "kind": "re-export",
          "signature": "setActiveGhostBasePosition",
          "summary": ""
        },
        {
          "name": "setActiveGhostInSelection",
          "kind": "re-export",
          "signature": "setActiveGhostInSelection",
          "summary": ""
        },
        {
          "name": "setActiveGhostOffset",
          "kind": "re-export",
          "signature": "setActiveGhostOffset",
          "summary": ""
        },
        {
          "name": "setBusVolumeByName",
          "kind": "re-export",
          "signature": "setBusVolumeByName",
          "summary": ""
        },
        {
          "name": "setEntityComponent",
          "kind": "re-export",
          "signature": "setEntityComponent",
          "summary": ""
        },
        {
          "name": "setMPMWorldBounds",
          "kind": "re-export",
          "signature": "setMPMWorldBounds",
          "summary": ""
        },
        {
          "name": "setMasterVolume",
          "kind": "re-export",
          "signature": "setMasterVolume",
          "summary": ""
        },
        {
          "name": "setNode",
          "kind": "re-export",
          "signature": "setNode",
          "summary": ""
        },
        {
          "name": "setParticleBillboardParams",
          "kind": "re-export",
          "signature": "setParticleBillboardParams",
          "summary": ""
        },
        {
          "name": "setSystemEnabled",
          "kind": "re-export",
          "signature": "setSystemEnabled",
          "summary": ""
        },
        {
          "name": "setSystemGroupEnabled",
          "kind": "re-export",
          "signature": "setSystemGroupEnabled",
          "summary": ""
        },
        {
          "name": "smoothstep",
          "kind": "re-export",
          "signature": "smoothstep",
          "summary": ""
        },
        {
          "name": "spawnEntity",
          "kind": "re-export",
          "signature": "spawnEntity",
          "summary": ""
        },
        {
          "name": "spawnParticleEmitter",
          "kind": "re-export",
          "signature": "spawnParticleEmitter",
          "summary": ""
        },
        {
          "name": "spawnPhysicsObjectAtPosition",
          "kind": "re-export",
          "signature": "spawnPhysicsObjectAtPosition",
          "summary": ""
        },
        {
          "name": "spellConfigToInstance",
          "kind": "re-export",
          "signature": "spellConfigToInstance",
          "summary": ""
        },
        {
          "name": "spellElementToEffectType",
          "kind": "re-export",
          "signature": "spellElementToEffectType",
          "summary": ""
        },
        {
          "name": "splatFluidSources",
          "kind": "re-export",
          "signature": "splatFluidSources",
          "summary": ""
        },
        {
          "name": "splatParticleDensity",
          "kind": "re-export",
          "signature": "splatParticleDensity",
          "summary": ""
        },
        {
          "name": "standardCameraBoomReport",
          "kind": "re-export",
          "signature": "standardCameraBoomReport",
          "summary": ""
        },
        {
          "name": "standardCameraBoundsFocusReport",
          "kind": "re-export",
          "signature": "standardCameraBoundsFocusReport",
          "summary": ""
        },
        {
          "name": "standardCameraBoundsReport",
          "kind": "re-export",
          "signature": "standardCameraBoundsReport",
          "summary": ""
        },
        {
          "name": "standardCameraFocusReport",
          "kind": "re-export",
          "signature": "standardCameraFocusReport",
          "summary": ""
        },
        {
          "name": "standardCameraFocusTransitionReport",
          "kind": "re-export",
          "signature": "standardCameraFocusTransitionReport",
          "summary": ""
        },
        {
          "name": "standardCameraKeysReport",
          "kind": "re-export",
          "signature": "standardCameraKeysReport",
          "summary": ""
        },
        {
          "name": "standardCameraMovementIntentReport",
          "kind": "re-export",
          "signature": "standardCameraMovementIntentReport",
          "summary": ""
        },
        {
          "name": "standardCameraMovementResponseReport",
          "kind": "re-export",
          "signature": "standardCameraMovementResponseReport",
          "summary": ""
        },
        {
          "name": "standardCameraOptionsReport",
          "kind": "re-export",
          "signature": "standardCameraOptionsReport",
          "summary": ""
        },
        {
          "name": "standardCameraSphereFitReport",
          "kind": "re-export",
          "signature": "standardCameraSphereFitReport",
          "summary": ""
        },
        {
          "name": "standardCameraStateReport",
          "kind": "re-export",
          "signature": "standardCameraStateReport",
          "summary": ""
        },
        {
          "name": "standardCameraUpdateReport",
          "kind": "re-export",
          "signature": "standardCameraUpdateReport",
          "summary": ""
        },
        {
          "name": "standardCameraZoomReport",
          "kind": "re-export",
          "signature": "standardCameraZoomReport",
          "summary": ""
        },
        {
          "name": "standardGamepadButtonReport",
          "kind": "re-export",
          "signature": "standardGamepadButtonReport",
          "summary": ""
        },
        {
          "name": "standardGamepadHapticEffectReport",
          "kind": "re-export",
          "signature": "standardGamepadHapticEffectReport",
          "summary": ""
        },
        {
          "name": "standardGamepadInputReport",
          "kind": "re-export",
          "signature": "standardGamepadInputReport",
          "summary": ""
        },
        {
          "name": "standardGamepadMovementReport",
          "kind": "re-export",
          "signature": "standardGamepadMovementReport",
          "summary": ""
        },
        {
          "name": "standardInputActionMapReport",
          "kind": "re-export",
          "signature": "standardInputActionMapReport",
          "summary": ""
        },
        {
          "name": "standardInputActionStateReport",
          "kind": "re-export",
          "signature": "standardInputActionStateReport",
          "summary": ""
        },
        {
          "name": "standardInputWheelZoomReport",
          "kind": "re-export",
          "signature": "standardInputWheelZoomReport",
          "summary": ""
        },
        {
          "name": "startGrabCandidate",
          "kind": "re-export",
          "signature": "startGrabCandidate",
          "summary": ""
        },
        {
          "name": "startImageHeatHaze",
          "kind": "re-export",
          "signature": "startImageHeatHaze",
          "summary": ""
        },
        {
          "name": "startUnderwaterSiltField",
          "kind": "re-export",
          "signature": "startUnderwaterSiltField",
          "summary": ""
        },
        {
          "name": "stateFirstModeLabel",
          "kind": "re-export",
          "signature": "stateFirstModeLabel",
          "summary": ""
        },
        {
          "name": "stepAllSimulations",
          "kind": "re-export",
          "signature": "stepAllSimulations",
          "summary": ""
        },
        {
          "name": "stepCamera",
          "kind": "re-export",
          "signature": "stepCamera",
          "summary": ""
        },
        {
          "name": "stepCoupledOscillators",
          "kind": "re-export",
          "signature": "stepCoupledOscillators",
          "summary": ""
        },
        {
          "name": "stepCrystallization",
          "kind": "re-export",
          "signature": "stepCrystallization",
          "summary": ""
        },
        {
          "name": "stepEmitters",
          "kind": "re-export",
          "signature": "stepEmitters",
          "summary": ""
        },
        {
          "name": "stepFluid",
          "kind": "re-export",
          "signature": "stepFluid",
          "summary": ""
        },
        {
          "name": "stepFluidSimWorld",
          "kind": "re-export",
          "signature": "stepFluidSimWorld",
          "summary": ""
        },
        {
          "name": "stepMPMWorld",
          "kind": "re-export",
          "signature": "stepMPMWorld",
          "summary": ""
        },
        {
          "name": "stepParticleSimWorld",
          "kind": "re-export",
          "signature": "stepParticleSimWorld",
          "summary": ""
        },
        {
          "name": "stepParticles",
          "kind": "re-export",
          "signature": "stepParticles",
          "summary": ""
        },
        {
          "name": "stepWorld",
          "kind": "re-export",
          "signature": "stepWorld",
          "summary": ""
        },
        {
          "name": "stepWorldFrame",
          "kind": "re-export",
          "signature": "stepWorldFrame",
          "summary": ""
        },
        {
          "name": "stopAllSources",
          "kind": "re-export",
          "signature": "stopAllSources",
          "summary": ""
        },
        {
          "name": "stopSource",
          "kind": "re-export",
          "signature": "stopSource",
          "summary": ""
        },
        {
          "name": "switchCameraMode",
          "kind": "re-export",
          "signature": "switchCameraMode",
          "summary": ""
        },
        {
          "name": "syncCameraToEcs",
          "kind": "re-export",
          "signature": "syncCameraToEcs",
          "summary": ""
        },
        {
          "name": "temperatureToSandboxBucket",
          "kind": "re-export",
          "signature": "temperatureToSandboxBucket",
          "summary": ""
        },
        {
          "name": "textNode",
          "kind": "re-export",
          "signature": "textNode",
          "summary": ""
        },
        {
          "name": "tickAudioEngine",
          "kind": "re-export",
          "signature": "tickAudioEngine",
          "summary": ""
        },
        {
          "name": "tickCharacterAudio",
          "kind": "re-export",
          "signature": "tickCharacterAudio",
          "summary": ""
        },
        {
          "name": "triggerAudioEvent",
          "kind": "re-export",
          "signature": "triggerAudioEvent",
          "summary": ""
        },
        {
          "name": "unpackSandboxCell",
          "kind": "re-export",
          "signature": "unpackSandboxCell",
          "summary": ""
        },
        {
          "name": "unpackSandboxObject",
          "kind": "re-export",
          "signature": "unpackSandboxObject",
          "summary": ""
        },
        {
          "name": "unregisterAudioEvent",
          "kind": "re-export",
          "signature": "unregisterAudioEvent",
          "summary": ""
        },
        {
          "name": "unregisterFootstepEvents",
          "kind": "re-export",
          "signature": "unregisterFootstepEvents",
          "summary": ""
        },
        {
          "name": "unregisterSystem",
          "kind": "re-export",
          "signature": "unregisterSystem",
          "summary": ""
        },
        {
          "name": "updateAttachedParticlesIntoParticlesState",
          "kind": "re-export",
          "signature": "updateAttachedParticlesIntoParticlesState",
          "summary": ""
        },
        {
          "name": "updateAttachedParticlesIntoWorld",
          "kind": "re-export",
          "signature": "updateAttachedParticlesIntoWorld",
          "summary": ""
        },
        {
          "name": "updateAudioListener",
          "kind": "re-export",
          "signature": "updateAudioListener",
          "summary": ""
        },
        {
          "name": "updateBuffer",
          "kind": "re-export",
          "signature": "updateBuffer",
          "summary": ""
        },
        {
          "name": "updateCameraFull",
          "kind": "re-export",
          "signature": "updateCameraFull",
          "summary": ""
        },
        {
          "name": "updateGrabbedEntity",
          "kind": "re-export",
          "signature": "updateGrabbedEntity",
          "summary": ""
        },
        {
          "name": "updateParticleCounts",
          "kind": "re-export",
          "signature": "updateParticleCounts",
          "summary": ""
        },
        {
          "name": "updateStandardCamera",
          "kind": "re-export",
          "signature": "updateStandardCamera",
          "summary": ""
        },
        {
          "name": "updateStandardLights",
          "kind": "re-export",
          "signature": "updateStandardLights",
          "summary": ""
        },
        {
          "name": "updateStandardUniforms",
          "kind": "re-export",
          "signature": "updateStandardUniforms",
          "summary": ""
        },
        {
          "name": "updateVoxelWorldFrameUniforms",
          "kind": "re-export",
          "signature": "updateVoxelWorldFrameUniforms",
          "summary": ""
        },
        {
          "name": "updateWorldFluidDomainParams",
          "kind": "re-export",
          "signature": "updateWorldFluidDomainParams",
          "summary": ""
        },
        {
          "name": "validateComponentSchema",
          "kind": "re-export",
          "signature": "validateComponentSchema",
          "summary": ""
        },
        {
          "name": "validateSandboxMaterialCatalog",
          "kind": "re-export",
          "signature": "validateSandboxMaterialCatalog",
          "summary": ""
        },
        {
          "name": "vec2",
          "kind": "re-export",
          "signature": "vec2",
          "summary": ""
        },
        {
          "name": "vec2Add",
          "kind": "re-export",
          "signature": "vec2Add",
          "summary": ""
        },
        {
          "name": "vec2Clone",
          "kind": "re-export",
          "signature": "vec2Clone",
          "summary": ""
        },
        {
          "name": "vec2Distance",
          "kind": "re-export",
          "signature": "vec2Distance",
          "summary": ""
        },
        {
          "name": "vec2Dot",
          "kind": "re-export",
          "signature": "vec2Dot",
          "summary": ""
        },
        {
          "name": "vec2Length",
          "kind": "re-export",
          "signature": "vec2Length",
          "summary": ""
        },
        {
          "name": "vec2Lerp",
          "kind": "re-export",
          "signature": "vec2Lerp",
          "summary": ""
        },
        {
          "name": "vec2Normalize",
          "kind": "re-export",
          "signature": "vec2Normalize",
          "summary": ""
        },
        {
          "name": "vec2Scale",
          "kind": "re-export",
          "signature": "vec2Scale",
          "summary": ""
        },
        {
          "name": "vec2Sub",
          "kind": "re-export",
          "signature": "vec2Sub",
          "summary": ""
        },
        {
          "name": "vec3",
          "kind": "re-export",
          "signature": "vec3",
          "summary": ""
        },
        {
          "name": "vec3Add",
          "kind": "re-export",
          "signature": "vec3Add",
          "summary": ""
        },
        {
          "name": "vec3Bounce",
          "kind": "re-export",
          "signature": "vec3Bounce",
          "summary": ""
        },
        {
          "name": "vec3Clone",
          "kind": "re-export",
          "signature": "vec3Clone",
          "summary": ""
        },
        {
          "name": "vec3Cross",
          "kind": "re-export",
          "signature": "vec3Cross",
          "summary": ""
        },
        {
          "name": "vec3DirectionTo",
          "kind": "re-export",
          "signature": "vec3DirectionTo",
          "summary": ""
        },
        {
          "name": "vec3Distance",
          "kind": "re-export",
          "signature": "vec3Distance",
          "summary": ""
        },
        {
          "name": "vec3DistanceSq",
          "kind": "re-export",
          "signature": "vec3DistanceSq",
          "summary": ""
        },
        {
          "name": "vec3Dot",
          "kind": "re-export",
          "signature": "vec3Dot",
          "summary": ""
        },
        {
          "name": "vec3FaceForward",
          "kind": "re-export",
          "signature": "vec3FaceForward",
          "summary": ""
        },
        {
          "name": "vec3Forward",
          "kind": "re-export",
          "signature": "vec3Forward",
          "summary": ""
        },
        {
          "name": "vec3Length",
          "kind": "re-export",
          "signature": "vec3Length",
          "summary": ""
        },
        {
          "name": "vec3LengthSq",
          "kind": "re-export",
          "signature": "vec3LengthSq",
          "summary": ""
        },
        {
          "name": "vec3Lerp",
          "kind": "re-export",
          "signature": "vec3Lerp",
          "summary": ""
        },
        {
          "name": "vec3Midpoint",
          "kind": "re-export",
          "signature": "vec3Midpoint",
          "summary": ""
        },
        {
          "name": "vec3Mul",
          "kind": "re-export",
          "signature": "vec3Mul",
          "summary": ""
        },
        {
          "name": "vec3Negate",
          "kind": "re-export",
          "signature": "vec3Negate",
          "summary": ""
        },
        {
          "name": "vec3Normalize",
          "kind": "re-export",
          "signature": "vec3Normalize",
          "summary": ""
        },
        {
          "name": "vec3OctDecode",
          "kind": "re-export",
          "signature": "vec3OctDecode",
          "summary": ""
        },
        {
          "name": "vec3OctEncode",
          "kind": "re-export",
          "signature": "vec3OctEncode",
          "summary": ""
        },
        {
          "name": "vec3One",
          "kind": "re-export",
          "signature": "vec3One",
          "summary": ""
        },
        {
          "name": "vec3Project",
          "kind": "re-export",
          "signature": "vec3Project",
          "summary": ""
        },
        {
          "name": "vec3Reflect",
          "kind": "re-export",
          "signature": "vec3Reflect",
          "summary": ""
        },
        {
          "name": "vec3Refract",
          "kind": "re-export",
          "signature": "vec3Refract",
          "summary": ""
        },
        {
          "name": "vec3Right",
          "kind": "re-export",
          "signature": "vec3Right",
          "summary": ""
        },
        {
          "name": "vec3RotateTowards",
          "kind": "re-export",
          "signature": "vec3RotateTowards",
          "summary": ""
        },
        {
          "name": "vec3Saturate",
          "kind": "re-export",
          "signature": "vec3Saturate",
          "summary": ""
        },
        {
          "name": "vec3Scale",
          "kind": "re-export",
          "signature": "vec3Scale",
          "summary": ""
        },
        {
          "name": "vec3SmoothDamp",
          "kind": "re-export",
          "signature": "vec3SmoothDamp",
          "summary": ""
        },
        {
          "name": "vec3Sub",
          "kind": "re-export",
          "signature": "vec3Sub",
          "summary": ""
        },
        {
          "name": "vec3Up",
          "kind": "re-export",
          "signature": "vec3Up",
          "summary": ""
        },
        {
          "name": "vec3Zero",
          "kind": "re-export",
          "signature": "vec3Zero",
          "summary": ""
        },
        {
          "name": "voxel",
          "kind": "re-export",
          "signature": "voxel",
          "summary": ""
        },
        {
          "name": "waitForCanvasReady",
          "kind": "re-export",
          "signature": "waitForCanvasReady",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "EngineEditorBootstrap",
      "path": "engine/reference/EngineEditorBootstrap.md",
      "source": "engine/EngineEditorBootstrap.js",
      "import": "/engine/EngineEditorBootstrap.js",
      "sourceHash": "a8fe16ba18fadfc618d35d10f0047efe5c658b3ba1cef5823a387fdc2da65443",
      "summary": "EngineEditorBootstrap.js - Combined Engine + Editor entry point Use this as the entry point when you want the FULL library bundled: - All engine modules (math, ECS, rendering, simulation, audio, tools) - All editor modules (viewport, physics sim, particles, collab, UI) Usage: python bundle_engine.py --entry engine/EngineEditorBootstrap.js --eager The bundled runtime exposes everything on window.PE / window.ParticleEngine: PE.vec3(), PE.createWorld(), PE.EditorApp, etc.",
      "exports": [
        {
          "name": "initializePlauna",
          "kind": "function",
          "signature": "async initializePlauna(options = {})",
          "summary": ""
        },
        {
          "name": "Editor",
          "kind": "constant",
          "signature": "Editor",
          "summary": ""
        },
        {
          "name": "EditorApp",
          "kind": "re-export",
          "signature": "EditorApp",
          "summary": ""
        },
        {
          "name": "Engine",
          "kind": "re-export",
          "signature": "Engine",
          "summary": ""
        },
        {
          "name": "ProjectManager",
          "kind": "re-export",
          "signature": "ProjectManager",
          "summary": ""
        },
        {
          "name": "createPlaunaApp",
          "kind": "re-export",
          "signature": "createPlaunaApp",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "EngineImports",
      "path": "engine/reference/EngineImports.md",
      "source": "engine/EngineImports.js",
      "import": "/engine/EngineImports.js",
      "sourceHash": "11e1315d0714124ddeae94e60169e42c525a1fd50fc47c1e822e5b5819dc7ffb",
      "summary": "Global barrel for engine modules, grouped by domain. This is intended for games/tests/tools that want a single import and then access Math/Gpu/Ecs/Render/Tools/etc as namespaces.",
      "exports": [
        {
          "name": "Aim",
          "kind": "re-export",
          "signature": "Aim",
          "summary": ""
        },
        {
          "name": "Animation",
          "kind": "re-export",
          "signature": "Animation",
          "summary": ""
        },
        {
          "name": "Camera",
          "kind": "re-export",
          "signature": "Camera",
          "summary": ""
        },
        {
          "name": "CameraTools",
          "kind": "re-export",
          "signature": "CameraTools",
          "summary": ""
        },
        {
          "name": "Collider",
          "kind": "re-export",
          "signature": "Collider",
          "summary": ""
        },
        {
          "name": "Config",
          "kind": "re-export",
          "signature": "Config",
          "summary": ""
        },
        {
          "name": "CoreSave",
          "kind": "re-export",
          "signature": "CoreSave",
          "summary": ""
        },
        {
          "name": "CoreSchema",
          "kind": "re-export",
          "signature": "CoreSchema",
          "summary": ""
        },
        {
          "name": "GameplayAI",
          "kind": "re-export",
          "signature": "GameplayAI",
          "summary": ""
        },
        {
          "name": "GameplayEvents",
          "kind": "re-export",
          "signature": "GameplayEvents",
          "summary": ""
        },
        {
          "name": "GameplayInventory",
          "kind": "re-export",
          "signature": "GameplayInventory",
          "summary": ""
        },
        {
          "name": "GameplayItems",
          "kind": "re-export",
          "signature": "GameplayItems",
          "summary": ""
        },
        {
          "name": "GameplayPerception",
          "kind": "re-export",
          "signature": "GameplayPerception",
          "summary": ""
        },
        {
          "name": "GameplayProgression",
          "kind": "re-export",
          "signature": "GameplayProgression",
          "summary": ""
        },
        {
          "name": "GameplayRules",
          "kind": "re-export",
          "signature": "GameplayRules",
          "summary": ""
        },
        {
          "name": "GameplaySimulation",
          "kind": "re-export",
          "signature": "GameplaySimulation",
          "summary": ""
        },
        {
          "name": "GameplaySocial",
          "kind": "re-export",
          "signature": "GameplaySocial",
          "summary": ""
        },
        {
          "name": "GameplaySociety",
          "kind": "re-export",
          "signature": "GameplaySociety",
          "summary": ""
        },
        {
          "name": "Geometry",
          "kind": "re-export",
          "signature": "Geometry",
          "summary": ""
        },
        {
          "name": "Ghost",
          "kind": "re-export",
          "signature": "Ghost",
          "summary": ""
        },
        {
          "name": "Gpu",
          "kind": "re-export",
          "signature": "Gpu",
          "summary": ""
        },
        {
          "name": "GpuDevice",
          "kind": "re-export",
          "signature": "GpuDevice",
          "summary": ""
        },
        {
          "name": "Grab",
          "kind": "re-export",
          "signature": "Grab",
          "summary": ""
        },
        {
          "name": "Inspector",
          "kind": "re-export",
          "signature": "Inspector",
          "summary": ""
        },
        {
          "name": "Light",
          "kind": "re-export",
          "signature": "Light",
          "summary": ""
        },
        {
          "name": "Math",
          "kind": "re-export",
          "signature": "Math",
          "summary": ""
        },
        {
          "name": "Mesh",
          "kind": "re-export",
          "signature": "Mesh",
          "summary": ""
        },
        {
          "name": "Narrative",
          "kind": "re-export",
          "signature": "Narrative",
          "summary": ""
        },
        {
          "name": "NetReplicated",
          "kind": "re-export",
          "signature": "NetReplicated",
          "summary": ""
        },
        {
          "name": "Network",
          "kind": "re-export",
          "signature": "Network",
          "summary": ""
        },
        {
          "name": "ParticleBillboards",
          "kind": "re-export",
          "signature": "ParticleBillboards",
          "summary": ""
        },
        {
          "name": "ParticleEmitter",
          "kind": "re-export",
          "signature": "ParticleEmitter",
          "summary": ""
        },
        {
          "name": "ParticleQuality",
          "kind": "re-export",
          "signature": "ParticleQuality",
          "summary": ""
        },
        {
          "name": "PhysicsBody",
          "kind": "re-export",
          "signature": "PhysicsBody",
          "summary": ""
        },
        {
          "name": "PhysicsScenes",
          "kind": "re-export",
          "signature": "PhysicsScenes",
          "summary": ""
        },
        {
          "name": "Picking",
          "kind": "re-export",
          "signature": "Picking",
          "summary": ""
        },
        {
          "name": "Platform",
          "kind": "re-export",
          "signature": "Platform",
          "summary": ""
        },
        {
          "name": "ReplicationProfiles",
          "kind": "re-export",
          "signature": "ReplicationProfiles",
          "summary": ""
        },
        {
          "name": "Rig",
          "kind": "re-export",
          "signature": "Rig",
          "summary": ""
        },
        {
          "name": "ScreenRayCaster",
          "kind": "re-export",
          "signature": "ScreenRayCaster",
          "summary": ""
        },
        {
          "name": "Shaders",
          "kind": "re-export",
          "signature": "Shaders",
          "summary": ""
        },
        {
          "name": "SmokeVolumes",
          "kind": "re-export",
          "signature": "SmokeVolumes",
          "summary": ""
        },
        {
          "name": "Spawn",
          "kind": "re-export",
          "signature": "Spawn",
          "summary": ""
        },
        {
          "name": "SpectralRender",
          "kind": "re-export",
          "signature": "SpectralRender",
          "summary": ""
        },
        {
          "name": "StandardEntityRenderResources",
          "kind": "re-export",
          "signature": "StandardEntityRenderResources",
          "summary": ""
        },
        {
          "name": "StandardRoom",
          "kind": "re-export",
          "signature": "StandardRoom",
          "summary": ""
        },
        {
          "name": "StandardUniforms",
          "kind": "re-export",
          "signature": "StandardUniforms",
          "summary": ""
        },
        {
          "name": "Storage",
          "kind": "re-export",
          "signature": "Storage",
          "summary": ""
        },
        {
          "name": "Transform",
          "kind": "re-export",
          "signature": "Transform",
          "summary": ""
        },
        {
          "name": "VoxelWorld",
          "kind": "re-export",
          "signature": "VoxelWorld",
          "summary": ""
        },
        {
          "name": "World",
          "kind": "re-export",
          "signature": "World",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "MathImports",
      "path": "engine/reference/MathImports.md",
      "source": "engine/MathImports.js",
      "import": "/engine/MathImports.js",
      "sourceHash": "751a3e0d53604a3c63c6793aab8f1b79580e202a43a82ed29b09bcabfd30eb6d",
      "summary": "MathImports: convenience barrel for engine math utilities. Provides both a grouped Math namespace and flat re-exports for common ops.",
      "exports": [
        {
          "name": "Math",
          "kind": "constant",
          "signature": "Math",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "RenderImports",
      "path": "engine/reference/RenderImports.md",
      "source": "engine/RenderImports.js",
      "import": "/engine/RenderImports.js",
      "sourceHash": "0ca25a938e4c7e6bdf092ed2af5977ee930ea805a80bcb5b1052885148588b9e",
      "summary": "",
      "exports": [
        {
          "name": "RenderMesh",
          "kind": "constant",
          "signature": "RenderMesh",
          "summary": ""
        },
        {
          "name": "RenderGeometry",
          "kind": "constant",
          "signature": "RenderGeometry",
          "summary": ""
        },
        {
          "name": "RenderShaders",
          "kind": "constant",
          "signature": "RenderShaders",
          "summary": ""
        },
        {
          "name": "RenderRoom",
          "kind": "constant",
          "signature": "RenderRoom",
          "summary": ""
        },
        {
          "name": "RenderVoxelWorld",
          "kind": "constant",
          "signature": "RenderVoxelWorld",
          "summary": ""
        },
        {
          "name": "RenderUniforms",
          "kind": "constant",
          "signature": "RenderUniforms",
          "summary": ""
        },
        {
          "name": "RenderEntityResources",
          "kind": "constant",
          "signature": "RenderEntityResources",
          "summary": ""
        },
        {
          "name": "RenderSpectral",
          "kind": "constant",
          "signature": "RenderSpectral",
          "summary": ""
        },
        {
          "name": "createUnitCubeMesh",
          "kind": "constant",
          "signature": "createUnitCubeMesh",
          "summary": ""
        },
        {
          "name": "getVertexBufferLayoutForMesh",
          "kind": "constant",
          "signature": "getVertexBufferLayoutForMesh",
          "summary": ""
        },
        {
          "name": "createEngineMesh",
          "kind": "constant",
          "signature": "createEngineMesh",
          "summary": ""
        },
        {
          "name": "createSkyboxGeometry",
          "kind": "constant",
          "signature": "createSkyboxGeometry",
          "summary": ""
        },
        {
          "name": "createCubeGeometry",
          "kind": "constant",
          "signature": "createCubeGeometry",
          "summary": ""
        },
        {
          "name": "createGroundGeometry",
          "kind": "constant",
          "signature": "createGroundGeometry",
          "summary": ""
        },
        {
          "name": "createPlaneGeometry",
          "kind": "constant",
          "signature": "createPlaneGeometry",
          "summary": ""
        },
        {
          "name": "createSphereGeometry",
          "kind": "constant",
          "signature": "createSphereGeometry",
          "summary": ""
        },
        {
          "name": "createCylinderGeometry",
          "kind": "constant",
          "signature": "createCylinderGeometry",
          "summary": ""
        },
        {
          "name": "createShaderLoader",
          "kind": "constant",
          "signature": "createShaderLoader",
          "summary": ""
        },
        {
          "name": "createStandardRoomRenderer",
          "kind": "constant",
          "signature": "createStandardRoomRenderer",
          "summary": ""
        },
        {
          "name": "createVoxelWorldRenderer",
          "kind": "constant",
          "signature": "createVoxelWorldRenderer",
          "summary": ""
        },
        {
          "name": "updateVoxelWorldFrameUniforms",
          "kind": "constant",
          "signature": "updateVoxelWorldFrameUniforms",
          "summary": ""
        },
        {
          "name": "updateStandardLights",
          "kind": "constant",
          "signature": "updateStandardLights",
          "summary": ""
        },
        {
          "name": "updateStandardUniforms",
          "kind": "constant",
          "signature": "updateStandardUniforms",
          "summary": ""
        },
        {
          "name": "createStandardEntityRenderResources",
          "kind": "constant",
          "signature": "createStandardEntityRenderResources",
          "summary": ""
        },
        {
          "name": "createSmokeVolumeRenderer",
          "kind": "constant",
          "signature": "createSmokeVolumeRenderer",
          "summary": ""
        },
        {
          "name": "createParticleBillboardRenderer",
          "kind": "constant",
          "signature": "createParticleBillboardRenderer",
          "summary": ""
        },
        {
          "name": "createParticleBillboardDataBindGroup",
          "kind": "constant",
          "signature": "createParticleBillboardDataBindGroup",
          "summary": ""
        },
        {
          "name": "setParticleBillboardParams",
          "kind": "constant",
          "signature": "setParticleBillboardParams",
          "summary": ""
        },
        {
          "name": "createParticleQualityManager",
          "kind": "constant",
          "signature": "createParticleQualityManager",
          "summary": ""
        },
        {
          "name": "PARTICLE_QUALITY_PRESETS",
          "kind": "constant",
          "signature": "PARTICLE_QUALITY_PRESETS",
          "summary": ""
        },
        {
          "name": "IndexedClusterCuller",
          "kind": "re-export",
          "signature": "IndexedClusterCuller",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ToolsImports",
      "path": "engine/reference/ToolsImports.md",
      "source": "engine/ToolsImports.js",
      "import": "/engine/ToolsImports.js",
      "sourceHash": "6e3c6ea002d569dbe64cf7168a7d15ce5837389c39bbcb37e0cb5bd4f94b6bfa",
      "summary": "",
      "exports": [
        {
          "name": "ToolsInspector",
          "kind": "constant",
          "signature": "ToolsInspector",
          "summary": ""
        },
        {
          "name": "ToolsSpawn",
          "kind": "constant",
          "signature": "ToolsSpawn",
          "summary": ""
        },
        {
          "name": "ToolsGhost",
          "kind": "constant",
          "signature": "ToolsGhost",
          "summary": ""
        },
        {
          "name": "ToolsPicking",
          "kind": "constant",
          "signature": "ToolsPicking",
          "summary": ""
        },
        {
          "name": "ToolsScreenRay",
          "kind": "constant",
          "signature": "ToolsScreenRay",
          "summary": ""
        },
        {
          "name": "ROOM_PICKING_LIMITS",
          "kind": "constant",
          "signature": "ROOM_PICKING_LIMITS",
          "summary": ""
        },
        {
          "name": "pickingRayReport",
          "kind": "constant",
          "signature": "pickingRayReport",
          "summary": ""
        },
        {
          "name": "roomPickingOptionsReport",
          "kind": "constant",
          "signature": "roomPickingOptionsReport",
          "summary": ""
        },
        {
          "name": "entityPickingOptionsReport",
          "kind": "constant",
          "signature": "entityPickingOptionsReport",
          "summary": ""
        },
        {
          "name": "SCREEN_RAY_LIMITS",
          "kind": "constant",
          "signature": "SCREEN_RAY_LIMITS",
          "summary": ""
        },
        {
          "name": "screenPickInputReport",
          "kind": "constant",
          "signature": "screenPickInputReport",
          "summary": ""
        },
        {
          "name": "screenCameraBasisReport",
          "kind": "constant",
          "signature": "screenCameraBasisReport",
          "summary": ""
        },
        {
          "name": "screenCameraStateReport",
          "kind": "constant",
          "signature": "screenCameraStateReport",
          "summary": ""
        },
        {
          "name": "ToolsCamera",
          "kind": "constant",
          "signature": "ToolsCamera",
          "summary": ""
        },
        {
          "name": "ToolsGrab",
          "kind": "constant",
          "signature": "ToolsGrab",
          "summary": ""
        },
        {
          "name": "ToolsPhysicsScenes",
          "kind": "constant",
          "signature": "ToolsPhysicsScenes",
          "summary": ""
        },
        {
          "name": "ToolsRigging",
          "kind": "constant",
          "signature": "ToolsRigging",
          "summary": ""
        },
        {
          "name": "ToolsAnimation",
          "kind": "constant",
          "signature": "ToolsAnimation",
          "summary": ""
        },
        {
          "name": "attachInspectorPanel",
          "kind": "constant",
          "signature": "attachInspectorPanel",
          "summary": ""
        },
        {
          "name": "spawnPhysicsObjectAtPosition",
          "kind": "constant",
          "signature": "spawnPhysicsObjectAtPosition",
          "summary": ""
        },
        {
          "name": "getGhostPreviewInfo",
          "kind": "constant",
          "signature": "getGhostPreviewInfo",
          "summary": ""
        },
        {
          "name": "createGhostSelectionState",
          "kind": "constant",
          "signature": "createGhostSelectionState",
          "summary": ""
        },
        {
          "name": "addGhostToSelection",
          "kind": "constant",
          "signature": "addGhostToSelection",
          "summary": ""
        },
        {
          "name": "setActiveGhostInSelection",
          "kind": "constant",
          "signature": "setActiveGhostInSelection",
          "summary": ""
        },
        {
          "name": "setActiveGhostBasePosition",
          "kind": "constant",
          "signature": "setActiveGhostBasePosition",
          "summary": ""
        },
        {
          "name": "setActiveGhostOffset",
          "kind": "constant",
          "signature": "setActiveGhostOffset",
          "summary": ""
        },
        {
          "name": "getGhostWorldPosition",
          "kind": "constant",
          "signature": "getGhostWorldPosition",
          "summary": ""
        },
        {
          "name": "getActiveGhost",
          "kind": "constant",
          "signature": "getActiveGhost",
          "summary": ""
        },
        {
          "name": "getActiveGhostWorldPosition",
          "kind": "constant",
          "signature": "getActiveGhostWorldPosition",
          "summary": ""
        },
        {
          "name": "pickRoomSurfaceFromRay",
          "kind": "constant",
          "signature": "pickRoomSurfaceFromRay",
          "summary": ""
        },
        {
          "name": "pickEntityFromRay",
          "kind": "constant",
          "signature": "pickEntityFromRay",
          "summary": ""
        },
        {
          "name": "getPickRayForCanvasFromScreen",
          "kind": "constant",
          "signature": "getPickRayForCanvasFromScreen",
          "summary": ""
        },
        {
          "name": "updateStandardCamera",
          "kind": "constant",
          "signature": "updateStandardCamera",
          "summary": ""
        },
        {
          "name": "getStandardCameraEyeBasis",
          "kind": "constant",
          "signature": "getStandardCameraEyeBasis",
          "summary": ""
        },
        {
          "name": "STANDARD_CAMERA_LIMITS",
          "kind": "constant",
          "signature": "STANDARD_CAMERA_LIMITS",
          "summary": ""
        },
        {
          "name": "standardCameraStateReport",
          "kind": "constant",
          "signature": "standardCameraStateReport",
          "summary": ""
        },
        {
          "name": "standardCameraOptionsReport",
          "kind": "constant",
          "signature": "standardCameraOptionsReport",
          "summary": ""
        },
        {
          "name": "standardCameraUpdateReport",
          "kind": "constant",
          "signature": "standardCameraUpdateReport",
          "summary": ""
        },
        {
          "name": "standardCameraKeysReport",
          "kind": "constant",
          "signature": "standardCameraKeysReport",
          "summary": ""
        },
        {
          "name": "standardCameraMovementResponseReport",
          "kind": "constant",
          "signature": "standardCameraMovementResponseReport",
          "summary": ""
        },
        {
          "name": "standardCameraZoomReport",
          "kind": "constant",
          "signature": "standardCameraZoomReport",
          "summary": ""
        },
        {
          "name": "standardCameraBoomReport",
          "kind": "constant",
          "signature": "standardCameraBoomReport",
          "summary": ""
        },
        {
          "name": "standardCameraFocusReport",
          "kind": "constant",
          "signature": "standardCameraFocusReport",
          "summary": ""
        },
        {
          "name": "standardCameraFocusTransitionReport",
          "kind": "constant",
          "signature": "standardCameraFocusTransitionReport",
          "summary": ""
        },
        {
          "name": "standardCameraSphereFitReport",
          "kind": "constant",
          "signature": "standardCameraSphereFitReport",
          "summary": ""
        },
        {
          "name": "standardCameraBoundsReport",
          "kind": "constant",
          "signature": "standardCameraBoundsReport",
          "summary": ""
        },
        {
          "name": "standardCameraBoundsFocusReport",
          "kind": "constant",
          "signature": "standardCameraBoundsFocusReport",
          "summary": ""
        },
        {
          "name": "standardCameraMovementIntentReport",
          "kind": "constant",
          "signature": "standardCameraMovementIntentReport",
          "summary": ""
        },
        {
          "name": "createGrabState",
          "kind": "constant",
          "signature": "createGrabState",
          "summary": ""
        },
        {
          "name": "startGrabCandidate",
          "kind": "constant",
          "signature": "startGrabCandidate",
          "summary": ""
        },
        {
          "name": "cancelGrabCandidate",
          "kind": "constant",
          "signature": "cancelGrabCandidate",
          "summary": ""
        },
        {
          "name": "releaseGrabbed",
          "kind": "constant",
          "signature": "releaseGrabbed",
          "summary": ""
        },
        {
          "name": "configurePhysicsSandboxScene",
          "kind": "constant",
          "signature": "configurePhysicsSandboxScene",
          "summary": ""
        },
        {
          "name": "buildSourceSurfaceBVH",
          "kind": "constant",
          "signature": "buildSourceSurfaceBVH",
          "summary": ""
        },
        {
          "name": "estimateAlignmentICP",
          "kind": "constant",
          "signature": "estimateAlignmentICP",
          "summary": ""
        },
        {
          "name": "transferSkinWeightsCPU",
          "kind": "constant",
          "signature": "transferSkinWeightsCPU",
          "summary": ""
        },
        {
          "name": "transferSkinWeightsGPU",
          "kind": "constant",
          "signature": "transferSkinWeightsGPU",
          "summary": ""
        },
        {
          "name": "SkinWeightTransferGPU",
          "kind": "constant",
          "signature": "SkinWeightTransferGPU",
          "summary": ""
        },
        {
          "name": "parseFBXAscii",
          "kind": "constant",
          "signature": "parseFBXAscii",
          "summary": ""
        },
        {
          "name": "buildMixamoSkeletonFromFBX",
          "kind": "constant",
          "signature": "buildMixamoSkeletonFromFBX",
          "summary": ""
        },
        {
          "name": "sampleMixamoFBXAnimationClip",
          "kind": "constant",
          "signature": "sampleMixamoFBXAnimationClip",
          "summary": ""
        },
        {
          "name": "loadMixamoFBXAscii",
          "kind": "constant",
          "signature": "loadMixamoFBXAscii",
          "summary": ""
        },
        {
          "name": "findSkeletonJointIndexByName",
          "kind": "constant",
          "signature": "findSkeletonJointIndexByName",
          "summary": ""
        },
        {
          "name": "computeClipLocalMatricesAtFrame",
          "kind": "constant",
          "signature": "computeClipLocalMatricesAtFrame",
          "summary": ""
        },
        {
          "name": "computeClipGlobalMatricesAtFrame",
          "kind": "constant",
          "signature": "computeClipGlobalMatricesAtFrame",
          "summary": ""
        },
        {
          "name": "extractRootTranslationTrack",
          "kind": "constant",
          "signature": "extractRootTranslationTrack",
          "summary": ""
        },
        {
          "name": "extractRootMotion",
          "kind": "constant",
          "signature": "extractRootMotion",
          "summary": ""
        },
        {
          "name": "buildTeacherJointPositionDataset",
          "kind": "constant",
          "signature": "buildTeacherJointPositionDataset",
          "summary": ""
        },
        {
          "name": "attachPhysicsSandboxInspector",
          "kind": "re-export",
          "signature": "attachPhysicsSandboxInspector",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/index",
      "path": "engine/reference/animation/index.md",
      "source": "engine/animation/index.js",
      "import": "/engine/animation/index.js",
      "sourceHash": "2b2418c8c52d0bd67acd1a22e3f6658cbc6b7115101383aab4be30550cdba945",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/FbxMotionExtractor",
      "path": "engine/reference/animation/learning/FbxMotionExtractor.md",
      "source": "engine/animation/learning/FbxMotionExtractor.js",
      "import": "/engine/animation/learning/FbxMotionExtractor.js",
      "sourceHash": "ca2eb5b9b2f21aadf374bf8cff0a32cab8f3193d24217d3f775eace806153834",
      "summary": "",
      "exports": [
        {
          "name": "extractMotionClipFromFbxAscii",
          "kind": "function",
          "signature": "extractMotionClipFromFbxAscii(text, options = {})",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxAsciiEntries",
          "kind": "function",
          "signature": "extractMotionDatasetFromFbxAsciiEntries(entries, options = {})",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxFiles",
          "kind": "function",
          "signature": "async extractMotionDatasetFromFbxFiles(files, options = {})",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxDirectoryHandle",
          "kind": "function",
          "signature": "async extractMotionDatasetFromFbxDirectoryHandle(dirHandle, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/GltfMotionExtractor",
      "path": "engine/reference/animation/learning/GltfMotionExtractor.md",
      "source": "engine/animation/learning/GltfMotionExtractor.js",
      "import": "/engine/animation/learning/GltfMotionExtractor.js",
      "sourceHash": "6a43763f7c966d4c825678cba2a37bb81636905f047966f68ec069a6bb8dbacd",
      "summary": "",
      "exports": [
        {
          "name": "extractMotionDatasetFromGltf",
          "kind": "function",
          "signature": "extractMotionDatasetFromGltf(gltf, options = {})",
          "summary": ""
        },
        {
          "name": "extractMotionClipFromGltf",
          "kind": "function",
          "signature": "extractMotionClipFromGltf(gltf, animationIndex = 0, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/MotionClip",
      "path": "engine/reference/animation/learning/MotionClip.md",
      "source": "engine/animation/learning/MotionClip.js",
      "import": "/engine/animation/learning/MotionClip.js",
      "sourceHash": "4a7962568bb34c96d7325c6e5faad14bb6882f889bfb3f50b0e7e4e31d6b946e",
      "summary": "",
      "exports": [
        {
          "name": "MotionClip",
          "kind": "class",
          "signature": "class MotionClip",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/MotionDataset",
      "path": "engine/reference/animation/learning/MotionDataset.md",
      "source": "engine/animation/learning/MotionDataset.js",
      "import": "/engine/animation/learning/MotionDataset.js",
      "sourceHash": "30624d36dbb13d2b4c2dcb507f67915c076ad04bf5f5171037dc98662a9620f9",
      "summary": "",
      "exports": [
        {
          "name": "MotionDataset",
          "kind": "class",
          "signature": "class MotionDataset",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/MotionFeatures",
      "path": "engine/reference/animation/learning/MotionFeatures.md",
      "source": "engine/animation/learning/MotionFeatures.js",
      "import": "/engine/animation/learning/MotionFeatures.js",
      "sourceHash": "d56aed9f4496c2a70aa38b0744eb5ae47e8f7c3497b380b70634de9b1bea8946",
      "summary": "",
      "exports": [
        {
          "name": "buildJointPositionDataset",
          "kind": "function",
          "signature": "buildJointPositionDataset(clip, options = {})",
          "summary": ""
        },
        {
          "name": "buildMotionFeatureIndex",
          "kind": "function",
          "signature": "buildMotionFeatureIndex(dataset, options = {})",
          "summary": ""
        },
        {
          "name": "fillRagdollFeature",
          "kind": "function",
          "signature": "fillRagdollFeature(ragdoll, boneIndices, out, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/MotionMatcher",
      "path": "engine/reference/animation/learning/MotionMatcher.md",
      "source": "engine/animation/learning/MotionMatcher.js",
      "import": "/engine/animation/learning/MotionMatcher.js",
      "sourceHash": "ad9575d3bcf1cc16f915ec88aca49e1ab104dc6aa1fa1c230502942dcfc860e2",
      "summary": "",
      "exports": [
        {
          "name": "MotionMatcher",
          "kind": "class",
          "signature": "class MotionMatcher",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/SkeletonHierarchy",
      "path": "engine/reference/animation/learning/SkeletonHierarchy.md",
      "source": "engine/animation/learning/SkeletonHierarchy.js",
      "import": "/engine/animation/learning/SkeletonHierarchy.js",
      "sourceHash": "07eb01ad4cec4324262e68fc5d369d133cb66a700cdbffb31f1685d6328c4b1e",
      "summary": "",
      "exports": [
        {
          "name": "SkeletonHierarchy",
          "kind": "class",
          "signature": "class SkeletonHierarchy",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "animation/learning/index",
      "path": "engine/reference/animation/learning/index.md",
      "source": "engine/animation/learning/index.js",
      "import": "/engine/animation/learning/index.js",
      "sourceHash": "df2275b655b63429e63d936d5d5b2709d71e3af9864906686bd94665f5f8b7a0",
      "summary": "",
      "exports": [
        {
          "name": "AnimationLearning",
          "kind": "constant",
          "signature": "AnimationLearning",
          "summary": ""
        },
        {
          "name": "MotionClip",
          "kind": "re-export",
          "signature": "MotionClip",
          "summary": ""
        },
        {
          "name": "MotionDataset",
          "kind": "re-export",
          "signature": "MotionDataset",
          "summary": ""
        },
        {
          "name": "MotionMatcher",
          "kind": "re-export",
          "signature": "MotionMatcher",
          "summary": ""
        },
        {
          "name": "SkeletonHierarchy",
          "kind": "re-export",
          "signature": "SkeletonHierarchy",
          "summary": ""
        },
        {
          "name": "buildJointPositionDataset",
          "kind": "re-export",
          "signature": "buildJointPositionDataset",
          "summary": ""
        },
        {
          "name": "buildMotionFeatureIndex",
          "kind": "re-export",
          "signature": "buildMotionFeatureIndex",
          "summary": ""
        },
        {
          "name": "extractMotionClipFromFbxAscii",
          "kind": "re-export",
          "signature": "extractMotionClipFromFbxAscii",
          "summary": ""
        },
        {
          "name": "extractMotionClipFromGltf",
          "kind": "re-export",
          "signature": "extractMotionClipFromGltf",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxAsciiEntries",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromFbxAsciiEntries",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxDirectoryHandle",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromFbxDirectoryHandle",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromFbxFiles",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromFbxFiles",
          "summary": ""
        },
        {
          "name": "extractMotionDatasetFromGltf",
          "kind": "re-export",
          "signature": "extractMotionDatasetFromGltf",
          "summary": ""
        },
        {
          "name": "fillRagdollFeature",
          "kind": "re-export",
          "signature": "fillRagdollFeature",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/AssetCache",
      "path": "engine/reference/assets/AssetCache.md",
      "source": "engine/assets/AssetCache.js",
      "import": "/engine/assets/AssetCache.js",
      "sourceHash": "700860a49d88a6109b03a826e70ecdc7d18c26e3950c3471e5ef15692768e5c9",
      "summary": "engine/assets/AssetCache.js — local engine cache (spec §3, cache://).  Converted artifacts (engine binaries, preview meshes, thumbnails, colliders, SDFs, material packs) are cached under cache:// keyed by content hash so a re-import of the same source is instant. The primary backend is the Origin Private File System (OPFS) — origin-private and optimized for file access; an in-memory Map backs environments without OPFS (Node tests, locked-down contexts) so the rest of the runtime is backend-agnostic.",
      "exports": [
        {
          "name": "AssetCache",
          "kind": "class",
          "signature": "class AssetCache",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/AssetDeduper",
      "path": "engine/reference/assets/AssetDeduper.md",
      "source": "engine/assets/AssetDeduper.js",
      "import": "/engine/assets/AssetDeduper.js",
      "sourceHash": "9d8bc22ec241e7ae3637d79abc0f32d087f0fdd0ce9a39a9ebbcaf405f89bbfc",
      "summary": "engine/assets/AssetDeduper.js — content-hash dedup (spec §3).  Assets are deduplicated by source content hash. We separate source / mesh / material hashes so that the dedup rules can distinguish exact duplicates from variants and conflicts: same source hash               = same source asset (exact duplicate) same name + different hash      = version/conflict same mesh hash + diff material  = variant same texture hash               = shared texture Hashing prefers Web Crypto SHA-256; in a non-secure context it falls back to a deterministic FNV-1a stamp (clearly tagged so callers know it isn't crypto).",
      "exports": [
        {
          "name": "assetDeduperFallbackHash",
          "kind": "function",
          "signature": "assetDeduperFallbackHash(data)",
          "summary": ""
        },
        {
          "name": "hashContent",
          "kind": "function",
          "signature": "async hashContent(data)",
          "summary": "Content hash of arbitrary data. Returns 'sha256:<hex>' (secure) or 'fnv1a:<hex>' (fallback). Async because Web Crypto digest is async."
        },
        {
          "name": "classify",
          "kind": "function",
          "signature": "classify(candidate, records)",
          "summary": "Classify a candidate against the existing records."
        },
        {
          "name": "DEDUP",
          "kind": "constant",
          "signature": "DEDUP",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/AssetRecord",
      "path": "engine/reference/assets/AssetRecord.md",
      "source": "engine/assets/AssetRecord.js",
      "import": "/engine/assets/AssetRecord.js",
      "sourceHash": "ae8548acb69b9c38101f96a2451c4439ff7072708c9d422fee73faa5cb1697d0",
      "summary": "engine/assets/AssetRecord.js — the registry's record for one source asset.  The asset registry (not the filesystem) is the source of truth. Each record tracks the source content hash, a primary virtual path, redundant backup paths, the set of converted engine artifacts, and license metadata. Records are deduplicated by source hash; variants/conflicts are linked, never merged blindly (see AssetDeduper / AssetRegistry).",
      "exports": [
        {
          "name": "createAssetRecord",
          "kind": "function",
          "signature": "createAssetRecord(init = {})",
          "summary": "Create an asset record."
        },
        {
          "name": "createLicenseBlock",
          "kind": "function",
          "signature": "createLicenseBlock(init = {})",
          "summary": "License metadata is mandatory before import (unknown is allowed but flagged). Marketplace assets are licensed, not sold — track it and warn on restricted."
        },
        {
          "name": "licenseNeedsReview",
          "kind": "function",
          "signature": "licenseNeedsReview(license)",
          "summary": "True if the license is unknown or explicitly disallows engine conversion."
        },
        {
          "name": "ASSET_TYPES",
          "kind": "constant",
          "signature": "ASSET_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/AssetRegistry",
      "path": "engine/reference/assets/AssetRegistry.md",
      "source": "engine/assets/AssetRegistry.js",
      "import": "/engine/assets/AssetRegistry.js",
      "sourceHash": "53ee2abb9003fa79df6f7a8fc163bfcf1d13a8ae199d2400109ea9ef58444206",
      "summary": "engine/assets/AssetRegistry.js — the source of truth (spec §3, rule 3).  The registry (not the filesystem) owns asset identity. Sources are deduplicated by content hash; the registry links exact duplicates, variants, and conflicts rather than merging them blindly. Registering an already-known source returns the canonical record (idempotent), so re-importing the same file never produces a second asset.",
      "exports": [
        {
          "name": "AssetRegistry",
          "kind": "class",
          "signature": "class AssetRegistry",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/AssetResolver",
      "path": "engine/reference/assets/AssetResolver.md",
      "source": "engine/assets/AssetResolver.js",
      "import": "/engine/assets/AssetResolver.js",
      "sourceHash": "71434beddaf555a895ce7cfc2fbfd032dc2be9bd87a70595e5dd5b43007bca51",
      "summary": "engine/assets/AssetResolver.js — virtual-path resolution + backup repair (spec §3, rule 5). Files move, browser permissions expire, cloud mirrors lag. The resolver maps a scheme:// path to a concrete backend and, when reading a registered asset, tries the primary then each backup, verifying by content hash. If a backup matches the expected hash it repairs the primary; if a candidate's hash differs it is flagged a conflict (never silently accepted).",
      "exports": [
        {
          "name": "AssetResolver",
          "kind": "class",
          "signature": "class AssetResolver",
          "summary": "A backend is { async read(path) -> Uint8Array|null, async write?(path, bytes) }. Schemes without a registered backend simply fail to resolve (caller falls back)."
        },
        {
          "name": "backendFromCache",
          "kind": "function",
          "signature": "backendFromCache(cache)",
          "summary": "Adapt an AssetCache instance to a resolver backend (cache:// scheme)."
        },
        {
          "name": "makeFetchBackend",
          "kind": "function",
          "signature": "makeFetchBackend(base)",
          "summary": "A read-only backend that fetches relative to a base URL (asset://, cloud://)."
        },
        {
          "name": "makeMemoryBackend",
          "kind": "function",
          "signature": "makeMemoryBackend(initial = {})",
          "summary": "A simple in-memory backend (temp:// drag-drop, user:// session mounts)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/CanonicalSpace",
      "path": "engine/reference/assets/CanonicalSpace.md",
      "source": "engine/assets/CanonicalSpace.js",
      "import": "/engine/assets/CanonicalSpace.js",
      "sourceHash": "4d32f0a2c6fbf749f08abeeb4f8b0d6166ac6706c45d93406ce44ca3b1a8cc1c",
      "summary": "engine/assets/CanonicalSpace.js — the engine's canonical coordinate frame.  Y = up, Z = forward, X = side (right), unit = meter, origin = logical root.  Source files come from Blender/Maya/Max/CAD/Unity/Unreal/etc. with inconsistent axes, scale, and origin. We never trust source orientation and never rewrite it destructively — instead we compute a non-destructive axis correction (a quaternion + uniform scale) that maps the declared source frame into this canonical frame, and store it on the model's ImportTransform.",
      "exports": [
        {
          "name": "axisVector",
          "kind": "function",
          "signature": "axisVector(token)",
          "summary": "Resolve an axis token ('+Y', '-Z', …) to a unit vector."
        },
        {
          "name": "axisCorrectionQuat",
          "kind": "function",
          "signature": "axisCorrectionQuat(upAxis = '+Y', forwardAxis = '+Z')",
          "summary": "Quaternion (xyzw) that rotates a vector from a source frame (declared by its up + forward axes) into the canonical Y-up / Z-forward frame."
        },
        {
          "name": "mat3ToQuat",
          "kind": "function",
          "signature": "mat3ToQuat(m)",
          "summary": "Convert a row-major 3x3 rotation matrix to a quaternion (xyzw)."
        },
        {
          "name": "rotateVecByQuat",
          "kind": "function",
          "signature": "rotateVecByQuat(v, q)",
          "summary": "Rotate a 3-vector by a quaternion (xyzw)."
        },
        {
          "name": "unitScaleToMeters",
          "kind": "function",
          "signature": "unitScaleToMeters(unit)",
          "summary": ""
        },
        {
          "name": "CANONICAL",
          "kind": "constant",
          "signature": "CANONICAL",
          "summary": ""
        },
        {
          "name": "UNIT_TO_METERS",
          "kind": "constant",
          "signature": "UNIT_TO_METERS",
          "summary": "Common unit guesses for formats that don't carry units (e.g. STL). Returns a scale factor to convert the source unit to meters. These are *guesses* — the editor exposes an override per import."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/EngineModel",
      "path": "engine/reference/assets/EngineModel.md",
      "source": "engine/assets/EngineModel.js",
      "import": "/engine/assets/EngineModel.js",
      "sourceHash": "b7af5e3efddc8d291cb2069460b22c9fcef1319b6cd30097dca52c8b10ee8201",
      "summary": "engine/assets/EngineModel.js — the unified runtime object.  Core rule of the ingestion runtime: a model file is raw evidence, not the runtime object. The importer parses a source file into an EngineModel, which keeps every layer explicitly separate (source ≠ visual mesh ≠ material ≠ collider ≠ SDF ≠ skeleton ≠ animation ≠ runtime rig ≠ render surface). Layers that have not been built yet are explicitly null/empty — never faked — so the editor can show exactly what was detected vs generated.  Corrections (axis/scale/origin, material fixes, rig edits) live in metadata as an ImportTransform / import profile and are NEVER baked destructively into the source: the original imported look must always be recoverable.",
      "exports": [
        {
          "name": "createEngineModel",
          "kind": "function",
          "signature": "createEngineModel(init = {})",
          "summary": "Create an empty EngineModel with every layer present but unbuilt."
        },
        {
          "name": "createImportTransform",
          "kind": "function",
          "signature": "createImportTransform(init = {})",
          "summary": "A non-destructive correction applied at runtime (never baked into source). Confidence drives the auto-apply / review / preview / neutral policy."
        },
        {
          "name": "createEngineNode",
          "kind": "function",
          "signature": "createEngineNode(init = {})",
          "summary": "A node in the preserved source hierarchy (transforms kept as-authored)."
        },
        {
          "name": "createEngineMesh",
          "kind": "function",
          "signature": "createEngineMesh(init = {})",
          "summary": "A mesh = a set of primitives (submeshes), each with its own material."
        },
        {
          "name": "createEnginePrimitive",
          "kind": "function",
          "signature": "createEnginePrimitive(init = {})",
          "summary": "A primitive/submesh: geometry + a single material binding."
        },
        {
          "name": "layerStatus",
          "kind": "function",
          "signature": "layerStatus(model)",
          "summary": "Report which layers are built (non-empty) vs explicitly unbuilt."
        },
        {
          "name": "ENGINE_MODEL_LAYERS",
          "kind": "constant",
          "signature": "ENGINE_MODEL_LAYERS",
          "summary": "Canonical layer list — used by the editor to show built vs unbuilt layers."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/LicenseTracker",
      "path": "engine/reference/assets/LicenseTracker.md",
      "source": "engine/assets/LicenseTracker.js",
      "import": "/engine/assets/LicenseTracker.js",
      "sourceHash": "513338d08c844774cb8ef324bb5dad544a377208d3f41db4d6264925e1a8dd83",
      "summary": "engine/assets/LicenseTracker.js — license metadata + import gate (spec §21).  License metadata is mandatory before import. Marketplace assets are licensed, not sold, and portability varies. The hard rules: only import assets the user owns or is licensed to use; never rip copyrighted game assets; never bypass DRM; store license metadata; warn on unknown/restricted licenses. This gate is advisory by default (warn) and can be set strict (block) per project.",
      "exports": [
        {
          "name": "LicenseTracker",
          "kind": "class",
          "signature": "class LicenseTracker",
          "summary": ""
        },
        {
          "name": "GATE",
          "kind": "constant",
          "signature": "GATE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/geometry/PrincipalAxes",
      "path": "engine/reference/assets/geometry/PrincipalAxes.md",
      "source": "engine/assets/geometry/PrincipalAxes.js",
      "import": "/engine/assets/geometry/PrincipalAxes.js",
      "sourceHash": "398bad06d2d3026c86be0c9e4e0faf52184dcd19bd24cecf297a28e8c81555be",
      "summary": "engine/assets/geometry/PrincipalAxes.js — Principal Component Analysis of an EngineModel node's geometry. Small, dependency-free, GPU-free, and reusable: any engine system can ask for the natural axes of a mesh (oriented bounds, alignment, the axle of a wheel disc, the long axis of a barrel, etc.).  PCA finds the orthogonal axes of greatest → least variance of the vertex cloud. A disc/cylinder is thin along its axle, so its axle is the axis of LEAST variance — orientation- and mirror-proof, unlike axis-aligned guesses.",
      "exports": [
        {
          "name": "eigSym3",
          "kind": "function",
          "signature": "eigSym3(m)",
          "summary": "Jacobi eigen-decomposition of a symmetric 3×3 (row-major length-9 array)."
        },
        {
          "name": "principalAxes",
          "kind": "function",
          "signature": "principalAxes(model, nodeId, opts = {})",
          "summary": "PCA of a node's mesh-local vertex cloud."
        },
        {
          "name": "leastVarianceAxis",
          "kind": "function",
          "signature": "leastVarianceAxis(model, nodeId, opts = {})",
          "summary": "Convenience: the axis of LEAST variance (e.g. a wheel/disc axle), or null."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/BoneMapper",
      "path": "engine/reference/assets/humanoid/BoneMapper.md",
      "source": "engine/assets/humanoid/BoneMapper.js",
      "import": "/engine/assets/humanoid/BoneMapper.js",
      "sourceHash": "6917a9903e9a9314b36c226271149b75cfcb898a0b7e19f966a770431b9307ea",
      "summary": "engine/assets/humanoid/BoneMapper.js — map a source skeleton's bones onto the canonical humanoid slots (HumanoidRig) by NAME first (Mixamo / VRM / generic rig conventions), then hierarchy for the spine chain. Every mapping is a hint; ambiguous/extra bones are reported as `unmapped` and missing required slots as `missing` so the editor can correct (rule 62). Pure + GPU-free (gate-testable).",
      "exports": [
        {
          "name": "mapBones",
          "kind": "function",
          "signature": "mapBones(model, opts = {})",
          "summary": "Map a model's skeleton to canonical humanoid bones."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/FingerGenerator",
      "path": "engine/reference/assets/humanoid/FingerGenerator.md",
      "source": "engine/assets/humanoid/FingerGenerator.js",
      "import": "/engine/assets/humanoid/FingerGenerator.js",
      "sourceHash": "cb943cae4105ba41aea90d9fb6808c107bf4d07f8cc7589307b2a7b7339bf110",
      "summary": "engine/assets/humanoid/FingerGenerator.js — synthesize finger bones from a hand mesh when the source skeleton has none (the browser-friendly geometric approach: detect open-hand fingertip \"lobes\", not ML). Method: 1. Build a hand frame from the wrist→fingertip direction; the lateral spread axis (fingers fan out) and palm normal (thinnest) come from 2-D PCA of the vertices in the plane perpendicular to forward. 2. Take the far band of vertices (toward the tips) and cluster them along the lateral axis — each cluster is one finger lobe. 3. Label the shortest extreme lobe as the thumb; order the rest index→pinky. 4. Emit a short straight bone chain (proximal→intermediate→distal→tip) per finger. If fewer than four lobes separate (a closed fist / low-poly hand), report `detected:false` so the caller falls back to a single paddle.  Pure geometry, GPU-free, deterministic → unit-testable.",
      "exports": [
        {
          "name": "generateFingers",
          "kind": "function",
          "signature": "generateFingers(vertices, opts = {})",
          "summary": "Generate finger bones from hand vertices."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/FingerMapper",
      "path": "engine/reference/assets/humanoid/FingerMapper.md",
      "source": "engine/assets/humanoid/FingerMapper.js",
      "import": "/engine/assets/humanoid/FingerMapper.js",
      "sourceHash": "77accd50503ad68da9e1bc0e4914685b3416701d076ca12b15d41d86fa17e081",
      "summary": "engine/assets/humanoid/FingerMapper.js — detect EXISTING finger bones under a hand node by name (Mixamo \"LeftHandIndex1..3\", VRM \"J_Bip_L_Index_Proximal\", generic \"index_01\"), grouping them into canonical fingers with palm→tip joint order. Used before procedural generation: if the artist rigged fingers, keep them; only synthesize when none are found.",
      "exports": [
        {
          "name": "mapFingers",
          "kind": "function",
          "signature": "mapFingers(model, handNodeId)",
          "summary": "Map existing finger bones under a hand node."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/HandRig",
      "path": "engine/reference/assets/humanoid/HandRig.md",
      "source": "engine/assets/humanoid/HandRig.js",
      "import": "/engine/assets/humanoid/HandRig.js",
      "sourceHash": "37eab586ed8a836c4cf5578fccb8c468fc736c1eb4e51df40e6f3cecea1bf400",
      "summary": "engine/assets/humanoid/HandRig.js — hand + finger rig schema (spec §12). A hand is a wrist + up to five fingers, each a short bone chain. Fingers come from one of three sources: the source skeleton's named bones (`skeleton`), procedurally GENERATED from the hand mesh when the skeleton has none (`generated`), or a single paddle bone when the hand is a closed fist / too low-poly (`paddle`).",
      "exports": [
        {
          "name": "createFinger",
          "kind": "function",
          "signature": "createFinger(init = {})",
          "summary": ""
        },
        {
          "name": "createHandRig",
          "kind": "function",
          "signature": "createHandRig(init = {})",
          "summary": ""
        },
        {
          "name": "FINGERS",
          "kind": "constant",
          "signature": "FINGERS",
          "summary": ""
        },
        {
          "name": "FINGER_JOINTS",
          "kind": "constant",
          "signature": "FINGER_JOINTS",
          "summary": ""
        },
        {
          "name": "HAND_SOURCE",
          "kind": "constant",
          "signature": "HAND_SOURCE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/HandRigBuilder",
      "path": "engine/reference/assets/humanoid/HandRigBuilder.md",
      "source": "engine/assets/humanoid/HandRigBuilder.js",
      "import": "/engine/assets/humanoid/HandRigBuilder.js",
      "sourceHash": "662dcceb30f7d3aa441e94819fb50c4d63357181ff00fdcafd53e5b443e2ff6f",
      "summary": "engine/assets/humanoid/HandRigBuilder.js — build a hand rig for each hand of a humanoid. Priority: (1) use named finger bones if the skeleton has them; else (2) PROBE the hand mesh (vertices skinned to the hand joint) and GENERATE finger bones geometrically; else (3) a single paddle. Wrist + forward come from the humanoid rig (hand world position, and the lowerArm→hand direction).",
      "exports": [
        {
          "name": "extractHandVertices",
          "kind": "function",
          "signature": "extractHandVertices(model, handNodeId, thresh = 0.4, pose = null)",
          "summary": "Vertices skinned (weight ≥ thresh) to the hand joint, in node-hierarchy SCENE space (so they match the wrist + the rendered mesh). `pose` is a node→world map."
        },
        {
          "name": "buildHandRig",
          "kind": "function",
          "signature": "buildHandRig(model, opts = {})",
          "summary": "Build a single hand rig."
        },
        {
          "name": "buildHands",
          "kind": "function",
          "signature": "buildHands(model, opts = {})",
          "summary": "Build both hands for a model that already has a humanoid rig; attaches them at model.rigs.hand = { left, right } and humanoidRig.hands."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/HumanoidRig",
      "path": "engine/reference/assets/humanoid/HumanoidRig.md",
      "source": "engine/assets/humanoid/HumanoidRig.js",
      "import": "/engine/assets/humanoid/HumanoidRig.js",
      "sourceHash": "6cb50cb963fa46d4cafdfd1540bc25186158e8df7239412f404a4fff78c00308",
      "summary": "engine/assets/humanoid/HumanoidRig.js — canonical humanoid bone slots + rig schema (spec §12). A humanoid is NOT its skeleton: it's a mapping from the source skeleton's bones onto a canonical slot set (Unity Mecanim / VRM style) plus rest-pose + correction metadata, so animation can retarget and physics can build a ragdoll regardless of how the artist named or oriented the rig. Every mapping is a HINT with confidence; unmapped/ambiguous bones go to the editor.",
      "exports": [
        {
          "name": "createHumanoidRig",
          "kind": "function",
          "signature": "createHumanoidRig(init = {})",
          "summary": "Create a humanoid rig descriptor."
        },
        {
          "name": "boneSide",
          "kind": "function",
          "signature": "boneSide(slot)",
          "summary": "Is a canonical slot a left/right limb (vs a center/spine bone)?"
        },
        {
          "name": "mirrorBone",
          "kind": "function",
          "signature": "mirrorBone(slot)",
          "summary": "The mirrored slot for a left/right bone (e.g. leftHand ↔ rightHand), or null."
        },
        {
          "name": "HUMANOID_BONES",
          "kind": "constant",
          "signature": "HUMANOID_BONES",
          "summary": ""
        },
        {
          "name": "REQUIRED_BONES",
          "kind": "constant",
          "signature": "REQUIRED_BONES",
          "summary": ""
        },
        {
          "name": "BODY_SIDE",
          "kind": "constant",
          "signature": "BODY_SIDE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/HumanoidRigBuilder",
      "path": "engine/reference/assets/humanoid/HumanoidRigBuilder.md",
      "source": "engine/assets/humanoid/HumanoidRigBuilder.js",
      "import": "/engine/assets/humanoid/HumanoidRigBuilder.js",
      "sourceHash": "2d667b0a0db64ef0e209cc484e292e3f5f4481497985dcb8992048790a4d084a",
      "summary": "engine/assets/humanoid/HumanoidRigBuilder.js — assemble a HumanoidRig from a model's skeleton (spec §12). Maps bones (BoneMapper), snapshots the rest pose, classifies the pose (T vs A) from the arm direction, and flags needsCorrection when required bones are missing — never guessing past the evidence. The rig is the retarget/ragdoll target: it references the source nodes, it does not bake.",
      "exports": [
        {
          "name": "buildHumanoidRig",
          "kind": "function",
          "signature": "buildHumanoidRig(model, opts = {})",
          "summary": "Build a humanoid rig and attach it at model.rigs.humanoid."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/SkeletonHeal",
      "path": "engine/reference/assets/humanoid/SkeletonHeal.md",
      "source": "engine/assets/humanoid/SkeletonHeal.js",
      "import": "/engine/assets/humanoid/SkeletonHeal.js",
      "sourceHash": "b4a8f4ae556d703b1d48d143f2032116e53092cf0ccb41bf74426ded124a8d08",
      "summary": "engine/assets/humanoid/SkeletonHeal.js — anatomy-aware, NON-DESTRUCTIVE skeleton repair. When a rig is missing or mislabels core bones, infer them from anatomy (the same heuristics auto-riggers use): • Pelvis = the point between the two hip joints (and the retarget root must be the pelvis, NOT a ground/root-motion bone — so a \"Root\"/Armature bone at the floor is replaced by the leg-derived pelvis). • Missing spine / chest / neck are interpolated along the hips→head chain. • A missing left/right limb is MIRRORED from the present side across the body's sagittal plane (auto-mirror). Inferred joints are written to `rig.synthesized` (slot → position) — the source model is never modified. `humanoidBonePosition()` returns the real joint if it exists, else the synthesized one.",
      "exports": [
        {
          "name": "humanoidBonePosition",
          "kind": "function",
          "signature": "humanoidBonePosition(rig, slot, pose)",
          "summary": "Real or synthesized world position for a canonical slot (or null)."
        },
        {
          "name": "healHumanoid",
          "kind": "function",
          "signature": "healHumanoid(model, rig, pose)",
          "summary": "Repair a humanoid rig in place (non-destructively): fills `rig.synthesized` with inferred joints and `rig.healed` with a list of what was repaired."
        },
        {
          "name": "analyzeSymmetry",
          "kind": "function",
          "signature": "analyzeSymmetry(model, pose)",
          "summary": "Find the skeleton's plane of bilateral symmetry."
        },
        {
          "name": "healSkeleton",
          "kind": "function",
          "signature": "healSkeleton(model, pose)",
          "summary": "Heal a generic skeleton by mirroring limbs that exist on only one side."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/humanoid/SkinPose",
      "path": "engine/reference/assets/humanoid/SkinPose.md",
      "source": "engine/assets/humanoid/SkinPose.js",
      "import": "/engine/assets/humanoid/SkinPose.js",
      "sourceHash": "db2735cd134348a9c124fd7543a73c5441908aff54084bd836788ab902046bbc",
      "summary": "engine/assets/humanoid/SkinPose.js — scene-space skeleton pose used by rig overlays + hand probing.  IMPORTANT (verified with scripts/probe_skeleton.py across real rigs): the correct space for placing the skeleton so it lands on the RENDERED mesh is the NODE-HIERARCHY world, because the importer/renderer draw the (unskinned) mesh through that same node hierarchy + importTransform. `inverse(IBM)` instead lives in the armature-local / unscaled space (e.g. hips ≈ 0.03 while the node-hierarchy hips ≈ 2.77 with a ×100 mesh-node scale), so using it for the overlay either collapses the skeleton (missing node scale) or double-rotates it (re-applying the armature transform). We therefore use the node hierarchy here; the IBMs are still imported and available (invert4) for true-bind / retarget work later.",
      "exports": [
        {
          "name": "invert4",
          "kind": "function",
          "signature": "invert4(m)",
          "summary": "Invert a column-major 4×4 (returns a new Float32Array, or null if singular)."
        },
        {
          "name": "buildBindPose",
          "kind": "function",
          "signature": "buildBindPose(model)",
          "summary": "Scene-space pose for every node = the node-hierarchy world (TRS composed down the tree). This is exactly the space the renderer draws the mesh in, so the skeleton overlay + hand probing align with the mesh for any export."
        },
        {
          "name": "jointPosition",
          "kind": "function",
          "signature": "jointPosition(pose, nodeId)",
          "summary": "World position of a node in a pose map (or null)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/Detectors",
      "path": "engine/reference/assets/import/Detectors.md",
      "source": "engine/assets/import/Detectors.js",
      "import": "/engine/assets/import/Detectors.js",
      "sourceHash": "9b741dc0e21f679cac3184b6622df3360d4709c9849b0c5ad45acdcd2503cd99",
      "summary": "engine/assets/import/Detectors.js — hierarchy, part, and semantic detection (spec §6). These produce hints, never assertions: every detection carries a confidence and is editor-correctable. Detection by name is the cheap first pass; geometry-based detection (cylinders → wheels, symmetry, etc.) is layered in by the phase that needs it (vehicles, humanoids, weapons).",
      "exports": [
        {
          "name": "detectHierarchy",
          "kind": "function",
          "signature": "detectHierarchy(model)",
          "summary": "Summarize the preserved source hierarchy."
        },
        {
          "name": "detectParts",
          "kind": "function",
          "signature": "detectParts(model)",
          "summary": "Detect semantic parts by node name. Populates model.detectedParts."
        },
        {
          "name": "detectSemanticDomain",
          "kind": "function",
          "signature": "detectSemanticDomain(model)",
          "summary": "Roll detected parts up to a guessed runtime domain (vehicle/humanoid/weapon)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/FormatDetector",
      "path": "engine/reference/assets/import/FormatDetector.md",
      "source": "engine/assets/import/FormatDetector.js",
      "import": "/engine/assets/import/FormatDetector.js",
      "sourceHash": "69a346175700b26dc908881d942a3dd16b9bb8482ae85dd55c710699878ccc52",
      "summary": "engine/assets/import/FormatDetector.js — detect format by extension + magic bytes (spec §5). Never trust the filename alone: the magic-byte sniff wins when it disagrees with the extension, and a confidence is reported so the pipeline can fall back to the editor when unsure.",
      "exports": [
        {
          "name": "sniffMagic",
          "kind": "function",
          "signature": "sniffMagic(head)",
          "summary": "Sniff a format from a leading byte slice. Returns a format token or null. Pass at least the first 16 bytes for reliable results."
        },
        {
          "name": "classOf",
          "kind": "function",
          "signature": "classOf(format)",
          "summary": ""
        },
        {
          "name": "detectFormat",
          "kind": "function",
          "signature": "detectFormat(name, head = null)",
          "summary": "Detect a file's format from its name and (optional) leading bytes."
        },
        {
          "name": "FORMAT_CLASS",
          "kind": "constant",
          "signature": "FORMAT_CLASS",
          "summary": ""
        },
        {
          "name": "BRIDGE_FORMATS",
          "kind": "re-export",
          "signature": "BRIDGE_FORMATS",
          "summary": ""
        },
        {
          "name": "IMAGE_FORMATS",
          "kind": "re-export",
          "signature": "IMAGE_FORMATS",
          "summary": ""
        },
        {
          "name": "NATIVE_FORMATS",
          "kind": "re-export",
          "signature": "NATIVE_FORMATS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/GltfSceneImporter",
      "path": "engine/reference/assets/import/GltfSceneImporter.md",
      "source": "engine/assets/import/GltfSceneImporter.js",
      "import": "/engine/assets/import/GltfSceneImporter.js",
      "sourceHash": "0c194246b9ce63e769ff713a13070fb778c24ef61d86631f952ad4cedd6c7cc4",
      "summary": "engine/assets/import/GltfSceneImporter.js — full glTF/GLB scene → EngineModel.  glTF is the preferred runtime delivery format (nodes, meshes, materials, skins, animations, buffers, textures). This importer parses the whole scene graph — not just motion — reusing the engine's accessor toolkit (core/math/MeshAttributeMath) to decode vertex/index data exactly. Materials and textures are preserved as raw blocks here and normalized in Phase 2; the original look must always be recoverable.",
      "exports": [
        {
          "name": "parseGlb",
          "kind": "function",
          "signature": "parseGlb(bytes)",
          "summary": "Parse a binary GLB into { json, bin }."
        },
        {
          "name": "decodeGltfDataUri",
          "kind": "function",
          "signature": "decodeGltfDataUri(uri)",
          "summary": ""
        },
        {
          "name": "gltfExternalUriReport",
          "kind": "function",
          "signature": "gltfExternalUriReport(uri)",
          "summary": ""
        },
        {
          "name": "gltfExternalResourceReferences",
          "kind": "function",
          "signature": "gltfExternalResourceReferences(json)",
          "summary": ""
        },
        {
          "name": "packageLooseGltfFiles",
          "kind": "function",
          "signature": "async packageLooseGltfFiles(inputFiles)",
          "summary": ""
        },
        {
          "name": "extractGltfMaterialPayload",
          "kind": "function",
          "signature": "extractGltfMaterialPayload(json, buffers = [], externalImages = null)",
          "summary": "Extract the recoverable glTF material/texture payload from already-resolved buffers. This is shared by the full asset pipeline and the editor mesh importer so both paths normalize exactly the same source records."
        },
        {
          "name": "importGltf",
          "kind": "function",
          "signature": "async importGltf(data, opts = {})",
          "summary": "Import a glTF/GLB into an EngineModel."
        },
        {
          "name": "GLTF_EXTERNAL_RESOURCE_LIMITS",
          "kind": "constant",
          "signature": "GLTF_EXTERNAL_RESOURCE_LIMITS",
          "summary": ""
        },
        {
          "name": "GLTF_COMPONENT_TYPES",
          "kind": "re-export",
          "signature": "GLTF_COMPONENT_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/GpuUploader",
      "path": "engine/reference/assets/import/GpuUploader.md",
      "source": "engine/assets/import/GpuUploader.js",
      "import": "/engine/assets/import/GpuUploader.js",
      "sourceHash": "69a206c0426cd6429d8481247b59aa1de99f8a6cd7f1e8dab37dac6a0ec868da",
      "summary": "engine/assets/import/GpuUploader.js — upload EngineModel primitives to the GPU.  Parsing is GPU-free; this is the separate, device-driven step (spec §9: upload GPU buffers incrementally). Each primitive is interleaved into a standard [position(3), normal(3), uv(2)] vertex layout (generating flat normals when a source lacks them) plus an optional index buffer, so the importer/viewer and the engine renderer can draw it with one shared layout. Buffers are recorded on `primitive.gpu`; `model.gpuReady` flips true when all primitives upload.",
      "exports": [
        {
          "name": "standardVertexLayout",
          "kind": "function",
          "signature": "standardVertexLayout()",
          "summary": "The WebGPU vertex buffer layout matching interleaveStandard()."
        },
        {
          "name": "interleaveStandard",
          "kind": "function",
          "signature": "interleaveStandard(primitive)",
          "summary": "Interleave a primitive's attributes into the standard layout."
        },
        {
          "name": "uploadPrimitive",
          "kind": "function",
          "signature": "uploadPrimitive(device, primitive)",
          "summary": "Upload one primitive to the GPU. Records `primitive.gpu`."
        },
        {
          "name": "uploadModel",
          "kind": "function",
          "signature": "uploadModel(device, model)",
          "summary": "Upload every primitive in a model. Returns the number uploaded."
        },
        {
          "name": "releaseModelGpu",
          "kind": "function",
          "signature": "releaseModelGpu(model)",
          "summary": "Free GPU buffers held by a model's primitives."
        },
        {
          "name": "STANDARD_STRIDE_FLOATS",
          "kind": "constant",
          "signature": "STANDARD_STRIDE_FLOATS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/ImportPipeline",
      "path": "engine/reference/assets/import/ImportPipeline.md",
      "source": "engine/assets/import/ImportPipeline.js",
      "import": "/engine/assets/import/ImportPipeline.js",
      "sourceHash": "a4c0ab1a8b0a21a9f9b358d7101384e6b8dda16622f3be1b8117040760d9b6ac",
      "summary": "engine/assets/import/ImportPipeline.js — orchestrates the ingestion flow (spec §5 pipeline): detect → license-gate → parse → normalize orientation → detect hierarchy/parts/domain → deduplicate/register. GPU upload is a separate explicit step (GpuUploader) because parsing must stay GPU-free and worker-able.",
      "exports": [
        {
          "name": "parseToModel",
          "kind": "function",
          "signature": "async parseToModel(format, data, opts = {})",
          "summary": "Parse raw bytes of a known format into an EngineModel (no GPU, no registry)."
        },
        {
          "name": "importFile",
          "kind": "function",
          "signature": "async importFile(args)",
          "summary": "Full import of a single file."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/ObjImporter",
      "path": "engine/reference/assets/import/ObjImporter.md",
      "source": "engine/assets/import/ObjImporter.js",
      "import": "/engine/assets/import/ObjImporter.js",
      "sourceHash": "6be5b53cfeab30b8a2a9b6cc8422e76d7fbfe12ac0e99c3634ebda576daca872",
      "summary": "engine/assets/import/ObjImporter.js — Wavefront OBJ (+ optional MTL) → EngineModel.  OBJ is static geometry + simple material references. We preserve groups/objects and per-face material assignment by splitting into one primitive per material group. Polygons are triangulated (fan). MTL parsing is light (names + a few PBR-ish factors) and the full material decode happens in Phase 2.",
      "exports": [
        {
          "name": "parseMtl",
          "kind": "function",
          "signature": "parseMtl(text)",
          "summary": "Parse a minimal MTL into a map of name → material descriptor."
        },
        {
          "name": "importObj",
          "kind": "function",
          "signature": "importObj(data, opts = {})",
          "summary": "Import OBJ text/bytes into an EngineModel."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/OrientationResolver",
      "path": "engine/reference/assets/import/OrientationResolver.md",
      "source": "engine/assets/import/OrientationResolver.js",
      "import": "/engine/assets/import/OrientationResolver.js",
      "sourceHash": "32197f5fccdd200a1e646256b0d6dba37aaf1187fd510f4961cf6e57bd908ba9",
      "summary": "engine/assets/import/OrientationResolver.js — axis/scale/origin inference (spec §6). Never trust source orientation; never bake corrections into source. We infer a non-destructive ImportTransform (axis correction quat + scale + origin) with a confidence, and a policy decides whether to auto-apply, mark reviewable, preview only, or stay neutral and require manual correction.",
      "exports": [
        {
          "name": "classifyConfidence",
          "kind": "function",
          "signature": "classifyConfidence(c)",
          "summary": ""
        },
        {
          "name": "resolveOrientation",
          "kind": "function",
          "signature": "resolveOrientation(model, opts = {})",
          "summary": "Infer an ImportTransform for a model."
        },
        {
          "name": "CONFIDENCE_POLICY",
          "kind": "constant",
          "signature": "CONFIDENCE_POLICY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/PlyImporter",
      "path": "engine/reference/assets/import/PlyImporter.md",
      "source": "engine/assets/import/PlyImporter.js",
      "import": "/engine/assets/import/PlyImporter.js",
      "sourceHash": "fb4d0d16eb083ffa8719149edee418193468036aee354f44f1c89467f9b3a52f",
      "summary": "engine/assets/import/PlyImporter.js — Stanford PLY (ASCII + binary LE) → EngineModel.  PLY is a point/mesh utility format. We read the vertex element (position + optional normal/color) and the face element (triangulated), producing one indexed primitive. Big-endian binary is uncommon for web assets and is not supported here (the editor can flag it).",
      "exports": [
        {
          "name": "importPly",
          "kind": "function",
          "signature": "importPly(data, opts = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/import/StlImporter",
      "path": "engine/reference/assets/import/StlImporter.md",
      "source": "engine/assets/import/StlImporter.js",
      "import": "/engine/assets/import/StlImporter.js",
      "sourceHash": "55daa8dd205faf69683e87d0dc96577878c25179078be68e8f180427da5c8054",
      "summary": "engine/assets/import/StlImporter.js — STL (binary + ASCII) → EngineModel.  STL is CAD/printable part geometry: triangles only, no materials, no hierarchy, no declared units. We import geometry faithfully and leave the unit guess to the OrientationResolver / editor. Output is a single non-indexed primitive with per-vertex positions and face normals.",
      "exports": [
        {
          "name": "importStl",
          "kind": "function",
          "signature": "importStl(data, opts = {})",
          "summary": "Import STL bytes or text into an EngineModel."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/index",
      "path": "engine/reference/assets/index.md",
      "source": "engine/assets/index.js",
      "import": "/engine/assets/index.js",
      "sourceHash": "72b007a62a505f281986f10e4ff2fad818edffcf12299481e69f310c0af65846",
      "summary": "engine/assets/index.js — Global Asset Ingestion Runtime barrel.  Turns any source file into an EngineModel and a usable simulation object: decode → normalize → deduplicate → preserve hierarchy/materials/animations → generate colliders/SDF/rigs/surfaces → cache → spawn.  Build status: [x] Phase 0  foundations (EngineModel, AssetRecord, vpath, canonical space) [x] Phase 1  asset core (dedup, cache/OPFS, registry, resolver, importers) [x] Phase 2  materials & textures (decode, bindings, segments, variants) [x] Phase 3  vehicles (wheel/chassis detect, rig builder, suspension/tire/sync) [x] Render   reusable model rendering (shader/pipeline, GPU drawables, wheel-spin, ModelRenderer) + geometry PCA — shared by demos, editor, and runtime so importing/viewing assets is one call. [ ] Phase 4  render surfaces [ ] Phase 5  humanoids, hands & weapons",
      "exports": [
        {
          "name": "ALPHA_MODE",
          "kind": "re-export",
          "signature": "ALPHA_MODE",
          "summary": ""
        },
        {
          "name": "ASSET_TYPES",
          "kind": "re-export",
          "signature": "ASSET_TYPES",
          "summary": ""
        },
        {
          "name": "AssetCache",
          "kind": "re-export",
          "signature": "AssetCache",
          "summary": ""
        },
        {
          "name": "AssetRegistry",
          "kind": "re-export",
          "signature": "AssetRegistry",
          "summary": ""
        },
        {
          "name": "AssetResolver",
          "kind": "re-export",
          "signature": "AssetResolver",
          "summary": ""
        },
        {
          "name": "BODY_SIDE",
          "kind": "re-export",
          "signature": "BODY_SIDE",
          "summary": ""
        },
        {
          "name": "BRIDGE_FORMATS",
          "kind": "re-export",
          "signature": "BRIDGE_FORMATS",
          "summary": ""
        },
        {
          "name": "CANONICAL",
          "kind": "re-export",
          "signature": "CANONICAL",
          "summary": ""
        },
        {
          "name": "COLOR_SPACE",
          "kind": "re-export",
          "signature": "COLOR_SPACE",
          "summary": ""
        },
        {
          "name": "CONFIDENCE_POLICY",
          "kind": "re-export",
          "signature": "CONFIDENCE_POLICY",
          "summary": ""
        },
        {
          "name": "DEDUP",
          "kind": "re-export",
          "signature": "DEDUP",
          "summary": ""
        },
        {
          "name": "DRIVETRAIN",
          "kind": "re-export",
          "signature": "DRIVETRAIN",
          "summary": ""
        },
        {
          "name": "ENGINE_MODEL_LAYERS",
          "kind": "re-export",
          "signature": "ENGINE_MODEL_LAYERS",
          "summary": ""
        },
        {
          "name": "FINGERS",
          "kind": "re-export",
          "signature": "FINGERS",
          "summary": ""
        },
        {
          "name": "FINGER_JOINTS",
          "kind": "re-export",
          "signature": "FINGER_JOINTS",
          "summary": ""
        },
        {
          "name": "FORMAT_CLASS",
          "kind": "re-export",
          "signature": "FORMAT_CLASS",
          "summary": ""
        },
        {
          "name": "GATE",
          "kind": "re-export",
          "signature": "GATE",
          "summary": ""
        },
        {
          "name": "HAND_SOURCE",
          "kind": "re-export",
          "signature": "HAND_SOURCE",
          "summary": ""
        },
        {
          "name": "HUMANOID_BONES",
          "kind": "re-export",
          "signature": "HUMANOID_BONES",
          "summary": ""
        },
        {
          "name": "IMAGE_FORMATS",
          "kind": "re-export",
          "signature": "IMAGE_FORMATS",
          "summary": ""
        },
        {
          "name": "LIT_MODEL_SHADER",
          "kind": "re-export",
          "signature": "LIT_MODEL_SHADER",
          "summary": ""
        },
        {
          "name": "LicenseTracker",
          "kind": "re-export",
          "signature": "LicenseTracker",
          "summary": ""
        },
        {
          "name": "MODEL_UNIFORM_BYTES",
          "kind": "re-export",
          "signature": "MODEL_UNIFORM_BYTES",
          "summary": ""
        },
        {
          "name": "MODEL_UNIFORM_FLOATS",
          "kind": "re-export",
          "signature": "MODEL_UNIFORM_FLOATS",
          "summary": ""
        },
        {
          "name": "MOVING_PART",
          "kind": "re-export",
          "signature": "MOVING_PART",
          "summary": ""
        },
        {
          "name": "NATIVE_FORMATS",
          "kind": "re-export",
          "signature": "NATIVE_FORMATS",
          "summary": ""
        },
        {
          "name": "REQUIRED_BONES",
          "kind": "re-export",
          "signature": "REQUIRED_BONES",
          "summary": ""
        },
        {
          "name": "REQUIRED_SOCKETS",
          "kind": "re-export",
          "signature": "REQUIRED_SOCKETS",
          "summary": ""
        },
        {
          "name": "SCULPTURE_COURT_BACKDROP_SHADER",
          "kind": "re-export",
          "signature": "SCULPTURE_COURT_BACKDROP_SHADER",
          "summary": ""
        },
        {
          "name": "SCULPTURE_COURT_MODEL_SHADER",
          "kind": "re-export",
          "signature": "SCULPTURE_COURT_MODEL_SHADER",
          "summary": ""
        },
        {
          "name": "SEGMENT_MODE",
          "kind": "re-export",
          "signature": "SEGMENT_MODE",
          "summary": ""
        },
        {
          "name": "STANDARD_STRIDE_FLOATS",
          "kind": "re-export",
          "signature": "STANDARD_STRIDE_FLOATS",
          "summary": ""
        },
        {
          "name": "TEXTURE_SLOTS",
          "kind": "re-export",
          "signature": "TEXTURE_SLOTS",
          "summary": ""
        },
        {
          "name": "TEXTURE_USAGE",
          "kind": "re-export",
          "signature": "TEXTURE_USAGE",
          "summary": ""
        },
        {
          "name": "UNIT_TO_METERS",
          "kind": "re-export",
          "signature": "UNIT_TO_METERS",
          "summary": ""
        },
        {
          "name": "VPATH_SCHEMES",
          "kind": "re-export",
          "signature": "VPATH_SCHEMES",
          "summary": ""
        },
        {
          "name": "WEAPON_EVENT",
          "kind": "re-export",
          "signature": "WEAPON_EVENT",
          "summary": ""
        },
        {
          "name": "WEAPON_INPUT",
          "kind": "re-export",
          "signature": "WEAPON_INPUT",
          "summary": ""
        },
        {
          "name": "WEAPON_SOCKET",
          "kind": "re-export",
          "signature": "WEAPON_SOCKET",
          "summary": ""
        },
        {
          "name": "WEAPON_STATE",
          "kind": "re-export",
          "signature": "WEAPON_STATE",
          "summary": ""
        },
        {
          "name": "WEAPON_TYPE",
          "kind": "re-export",
          "signature": "WEAPON_TYPE",
          "summary": ""
        },
        {
          "name": "WHEEL_PHYSICS_MODE",
          "kind": "re-export",
          "signature": "WHEEL_PHYSICS_MODE",
          "summary": ""
        },
        {
          "name": "WORKFLOW",
          "kind": "re-export",
          "signature": "WORKFLOW",
          "summary": ""
        },
        {
          "name": "advanceSpin",
          "kind": "re-export",
          "signature": "advanceSpin",
          "summary": ""
        },
        {
          "name": "analyzeSymmetry",
          "kind": "re-export",
          "signature": "analyzeSymmetry",
          "summary": ""
        },
        {
          "name": "approximateToMetallicRoughness",
          "kind": "re-export",
          "signature": "approximateToMetallicRoughness",
          "summary": ""
        },
        {
          "name": "axisCorrectionQuat",
          "kind": "re-export",
          "signature": "axisCorrectionQuat",
          "summary": ""
        },
        {
          "name": "axisVector",
          "kind": "re-export",
          "signature": "axisVector",
          "summary": ""
        },
        {
          "name": "backendFromCache",
          "kind": "re-export",
          "signature": "backendFromCache",
          "summary": ""
        },
        {
          "name": "bakeSegment",
          "kind": "re-export",
          "signature": "bakeSegment",
          "summary": ""
        },
        {
          "name": "bakeSkinnedMeshes",
          "kind": "re-export",
          "signature": "bakeSkinnedMeshes",
          "summary": ""
        },
        {
          "name": "boneSide",
          "kind": "re-export",
          "signature": "boneSide",
          "summary": ""
        },
        {
          "name": "buildBindPose",
          "kind": "re-export",
          "signature": "buildBindPose",
          "summary": ""
        },
        {
          "name": "buildHandRig",
          "kind": "re-export",
          "signature": "buildHandRig",
          "summary": ""
        },
        {
          "name": "buildHands",
          "kind": "re-export",
          "signature": "buildHands",
          "summary": ""
        },
        {
          "name": "buildHumanoidRig",
          "kind": "re-export",
          "signature": "buildHumanoidRig",
          "summary": ""
        },
        {
          "name": "buildModelDrawables",
          "kind": "re-export",
          "signature": "buildModelDrawables",
          "summary": ""
        },
        {
          "name": "buildSurfaceBindings",
          "kind": "re-export",
          "signature": "buildSurfaceBindings",
          "summary": ""
        },
        {
          "name": "buildVehicleRig",
          "kind": "re-export",
          "signature": "buildVehicleRig",
          "summary": ""
        },
        {
          "name": "buildWeaponRig",
          "kind": "re-export",
          "signature": "buildWeaponRig",
          "summary": ""
        },
        {
          "name": "buildWheelSpinMap",
          "kind": "re-export",
          "signature": "buildWheelSpinMap",
          "summary": ""
        },
        {
          "name": "cachePathFor",
          "kind": "re-export",
          "signature": "cachePathFor",
          "summary": ""
        },
        {
          "name": "classOf",
          "kind": "re-export",
          "signature": "classOf",
          "summary": ""
        },
        {
          "name": "classify",
          "kind": "re-export",
          "signature": "classify",
          "summary": ""
        },
        {
          "name": "classifyConfidence",
          "kind": "re-export",
          "signature": "classifyConfidence",
          "summary": ""
        },
        {
          "name": "computeWorldMatrices",
          "kind": "re-export",
          "signature": "computeWorldMatrices",
          "summary": ""
        },
        {
          "name": "createAssetRecord",
          "kind": "re-export",
          "signature": "createAssetRecord",
          "summary": ""
        },
        {
          "name": "createDefaultSampler",
          "kind": "re-export",
          "signature": "createDefaultSampler",
          "summary": ""
        },
        {
          "name": "createEngineMaterial",
          "kind": "re-export",
          "signature": "createEngineMaterial",
          "summary": ""
        },
        {
          "name": "createEngineMesh",
          "kind": "re-export",
          "signature": "createEngineMesh",
          "summary": ""
        },
        {
          "name": "createEngineModel",
          "kind": "re-export",
          "signature": "createEngineModel",
          "summary": ""
        },
        {
          "name": "createEngineNode",
          "kind": "re-export",
          "signature": "createEngineNode",
          "summary": ""
        },
        {
          "name": "createEnginePrimitive",
          "kind": "re-export",
          "signature": "createEnginePrimitive",
          "summary": ""
        },
        {
          "name": "createFinger",
          "kind": "re-export",
          "signature": "createFinger",
          "summary": ""
        },
        {
          "name": "createHandRig",
          "kind": "re-export",
          "signature": "createHandRig",
          "summary": ""
        },
        {
          "name": "createHumanoidRig",
          "kind": "re-export",
          "signature": "createHumanoidRig",
          "summary": ""
        },
        {
          "name": "createImportTransform",
          "kind": "re-export",
          "signature": "createImportTransform",
          "summary": ""
        },
        {
          "name": "createLicenseBlock",
          "kind": "re-export",
          "signature": "createLicenseBlock",
          "summary": ""
        },
        {
          "name": "createMaterialVariant",
          "kind": "re-export",
          "signature": "createMaterialVariant",
          "summary": ""
        },
        {
          "name": "createModelPipeline",
          "kind": "re-export",
          "signature": "createModelPipeline",
          "summary": ""
        },
        {
          "name": "createModelRenderer",
          "kind": "re-export",
          "signature": "createModelRenderer",
          "summary": ""
        },
        {
          "name": "createSegmentView",
          "kind": "re-export",
          "signature": "createSegmentView",
          "summary": ""
        },
        {
          "name": "createSuspension",
          "kind": "re-export",
          "signature": "createSuspension",
          "summary": ""
        },
        {
          "name": "createTextureBinding",
          "kind": "re-export",
          "signature": "createTextureBinding",
          "summary": ""
        },
        {
          "name": "createTimelinePlayer",
          "kind": "re-export",
          "signature": "createTimelinePlayer",
          "summary": ""
        },
        {
          "name": "createTireProfile",
          "kind": "re-export",
          "signature": "createTireProfile",
          "summary": ""
        },
        {
          "name": "createVehicleAsset",
          "kind": "re-export",
          "signature": "createVehicleAsset",
          "summary": ""
        },
        {
          "name": "createWeaponAction",
          "kind": "re-export",
          "signature": "createWeaponAction",
          "summary": ""
        },
        {
          "name": "createWeaponRig",
          "kind": "re-export",
          "signature": "createWeaponRig",
          "summary": ""
        },
        {
          "name": "createWeaponStateMachine",
          "kind": "re-export",
          "signature": "createWeaponStateMachine",
          "summary": ""
        },
        {
          "name": "createWheelSlot",
          "kind": "re-export",
          "signature": "createWheelSlot",
          "summary": ""
        },
        {
          "name": "createWhiteTexture",
          "kind": "re-export",
          "signature": "createWhiteTexture",
          "summary": ""
        },
        {
          "name": "decodeAllTextures",
          "kind": "re-export",
          "signature": "decodeAllTextures",
          "summary": ""
        },
        {
          "name": "decodeTexture",
          "kind": "re-export",
          "signature": "decodeTexture",
          "summary": ""
        },
        {
          "name": "defaultChannelMap",
          "kind": "re-export",
          "signature": "defaultChannelMap",
          "summary": ""
        },
        {
          "name": "defaultFireAction",
          "kind": "re-export",
          "signature": "defaultFireAction",
          "summary": ""
        },
        {
          "name": "defaultReloadAction",
          "kind": "re-export",
          "signature": "defaultReloadAction",
          "summary": ""
        },
        {
          "name": "detectChassis",
          "kind": "re-export",
          "signature": "detectChassis",
          "summary": ""
        },
        {
          "name": "detectFormat",
          "kind": "re-export",
          "signature": "detectFormat",
          "summary": ""
        },
        {
          "name": "detectHierarchy",
          "kind": "re-export",
          "signature": "detectHierarchy",
          "summary": ""
        },
        {
          "name": "detectParts",
          "kind": "re-export",
          "signature": "detectParts",
          "summary": ""
        },
        {
          "name": "detectSemanticDomain",
          "kind": "re-export",
          "signature": "detectSemanticDomain",
          "summary": ""
        },
        {
          "name": "detectWeapon",
          "kind": "re-export",
          "signature": "detectWeapon",
          "summary": ""
        },
        {
          "name": "detectWheels",
          "kind": "re-export",
          "signature": "detectWheels",
          "summary": ""
        },
        {
          "name": "eigSym3",
          "kind": "re-export",
          "signature": "eigSym3",
          "summary": ""
        },
        {
          "name": "eventsBetween",
          "kind": "re-export",
          "signature": "eventsBetween",
          "summary": ""
        },
        {
          "name": "extractHandVertices",
          "kind": "re-export",
          "signature": "extractHandVertices",
          "summary": ""
        },
        {
          "name": "frameBounds",
          "kind": "re-export",
          "signature": "frameBounds",
          "summary": ""
        },
        {
          "name": "freeRollAngularVelocity",
          "kind": "re-export",
          "signature": "freeRollAngularVelocity",
          "summary": ""
        },
        {
          "name": "generateFingers",
          "kind": "re-export",
          "signature": "generateFingers",
          "summary": ""
        },
        {
          "name": "hasTextureTransform",
          "kind": "re-export",
          "signature": "hasTextureTransform",
          "summary": ""
        },
        {
          "name": "hashContent",
          "kind": "re-export",
          "signature": "hashContent",
          "summary": ""
        },
        {
          "name": "healHumanoid",
          "kind": "re-export",
          "signature": "healHumanoid",
          "summary": ""
        },
        {
          "name": "healSkeleton",
          "kind": "re-export",
          "signature": "healSkeleton",
          "summary": ""
        },
        {
          "name": "humanoidBonePosition",
          "kind": "re-export",
          "signature": "humanoidBonePosition",
          "summary": ""
        },
        {
          "name": "importFile",
          "kind": "re-export",
          "signature": "importFile",
          "summary": ""
        },
        {
          "name": "importGltf",
          "kind": "re-export",
          "signature": "importGltf",
          "summary": ""
        },
        {
          "name": "importMaterials",
          "kind": "re-export",
          "signature": "importMaterials",
          "summary": ""
        },
        {
          "name": "importMatrixOf",
          "kind": "re-export",
          "signature": "importMatrixOf",
          "summary": ""
        },
        {
          "name": "importObj",
          "kind": "re-export",
          "signature": "importObj",
          "summary": ""
        },
        {
          "name": "importPly",
          "kind": "re-export",
          "signature": "importPly",
          "summary": ""
        },
        {
          "name": "importStl",
          "kind": "re-export",
          "signature": "importStl",
          "summary": ""
        },
        {
          "name": "interleaveStandard",
          "kind": "re-export",
          "signature": "interleaveStandard",
          "summary": ""
        },
        {
          "name": "invert4",
          "kind": "re-export",
          "signature": "invert4",
          "summary": ""
        },
        {
          "name": "isVPath",
          "kind": "re-export",
          "signature": "isVPath",
          "summary": ""
        },
        {
          "name": "jointPosition",
          "kind": "re-export",
          "signature": "jointPosition",
          "summary": ""
        },
        {
          "name": "layerStatus",
          "kind": "re-export",
          "signature": "layerStatus",
          "summary": ""
        },
        {
          "name": "leastVarianceAxis",
          "kind": "re-export",
          "signature": "leastVarianceAxis",
          "summary": ""
        },
        {
          "name": "licenseNeedsReview",
          "kind": "re-export",
          "signature": "licenseNeedsReview",
          "summary": ""
        },
        {
          "name": "longitudinalSlip",
          "kind": "re-export",
          "signature": "longitudinalSlip",
          "summary": ""
        },
        {
          "name": "makeFetchBackend",
          "kind": "re-export",
          "signature": "makeFetchBackend",
          "summary": ""
        },
        {
          "name": "makeGpuTexture",
          "kind": "re-export",
          "signature": "makeGpuTexture",
          "summary": ""
        },
        {
          "name": "makeMemoryBackend",
          "kind": "re-export",
          "signature": "makeMemoryBackend",
          "summary": ""
        },
        {
          "name": "makeVPath",
          "kind": "re-export",
          "signature": "makeVPath",
          "summary": ""
        },
        {
          "name": "mapBones",
          "kind": "re-export",
          "signature": "mapBones",
          "summary": ""
        },
        {
          "name": "mapFingers",
          "kind": "re-export",
          "signature": "mapFingers",
          "summary": ""
        },
        {
          "name": "mat3ToQuat",
          "kind": "re-export",
          "signature": "mat3ToQuat",
          "summary": ""
        },
        {
          "name": "mirrorBone",
          "kind": "re-export",
          "signature": "mirrorBone",
          "summary": ""
        },
        {
          "name": "normalizeSegments",
          "kind": "re-export",
          "signature": "normalizeSegments",
          "summary": ""
        },
        {
          "name": "normalizeTextures",
          "kind": "re-export",
          "signature": "normalizeTextures",
          "summary": ""
        },
        {
          "name": "parseGlb",
          "kind": "re-export",
          "signature": "parseGlb",
          "summary": ""
        },
        {
          "name": "parseMtl",
          "kind": "re-export",
          "signature": "parseMtl",
          "summary": ""
        },
        {
          "name": "parseToModel",
          "kind": "re-export",
          "signature": "parseToModel",
          "summary": ""
        },
        {
          "name": "parseVPath",
          "kind": "re-export",
          "signature": "parseVPath",
          "summary": ""
        },
        {
          "name": "pivotSpin",
          "kind": "re-export",
          "signature": "pivotSpin",
          "summary": ""
        },
        {
          "name": "primitiveColor",
          "kind": "re-export",
          "signature": "primitiveColor",
          "summary": ""
        },
        {
          "name": "principalAxes",
          "kind": "re-export",
          "signature": "principalAxes",
          "summary": ""
        },
        {
          "name": "releaseDrawables",
          "kind": "re-export",
          "signature": "releaseDrawables",
          "summary": ""
        },
        {
          "name": "releaseModelGpu",
          "kind": "re-export",
          "signature": "releaseModelGpu",
          "summary": ""
        },
        {
          "name": "resolveOrientation",
          "kind": "re-export",
          "signature": "resolveOrientation",
          "summary": ""
        },
        {
          "name": "restoreOriginal",
          "kind": "re-export",
          "signature": "restoreOriginal",
          "summary": ""
        },
        {
          "name": "rollAngle",
          "kind": "re-export",
          "signature": "rollAngle",
          "summary": ""
        },
        {
          "name": "rotAxis",
          "kind": "re-export",
          "signature": "rotAxis",
          "summary": ""
        },
        {
          "name": "rotateVecByQuat",
          "kind": "re-export",
          "signature": "rotateVecByQuat",
          "summary": ""
        },
        {
          "name": "sniffMagic",
          "kind": "re-export",
          "signature": "sniffMagic",
          "summary": ""
        },
        {
          "name": "standardVertexLayout",
          "kind": "re-export",
          "signature": "standardVertexLayout",
          "summary": ""
        },
        {
          "name": "suspensionForce",
          "kind": "re-export",
          "signature": "suspensionForce",
          "summary": ""
        },
        {
          "name": "tireForce",
          "kind": "re-export",
          "signature": "tireForce",
          "summary": ""
        },
        {
          "name": "unitScaleToMeters",
          "kind": "re-export",
          "signature": "unitScaleToMeters",
          "summary": ""
        },
        {
          "name": "uploadModel",
          "kind": "re-export",
          "signature": "uploadModel",
          "summary": ""
        },
        {
          "name": "uploadModelTextures",
          "kind": "re-export",
          "signature": "uploadModelTextures",
          "summary": ""
        },
        {
          "name": "uploadPrimitive",
          "kind": "re-export",
          "signature": "uploadPrimitive",
          "summary": ""
        },
        {
          "name": "vehicleComposeTRS",
          "kind": "re-export",
          "signature": "vehicleComposeTRS",
          "summary": ""
        },
        {
          "name": "vehicleTransformPoint",
          "kind": "re-export",
          "signature": "vehicleTransformPoint",
          "summary": ""
        },
        {
          "name": "visualWheelMatrix",
          "kind": "re-export",
          "signature": "visualWheelMatrix",
          "summary": ""
        },
        {
          "name": "vpathBasename",
          "kind": "re-export",
          "signature": "vpathBasename",
          "summary": ""
        },
        {
          "name": "vpathExtension",
          "kind": "re-export",
          "signature": "vpathExtension",
          "summary": ""
        },
        {
          "name": "withScheme",
          "kind": "re-export",
          "signature": "withScheme",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/EngineMaterial",
      "path": "engine/reference/assets/material/EngineMaterial.md",
      "source": "engine/assets/material/EngineMaterial.js",
      "import": "/engine/assets/material/EngineMaterial.js",
      "sourceHash": "5263a4543010e12caf42252671ca0f259cc28a9ed32ac3643a6e2c6303b0c729",
      "summary": "engine/assets/material/EngineMaterial.js — normalized material + texture binding schemas (spec §7). Materials are decoded, not guessed. Textures bind to surfaces (not loose images); UV sets, sampler wrap/filter, and texture transforms must survive import; packed channels are read exactly. The raw source material is always preserved on `.original` so the imported look stays recoverable even after engine normalization or shader-model approximation.",
      "exports": [
        {
          "name": "defaultChannelMap",
          "kind": "function",
          "signature": "defaultChannelMap(slot)",
          "summary": "glTF default packing: metallic=B, roughness=G, occlusion=R."
        },
        {
          "name": "createEngineMaterial",
          "kind": "function",
          "signature": "createEngineMaterial(init = {})",
          "summary": "Create a normalized engine material."
        },
        {
          "name": "createTextureBinding",
          "kind": "function",
          "signature": "createTextureBinding(init = {})",
          "summary": "Create a texture binding (a texture bound to a material slot on a surface)."
        },
        {
          "name": "hasTextureTransform",
          "kind": "function",
          "signature": "hasTextureTransform(binding)",
          "summary": "Has this binding a non-identity UV transform (KHR_texture_transform)?"
        },
        {
          "name": "WORKFLOW",
          "kind": "constant",
          "signature": "WORKFLOW",
          "summary": ""
        },
        {
          "name": "ALPHA_MODE",
          "kind": "constant",
          "signature": "ALPHA_MODE",
          "summary": ""
        },
        {
          "name": "TEXTURE_SLOTS",
          "kind": "constant",
          "signature": "TEXTURE_SLOTS",
          "summary": ""
        },
        {
          "name": "COLOR_SPACE",
          "kind": "constant",
          "signature": "COLOR_SPACE",
          "summary": ""
        },
        {
          "name": "TEXTURE_USAGE",
          "kind": "constant",
          "signature": "TEXTURE_USAGE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/MaterialImport",
      "path": "engine/reference/assets/material/MaterialImport.md",
      "source": "engine/assets/material/MaterialImport.js",
      "import": "/engine/assets/material/MaterialImport.js",
      "sourceHash": "da7e38b82758c500023db3f6794903b0966414587abe40c284879193041c1f18",
      "summary": "engine/assets/material/MaterialImport.js — decode source materials into the normalized EngineMaterial (spec §7). Materials are decoded exactly, never guessed: UV sets, sampler wrap/filter, and KHR_texture_transform survive; packed channels are read per the format (metadata wins over filename). The raw material is preserved on `.original` so the imported look stays recoverable.",
      "exports": [
        {
          "name": "importMaterials",
          "kind": "function",
          "signature": "importMaterials(model)",
          "summary": "Decode every material in a model into EngineMaterial in place. Idempotent: a material already carrying `.original` is left untouched."
        },
        {
          "name": "ALPHA_MODE",
          "kind": "re-export",
          "signature": "ALPHA_MODE",
          "summary": ""
        },
        {
          "name": "WORKFLOW",
          "kind": "re-export",
          "signature": "WORKFLOW",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/MaterialVariant",
      "path": "engine/reference/assets/material/MaterialVariant.md",
      "source": "engine/assets/material/MaterialVariant.js",
      "import": "/engine/assets/material/MaterialVariant.js",
      "sourceHash": "7afaca740fffc5347263d83dbe15e44a96075b1161ab797aea87e2db18e66bc8",
      "summary": "engine/assets/material/MaterialVariant.js — variants + shader-model fallback (spec §7). Imported materials won't always match the engine shader model, so we normalize into EngineMaterial, can generate a metallic-roughness fallback approximation when needed, and always keep the original recoverable. Variants (e.g. a re-tinted body panel) share the source material and only narrow/adjust.",
      "exports": [
        {
          "name": "createMaterialVariant",
          "kind": "function",
          "signature": "createMaterialVariant(base, overrides = {})",
          "summary": "Create a material variant that overrides a few fields of a base material while preserving the original (recoverable) and recording the variant lineage."
        },
        {
          "name": "approximateToMetallicRoughness",
          "kind": "function",
          "signature": "approximateToMetallicRoughness(material)",
          "summary": "Approximate a non-metallic-roughness material as metallic-roughness for the engine's PBR shader. The original is preserved so the imported look can always be restored. This is a deliberate, labelled approximation — not an exact port."
        },
        {
          "name": "restoreOriginal",
          "kind": "function",
          "signature": "restoreOriginal(material)",
          "summary": "Restore the original imported material descriptor (the raw source block)."
        },
        {
          "name": "COLOR_SPACE",
          "kind": "re-export",
          "signature": "COLOR_SPACE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/SegmentView",
      "path": "engine/reference/assets/material/SegmentView.md",
      "source": "engine/assets/material/SegmentView.js",
      "import": "/engine/assets/material/SegmentView.js",
      "sourceHash": "59cbce841d98a50317470dee357ebac013ec5ed1bd41acf8df4aa181150912f5",
      "summary": "engine/assets/material/SegmentView.js — non-destructive segmentation (spec §8).  We need modular breaking (swap tires, detach doors, tint glass, split a magazine) WITHOUT destroying the source. A SegmentView references original primitive ids / index ranges / materials — it never copies or rewrites geometry. A physical split is only baked later, on export or when a detachable part is actually created. This keeps skeletons, UVs, and morph targets intact.",
      "exports": [
        {
          "name": "createSegmentView",
          "kind": "function",
          "signature": "createSegmentView(model, mode = SEGMENT_MODE.MATERIAL)",
          "summary": "Create a non-destructive segment view of a model."
        },
        {
          "name": "bakeSegment",
          "kind": "function",
          "signature": "bakeSegment(model, segmentView, segmentKey)",
          "summary": "Bake a single segment into a standalone EngineModel-like payload (only when a detachable part is actually needed — e.g. export). Geometry is copied here, the source model is left untouched."
        },
        {
          "name": "SEGMENT_MODE",
          "kind": "constant",
          "signature": "SEGMENT_MODE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/SurfaceBinding",
      "path": "engine/reference/assets/material/SurfaceBinding.md",
      "source": "engine/assets/material/SurfaceBinding.js",
      "import": "/engine/assets/material/SurfaceBinding.js",
      "sourceHash": "8ec083e0428da712dafe8880c3bd63a03e1f76acb70d34b05d1424212db7feb4",
      "summary": "engine/assets/material/SurfaceBinding.js — bind materials to surfaces (spec §7).  Material assignment happens at the primitive/submesh level, not per-image. A SurfaceBinding records exactly which node/mesh/primitive a material covers, which UV set it uses, and (when known) the semantic part — so segmentation and editing can target real surfaces and bindings survive non-destructive splits.",
      "exports": [
        {
          "name": "buildSurfaceBindings",
          "kind": "function",
          "signature": "buildSurfaceBindings(model)",
          "summary": "Build surface bindings for a model (material ↔ primitive). Populates model.surfaceBindings and returns them."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/TextureImport",
      "path": "engine/reference/assets/material/TextureImport.md",
      "source": "engine/assets/material/TextureImport.js",
      "import": "/engine/assets/material/TextureImport.js",
      "sourceHash": "69b4d12fac4a38ef129660fef6d7f2eab09611c7f10ca8102fc9cd01cbc6b544",
      "summary": "engine/assets/material/TextureImport.js — normalize textures + decode pixels (spec §7). A texture's colour space and usage are inferred from the material slots that bind it (sRGB for colour/emissive, linear for data/normal/ORM), so the same image used as colour vs data is handled correctly. Pixel decode is a separate, browser-only step (createImageBitmap) kept out of parsing. KTX2/ Basis stay compressed here and are routed by TextureManager to the existing native upload or registered decoder/transcoder hook path.",
      "exports": [
        {
          "name": "normalizeTextures",
          "kind": "function",
          "signature": "normalizeTextures(model)",
          "summary": "Infer per-texture colour space + usage from the decoded material bindings, and normalize model.textures into self-describing EngineTexture records. Requires importMaterials() to have run first (so bindings exist)."
        },
        {
          "name": "decodeTexture",
          "kind": "function",
          "signature": "async decodeTexture(tex)",
          "summary": "Decode a normalized texture's pixels to an ImageBitmap (browser only). Returns the bitmap (also cached on the texture) or null when undecodable (no bytes, external uri, or a compressed format with no transcoder)."
        },
        {
          "name": "decodeAllTextures",
          "kind": "function",
          "signature": "async decodeAllTextures(model)",
          "summary": "Decode every decodable texture in a model. Returns the count decoded."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/composite/CompositeMaterialContracts",
      "path": "engine/reference/assets/material/composite/CompositeMaterialContracts.md",
      "source": "engine/assets/material/composite/CompositeMaterialContracts.js",
      "import": "/engine/assets/material/composite/CompositeMaterialContracts.js",
      "sourceHash": "76f00592a36bbf5ad2ac8534c0489ff44bd96f0f7bcd26817281bfacd381b0ea",
      "summary": "Strict, app-neutral contracts for immutable composite material data.",
      "exports": [
        {
          "name": "isPlainCompositeMaterialObject",
          "kind": "function",
          "signature": "isPlainCompositeMaterialObject(value)",
          "summary": ""
        },
        {
          "name": "validateCompositeMaterialFacets",
          "kind": "function",
          "signature": "validateCompositeMaterialFacets(value, path = '$.facets')",
          "summary": ""
        },
        {
          "name": "validateCompositeMaterialProvenance",
          "kind": "function",
          "signature": "validateCompositeMaterialProvenance({ facets, sources, fieldSources }, path = '$')",
          "summary": ""
        },
        {
          "name": "validateEngineCompositeMaterialResource",
          "kind": "function",
          "signature": "validateEngineCompositeMaterialResource(value, path = '$')",
          "summary": "Validate a complete built-in catalog resource. Returns the input unchanged."
        },
        {
          "name": "ENGINE_COMPOSITE_MATERIAL_SCHEMA",
          "kind": "constant",
          "signature": "ENGINE_COMPOSITE_MATERIAL_SCHEMA",
          "summary": ""
        },
        {
          "name": "ENGINE_COMPOSITE_MATERIAL_VERSION",
          "kind": "constant",
          "signature": "ENGINE_COMPOSITE_MATERIAL_VERSION",
          "summary": ""
        },
        {
          "name": "COMPOSITE_MATERIAL_FACETS",
          "kind": "constant",
          "signature": "COMPOSITE_MATERIAL_FACETS",
          "summary": ""
        },
        {
          "name": "COMPOSITE_MATERIAL_FACET_FIELDS",
          "kind": "constant",
          "signature": "COMPOSITE_MATERIAL_FACET_FIELDS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/composite/EngineCompositeMaterialCatalog",
      "path": "engine/reference/assets/material/composite/EngineCompositeMaterialCatalog.md",
      "source": "engine/assets/material/composite/EngineCompositeMaterialCatalog.js",
      "import": "/engine/assets/material/composite/EngineCompositeMaterialCatalog.js",
      "sourceHash": "6f53168c9843e015d4bfdd7fefe369109990f9b40187e0a20a867b5caf53202f",
      "summary": "Browser-native JSON loader. Callers may inject an equivalent fetch boundary.",
      "exports": [
        {
          "name": "EngineCompositeMaterialCatalog",
          "kind": "class",
          "signature": "class EngineCompositeMaterialCatalog",
          "summary": ""
        },
        {
          "name": "loadEngineCompositeMaterialCatalog",
          "kind": "function",
          "signature": "async loadEngineCompositeMaterialCatalog({ fetchImpl = globalThis.fetch, urls = ENGINE_COMPOSITE_MATERIAL_RESOURCE_URLS, } = {})",
          "summary": "Browser-native JSON loader. Callers may inject an equivalent fetch boundary."
        },
        {
          "name": "ENGINE_COMPOSITE_MATERIAL_RESOURCE_URLS",
          "kind": "constant",
          "signature": "ENGINE_COMPOSITE_MATERIAL_RESOURCE_URLS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/material/composite/index",
      "path": "engine/reference/assets/material/composite/index.md",
      "source": "engine/assets/material/composite/index.js",
      "import": "/engine/assets/material/composite/index.js",
      "sourceHash": "2ceda7202ea6cdeadd439ee7f876432743481f80d5633533339ed0e0e9b34c8a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/render/ModelGpu",
      "path": "engine/reference/assets/render/ModelGpu.md",
      "source": "engine/assets/render/ModelGpu.js",
      "import": "/engine/assets/render/ModelGpu.js",
      "sourceHash": "44186713557f036c993cb9325b5a3461167457943f8d587cd3c06390fdd0e74e",
      "summary": "engine/assets/render/ModelGpu.js — reusable GPU-side helpers to turn an uploaded EngineModel into drawable items. Small, composable, and shared by the importer/viewer, the editor, and the runtime so nobody re-implements texture upload, per-primitive bind groups, world-matrix flattening, or bounds framing.  Pairs with ModelShader (uniform block) and GpuUploader (vertex layout). Pure data in → GPU objects out; callers own the render pass and camera.",
      "exports": [
        {
          "name": "createDefaultSampler",
          "kind": "function",
          "signature": "createDefaultSampler(device)",
          "summary": "A linear, repeating sampler — a sane default for model albedo."
        },
        {
          "name": "createWhiteTexture",
          "kind": "function",
          "signature": "createWhiteTexture(device)",
          "summary": "A 1×1 white texture so untextured primitives sample white (albedo = color)."
        },
        {
          "name": "makeGpuTexture",
          "kind": "function",
          "signature": "makeGpuTexture(device, bitmap, srgb)",
          "summary": "Upload one decoded bitmap to a GPU texture (sRGB for colour, linear for data)."
        },
        {
          "name": "uploadModelTextures",
          "kind": "function",
          "signature": "async uploadModelTextures(device, model)",
          "summary": "Decode + upload every embedded texture in a model."
        },
        {
          "name": "primitiveColor",
          "kind": "function",
          "signature": "primitiveColor(model, prim)",
          "summary": "Deterministic fallback colour for a primitive lacking a baseColorFactor."
        },
        {
          "name": "buildModelDrawables",
          "kind": "function",
          "signature": "buildModelDrawables(device, model, opts)",
          "summary": "Build drawable items for an uploaded model: one per primitive, each with its world draw matrix, uniform buffer, bind group, fallback colour, and (optional) wheel-spin descriptor keyed by node id."
        },
        {
          "name": "bakeSkinnedMeshes",
          "kind": "function",
          "signature": "bakeSkinnedMeshes(model)",
          "summary": "CPU-skin every skinned mesh to its DEFAULT pose so the static viewer draws the mesh wrapped around the node-hierarchy skeleton (per the glTF rule that a skinned mesh's own node transform is ignored). For each skinned vertex: v' = Σ wⱼ · (jointNodeWorld(j) · inverseBindMatrix(j)) · v   (scene space) Positions/normals are replaced in place (original kept on `_bindPosition`) and the primitive is flagged `_skinnedBaked`. No-op without skins/IBMs. GPU-free."
        },
        {
          "name": "releaseDrawables",
          "kind": "function",
          "signature": "releaseDrawables(items)",
          "summary": "Free per-item uniform buffers built by buildModelDrawables."
        },
        {
          "name": "frameBounds",
          "kind": "function",
          "signature": "frameBounds(items)",
          "summary": "World-space bounds of a set of drawables, for camera framing."
        },
        {
          "name": "importMatrixOf",
          "kind": "function",
          "signature": "importMatrixOf(model)",
          "summary": "Compose the standard import-correction matrix from a model's importTransform."
        },
        {
          "name": "nodeLocalMatrix",
          "kind": "re-export",
          "signature": "nodeLocalMatrix",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/render/ModelRenderer",
      "path": "engine/reference/assets/render/ModelRenderer.md",
      "source": "engine/assets/render/ModelRenderer.js",
      "import": "/engine/assets/render/ModelRenderer.js",
      "sourceHash": "c6a36dd5b5da0e229d6e60e1e4b8f1c70c3130a51aeb0a2f8b098418e9445f29",
      "summary": "engine/assets/render/ModelRenderer.js — the batteries-included way to draw an EngineModel. It composes the small render modules (ModelShader + ModelGpu) and the vehicle wheel-spin helper, applying sensible DEFAULTS so any engine system can go from \"I have an EngineModel\" to \"it's on screen\" in two calls:  const r = createModelRenderer(device, { format }); await r.setModel(model, { wheelSpin: true, rig });   // upload + drawables per frame: r.render(pass, { mvp, eye, distance });  The caller still owns the render pass + camera (so it slots into any pipeline); the renderer owns the model's GPU lifetime and offers a depth-texture + camera- framing convenience. Override the shader/format/cull via opts when needed.",
      "exports": [
        {
          "name": "createModelRenderer",
          "kind": "function",
          "signature": "createModelRenderer(device, opts = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/render/ModelShader",
      "path": "engine/reference/assets/render/ModelShader.md",
      "source": "engine/assets/render/ModelShader.js",
      "import": "/engine/assets/render/ModelShader.js",
      "sourceHash": "b1420623bb52cc09c9245fb726251b7f616554f3d45f9032474717a8cc637a36",
      "summary": "engine/assets/render/ModelShader.js — the default lit WGSL shader + pipeline for drawing an EngineModel's standard-layout primitives. Small and overridable: any engine system can grab LIT_MODEL_SHADER for a sensible default, or pass its own WGSL to createModelPipeline. The shader pairs with standardVertexLayout() (pos3 + nrm3 + uv2) and the 160-byte uniform block written by ModelGpu.",
      "exports": [
        {
          "name": "createModelPipeline",
          "kind": "function",
          "signature": "createModelPipeline(device, opts = {})",
          "summary": "Build the render pipeline for EngineModel primitives."
        },
        {
          "name": "MODEL_UNIFORM_BYTES",
          "kind": "constant",
          "signature": "MODEL_UNIFORM_BYTES",
          "summary": ""
        },
        {
          "name": "MODEL_UNIFORM_FLOATS",
          "kind": "constant",
          "signature": "MODEL_UNIFORM_FLOATS",
          "summary": ""
        },
        {
          "name": "LIT_MODEL_SHADER",
          "kind": "constant",
          "signature": "LIT_MODEL_SHADER",
          "summary": "A neutral physically-plausible lit shader with albedo floor + additive rim."
        },
        {
          "name": "SCULPTURE_COURT_MODEL_SHADER",
          "kind": "constant",
          "signature": "SCULPTURE_COURT_MODEL_SHADER",
          "summary": "Gallery raster lighting derived from the Astral Sculpture Court studies: warm broad key, restrained green-cyan fill, cool portal rim, park/studio environment response, Khronos PBR Neutral, and stable one-LSB dithering. It deliberately preserves the default renderer bind/uniform contract."
        },
        {
          "name": "SCULPTURE_COURT_BACKDROP_SHADER",
          "kind": "constant",
          "signature": "SCULPTURE_COURT_BACKDROP_SHADER",
          "summary": "Full-screen gallery/park environment paired with the sculpture shader."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/BodyTemplateExport",
      "path": "engine/reference/assets/rig/BodyTemplateExport.md",
      "source": "engine/assets/rig/BodyTemplateExport.js",
      "import": "/engine/assets/rig/BodyTemplateExport.js",
      "sourceHash": "1d06fcadb655308eef0a6e35413bc074674226b481d6d412aa8888696d8cc96e",
      "summary": "engine/assets/rig/BodyTemplateExport.js — turn a generated `CharacterPhysicsAsset` into a starting-point `life.body.v1`-shaped body template JSON (the schema `Life/data/bodies/*.json` + `engine/assets/rig/active-body/BodyAssembler.js` consume).  This mirrors how every mainstream engine handles the generated-vs-hand-authored split (Unreal's Physics Asset auto-generate, Unity's Ragdoll Wizard, Godot's \"Create Physical Skeleton\"): the generator produces a complete, valid STARTING POINT for skeleton/joint/collision structure — never silently re-applied over hand-tuned data afterward. A dev generates this once for a new creature/character variant, saves it as a plain JSON file, and hand-tunes gameplay-only concerns on top (anatomy/organs, ligaments, muscle model, strength/mass presets) that have no generator and are intentionally hand-authored. This is the \"easy for devs to achieve anything\" on-ramp: zero-authoring skeleton for a new body, full hand-tuning power afterward.",
      "exports": [
        {
          "name": "characterPhysicsAssetToBodyTemplate",
          "kind": "function",
          "signature": "characterPhysicsAssetToBodyTemplate(asset, opts = {})",
          "summary": "Convert a `CharacterPhysicsAsset` (from `createCharacterPhysicsAsset()`) into a `life.body.v1` body template — a ready-to-save JSON starting point for a new creature/character variant. Only the skeleton/joint/collision structure is generated; `anatomy`/`ligaments`/`muscleModel`/`presets` are left as explicit, clearly-commented empty stubs since no generator authors those — every mainstream engine's ragdoll generator stops at the same boundary."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/CharacterPhysicsAsset",
      "path": "engine/reference/assets/rig/CharacterPhysicsAsset.md",
      "source": "engine/assets/rig/CharacterPhysicsAsset.js",
      "import": "/engine/assets/rig/CharacterPhysicsAsset.js",
      "sourceHash": "4ed8411eaa0e53054ff4c5471d47644968e21da0eb4e4a556dfb0d2228c66ccf",
      "summary": "engine/assets/rig/CharacterPhysicsAsset.js — the single generated packaging layer for a character's physics structure. This is NOT a new generator: it wraps `buildRagdoll()` (RagdollBuilder.js) + `buildJointLimits()` (JointLimits.js) and repackages their output into one serializable schema that every consumer (ActiveRigController/PhysX, RagdollSim, RagdollSkinning, Life's BodyAssembler, RealmForge's compilers, legacy PBDRagdoll wrapper) can read instead of inventing its own bone/joint shape. GPU-free + deterministic.  Schema fields: skeletonFingerprint, boneMap, bodyDefs, jointDefs, jointLimits, massProfile, collisionFilters, driveProfiles, skinningOffsets, particleCageDef (reserved for the future flesh-cage system), validationReport.",
      "exports": [
        {
          "name": "computeSkeletonFingerprint",
          "kind": "function",
          "signature": "computeSkeletonFingerprint(bodyDefs)",
          "summary": "Stable fingerprint for a bone topology — same skeleton shape (names + parent links, order-independent per bone but position-stable) hashes the same way twice. Used to detect when a cached CharacterPhysicsAsset can be reused vs. must be rebuilt."
        },
        {
          "name": "createCharacterPhysicsAsset",
          "kind": "function",
          "signature": "createCharacterPhysicsAsset(model, opts = {})",
          "summary": "Build a `CharacterPhysicsAsset` for a model. Humanoid path when a humanoid rig is present, otherwise generic topology — identical branch selection to `buildRagdoll()`, which this function delegates to."
        },
        {
          "name": "validateCharacterPhysicsAsset",
          "kind": "function",
          "signature": "validateCharacterPhysicsAsset(asset)",
          "summary": "Validate a CharacterPhysicsAsset's internal consistency (indices resolve, joint types known, mass/limit values finite). Follows the same `{ ok, errors, warnings, counts }` pattern as Life's `BodySpecValidator.js`, adapted to this schema's shape."
        },
        {
          "name": "CHARACTER_PHYSICS_ASSET_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "CHARACTER_PHYSICS_ASSET_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "inferDriveType",
          "kind": "re-export",
          "signature": "inferDriveType",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/JointLimits",
      "path": "engine/reference/assets/rig/JointLimits.md",
      "source": "engine/assets/rig/JointLimits.js",
      "import": "/engine/assets/rig/JointLimits.js",
      "sourceHash": "819bd4dca674bea5ddf92ad8d79541ce11cac04ec5c02ed31ff5cefc0d03f49f",
      "summary": "engine/assets/rig/JointLimits.js — automatically derive per-joint movement limits (range of motion) from a model, the way Life's BodyAssembler does it: every joint gets a TYPE (ball / hinge / saddle / twist / root) plus a swing cone + twist limit (degrees → radians), and hinge joints get a bend AXIS taken from the bind-pose geometry (perpendicular to the parent→joint→child bend plane). Two paths: • humanoid — role-based anatomical profile keyed by canonical bone slots. • generic  — topology inference (children count + segment straightness) so spiders, dogs, cats, birds, etc. get sensible limits with no template: hub/limb-root joints → ball, straight mid-limb segments → hinge, leaves → fixed. GPU-free + deterministic → gate-testable.",
      "exports": [
        {
          "name": "hingeAxis",
          "kind": "function",
          "signature": "hingeAxis(parentPos, jointPos, childPos)",
          "summary": "Hinge bend axis = normal of the parent→joint→child plane (the axis a knee/elbow actually bends about). Falls back to a perpendicular of the bone direction."
        },
        {
          "name": "deriveJointType",
          "kind": "function",
          "signature": "deriveJointType(prof)",
          "summary": "Joint type carried by an anatomical profile (ball/hinge/saddle/twist/root)."
        },
        {
          "name": "deriveSwingCone",
          "kind": "function",
          "signature": "deriveSwingCone(prof)",
          "summary": "Swing-cone half-angle (degrees) carried by a profile."
        },
        {
          "name": "deriveHingeLimit",
          "kind": "function",
          "signature": "deriveHingeLimit(prof)",
          "summary": "Hinge bend-range (degrees). By Life's hinge convention this value is carried in the profile's `twist` field (a hinge drives one axis), so this is semantically distinct from `deriveTwistLimit` even though both read the same underlying number for a hinge profile."
        },
        {
          "name": "deriveTwistLimit",
          "kind": "function",
          "signature": "deriveTwistLimit(prof)",
          "summary": "Twist limit (degrees) for a non-hinge (ball/saddle/twist) profile."
        },
        {
          "name": "mirrorLeftRightLimits",
          "kind": "function",
          "signature": "mirrorLeftRightLimits(leftLimit, rightLimit)",
          "summary": "Verify (and defensively enforce) left/right symmetry between two derived limits — swing/twist degrees must match (anatomy is bilaterally symmetric); axes are expected to differ (mirrored bind-pose geometry) and are left untouched. Explicit, testable version of the symmetry `profileFor()` already guarantees implicitly by stripping the left/right prefix before profile lookup."
        },
        {
          "name": "inferDriveType",
          "kind": "function",
          "signature": "inferDriveType(name = '')",
          "summary": "Infer a coarse drive role (neck/shoulder/elbow/wrist/spineUpper/pelvis/hip/ knee/ankle/toe/default) from a bone/slot name via string matching. Shared so RagdollBuilder, CharacterPhysicsAsset, and future adapters don't each reimplement this heuristic independently."
        },
        {
          "name": "deriveHumanoidJointLimits",
          "kind": "function",
          "signature": "deriveHumanoidJointLimits(model, pose)",
          "summary": "Derive joint limits for a humanoid rig."
        },
        {
          "name": "deriveSkeletonJointLimits",
          "kind": "function",
          "signature": "deriveSkeletonJointLimits(model, pose)",
          "summary": "Derive joint limits for ANY skeleton by topology + geometry (spiders, dogs, cats, birds…). No names required."
        },
        {
          "name": "validJointTypeSet",
          "kind": "function",
          "signature": "validJointTypeSet()",
          "summary": "The set of valid joint-type strings (`root`/`ball`/`hinge`/`saddle`/`twist`/ `fixed`) as a `Set`, for membership checks — single source of truth so a validator never hand-declares its own copy that can silently drift from `JOINT_TYPE` (this is exactly how `CharacterPhysicsAsset.js` and Life's `BodySpecValidator.js` used to each keep their own disconnected copy)."
        },
        {
          "name": "validateBoneTopology",
          "kind": "function",
          "signature": "validateBoneTopology(bones)",
          "summary": "Shared bone-topology structural validation — the literally-duplicated core every ragdoll/body validator needs (bone id uniqueness, parent-reference resolution), extracted once so `CharacterPhysicsAsset.validateCharacterPhysicsAsset` and Life's `BodySpecValidator.validateBodyTemplate` can never silently drift apart on these checks again. Each caller still owns its own shape-specific checks (mass/position for CharacterPhysicsAsset; anatomy/ligaments/skeleton extensions for Life)."
        },
        {
          "name": "countTypes",
          "kind": "function",
          "signature": "countTypes(limits)",
          "summary": "Count joint types in a limit map (for inspectors/gates)."
        },
        {
          "name": "buildJointLimits",
          "kind": "function",
          "signature": "buildJointLimits(model, opts = {})",
          "summary": "Auto-derive and attach joint limits to a model. Humanoid path when a humanoid rig is present, otherwise generic topology inference."
        },
        {
          "name": "JOINT_TYPE",
          "kind": "constant",
          "signature": "JOINT_TYPE",
          "summary": ""
        },
        {
          "name": "deriveBendDirection",
          "kind": "constant",
          "signature": "deriveBendDirection",
          "summary": "Alias for `hingeAxis` — the joint bend-direction deriver, named for the generic \"derive*\" family used by RagdollBuilder/CharacterPhysicsAsset."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/RagdollBuilder",
      "path": "engine/reference/assets/rig/RagdollBuilder.md",
      "source": "engine/assets/rig/RagdollBuilder.js",
      "import": "/engine/assets/rig/RagdollBuilder.js",
      "sourceHash": "3219bdafb093ddd462650abca51bc7748628095090a714c9b82280a633174cbc",
      "summary": "engine/assets/rig/RagdollBuilder.js — turn a detected skeleton + auto-derived joint limits into a RAGDOLL descriptor: one capsule body per bone (sized from the bone length, mass from its volume) plus a constrained joint to its parent using the JointLimits type + swing/twist + bend axis. Pure data (no physics engine here) so it can drive `sim/physics/PBDRagdoll` / articulations or the editor's ragdoll. Works for humanoids (canonical bones, incl. healed ones) and for any creature via generic topology. GPU-free + deterministic.",
      "exports": [
        {
          "name": "radiusRatio",
          "kind": "function",
          "signature": "radiusRatio(slot)",
          "summary": ""
        },
        {
          "name": "buildHumanoidRagdoll",
          "kind": "function",
          "signature": "buildHumanoidRagdoll(model, rig, pose, opts = {})",
          "summary": "Build a ragdoll from a humanoid rig (canonical bones, including healed ones)."
        },
        {
          "name": "buildGenericRagdoll",
          "kind": "function",
          "signature": "buildGenericRagdoll(model, pose, opts = {})",
          "summary": "Build a ragdoll from any skeleton by generic topology (spiders, dogs, …)."
        },
        {
          "name": "buildRagdoll",
          "kind": "function",
          "signature": "buildRagdoll(model, opts = {})",
          "summary": "Build a ragdoll for a model and attach it at model.rigs.ragdoll. Humanoid path when a humanoid rig is present, otherwise generic topology."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/RagdollSim",
      "path": "engine/reference/assets/rig/RagdollSim.md",
      "source": "engine/assets/rig/RagdollSim.js",
      "import": "/engine/assets/rig/RagdollSim.js",
      "sourceHash": "ba132a2e83b14009e3b87c7ed76badd6e5235926dab036135d4fe07990219f54",
      "summary": "engine/assets/rig/RagdollSim.js — a tiny, GENERIC Verlet/PBD ragdoll runtime that simulates ANY ragdoll descriptor from RagdollBuilder (humanoid, creature, healed/mirrored limbs). Each bone joint is a particle; each bone is a distance constraint to its parent (Jakobsen \"Advanced Character Physics\"). Gravity + ground + a few constraint iterations give a stable, believable flop with no dependency on a fixed humanoid template. Pure JS / deterministic / GPU-free.",
      "exports": [
        {
          "name": "createRagdollSim",
          "kind": "function",
          "signature": "createRagdollSim(ragdoll, opts = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/RagdollSkinning",
      "path": "engine/reference/assets/rig/RagdollSkinning.md",
      "source": "engine/assets/rig/RagdollSkinning.js",
      "import": "/engine/assets/rig/RagdollSkinning.js",
      "sourceHash": "9be76ff7d4c494127670641cef62879a6e58a2c8df98363482c8bb5b370af5fe",
      "summary": "engine/assets/rig/RagdollSkinning.js — make the live MESH follow a ragdoll.  The ragdoll sim (RagdollSim) only moves joint POSITIONS. To deform the skinned mesh with it we need a per-joint world transform. We build a ragdoll over the model's actual SKIN JOINTS (1:1 with the skin's joint slots, so vertex skin weights index straight into it) and, each frame, derive a per-bone rotation from the rest→current bone direction. Skinning is then the standard linear blend in SCENE space (the renderer applies importMatrix afterwards):  v' = Σ wⱼ · ( Rⱼ · (v − bindPosⱼ) + curPosⱼ )  At the bind pose Rⱼ=I and curPos=bindPos, so v'=v (the baked mesh). This needs no inverse-bind matrices because jointBindWorld·IBM = I per joint. Pure JS.",
      "exports": [
        {
          "name": "buildSkinnedRagdoll",
          "kind": "function",
          "signature": "buildSkinnedRagdoll(model, opts = {})",
          "summary": "Build a ragdoll over a model's skin joints (1:1 with skin slot indices) and a sim for it. Joint limits come from the humanoid rig where mapped, else generic topology. Returns null when the model has no skin to drive."
        },
        {
          "name": "ragdollBoneFrames",
          "kind": "function",
          "signature": "ragdollBoneFrames(state)",
          "summary": "Per-bone frames for the current sim state: rotation (3×3 row-major), current position, and bind position. Bones with no child inherit their parent's rotation (so leaf verts swing with the limb)."
        },
        {
          "name": "skinPrimitiveInterleaved",
          "kind": "function",
          "signature": "skinPrimitiveInterleaved(prim, frames, jointCount, outInterleaved)",
          "summary": "Linear-blend skin a primitive into a standard interleaved [pos3,nrm3,uv2] buffer (UVs at o+6/o+7 are left untouched). Writes scene-space positions so the renderer's importMatrix lands them correctly. Mutates + returns `outInterleaved`."
        },
        {
          "name": "logSkinnedRagdoll",
          "kind": "function",
          "signature": "logSkinnedRagdoll(state, logFn)",
          "summary": "One-time STATIC report of a built ragdoll: every joint's type + auto-detected limits, and the full constraint breakdown (bone sticks, hub bracing, ROM, signed hinges, swing cones). Prints rich console.tables when available; always returns a one-line summary string (also handed to `logFn` for the in-app console)."
        },
        {
          "name": "ragdollDebugStats",
          "kind": "function",
          "signature": "ragdollDebugStats(state)",
          "summary": "LIVE per-frame measurement: each hinge's current bend, each cone's current swing, and each ROM constraint's grandparent distance — all vs their limits, with an `ok` flag. Use it to PROVE the limits hold during simulation (and to spot violations)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/ActiveBodyFallbackReport",
      "path": "engine/reference/assets/rig/active-body/ActiveBodyFallbackReport.md",
      "source": "engine/assets/rig/active-body/ActiveBodyFallbackReport.js",
      "import": "/engine/assets/rig/active-body/ActiveBodyFallbackReport.js",
      "sourceHash": "ef39b05df9c3da010ba3d8e74cda5a24939a294606394fbb186a14c62b6d3f75",
      "summary": "",
      "exports": [
        {
          "name": "getActiveBodyFallbackReport",
          "kind": "function",
          "signature": "getActiveBodyFallbackReport(gpu = null)",
          "summary": ""
        },
        {
          "name": "isActiveBodyFallbackReportOk",
          "kind": "function",
          "signature": "isActiveBodyFallbackReportOk(report)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/ActiveBodyPerformanceBudgets",
      "path": "engine/reference/assets/rig/active-body/ActiveBodyPerformanceBudgets.md",
      "source": "engine/assets/rig/active-body/ActiveBodyPerformanceBudgets.js",
      "import": "/engine/assets/rig/active-body/ActiveBodyPerformanceBudgets.js",
      "sourceHash": "3a407693a4d638e03264838e2dc1dff7f408b90033a6b84862168604789c078e",
      "summary": "",
      "exports": [
        {
          "name": "getActiveBodyPerformanceBudgetReport",
          "kind": "function",
          "signature": "getActiveBodyPerformanceBudgetReport(bodyCount = 0, measurements = {})",
          "summary": ""
        },
        {
          "name": "ACTIVE_BODY_PERFORMANCE_BUDGETS",
          "kind": "constant",
          "signature": "ACTIVE_BODY_PERFORMANCE_BUDGETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/ActiveBodyRigBuilder",
      "path": "engine/reference/assets/rig/active-body/ActiveBodyRigBuilder.md",
      "source": "engine/assets/rig/active-body/ActiveBodyRigBuilder.js",
      "import": "/engine/assets/rig/active-body/ActiveBodyRigBuilder.js",
      "sourceHash": "351fc559a428de447b5d1fe7be25cbec2ddd29e6c502602571a5547ce2cd682c",
      "summary": "HumanoidRigBuilder — Builds a physics-ready humanoid rig (skeleton, bodies, joints, mass profile, drive profile) from entity phenotype data. Produces a StickmanRagdoll-compatible component that ActiveBodySystem can spawn as a PhysX articulation via the engine's ActiveRigController. Moved from editor/people-preview/PeoplePhenotypeRig.js into the game simulation layer so any game entity can have an active body.",
      "exports": [
        {
          "name": "buildHumanoidRig",
          "kind": "function",
          "signature": "buildHumanoidRig(config)",
          "summary": "Build a complete humanoid rig from entity data."
        },
        {
          "name": "buildActiveBodyPayload",
          "kind": "function",
          "signature": "buildActiveBodyPayload(config, worldPosition = [0, 0, 0])",
          "summary": "Build a spawn-ready payload for ActiveBodySystem."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/ActiveBodySimulationTiers",
      "path": "engine/reference/assets/rig/active-body/ActiveBodySimulationTiers.md",
      "source": "engine/assets/rig/active-body/ActiveBodySimulationTiers.js",
      "import": "/engine/assets/rig/active-body/ActiveBodySimulationTiers.js",
      "sourceHash": "72bfa79a52952a11c5945d8777811a8e8b218c34ae09d8dbf4885400d96d1b76",
      "summary": "",
      "exports": [
        {
          "name": "classifyActiveBodySimulationTier",
          "kind": "function",
          "signature": "classifyActiveBodySimulationTier(input = {})",
          "summary": ""
        },
        {
          "name": "buildActiveBodySimulationTierReport",
          "kind": "function",
          "signature": "buildActiveBodySimulationTierReport(bodies = [], observer = {})",
          "summary": ""
        },
        {
          "name": "estimateActiveBodyImportance",
          "kind": "function",
          "signature": "estimateActiveBodyImportance(body = {})",
          "summary": ""
        },
        {
          "name": "ACTIVE_BODY_SIMULATION_TIERS",
          "kind": "constant",
          "signature": "ACTIVE_BODY_SIMULATION_TIERS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/ActiveBodySystem",
      "path": "engine/reference/assets/rig/active-body/ActiveBodySystem.md",
      "source": "engine/assets/rig/active-body/ActiveBodySystem.js",
      "import": "/engine/assets/rig/active-body/ActiveBodySystem.js",
      "sourceHash": "dc2f6aafc210a72158a2ffd494413d8d619d31907bc92d48cdcf51784100bfd3",
      "summary": "",
      "exports": [
        {
          "name": "ActiveBodySystem",
          "kind": "class",
          "signature": "class ActiveBodySystem",
          "summary": ""
        },
        {
          "name": "BONE_NAMES",
          "kind": "re-export",
          "signature": "BONE_NAMES",
          "summary": ""
        },
        {
          "name": "buildDirectionDiagnostics",
          "kind": "re-export",
          "signature": "buildDirectionDiagnostics",
          "summary": ""
        },
        {
          "name": "clamp01",
          "kind": "re-export",
          "signature": "clamp01",
          "summary": ""
        },
        {
          "name": "clampSigned",
          "kind": "re-export",
          "signature": "clampSigned",
          "summary": ""
        },
        {
          "name": "computeSignedAngleOnHorizontal",
          "kind": "re-export",
          "signature": "computeSignedAngleOnHorizontal",
          "summary": ""
        },
        {
          "name": "copyFunctionalSensorAnchor",
          "kind": "re-export",
          "signature": "copyFunctionalSensorAnchor",
          "summary": ""
        },
        {
          "name": "estimateAverageFatigue",
          "kind": "re-export",
          "signature": "estimateAverageFatigue",
          "summary": ""
        },
        {
          "name": "groundYFromFoot",
          "kind": "re-export",
          "signature": "groundYFromFoot",
          "summary": ""
        },
        {
          "name": "makeBalanceState",
          "kind": "re-export",
          "signature": "makeBalanceState",
          "summary": ""
        },
        {
          "name": "normalizePhase01",
          "kind": "re-export",
          "signature": "normalizePhase01",
          "summary": ""
        },
        {
          "name": "normalizeRadians",
          "kind": "re-export",
          "signature": "normalizeRadians",
          "summary": ""
        },
        {
          "name": "organStatusColor",
          "kind": "re-export",
          "signature": "organStatusColor",
          "summary": ""
        },
        {
          "name": "percentSignal",
          "kind": "re-export",
          "signature": "percentSignal",
          "summary": ""
        },
        {
          "name": "radiansToDebugDegrees",
          "kind": "re-export",
          "signature": "radiansToDebugDegrees",
          "summary": ""
        },
        {
          "name": "resolveFunctionalSensorAnchors",
          "kind": "re-export",
          "signature": "resolveFunctionalSensorAnchors",
          "summary": ""
        },
        {
          "name": "round4",
          "kind": "re-export",
          "signature": "round4",
          "summary": ""
        },
        {
          "name": "setParticleVelocity",
          "kind": "re-export",
          "signature": "setParticleVelocity",
          "summary": ""
        },
        {
          "name": "signedAngularDelta",
          "kind": "re-export",
          "signature": "signedAngularDelta",
          "summary": ""
        },
        {
          "name": "slewRadians",
          "kind": "re-export",
          "signature": "slewRadians",
          "summary": ""
        },
        {
          "name": "supportCenter",
          "kind": "re-export",
          "signature": "supportCenter",
          "summary": ""
        },
        {
          "name": "unitSignal",
          "kind": "re-export",
          "signature": "unitSignal",
          "summary": ""
        },
        {
          "name": "unitSignalDefault",
          "kind": "re-export",
          "signature": "unitSignalDefault",
          "summary": ""
        },
        {
          "name": "yawDeg",
          "kind": "re-export",
          "signature": "yawDeg",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/AnimalLocomotion",
      "path": "engine/reference/assets/rig/active-body/AnimalLocomotion.md",
      "source": "engine/assets/rig/active-body/AnimalLocomotion.js",
      "import": "/engine/assets/rig/active-body/AnimalLocomotion.js",
      "sourceHash": "fb5c208dbf693335ac9010b4ecc9677ec5b351a04e7467e6997c62628b17ef83",
      "summary": "engine/assets/rig/active-body/AnimalLocomotion.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns the animal (quadruped/ arachnid) active-body path: anatomy spec generation, PBD ragdoll assembly, per-frame locomotion (gait, leg targets, tail, neural residual blending), and animal-only debug tracing. Every function here takes its dependencies as explicit parameters (ragdoll/entry/skeleton/dt/...) — none of them close over ActiveBodySystem module state, so this extraction is a pure move, not a redesign. Shared helpers (contact telemetry, balance, small math/format utils) stay in ActiveBodySystem.js and are imported back here; the reverse (the handful of names ActiveBodySystem.js still calls into, e.g. stepAnimalActiveBody) are exported from here.",
      "exports": [
        {
          "name": "createAnimalAnatomySpec",
          "kind": "function",
          "signature": "createAnimalAnatomySpec(skeleton)",
          "summary": ""
        },
        {
          "name": "createQuadrupedAnatomySpec",
          "kind": "function",
          "signature": "createQuadrupedAnatomySpec(skeleton)",
          "summary": ""
        },
        {
          "name": "createArachnidAnatomySpec",
          "kind": "function",
          "signature": "createArachnidAnatomySpec(skeleton)",
          "summary": ""
        },
        {
          "name": "createAnimalBrainProfile",
          "kind": "function",
          "signature": "createAnimalBrainProfile(skeleton, options = {}, entityId = 'animal')",
          "summary": ""
        },
        {
          "name": "cloneAnimalSkeleton",
          "kind": "function",
          "signature": "cloneAnimalSkeleton(skeleton)",
          "summary": ""
        },
        {
          "name": "animalVerticalScaleFor",
          "kind": "function",
          "signature": "animalVerticalScaleFor(skeleton, scale = 1)",
          "summary": ""
        },
        {
          "name": "animalPoseVerticalScale",
          "kind": "function",
          "signature": "animalPoseVerticalScale(entry)",
          "summary": ""
        },
        {
          "name": "animalLocalToWorldPosition",
          "kind": "function",
          "signature": "animalLocalToWorldPosition(origin, yaw, scale, local, verticalScale = scale)",
          "summary": ""
        },
        {
          "name": "createAnimalPbdRagdoll",
          "kind": "function",
          "signature": "createAnimalPbdRagdoll(skeleton, worldPosition, options = {})",
          "summary": ""
        },
        {
          "name": "animalParentConstraintStiffness",
          "kind": "function",
          "signature": "animalParentConstraintStiffness(bone, parent, skeleton)",
          "summary": ""
        },
        {
          "name": "animalLegSpanConstraintStiffness",
          "kind": "function",
          "signature": "animalLegSpanConstraintStiffness(skeleton)",
          "summary": ""
        },
        {
          "name": "computeAnimalStructuralLimits",
          "kind": "function",
          "signature": "computeAnimalStructuralLimits(skeleton, boneMap)",
          "summary": ""
        },
        {
          "name": "animalBoneMass",
          "kind": "function",
          "signature": "animalBoneMass(bone, skeleton)",
          "summary": ""
        },
        {
          "name": "animalBoneRadius",
          "kind": "function",
          "signature": "animalBoneRadius(bone, skeleton, scale)",
          "summary": ""
        },
        {
          "name": "stepAnimalActiveBody",
          "kind": "function",
          "signature": "stepAnimalActiveBody(entry, dt, groundY = 0, sensors = null)",
          "summary": ""
        },
        {
          "name": "resolveAnimalMotion",
          "kind": "function",
          "signature": "resolveAnimalMotion(entry, root)",
          "summary": ""
        },
        {
          "name": "animalGaitPhaseAdvance",
          "kind": "function",
          "signature": "animalGaitPhaseAdvance(entry, motion, dt)",
          "summary": ""
        },
        {
          "name": "animalGaitDriveSpeed",
          "kind": "function",
          "signature": "animalGaitDriveSpeed(entry, motion)",
          "summary": ""
        },
        {
          "name": "animalIntendedSpeedScale",
          "kind": "function",
          "signature": "animalIntendedSpeedScale(entry, motion)",
          "summary": ""
        },
        {
          "name": "animalMotionForwardVector",
          "kind": "function",
          "signature": "animalMotionForwardVector(entry, motion)",
          "summary": ""
        },
        {
          "name": "animalRootForwardVelocityDot",
          "kind": "function",
          "signature": "animalRootForwardVelocityDot(entry, motion)",
          "summary": ""
        },
        {
          "name": "animalShouldReplantLegsForDirection",
          "kind": "function",
          "signature": "animalShouldReplantLegsForDirection(entry, motion, moving)",
          "summary": ""
        },
        {
          "name": "isAnimalDebugTarget",
          "kind": "function",
          "signature": "isAnimalDebugTarget(entry)",
          "summary": ""
        },
        {
          "name": "logAnimalActiveBodyTrace",
          "kind": "function",
          "signature": "logAnimalActiveBodyTrace(entry, frame, groundY = 0)",
          "summary": ""
        },
        {
          "name": "animalDebugBodyAxis",
          "kind": "function",
          "signature": "animalDebugBodyAxis(entry)",
          "summary": ""
        },
        {
          "name": "animalDebugWorstBoneSpeed",
          "kind": "function",
          "signature": "animalDebugWorstBoneSpeed(entry)",
          "summary": ""
        },
        {
          "name": "formatAnimalNeuralDebug",
          "kind": "function",
          "signature": "formatAnimalNeuralDebug(entry)",
          "summary": ""
        },
        {
          "name": "formatAnimalDirectionDebug",
          "kind": "function",
          "signature": "formatAnimalDirectionDebug(entry)",
          "summary": ""
        },
        {
          "name": "formatAnimalLegDebug",
          "kind": "function",
          "signature": "formatAnimalLegDebug(entry, groundY = 0)",
          "summary": ""
        },
        {
          "name": "formatAnimalTailDebug",
          "kind": "function",
          "signature": "formatAnimalTailDebug(entry, groundY = 0)",
          "summary": ""
        },
        {
          "name": "animalLegDebugLabel",
          "kind": "function",
          "signature": "animalLegDebugLabel(descriptor)",
          "summary": ""
        },
        {
          "name": "signedAnimalYawDeltaDegrees",
          "kind": "function",
          "signature": "signedAnimalYawDeltaDegrees(a, b)",
          "summary": ""
        },
        {
          "name": "applyAnimalPoseDrive",
          "kind": "function",
          "signature": "applyAnimalPoseDrive(entry, dt, groundY, motion)",
          "summary": ""
        },
        {
          "name": "computeAnimalLegTargets",
          "kind": "function",
          "signature": "computeAnimalLegTargets(entry, root, rootLocal, groundY, motion, basis)",
          "summary": ""
        },
        {
          "name": "applyAnimalNeuralMotor",
          "kind": "function",
          "signature": "applyAnimalNeuralMotor(entry, legTargets, tailTargets, motion, groundY, dt)",
          "summary": ""
        },
        {
          "name": "animalNeuralTierCap",
          "kind": "function",
          "signature": "animalNeuralTierCap(tier)",
          "summary": ""
        },
        {
          "name": "animalBodyVerticality",
          "kind": "function",
          "signature": "animalBodyVerticality(entry, groundY = 0)",
          "summary": ""
        },
        {
          "name": "animalNeuralReward",
          "kind": "function",
          "signature": "animalNeuralReward(entry, motion, currentV, targetV, coreV)",
          "summary": ""
        },
        {
          "name": "animalNeuralBonesByName",
          "kind": "function",
          "signature": "animalNeuralBonesByName(entry)",
          "summary": ""
        },
        {
          "name": "animalNeuralTargetAliases",
          "kind": "function",
          "signature": "animalNeuralTargetAliases(entry, legTargets, tailTargets)",
          "summary": ""
        },
        {
          "name": "applyAnimalNeuralLegOffsets",
          "kind": "function",
          "signature": "applyAnimalNeuralLegOffsets(entry, legTargets, offsets, weight)",
          "summary": ""
        },
        {
          "name": "animalNeuralOffsetScale",
          "kind": "function",
          "signature": "animalNeuralOffsetScale(entry, footPlanted)",
          "summary": ""
        },
        {
          "name": "addAnimalNeuralOffset",
          "kind": "function",
          "signature": "addAnimalNeuralOffset(target, offsets, alias, weight, footPlanted)",
          "summary": ""
        },
        {
          "name": "computeAnimalTailTargets",
          "kind": "function",
          "signature": "computeAnimalTailTargets(entry, root, rootLocal, groundY, motion, basis, dt)",
          "summary": ""
        },
        {
          "name": "resolveAnimalTailAffect",
          "kind": "function",
          "signature": "resolveAnimalTailAffect(entry, motion)",
          "summary": ""
        },
        {
          "name": "animalTailSpecies",
          "kind": "function",
          "signature": "animalTailSpecies(entry, packet = null)",
          "summary": ""
        },
        {
          "name": "animalTailDriveScale",
          "kind": "function",
          "signature": "animalTailDriveScale(entry)",
          "summary": ""
        },
        {
          "name": "animalTailCarryProfile",
          "kind": "function",
          "signature": "animalTailCarryProfile(species)",
          "summary": ""
        },
        {
          "name": "animalRootTargetY",
          "kind": "function",
          "signature": "animalRootTargetY(entry, groundY = 0)",
          "summary": ""
        },
        {
          "name": "animalLowestSupportFootLocalY",
          "kind": "function",
          "signature": "animalLowestSupportFootLocalY(entry)",
          "summary": ""
        },
        {
          "name": "animalSupportRoot",
          "kind": "function",
          "signature": "animalSupportRoot(entry, root, groundY, motion, basis)",
          "summary": ""
        },
        {
          "name": "animalRootVerticalDriveWeight",
          "kind": "function",
          "signature": "animalRootVerticalDriveWeight(entry)",
          "summary": ""
        },
        {
          "name": "animalBodyPostureOffset",
          "kind": "function",
          "signature": "animalBodyPostureOffset(entry, role, basis)",
          "summary": ""
        },
        {
          "name": "animalStrideLength",
          "kind": "function",
          "signature": "animalStrideLength(entry, speedScale)",
          "summary": ""
        },
        {
          "name": "animalStrideDriveScale",
          "kind": "function",
          "signature": "animalStrideDriveScale(entry)",
          "summary": ""
        },
        {
          "name": "animalSwingLateralSweep",
          "kind": "function",
          "signature": "animalSwingLateralSweep(entry, descriptor, lift, swingAhead)",
          "summary": ""
        },
        {
          "name": "animalSwingLiftHeight",
          "kind": "function",
          "signature": "animalSwingLiftHeight(entry)",
          "summary": ""
        },
        {
          "name": "animalPoseDriveGains",
          "kind": "function",
          "signature": "animalPoseDriveGains(role, id, bodyType)",
          "summary": ""
        },
        {
          "name": "animalRestWorld",
          "kind": "function",
          "signature": "animalRestWorld(root, rootLocal, local, scale, basis, verticalScale = scale)",
          "summary": ""
        },
        {
          "name": "animalLegPhase",
          "kind": "function",
          "signature": "animalLegPhase(entry, descriptor, legCount, speedScale = null)",
          "summary": ""
        },
        {
          "name": "animalDutyFactor",
          "kind": "function",
          "signature": "animalDutyFactor(entry, legCount, speedScale)",
          "summary": ""
        },
        {
          "name": "animalStanceRollback",
          "kind": "function",
          "signature": "animalStanceRollback(entry, speedScale)",
          "summary": ""
        },
        {
          "name": "applyAnimalLegChainTargets",
          "kind": "function",
          "signature": "applyAnimalLegChainTargets(entry, targets, info, descriptor, root, bodyRootLocal, footTarget, lift, swing, basis)",
          "summary": ""
        },
        {
          "name": "animalCurrentSpeedScale",
          "kind": "function",
          "signature": "animalCurrentSpeedScale(entry)",
          "summary": ""
        },
        {
          "name": "animalStanceRootPush",
          "kind": "function",
          "signature": "animalStanceRootPush(entry, descriptor, speedScale)",
          "summary": ""
        },
        {
          "name": "animalLegShapeWeight",
          "kind": "function",
          "signature": "animalLegShapeWeight(entry, descriptor, swing)",
          "summary": ""
        },
        {
          "name": "animalLegJointPulse",
          "kind": "function",
          "signature": "animalLegJointPulse(entry, descriptor, jointIndex, chainLength, lift, swing, basis)",
          "summary": ""
        },
        {
          "name": "animalStructuralPasses",
          "kind": "function",
          "signature": "animalStructuralPasses(entry)",
          "summary": ""
        },
        {
          "name": "clampAnimalBoneVelocities",
          "kind": "function",
          "signature": "clampAnimalBoneVelocities(entry, dt)",
          "summary": ""
        },
        {
          "name": "enforceAnimalGroundContact",
          "kind": "function",
          "signature": "enforceAnimalGroundContact(entry, groundY, dt = 1/60, sensors = null)",
          "summary": ""
        },
        {
          "name": "enforceAnimalPlantedFootContacts",
          "kind": "function",
          "signature": "enforceAnimalPlantedFootContacts(entry, groundY, dt = 1/60, sensors = null, motion = null)",
          "summary": ""
        },
        {
          "name": "animalPlantedFootHold",
          "kind": "function",
          "signature": "animalPlantedFootHold(entry, moving)",
          "summary": ""
        },
        {
          "name": "animalPlantedFootDamping",
          "kind": "function",
          "signature": "animalPlantedFootDamping(entry, moving)",
          "summary": ""
        },
        {
          "name": "applyAnimalNoIntentSettleBrake",
          "kind": "function",
          "signature": "applyAnimalNoIntentSettleBrake(entry, dt = 1/60, motion = null)",
          "summary": ""
        },
        {
          "name": "applyAnimalWrongWayBrake",
          "kind": "function",
          "signature": "applyAnimalWrongWayBrake(entry, dt = 1/60, motion = null)",
          "summary": ""
        },
        {
          "name": "computeAnimalBalance",
          "kind": "function",
          "signature": "computeAnimalBalance(entry, groundY = 0)",
          "summary": ""
        },
        {
          "name": "ANIMAL_DEBUG_ENTITY_IDS",
          "kind": "constant",
          "signature": "ANIMAL_DEBUG_ENTITY_IDS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/BalanceMotor",
      "path": "engine/reference/assets/rig/active-body/BalanceMotor.md",
      "source": "engine/assets/rig/active-body/BalanceMotor.js",
      "import": "/engine/assets/rig/active-body/BalanceMotor.js",
      "sourceHash": "652a9b091371c3ef28082744735ab6c60c84070ecef3dd7b870b942b4590fbff",
      "summary": "engine/assets/rig/active-body/BalanceMotor.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns humanoid COM-based balance (Winter mass fractions) and the idle/locomotion/stumble/fallen/ getup/ko state machine that reads it. Kept as one module per the Phase 7 pre-work findings — the state machine and balance computation are tightly entangled (updateState reads balance.error/groundedFeet every frame) and splitting them would just add a needless import hop.",
      "exports": [
        {
          "name": "computeBalance",
          "kind": "function",
          "signature": "computeBalance(ragdoll)",
          "summary": ""
        },
        {
          "name": "makeBalanceState",
          "kind": "function",
          "signature": "makeBalanceState(entry, balance)",
          "summary": ""
        },
        {
          "name": "toBalanceControllerState",
          "kind": "function",
          "signature": "toBalanceControllerState(state)",
          "summary": ""
        },
        {
          "name": "copyBalanceState",
          "kind": "function",
          "signature": "copyBalanceState(balance)",
          "summary": ""
        },
        {
          "name": "updateState",
          "kind": "function",
          "signature": "updateState(entry, balance, dt)",
          "summary": ""
        },
        {
          "name": "snapshotGetupOrientation",
          "kind": "function",
          "signature": "snapshotGetupOrientation(entry)",
          "summary": ""
        },
        {
          "name": "MASS_FRACTIONS",
          "kind": "constant",
          "signature": "MASS_FRACTIONS",
          "summary": ""
        },
        {
          "name": "STUMBLE_THRESHOLD",
          "kind": "constant",
          "signature": "STUMBLE_THRESHOLD",
          "summary": ""
        },
        {
          "name": "FALL_THRESHOLD",
          "kind": "constant",
          "signature": "FALL_THRESHOLD",
          "summary": ""
        },
        {
          "name": "LOCOMOTION_STUMBLE_THRESHOLD",
          "kind": "constant",
          "signature": "LOCOMOTION_STUMBLE_THRESHOLD",
          "summary": ""
        },
        {
          "name": "LOCOMOTION_STUMBLE_TIME",
          "kind": "constant",
          "signature": "LOCOMOTION_STUMBLE_TIME",
          "summary": ""
        },
        {
          "name": "STUMBLE_FALL_TIME",
          "kind": "constant",
          "signature": "STUMBLE_FALL_TIME",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/BodyAssembler",
      "path": "engine/reference/assets/rig/active-body/BodyAssembler.md",
      "source": "engine/assets/rig/active-body/BodyAssembler.js",
      "import": "/engine/assets/rig/active-body/BodyAssembler.js",
      "sourceHash": "ef5c9931a4c2f892f1908492c6ce109c9d3399b83afce9dc8ca97245f3d34cf2",
      "summary": "BodyAssembler — Data-driven ragdoll spec from body template + part catalog. Reads: - data/bodies/humanoid_default.json (bone hierarchy + collision rules) - data/parts/construction_volumes/*.json (per-part collision metadata) Produces a `RagdollSpec` consumable by ActiveBodySystem: { bones: [{ id, parent, partId, side, joint, collision, mass }, ...] ignorePairs: Set<\"a|b\"> // bone-pair keys for self-collision exclusion ignoreGroupsActive: Set<\"groupA|groupB\"> joints: { ball: {...}, hinge: {...}, ... } drives: { ball: {...}, hinge: {...}, ... } anatomy: { thorax, organs, collisionShells } skeletonExtensions: { mode, spineSegments, structuralBones } } This is the single source of truth for ragdoll structure. Edit the JSON files to change the body without touching code.",
      "exports": [
        {
          "name": "loadBodyTemplate",
          "kind": "function",
          "signature": "async loadBodyTemplate(url = '/data/bodies/humanoid_default.json')",
          "summary": "Load the humanoid body template (cached after first call)."
        },
        {
          "name": "assembleBody",
          "kind": "function",
          "signature": "assembleBody(template, partCatalog, options = {})",
          "summary": "Build a ragdoll spec from a body template + part catalog."
        },
        {
          "name": "shouldBonesCollide",
          "kind": "function",
          "signature": "shouldBonesCollide(spec, boneA, boneB, isActive)",
          "summary": "Test if two bones should collide given a ragdoll spec."
        },
        {
          "name": "getFootBones",
          "kind": "function",
          "signature": "getFootBones(spec)",
          "summary": "Get bone IDs that are foot contacts (for ground sensing / balance)."
        },
        {
          "name": "getBone",
          "kind": "function",
          "signature": "getBone(spec, id)",
          "summary": "Get a bone by id."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/BodyPoses",
      "path": "engine/reference/assets/rig/active-body/BodyPoses.md",
      "source": "engine/assets/rig/active-body/BodyPoses.js",
      "import": "/engine/assets/rig/active-body/BodyPoses.js",
      "sourceHash": "6ccaef6560d326634fe50249a9de24d0717a93b8f2059559d61887543d9b1a1f",
      "summary": "BodyPoses — Data-driven pose library + biomechanical motor controller. ══════════════════════════════════════════════════════════════════════ POSE DATA ══════════════════════════════════════════════════════════════════════ Poses live in /data/poses/*.json. Each has: id, referenceHeight, rootBone, facing, bones{name:[x,y,z]}, rotations{name:[x,y,z,w]} verticality (0..100) — used by the blend space Sequences live in /data/sequences/*.json and chain poses, though the NEW verticality system (see getPoseAtVerticality) supersedes discrete sequence-time for getup — bodies blend continuously between adjacent rungs of the verticality ladder: 0 ── 15 ── 25 ── 35 ── 45 ── 50 ── (>50 reserved) prone pushup quad  kneel half  stand   tiptoe/jump/reach kneel The ladder is based on the clinical Postural Verticality Scale (PVS) used in stroke rehab, cross-referenced with the Gross Motor Function Measure (GMFM) and standard 1D animation blend trees. ══════════════════════════════════════════════════════════════════════ MOTOR: applyKinematicBlend — FOUR STACKED LAYERS ══════════════════════════════════════════════════════════════════════ For each bone we apply, in order: 1. SOFT POSITION NUDGE  (kinematic lerp, small % per frame) Guarantees pose convergence even when forces can't. 2. VELOCITY-CLAMPED PURSUIT  (capped at muscleSpeed m/s) Close to target = slower approach (ease-in). Far = full speed. 3. MASS-SCALED PD FORCE  (the one that actually does work) Kp = m · ω² Kd = 2 · m · ω · ζ          (ζ = dampingRatio) F  = Kp·(target - pos) - Kd·velocity Mass-scaled means a 20 kg pelvis and a 0.5 kg hand have the SAME natural frequency. Like real biological muscle — body parts reach their targets on the same time scale regardless of weight. 4. MUSCLE-TONE GRAVITY COMPENSATION  (postural) Bones above knee-height get 75% of their weight canceled so posture holds without the motor doing all the lifting. Real humans use passive muscle tone; we model the same. + FORCE RISE-TIME FILTER (on the final force) Real muscles can't change force instantly. Rate-of-force- development (RFD) is 800-1500 N/s for untrained adults. Per-bone multipliers: thighs 0.7× (slow recruitment, biggest muscles), hands 1.4× (fast, small motor units). From EMG studies. + ERROR-GATED DAMPING (near target) Within 5 cm of target, velocity is damped 30% per frame. Kills steady-state jitter where the PD motor fights imperceptible position deltas. Doesn't affect in-flight motion. ══════════════════════════════════════════════════════════════════════ BIOMECHANICAL CALIBRATION  (do not \"fix\" these without reading!) ══════════════════════════════════════════════════════════════════════ forcePerKg = 15 × g    — untrained adult (not Olympic athlete) peak quad ≈ 15g × 8kg = 1176 N (realistic) maxForce = 1500 N      — absolute cap (big muscle groups) forceRiseRate = 1200 N/s — typical RFD. Bumping this to 3000 makes bodies feel robotic (athlete-level). omega = 6-9 rad/s      — muscle response frequency (postural 5-7, voluntary 8-12). Above 12 = twitchy. dampingRatio = 0.7     — slight overshoot (natural muscle feel). 1.0 = critical, 1.2+ = sluggish/locked. gravityTone = 0.75     — 75% of bone weight canceled via feedforward for bones above toneYThreshold. Human postural muscles do this automatically. ══════════════════════════════════════════════════════════════════════",
      "exports": [
        {
          "name": "normalizePose",
          "kind": "function",
          "signature": "normalizePose(data)",
          "summary": ""
        },
        {
          "name": "loadPose",
          "kind": "function",
          "signature": "async loadPose(id)",
          "summary": "Load a single pose by id. Cached after first fetch. URL matches the BodyAssembler pattern (`/data/...`) since the server roots `Life/data/` as `/data/`."
        },
        {
          "name": "loadSequence",
          "kind": "function",
          "signature": "async loadSequence(id)",
          "summary": "Load a sequence and pre-load all poses referenced by its phases."
        },
        {
          "name": "preloadStandardPoses",
          "kind": "function",
          "signature": "async preloadStandardPoses()",
          "summary": ""
        },
        {
          "name": "bracketWalkCyclePhase",
          "kind": "function",
          "signature": "bracketWalkCyclePhase(gaitPhase)",
          "summary": "Map gait phase (rad) to two adjacent walk-cycle poses and blend factor."
        },
        {
          "name": "getWalkCycleWorldTargets",
          "kind": "function",
          "signature": "getWalkCycleWorldTargets(gaitPhase, measurements, anchor, yaw)",
          "summary": ""
        },
        {
          "name": "getWalkCycleWorldPoseTargets",
          "kind": "function",
          "signature": "getWalkCycleWorldPoseTargets(gaitPhase, measurements, anchor, yaw)",
          "summary": ""
        },
        {
          "name": "blendPositionTargetMaps",
          "kind": "function",
          "signature": "blendPositionTargetMaps(base, overlay, t)",
          "summary": "Linear blend of bone world positions (stand + walk-cycle additive layer)."
        },
        {
          "name": "blendWorldPoseTargets",
          "kind": "function",
          "signature": "blendWorldPoseTargets(base, overlay, t)",
          "summary": ""
        },
        {
          "name": "getPoseBoneWorldPosition",
          "kind": "function",
          "signature": "getPoseBoneWorldPosition(pose, boneId, measurements, anchor, yaw)",
          "summary": "Compute the world-space target position of a single bone for a given pose. Applies scale (measurements.height / pose.referenceHeight), yaw rotation around +Y (body facing direction), and translation to anchor."
        },
        {
          "name": "getPoseBoneLocalPosition",
          "kind": "function",
          "signature": "getPoseBoneLocalPosition(pose, boneId)",
          "summary": ""
        },
        {
          "name": "getPoseBoneLocalRotation",
          "kind": "function",
          "signature": "getPoseBoneLocalRotation(pose, boneId)",
          "summary": ""
        },
        {
          "name": "getPoseBoneWorldRotation",
          "kind": "function",
          "signature": "getPoseBoneWorldRotation(pose, boneId, yaw)",
          "summary": ""
        },
        {
          "name": "getPoseWorldTargets",
          "kind": "function",
          "signature": "getPoseWorldTargets(pose, measurements, anchor, yaw)",
          "summary": "Compute all target positions for a pose, keyed by bone id."
        },
        {
          "name": "getPoseWorldPoseTargets",
          "kind": "function",
          "signature": "getPoseWorldPoseTargets(pose, measurements, anchor, yaw)",
          "summary": ""
        },
        {
          "name": "interpolatePoses",
          "kind": "function",
          "signature": "interpolatePoses(poseA, poseB, t, measurements, anchor, yaw)",
          "summary": "Interpolate between two poses. Returns a target-position map for all bones that exist in both. Useful for smooth phase transitions within a sequence."
        },
        {
          "name": "interpolatePoseTargets",
          "kind": "function",
          "signature": "interpolatePoseTargets(poseA, poseB, t, measurements, anchor, yaw)",
          "summary": ""
        },
        {
          "name": "applyKinematicBlend",
          "kind": "function",
          "signature": "applyKinematicBlend(ragdoll, targets, blendRate = 0.04, options = {})",
          "summary": "Hybrid muscle-motor blend — mixes kinematic pose delivery with PD-force behavior to produce realistic active-ragdoll motion that FEELS muscular rather than teleport-y. Four layers stacked per bone: 1. SOFT POSITION NUDGE — small kinematic lerp (2-4% per frame). Guarantees pose delivery; prevents drift from constraints/collisions. 2. VELOCITY-CLAMPED PURSUIT — computes a desired velocity toward the target and caps it at a \"muscle speed\" limit. Far bones move at max speed; close bones slow down (ease-in on arrival). 3. PD STABILIZATION — small spring-damper toward target adds subtle inertia/settling that pure position lerp lacks. Uses applyForce so gravity/collisions/distance constraints still dominate. 4. MUSCLE-TONE GRAVITY COMP — above-ground bones get 70% gravity cancellation (like real postural muscles keeping you upright). Per-bone activation timing: big postural muscles (pelvis, thighs, chest) lead; smaller bones (hands, head) follow. Creates the \"stage-by-stage effort\" look real people have when getting up."
        },
        {
          "name": "applyMotorToTargets",
          "kind": "function",
          "signature": "applyMotorToTargets(ragdoll, targets, options = {})",
          "summary": "Apply PD (proportional-derivative) motor FORCES to drive the ragdoll toward a target pose. This is the proper active-ragdoll approach used in DeepMimic / NaturalMotion Euphoria / Karl Sims creatures: F = Kp * (target_pos - pos) - Kd * velocity Forces are applied via `solver.applyForce()` BEFORE the physics step so they get integrated as acceleration through the Verlet solver. The body rises by physically PUSHING against the ground (via collision friction on its hands/feet) — not by teleporting particles to target positions. Key properties: - Mass matters: Kp scales per bone mass so acceleration is consistent. - Kd damps overshoot and oscillation (critical damping formula below). - Gravity, collisions, and distance constraints ALL still act normally. - Momentum is preserved — no teleportation. PHASE RAMP: `phaseBoost` multiplier scales stiffness over the phase duration so the motor grows stronger as the body approaches the pose. ADAPTIVE GAIN: bones far from target get a proportional force boost — the \"ramp muscle output until it works\" behavior. Still applied through PD force, not position teleport. MAX FORCE CAP: prevents instability from runaway forces at large errors."
        },
        {
          "name": "getSequenceState",
          "kind": "function",
          "signature": "getSequenceState(sequence, elapsed)",
          "summary": "Run one tick of a sequence. Returns progress info so the caller can decide when the sequence completes or what phase is active."
        },
        {
          "name": "getCachedPose",
          "kind": "function",
          "signature": "getCachedPose(id)",
          "summary": "Read a cached pose without loading. Returns null if not loaded."
        },
        {
          "name": "getVerticalityLadder",
          "kind": "function",
          "signature": "getVerticalityLadder()",
          "summary": "Return a sorted ladder of {verticality, pose} for every cached pose that declares one. Sorted ascending by score."
        },
        {
          "name": "bracketVerticality",
          "kind": "function",
          "signature": "bracketVerticality(v, ladder = null)",
          "summary": "Find the two adjacent rungs bracketing verticality `v`, plus the interpolation factor between them. Returns { lower, upper, t } where t ∈ [0,1]; t=0 means exactly lower. If v is below min or above max, clamps to end and t=0 or 1."
        },
        {
          "name": "getPoseAtVerticality",
          "kind": "function",
          "signature": "getPoseAtVerticality(v, measurements, anchor, yaw)",
          "summary": "Get world-space bone targets for an arbitrary verticality score. Blends between the two adjacent ladder poses, so the caller never has to know which discrete pose is \"current\" — just \"how vertical\"."
        },
        {
          "name": "getPoseTargetsAtVerticality",
          "kind": "function",
          "signature": "getPoseTargetsAtVerticality(v, measurements, anchor, yaw)",
          "summary": ""
        },
        {
          "name": "measureBodyVerticality",
          "kind": "function",
          "signature": "measureBodyVerticality(ragdoll)",
          "summary": "Measure the current body's verticality from live physics state. Uses pelvis height as fraction of the stand-pose pelvis height, mapped onto the scale so stand = 50. Below stand scales linearly; above stand (for future jumping/reaching) grows proportionally."
        },
        {
          "name": "getCachedSequence",
          "kind": "function",
          "signature": "getCachedSequence(id)",
          "summary": "Read a cached sequence without loading. Returns null if not loaded."
        },
        {
          "name": "getSequenceDuration",
          "kind": "function",
          "signature": "getSequenceDuration(sequence)",
          "summary": "Compute total duration of a sequence in seconds."
        },
        {
          "name": "WALK_CYCLE_POSE_IDS",
          "kind": "constant",
          "signature": "WALK_CYCLE_POSE_IDS",
          "summary": "Warm-cache everything we need for the active controller. Loads both prone (face-down) and supine (face-up) getup sequences so the controller can pick the right one based on the body's orientation when it decides to stand up."
        },
        {
          "name": "WALK_CYCLE_PHASE_OFFSET",
          "kind": "constant",
          "signature": "WALK_CYCLE_PHASE_OFFSET",
          "summary": "Align CPG gait phase (φ=0 toe-off) with walk_cycle_q* heel-strike keys."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/BodyRhythms",
      "path": "engine/reference/assets/rig/active-body/BodyRhythms.md",
      "source": "engine/assets/rig/active-body/BodyRhythms.js",
      "import": "/engine/assets/rig/active-body/BodyRhythms.js",
      "sourceHash": "121018efc0b9fbc25ff8a7bfaf493049723ea2556702701476cd70a991d0570d",
      "summary": "BodyRhythms — Coupled phase oscillators that generate body rhythms. ══════════════════════════════════════════════════════════════════════ WHAT THIS IS ══════════════════════════════════════════════════════════════════════ Every living body has SYNCHRONIZED internal oscillators: - HEART      ~1.0-1.5 Hz resting (60-90 bpm) - BREATH     ~0.2-0.3 Hz resting (12-18 breaths/min) - GAIT_L     ~1.0 Hz walking cadence (left leg) - GAIT_R     ~1.0 Hz antiphase to left (π offset) - ARM_L      counter-swings with RIGHT leg (inphase with GAIT_R) - ARM_R      counter-swings with LEFT leg (inphase with GAIT_L) These are the output of CENTRAL PATTERN GENERATORS (CPGs) — spinal neural circuits that don't need brain input to produce rhythm. They sync via Kuramoto-like coupling so all the oscillators lock into phase-locked relationships automatically. Engine provides the math (engine/core/math/MathOscillator.js): stepKuramotoPhases  — Euler step for coupled oscillator network phaseCoherence      — measure of synchrony (0=chaos, 1=lockstep) stepKuramotoDriven  — with external forcing (metronome, music, etc) ══════════════════════════════════════════════════════════════════════ USES IN THE ACTIVE BODY SYSTEM ══════════════════════════════════════════════════════════════════════ 1. NN OBSERVATION INPUT The NN sees sin/cos of key phases, so it knows WHERE in the gait cycle the body is. This lets it learn rhythmic actions — step forward on left foot during gait_L peak, etc. 2. POSE MODULATION (future) When intent = walk, leg targets can be modulated by gait phase to produce a stepping motion automatically. 3. VISIBLE RHYTHM (future) Chest rises with breath, head bobs with heart, body sways with gait — alive-looking NPCs even when standing still. 4. DRUG/DISEASE EFFECTS Arrhythmia = desynchronized heart. Panic = tachycardia (faster heart + breath). Paralysis = no gait coupling. Loss of coherence (order parameter drops) indicates systemic failure. ══════════════════════════════════════════════════════════════════════ COUPLING MATRIX  (who synchronizes with whom, how strongly) ══════════════════════════════════════════════════════════════════════ HEART  BREATH  GAIT_L  GAIT_R  ARM_L  ARM_R HEART     -    0.3     0       0       0      0 BREATH    0.3  -       0.1     0.1     0      0 GAIT_L    0    0.1     -      -1.0    0      1.0      (antiphase L↔R, counter with arms) GAIT_R    0    0.1     -1.0    -       1.0   0 ARM_L     0    0       0       1.0    -     -1.0 ARM_R     0    0       1.0     0      -1.0  - Positive weight = inphase pull (synchronize), negative = antiphase. Kuramoto coupling term: sin(phase_j - phase_i) × weight.",
      "exports": [
        {
          "name": "createRhythmState",
          "kind": "function",
          "signature": "createRhythmState(rng = Math.random)",
          "summary": "Create a new rhythm state for a body. Initial phases are seeded from a per-entity RNG so different bodies aren't in lockstep (a crowd of NPCs should look like independent individuals, not a marching band)."
        },
        {
          "name": "stepRhythms",
          "kind": "function",
          "signature": "stepRhythms(state, dt, opts = {})",
          "summary": "Advance the rhythm state by dt seconds using the Kuramoto model. Modulates natural frequencies based on body state: - walking intent      → gait and arms non-zero - high adrenaline     → faster heart and breath - high fatigue        → slightly elevated heart, faster breath"
        },
        {
          "name": "rhythmSample",
          "kind": "function",
          "signature": "rhythmSample(state, rhythmIdx)",
          "summary": "Return sin/cos of a rhythm phase — what the NN sees. sin/cos pair is the standard representation of a circular variable for neural networks (avoids wraparound discontinuity at 2π)."
        },
        {
          "name": "shatterRhythm",
          "kind": "function",
          "signature": "shatterRhythm(state, severity = 0.5, rng = Math.random)",
          "summary": "Desynchronize rhythms (simulate arrhythmia / panic breakdown). Adds random noise to phases and reduces coupling strength."
        },
        {
          "name": "restoreRhythm",
          "kind": "function",
          "signature": "restoreRhythm(state)",
          "summary": "Re-establish healthy coupling after disruption (recovery)."
        },
        {
          "name": "RHYTHM",
          "kind": "constant",
          "signature": "RHYTHM",
          "summary": ""
        },
        {
          "name": "NUM_RHYTHMS",
          "kind": "constant",
          "signature": "NUM_RHYTHMS",
          "summary": ""
        },
        {
          "name": "kuramotoOrderParameter",
          "kind": "re-export",
          "signature": "kuramotoOrderParameter",
          "summary": ""
        },
        {
          "name": "phaseCoherence",
          "kind": "re-export",
          "signature": "phaseCoherence",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/BodySpecValidator",
      "path": "engine/reference/assets/rig/active-body/BodySpecValidator.md",
      "source": "engine/assets/rig/active-body/BodySpecValidator.js",
      "import": "/engine/assets/rig/active-body/BodySpecValidator.js",
      "sourceHash": "9b89f455778c4f08b4c70b1291d4839d6ab8bd523e833ed1750b2ed05512acff",
      "summary": "",
      "exports": [
        {
          "name": "validateBodyTemplate",
          "kind": "function",
          "signature": "validateBodyTemplate(template)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/BrainProfile",
      "path": "engine/reference/assets/rig/active-body/BrainProfile.md",
      "source": "engine/assets/rig/active-body/BrainProfile.js",
      "import": "/engine/assets/rig/active-body/BrainProfile.js",
      "sourceHash": "a14878af2d5e21c16bc92dd2827d2b47b7b100a6d10ddf39f72d38257499e190",
      "summary": "engine/assets/rig/active-body/BrainProfile.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns humanoid brain-profile creation/loading (NN tier, motor profile key resolution, lazy brain-file load) and the trust/anatomy/brain readback helpers consumed by getReadback().",
      "exports": [
        {
          "name": "createHumanoidBrainProfile",
          "kind": "function",
          "signature": "createHumanoidBrainProfile(entityId, options = {})",
          "summary": ""
        },
        {
          "name": "neuralTierAuthorityCap",
          "kind": "function",
          "signature": "neuralTierAuthorityCap(tier)",
          "summary": ""
        },
        {
          "name": "estimateNeuralMotorTrust",
          "kind": "function",
          "signature": "estimateNeuralMotorTrust(motor, options = {})",
          "summary": ""
        },
        {
          "name": "getBrainReadback",
          "kind": "function",
          "signature": "getBrainReadback(entry)",
          "summary": ""
        },
        {
          "name": "getAnatomyReadback",
          "kind": "function",
          "signature": "getAnatomyReadback(entry)",
          "summary": ""
        },
        {
          "name": "applyBodySpecMetadata",
          "kind": "function",
          "signature": "applyBodySpecMetadata(entry, bodySpec)",
          "summary": ""
        },
        {
          "name": "ensureBrainLoaded",
          "kind": "function",
          "signature": "ensureBrainLoaded(entry)",
          "summary": ""
        },
        {
          "name": "defaultMotorProfileKey",
          "kind": "function",
          "signature": "defaultMotorProfileKey(entityId, preset, tier)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/ContactTelemetry",
      "path": "engine/reference/assets/rig/active-body/ContactTelemetry.md",
      "source": "engine/assets/rig/active-body/ContactTelemetry.js",
      "import": "/engine/assets/rig/active-body/ContactTelemetry.js",
      "sourceHash": "fddfe8a3344fad9001683b7a25ae10ca2e894199220228872bbdf2ad45301967",
      "summary": "engine/assets/rig/active-body/ContactTelemetry.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns ground-contact resolution (Coulomb friction), per-bone/per-foot/per-sensor-anchor contact telemetry (humanoid AND animal — buildContactTelemetry dispatches to buildAnimalContactTelemetry internally so both paths share one entry point), and the contact-related debug overlay builders. Every function here takes its dependencies as explicit parameters, matching the same extraction pattern as AnimalLocomotion.js.",
      "exports": [
        {
          "name": "enforceGroundContact",
          "kind": "function",
          "signature": "enforceGroundContact(ragdoll, groundY, dt = 1/60, sensors = null)",
          "summary": ""
        },
        {
          "name": "clampSurfaceFriction",
          "kind": "function",
          "signature": "clampSurfaceFriction(value)",
          "summary": ""
        },
        {
          "name": "buildContactTelemetry",
          "kind": "function",
          "signature": "buildContactTelemetry(entry, groundY = 0, sensors = null)",
          "summary": ""
        },
        {
          "name": "buildAnimalContactTelemetry",
          "kind": "function",
          "signature": "buildAnimalContactTelemetry(entry, groundY = 0, sensors = null)",
          "summary": ""
        },
        {
          "name": "buildBoneContactRecord",
          "kind": "function",
          "signature": "buildBoneContactRecord(entry, spec, p, groundY, sensors)",
          "summary": ""
        },
        {
          "name": "buildSensorAnchorTelemetry",
          "kind": "function",
          "signature": "buildSensorAnchorTelemetry(entry, groundY = 0, sensors = null)",
          "summary": ""
        },
        {
          "name": "buildSensorAnchorRecord",
          "kind": "function",
          "signature": "buildSensorAnchorRecord(entry, anchor, groundY, sensors)",
          "summary": ""
        },
        {
          "name": "approximateSensorAnchorPoint",
          "kind": "function",
          "signature": "approximateSensorAnchorPoint(entry, anchor, driver, reference = null)",
          "summary": ""
        },
        {
          "name": "makeSensorAnchorBasis",
          "kind": "function",
          "signature": "makeSensorAnchorBasis(entry, anchor, driver, reference = null)",
          "summary": ""
        },
        {
          "name": "isFootAnchor",
          "kind": "function",
          "signature": "isFootAnchor(anchor)",
          "summary": ""
        },
        {
          "name": "isHandAnchor",
          "kind": "function",
          "signature": "isHandAnchor(anchor)",
          "summary": ""
        },
        {
          "name": "anchorContactPatch",
          "kind": "function",
          "signature": "anchorContactPatch(anchor)",
          "summary": ""
        },
        {
          "name": "readContactSurface",
          "kind": "function",
          "signature": "readContactSurface(sensors, x, z)",
          "summary": ""
        },
        {
          "name": "buildFootContactDerived",
          "kind": "function",
          "signature": "buildFootContactDerived(entry, side, record)",
          "summary": ""
        },
        {
          "name": "copyContactTelemetry",
          "kind": "function",
          "signature": "copyContactTelemetry(contactTelemetry)",
          "summary": ""
        },
        {
          "name": "copySensorAnchorTelemetry",
          "kind": "function",
          "signature": "copySensorAnchorTelemetry(sensorAnchors)",
          "summary": ""
        },
        {
          "name": "copyContactRecord",
          "kind": "function",
          "signature": "copyContactRecord(record)",
          "summary": ""
        },
        {
          "name": "makeContactOverlay",
          "kind": "function",
          "signature": "makeContactOverlay(contactTelemetry)",
          "summary": ""
        },
        {
          "name": "makeContactFootOverlay",
          "kind": "function",
          "signature": "makeContactFootOverlay(record)",
          "summary": ""
        },
        {
          "name": "contactOverlayColor",
          "kind": "function",
          "signature": "contactOverlayColor(record)",
          "summary": ""
        },
        {
          "name": "logContactTrace",
          "kind": "function",
          "signature": "logContactTrace(entry)",
          "summary": ""
        },
        {
          "name": "formatFootContactTrace",
          "kind": "function",
          "signature": "formatFootContactTrace(record)",
          "summary": ""
        },
        {
          "name": "scaledAnimalContactWindow",
          "kind": "function",
          "signature": "scaledAnimalContactWindow(entry, base)",
          "summary": ""
        },
        {
          "name": "FOOT_PARTICLE_SOLE_HEIGHT",
          "kind": "constant",
          "signature": "FOOT_PARTICLE_SOLE_HEIGHT",
          "summary": ""
        },
        {
          "name": "FOOT_PARTICLE_CONTACT_HEIGHT",
          "kind": "constant",
          "signature": "FOOT_PARTICLE_CONTACT_HEIGHT",
          "summary": ""
        },
        {
          "name": "CONTACT_SENSOR_BONES",
          "kind": "constant",
          "signature": "CONTACT_SENSOR_BONES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/DebugOverlay",
      "path": "engine/reference/assets/rig/active-body/DebugOverlay.md",
      "source": "engine/assets/rig/active-body/DebugOverlay.js",
      "import": "/engine/assets/rig/active-body/DebugOverlay.js",
      "sourceHash": "b4d26f1ab15130b1c02d45728e7b886b3caa32f23be0aae8228d8837b7b42beb",
      "summary": "engine/assets/rig/active-body/DebugOverlay.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns pure display/readback helpers: overlay toggle resolution and the make*Overlay builders consumed by ActiveBodySystem.getDebugOverlay()/getReadback(). Deliberately excludes buildMotorAuthorityMap — despite being overlay-adjacent, it's also consumed by live simulation (applyFootReflexTarget/applyBraceProtection Targets), so it stays with the reflex/motor-authority code, not here.",
      "exports": [
        {
          "name": "makeOverlayToggleMap",
          "kind": "function",
          "signature": "makeOverlayToggleMap(source = null, fallback = DEFAULT_ACTIVE_BODY_OVERLAY_TOGGLES)",
          "summary": ""
        },
        {
          "name": "resolveOverlayToggle",
          "kind": "function",
          "signature": "resolveOverlayToggle(value, fallback)",
          "summary": ""
        },
        {
          "name": "makeComOverlay",
          "kind": "function",
          "signature": "makeComOverlay(balance)",
          "summary": ""
        },
        {
          "name": "makeSupportOverlay",
          "kind": "function",
          "signature": "makeSupportOverlay(entry)",
          "summary": ""
        },
        {
          "name": "getSupportFootBoneIds",
          "kind": "function",
          "signature": "getSupportFootBoneIds(entry)",
          "summary": ""
        },
        {
          "name": "makeFatigueOverlay",
          "kind": "function",
          "signature": "makeFatigueOverlay(entry)",
          "summary": ""
        },
        {
          "name": "makeOrganStatusOverlay",
          "kind": "function",
          "signature": "makeOrganStatusOverlay(entry)",
          "summary": ""
        },
        {
          "name": "makePoseTargetOverlay",
          "kind": "function",
          "signature": "makePoseTargetOverlay(entry)",
          "summary": ""
        },
        {
          "name": "makeJointErrorOverlay",
          "kind": "function",
          "signature": "makeJointErrorOverlay(entry)",
          "summary": ""
        },
        {
          "name": "copyRotationTargetSummary",
          "kind": "function",
          "signature": "copyRotationTargetSummary(rotationTargets)",
          "summary": ""
        },
        {
          "name": "copyRotationResidualSummary",
          "kind": "function",
          "signature": "copyRotationResidualSummary(residuals)",
          "summary": ""
        },
        {
          "name": "copyReflexState",
          "kind": "function",
          "signature": "copyReflexState(reflexState)",
          "summary": ""
        },
        {
          "name": "copyMotorAuthorityMap",
          "kind": "function",
          "signature": "copyMotorAuthorityMap(map)",
          "summary": ""
        },
        {
          "name": "DEFAULT_ACTIVE_BODY_OVERLAY_TOGGLES",
          "kind": "constant",
          "signature": "DEFAULT_ACTIVE_BODY_OVERLAY_TOGGLES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/DirectionDiagnostics",
      "path": "engine/reference/assets/rig/active-body/DirectionDiagnostics.md",
      "source": "engine/assets/rig/active-body/DirectionDiagnostics.js",
      "import": "/engine/assets/rig/active-body/DirectionDiagnostics.js",
      "sourceHash": "b6133ceccfc7030eb57c84b1011f9b406580352c6cf4e0eaefd7c30559fd8bcc",
      "summary": "engine/assets/rig/active-body/DirectionDiagnostics.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns per-frame pelvis-displacement direction tracking (updateDirectionMotion) and the direction/facing diagnostics readback consumed by getDirectionDiagnostics()/getReadback() and the orientation-audit debug logging (still in ActiveBodySystem.js).",
      "exports": [
        {
          "name": "updateDirectionMotion",
          "kind": "function",
          "signature": "updateDirectionMotion(entry, dt)",
          "summary": ""
        },
        {
          "name": "buildDirectionDiagnostics",
          "kind": "function",
          "signature": "buildDirectionDiagnostics(entry)",
          "summary": ""
        },
        {
          "name": "resolveIntentDirection",
          "kind": "function",
          "signature": "resolveIntentDirection(entry, pelvis)",
          "summary": ""
        },
        {
          "name": "normalize2",
          "kind": "function",
          "signature": "normalize2(v)",
          "summary": ""
        },
        {
          "name": "dot2",
          "kind": "function",
          "signature": "dot2(a, b)",
          "summary": ""
        },
        {
          "name": "classifyDirectionStatus",
          "kind": "function",
          "signature": "classifyDirectionStatus(intentDotVelocity, speed)",
          "summary": ""
        },
        {
          "name": "boneNameForParticle",
          "kind": "function",
          "signature": "boneNameForParticle(ragdoll, particle)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/MotionPriorTraining",
      "path": "engine/reference/assets/rig/active-body/MotionPriorTraining.md",
      "source": "engine/assets/rig/active-body/MotionPriorTraining.js",
      "import": "/engine/assets/rig/active-body/MotionPriorTraining.js",
      "sourceHash": "20ca80ab20cdc4f3f0fab1672da622ac831bdc7a014ae8ab260db863724cf238",
      "summary": "",
      "exports": [
        {
          "name": "createAniMotionPriorState",
          "kind": "function",
          "signature": "createAniMotionPriorState()",
          "summary": ""
        },
        {
          "name": "getAniMotionPriorReport",
          "kind": "function",
          "signature": "getAniMotionPriorReport(state)",
          "summary": ""
        },
        {
          "name": "loadAniMotionPrior",
          "kind": "function",
          "signature": "async loadAniMotionPrior(state, options = {})",
          "summary": ""
        },
        {
          "name": "mixAniMotionTeacher",
          "kind": "function",
          "signature": "mixAniMotionTeacher(teacher, state, entry, ragdoll, bonesByName, intent = null, options = {})",
          "summary": ""
        },
        {
          "name": "normalizeAniMotionIndexEnvelope",
          "kind": "function",
          "signature": "normalizeAniMotionIndexEnvelope(input)",
          "summary": ""
        },
        {
          "name": "createAi4AnimationMotionClipFromJson",
          "kind": "function",
          "signature": "createAi4AnimationMotionClipFromJson(json, fileName)",
          "summary": ""
        },
        {
          "name": "ANI_MOTION_INDEX_FORMAT",
          "kind": "constant",
          "signature": "ANI_MOTION_INDEX_FORMAT",
          "summary": ""
        },
        {
          "name": "ANI_MOTION_MANIFEST_FORMAT",
          "kind": "constant",
          "signature": "ANI_MOTION_MANIFEST_FORMAT",
          "summary": ""
        },
        {
          "name": "ANI_MOTION_JSON_FORMAT",
          "kind": "constant",
          "signature": "ANI_MOTION_JSON_FORMAT",
          "summary": ""
        },
        {
          "name": "ANI_MOTION_HTTP_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "ANI_MOTION_HTTP_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "ANI_MOTION_HTTP_READ_VERSIONS",
          "kind": "constant",
          "signature": "ANI_MOTION_HTTP_READ_VERSIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/NeuralMotor",
      "path": "engine/reference/assets/rig/active-body/NeuralMotor.md",
      "source": "engine/assets/rig/active-body/NeuralMotor.js",
      "import": "/engine/assets/rig/active-body/NeuralMotor.js",
      "sourceHash": "754f47de710bb4fc1226e9b57f095d16fdb2127bf792012f99507876b4008322",
      "summary": "NeuralMotor — per-entity self-training MLP for active-ragdoll control. ══════════════════════════════════════════════════════════════════════ WHAT THIS IS (read first) ══════════════════════════════════════════════════════════════════════ The NN adds position RESIDUAL offsets (±8cm per bone) on top of the kinematic verticality pose targets. It is NOT a force generator. The force that actually lifts the body comes from the PD motor in BodyPoses.js, which uses the (NN-refined) targets. This is called \"residual policy learning\" — same approach used by DReCon (Ubisoft, 2020) and DeepMimic. The NN learns the RESIDUAL between hand-authored poses and what the body actually needs. targets_kinematic  (from verticality blend) + NN_residual  (from this file, trained online) = targets_final → PD motor tracks targets_final with realistic muscle force ══════════════════════════════════════════════════════════════════════ TRAINING ALGORITHM: AWR (Advantage-Weighted Regression) ══════════════════════════════════════════════════════════════════════ Every frame: 1. Compute REWARD from body state (pose match, upright, stable, goal progress — see computeReward). 2. Maintain an EMA baseline of reward. 3. Advantage = reward - baseline. 4. Gradient weight = clamp(exp(β·advantage), 0.25, 3). 5. Teacher = what the kinematic controller would nudge this frame. 6. Loss = awrWeight × MSE(NN_output, teacher). 7. One SGD step per frame. Effect: NN imitates the teacher MORE in above-average states and LESS in below-average. This turns behavior cloning into a proper RL method. We don't need full PPO with rollout buffers — training is online and stable because the teacher is always available. STABILITY GATE: training is skipped when the body is thrashing (core velocity > 24 m/s or head below pelvis). Chaotic frames produce noise teacher signals that would corrupt the NN. ══════════════════════════════════════════════════════════════════════ BRAIN TIERS ══════════════════════════════════════════════════════════════════════ tiny   (default NPCs):  43→64→64→60             ≈ 41 KB small  (named NPCs):    43→128→128→60           ≈ 130 KB medium (player default):43→256→256→256→60       ≈ 1.2 MB large  (player upgrade):43→512→1024→1024→60     ≈ 6.6 MB huge   (endgame cap):   43→768→1024³→60         ≈ 10 MB (Input dim 43 = 36 body state + 4 intent one-hot + 3 goal vector.) 10 MB hard cap per brain (enforced at serialize-time). Upgrades via Net2Net weight transplant (upgradeBrain) — preserves learned behavior, new neurons start near-zero and learn later. ══════════════════════════════════════════════════════════════════════ DETERMINISM ══════════════════════════════════════════════════════════════════════ Per-entity seeded PRNG (engine's mulberry32 + FNV-1a string hash of entity id). Same id always produces the same initial brain. Different ids (player, npc_parent, thief_jin) diverge immediately into unique \"personalities\". Drug/seizure/tremor effects also use the per-entity RNG, so effects are reproducible per body. ══════════════════════════════════════════════════════════════════════ NEUROMODIFIERS (drugs, disease, damage) ══════════════════════════════════════════════════════════════════════ The forward pass accepts five perturbations applied to hidden-layer activations, grounded in real pharmacology: noise      — Gaussian σ (alcohol → loss of coordination) dropout    — random activation kill (seizure / KO) scale      — output multiplier (paralytic=0, stimulant=1.4) tremor     — coherent sinusoidal (Parkinsonian 4-6 Hz) delay      — observation buffer lag (concussion) seizureAmp — random spikes in activations See NeuroModifiers.js for preset profiles. ══════════════════════════════════════════════════════════════════════ No external ML library — pure JS, uses engine/core/math/MathRandom.js for shared PRNG utilities. Runs on CPU at 60 Hz for ~20 bodies on a laptop. Training cost ~0.3ms per body per frame (tiny tier).",
      "exports": [
        {
          "name": "tierFromIntelligence",
          "kind": "function",
          "signature": "tierFromIntelligence(score, magical = false)",
          "summary": "Map an intelligence score to the appropriate tier name. Magical tiers (IQ > 100) only return when `magical=true` — otherwise the character is capped at the highest mortal tier (huge)."
        },
        {
          "name": "nextTier",
          "kind": "function",
          "signature": "nextTier(currentTier)",
          "summary": "Get the next tier above the current one, or null if already at top."
        },
        {
          "name": "createNeuralMotor",
          "kind": "function",
          "signature": "createNeuralMotor(tier = DEFAULT_TIER, seedSource = null)",
          "summary": "Create a NeuralMotor. If `seedSource` is given (typically the entity id string), initialization uses a deterministic PRNG — the same id always produces the same starting brain. Different ids get different brains (different \"personalities\") via string hashing."
        },
        {
          "name": "buildObservation",
          "kind": "function",
          "signature": "buildObservation(ragdoll, bonesByName, currentV, targetV, intent = null, rhythms = null, sensors = null)",
          "summary": "Build the observation vector. Dimensions [21..23] originally held a static gravity vector placeholder — we've REPURPOSED these for CPG RHYTHM signals, which give the NN an internal time-base for rhythmic motor actions (walking, breathing): [0..2]   pelvis position (x,y,z) [3..5]   pelvis velocity [6..8]   chest - pelvis (spine vector) [9..11]  shoulder axis (rShoulder - lShoulder) [12..14] COM - pelvis [15]     verticality (0..1, normalized to /50) [16]     verticality gap (target - current, normalized) [17..20] foot contacts (lFoot y, rFoot y, lFoot vy, rFoot vy) [21]     sin(gait_L phase)  ← CPG: left-leg step cycle [22]     cos(gait_L phase) [23]     sin(breath phase)  ← CPG: breathing cycle [24..35] left/right hand/knee positions relative to pelvis [36..39] intent one-hot (stand/walk/duck/act) [40]     target verticality / 50 (goal normalized) [41..42] target direction (xz, world-space, for walk/act) [43..46] terrain (height below / ahead / slope / lateral) — see OBS_SIZE comment [47..50] social (nearest-agent rel xz + rel vxz) [51..54] high-level motor intent (guard/brace/attack/recover) [55..77] tactile/proprioception block The sin/cos encoding of phase is standard NN representation for circular variables (avoids wraparound discontinuity at 2π)."
        },
        {
          "name": "neuralMotorForward",
          "kind": "function",
          "signature": "neuralMotorForward(motor, obs, time = 0, options = null)",
          "summary": "Forward pass through the network with neuromodifier effects applied. Returns per-bone Δxyz offsets (in ragdoll name order)."
        },
        {
          "name": "getNeuralInferenceBackendReport",
          "kind": "function",
          "signature": "getNeuralInferenceBackendReport(bodyCount = 0, gpu = null)",
          "summary": ""
        },
        {
          "name": "computeReward",
          "kind": "function",
          "signature": "computeReward(ragdoll, bonesByName, poseTargets, intent)",
          "summary": "Compute a scalar reward for the current body state. Real DeepMimic-style reward function — additive terms with sensible weights. All terms ∈ [0, 1] so total ≤ sum of weights (~5). poseMatch     — mean bone distance to pose target (closer = higher) upright       — head Y above pelvis Y, normalized (no face-plant) stable        — low velocity = higher (not thrashing) goalProgress  — state-dependent (verticality match, walk speed, etc) Returns: reward ∈ [0, ~5] approximately; scale to [0, 1] with r/5 for AWR weight"
        },
        {
          "name": "trainNeuralMotor",
          "kind": "function",
          "signature": "trainNeuralMotor(motor, obs, teacherOffsets, reward = null, opts = {})",
          "summary": "Advantage-Weighted Regression (AWR) training step. Standard behavior cloning: minimize MSE(NN_out, teacher) AWR: minimize reward_weight * MSE(NN_out, teacher) Effect: NN imitates the teacher ONLY when the state is good (high reward). Bad states contribute ~0 gradient. This implicitly learns which actions lead to high reward — a form of reinforcement learning without full PPO machinery. Used in shipping games (DReCon) and research (AWR, RWR)."
        },
        {
          "name": "getNeuralMotorDebugReport",
          "kind": "function",
          "signature": "getNeuralMotorDebugReport(motor)",
          "summary": ""
        },
        {
          "name": "applyNeuralOffsets",
          "kind": "function",
          "signature": "applyNeuralOffsets(offsets, targets)",
          "summary": "Apply motor output as per-bone target offsets. Call AFTER the kinematic blend has computed its targets; the NN adds corrective deltas."
        },
        {
          "name": "computeTeacherSignal",
          "kind": "function",
          "signature": "computeTeacherSignal(kinematicTargets, ragdoll, bonesByName, rate = 0.15)",
          "summary": "Compute the \"teacher signal\" — the delta the kinematic controller would apply this frame. For DAgger training, this is what the NN tries to predict. Simple formula: (kinematic_target - actual_position) × rate."
        },
        {
          "name": "serializeMotor",
          "kind": "function",
          "signature": "serializeMotor(motor)",
          "summary": "Serialize a NeuralMotor to a compact JSON-safe object. Weights are packed as base64-encoded Float32 bytes. Enforces 10 MB per-brain cap. Layout: { magic, version, tier, hiddens[], bytes (base64), framesTrained, lossEMA }"
        },
        {
          "name": "deserializeMotor",
          "kind": "function",
          "signature": "deserializeMotor(motor, data, options = {})",
          "summary": "Load serialized brain data into an existing motor (replaces weights). Rebuilds layer chain if hiddens differ. Returns true on success."
        },
        {
          "name": "analyzeMotorStorage",
          "kind": "function",
          "signature": "analyzeMotorStorage(motor, packedBytes = null)",
          "summary": ""
        },
        {
          "name": "saveBrain",
          "kind": "function",
          "signature": "async saveBrain(id, motor)",
          "summary": "Save a brain under `id`. Enforces 10 MB per-brain cap."
        },
        {
          "name": "loadBrain",
          "kind": "function",
          "signature": "async loadBrain(id)",
          "summary": "Load a brain by id. Returns serialized data or null."
        },
        {
          "name": "deleteBrain",
          "kind": "function",
          "signature": "async deleteBrain(id)",
          "summary": "Delete a brain."
        },
        {
          "name": "listBrains",
          "kind": "function",
          "signature": "async listBrains()",
          "summary": "List all saved brain ids with their sizes."
        },
        {
          "name": "exportBrainAsJson",
          "kind": "function",
          "signature": "exportBrainAsJson(motor)",
          "summary": "Export a brain as a downloadable JSON file (base64 inside). Useful for sharing trained brains between players."
        },
        {
          "name": "exportBrainAsCompressedJson",
          "kind": "function",
          "signature": "async exportBrainAsCompressedJson(motor)",
          "summary": ""
        },
        {
          "name": "importBrainFromJson",
          "kind": "function",
          "signature": "importBrainFromJson(motor, jsonStr)",
          "summary": "Import a JSON string (from exportBrainAsJson) into a motor."
        },
        {
          "name": "importBrainFromJsonAsync",
          "kind": "function",
          "signature": "async importBrainFromJsonAsync(motor, jsonStr)",
          "summary": ""
        },
        {
          "name": "upgradeBrain",
          "kind": "function",
          "signature": "upgradeBrain(motor, newTier)",
          "summary": "Upgrade a motor to a bigger tier. Weight matrices are transplanted so the pre-upgrade behavior is preserved; new neurons start with near-zero influence and gradually learn new behaviors. Returns true if upgraded, false if target tier isn't actually bigger."
        },
        {
          "name": "getUpgradeOptions",
          "kind": "function",
          "signature": "getUpgradeOptions(currentTier)",
          "summary": "Check which tiers an entity can upgrade to (tier order: tiny→small→medium→large→huge)."
        },
        {
          "name": "BRAIN_TIERS",
          "kind": "constant",
          "signature": "BRAIN_TIERS",
          "summary": ""
        },
        {
          "name": "TIER_LADDER",
          "kind": "constant",
          "signature": "TIER_LADDER",
          "summary": ""
        },
        {
          "name": "MAGICAL_TIERS",
          "kind": "constant",
          "signature": "MAGICAL_TIERS",
          "summary": ""
        },
        {
          "name": "INTELLIGENCE_TIERS",
          "kind": "constant",
          "signature": "INTELLIGENCE_TIERS",
          "summary": ""
        },
        {
          "name": "MAX_BRAIN_BYTES",
          "kind": "constant",
          "signature": "MAX_BRAIN_BYTES",
          "summary": ""
        },
        {
          "name": "WARN_BRAIN_BYTES",
          "kind": "constant",
          "signature": "WARN_BRAIN_BYTES",
          "summary": ""
        },
        {
          "name": "MAX_PLAYER_SLOTS",
          "kind": "constant",
          "signature": "MAX_PLAYER_SLOTS",
          "summary": ""
        },
        {
          "name": "STATE_INTENTS",
          "kind": "constant",
          "signature": "STATE_INTENTS",
          "summary": ""
        },
        {
          "name": "NUM_INTENTS",
          "kind": "constant",
          "signature": "NUM_INTENTS",
          "summary": ""
        },
        {
          "name": "ACTION_SIZE",
          "kind": "re-export",
          "signature": "ACTION_SIZE",
          "summary": ""
        },
        {
          "name": "BONE_ORDER",
          "kind": "re-export",
          "signature": "BONE_ORDER",
          "summary": ""
        },
        {
          "name": "OBS_SIZE",
          "kind": "re-export",
          "signature": "OBS_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/NeuralResidualController",
      "path": "engine/reference/assets/rig/active-body/NeuralResidualController.md",
      "source": "engine/assets/rig/active-body/NeuralResidualController.js",
      "import": "/engine/assets/rig/active-body/NeuralResidualController.js",
      "sourceHash": "fe1dcf5e7ba692d548678bb06744070359634ca587c725af7b8114cab12321c7",
      "summary": "engine/assets/rig/active-body/NeuralResidualController.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns the humanoid rotation-residual cluster: converting NN bone offsets into axis-angle residuals blended on top of kinematic rotation targets, and zeroing out idle-state NN drift on the horizontal (and, for a fixed set of upper-body bones, vertical) axes so a \"resting\" NN doesn't slowly walk the pose off-target. Pure functions — callers (the pose-target pipeline, still in ActiveBodySystem.js) own all the surrounding per-frame state.",
      "exports": [
        {
          "name": "dampIdleNeuralOffsets",
          "kind": "function",
          "signature": "dampIdleNeuralOffsets(offsets)",
          "summary": ""
        },
        {
          "name": "extractRotationTargets",
          "kind": "function",
          "signature": "extractRotationTargets(poseTargets)",
          "summary": ""
        },
        {
          "name": "computeNeuralRotationResidualHints",
          "kind": "function",
          "signature": "computeNeuralRotationResidualHints(rotationTargets, poseState, neuralOffsets = null, weight = 1)",
          "summary": ""
        },
        {
          "name": "neuralOffsetToAxisAngle",
          "kind": "function",
          "signature": "neuralOffsetToAxisAngle(neuralOffsets, boneId, weight = 1)",
          "summary": ""
        },
        {
          "name": "IDLE_NEURAL_VERTICAL_BLOCK_BONES",
          "kind": "constant",
          "signature": "IDLE_NEURAL_VERTICAL_BLOCK_BONES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/NeuroModifiers",
      "path": "engine/reference/assets/rig/active-body/NeuroModifiers.md",
      "source": "engine/assets/rig/active-body/NeuroModifiers.js",
      "import": "/engine/assets/rig/active-body/NeuroModifiers.js",
      "sourceHash": "a77dd92362a606bd2d59ed2f3821b4ad91a3a897ab4cda04d26e2487caa30ac9",
      "summary": "NeuroModifiers — preset effect profiles that corrupt the NeuralMotor's forward pass to produce realistic neurological symptoms. Each profile mutates the `motor.modifiers` bag on a NeuralMotor instance. Multiple effects stack by summing noise/dropout and multiplying scale. Grounded in real pharmacology/neurology: - alcohol:   inhibits GABA → activation noise + slow reaction (delay) - paralytic: blocks ACh at NMJ → output scale → 0 (limp) - stimulant: excess catecholamines → amplified output, jitter - tranq:    dopamine block → output scale 0.4, delay 3 - poison:   neural death → growing dropout + decreasing scale - seizure:  hypersynchronous discharge → huge activation spikes - tremor:   basal-ganglia dysfn (Parkinson) → coherent 4-6 Hz oscillation",
      "exports": [
        {
          "name": "applyNeuroProfile",
          "kind": "function",
          "signature": "applyNeuroProfile(motor, profileName)",
          "summary": "Apply a preset profile to a NeuralMotor (replaces current modifiers)."
        },
        {
          "name": "rampNeuroProfile",
          "kind": "function",
          "signature": "rampNeuroProfile(motor, profileName, t)",
          "summary": "Blend toward a profile over time — e.g. poison progression. `t` ∈ [0,1] is how far along the progression is."
        },
        {
          "name": "clearNeuroModifiers",
          "kind": "function",
          "signature": "clearNeuroModifiers(motor)",
          "summary": "Reset all neuromodifiers to healthy."
        },
        {
          "name": "applyNeuroJerks",
          "kind": "function",
          "signature": "applyNeuroJerks(ragdoll, motor, time, dt)",
          "summary": "Apply neuromodifier effects DIRECTLY to the ragdoll bones, bypassing the NN. Needed because the NN only runs during `getup` state; seizures etc. should be visible in ANY state (idle, fallen, walking). This is the physical manifestation of motor-cortex corruption: tremor      → coherent sinusoidal force (Parkinsonian shake) seizureAmp  → random large impulses (tonic-clonic thrashing) noise       → Gaussian jitter on force (alcohol wobble) scale       → global force multiplier (paralytic = 0 → body goes limp) Scales with bone mass so effects feel right (heavy pelvis thrashes harder than hand). Called each frame in the main update loop."
        },
        {
          "name": "NEURO_PROFILES",
          "kind": "constant",
          "signature": "NEURO_PROFILES",
          "summary": "NeuroModifiers — preset effect profiles that corrupt the NeuralMotor's forward pass to produce realistic neurological symptoms. Each profile mutates the `motor.modifiers` bag on a NeuralMotor instance. Multiple effects stack by summing noise/dropout and multiplying scale. Grounded in real pharmacology/neurology: - alcohol:   inhibits GABA → activation noise + slow reaction (delay) - paralytic: blocks ACh at NMJ → output scale → 0 (limp) - stimulant: excess catecholamines → amplified output, jitter - tranq:    dopamine block → output scale 0.4, delay 3 - poison:   neural death → growing dropout + decreasing scale - seizure:  hypersynchronous discharge → huge activation spikes - tremor:   basal-ganglia dysfn (Parkinson) → coherent 4-6 Hz oscillation"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/OrientationAudit",
      "path": "engine/reference/assets/rig/active-body/OrientationAudit.md",
      "source": "engine/assets/rig/active-body/OrientationAudit.js",
      "import": "/engine/assets/rig/active-body/OrientationAudit.js",
      "sourceHash": "d757e89e70564ee44da99e3e9999a90d76b1b5fac75f567f017c1adc23146f95",
      "summary": "engine/assets/rig/active-body/OrientationAudit.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns pure console.log debug tracing: per-frame locomotion-target deltas, the body-vs-particle-vs-facing orientation audit, and the authored-pose directional-consistency self-check (knees/elbows/toes/belly orientation). Distinct from DebugOverlay.js's structured readback data — this is developer-console tracing only, no return values consumed by callers.",
      "exports": [
        {
          "name": "logLocomotionTargetTrace",
          "kind": "function",
          "signature": "logLocomotionTargetTrace(entry, ragdoll, targets, meta)",
          "summary": ""
        },
        {
          "name": "logOrientationAudit",
          "kind": "function",
          "signature": "logOrientationAudit(entry, ragdoll)",
          "summary": ""
        },
        {
          "name": "logFinalDirectionAudit",
          "kind": "function",
          "signature": "logFinalDirectionAudit(entry)",
          "summary": ""
        },
        {
          "name": "lHandDelta",
          "kind": "function",
          "signature": "lHandDelta(yaw, bfX, bfZ)",
          "summary": ""
        },
        {
          "name": "auditAllPoses",
          "kind": "function",
          "signature": "auditAllPoses()",
          "summary": ""
        },
        {
          "name": "auditPose",
          "kind": "function",
          "signature": "auditPose(pose)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/PhysicsMotor",
      "path": "engine/reference/assets/rig/active-body/PhysicsMotor.md",
      "source": "engine/assets/rig/active-body/PhysicsMotor.js",
      "import": "/engine/assets/rig/active-body/PhysicsMotor.js",
      "sourceHash": "cf857e1668d16cbc09c776cc9492c6dce8a3c9de4dbbef11b2714b151520981f",
      "summary": "engine/assets/rig/active-body/PhysicsMotor.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns the pure physics-application layer for the humanoid Verlet/PBD ragdoll: initial walking-skeleton kinematic pose construction, pelvis anchoring, per-bone joint-torque drive, and hinge-limit computation/enforcement + compliance scaling. Separate concern from pose-TARGET computation (still in ActiveBodySystem.js) — this module only turns targets/limits into forces applied to the ragdoll's particles.",
      "exports": [
        {
          "name": "buildWalkingSkeleton",
          "kind": "function",
          "signature": "buildWalkingSkeleton(anchor, nav, m)",
          "summary": ""
        },
        {
          "name": "setRagdollPose",
          "kind": "function",
          "signature": "setRagdollPose(ragdoll, anchor, m, options = {})",
          "summary": ""
        },
        {
          "name": "currentPelvisPosition",
          "kind": "function",
          "signature": "currentPelvisPosition(ragdoll)",
          "summary": ""
        },
        {
          "name": "applyPelvisAnchor",
          "kind": "function",
          "signature": "applyPelvisAnchor(ragdoll, skeleton, dt)",
          "summary": ""
        },
        {
          "name": "applyJointTorques",
          "kind": "function",
          "signature": "applyJointTorques(ragdoll, skeleton, dt, state, driveByBone = null)",
          "summary": ""
        },
        {
          "name": "computeHingeLimits",
          "kind": "function",
          "signature": "computeHingeLimits(ragdoll, m, jointLimitsByBone = null)",
          "summary": ""
        },
        {
          "name": "applyHingeLimits",
          "kind": "function",
          "signature": "applyHingeLimits(limits)",
          "summary": ""
        },
        {
          "name": "complianceStrength",
          "kind": "function",
          "signature": "complianceStrength(jointLimitsByBone)",
          "summary": ""
        },
        {
          "name": "complianceStrengthFor",
          "kind": "function",
          "signature": "complianceStrengthFor(jointLimitsByBone, names, fallback = 1)",
          "summary": ""
        },
        {
          "name": "jointSwingScaleFor",
          "kind": "function",
          "signature": "jointSwingScaleFor(jointLimitsByBone, names, defaultSwingDeg)",
          "summary": ""
        },
        {
          "name": "jointTwistScaleFor",
          "kind": "function",
          "signature": "jointTwistScaleFor(jointLimitsByBone, names, defaultTwistDeg)",
          "summary": ""
        },
        {
          "name": "JOINT_STIFFNESS",
          "kind": "constant",
          "signature": "JOINT_STIFFNESS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/PoseAuthority",
      "path": "engine/reference/assets/rig/active-body/PoseAuthority.md",
      "source": "engine/assets/rig/active-body/PoseAuthority.js",
      "import": "/engine/assets/rig/active-body/PoseAuthority.js",
      "sourceHash": "20aa316053b6aa08d91e1a16c3092bff57fce0304131ef23c077a7fd24e34987",
      "summary": "engine/assets/rig/active-body/PoseAuthority.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). This is the hardest and last Phase 7 cluster: the humanoid standing/getup pose-target pipeline — applyStandingController (kinematic pose blending, walk-cycle overlay, balance correction, rhythm/breathing modulation, contact reflexes, brace protection, NN residual blending, training) and applyGetupController (orientation-aware rise sequencing), plus every helper they call (limb/shoulder/head stabilization, reflex classification, motor-authority mapping, pose-state resolution). Deliberately NOT split further — these helpers are tightly entangled with the two controller functions and with each other; see the Phase 7 pre-work notes in the roadmap doc.",
      "exports": [
        {
          "name": "coupleShoulderGirdleTargets",
          "kind": "function",
          "signature": "coupleShoulderGirdleTargets(entry, ragdoll, targets, yaw)",
          "summary": ""
        },
        {
          "name": "getBodySideAxis",
          "kind": "function",
          "signature": "getBodySideAxis(entry, ragdoll, yaw = null, preferYaw = false)",
          "summary": ""
        },
        {
          "name": "clampTargetToSide",
          "kind": "function",
          "signature": "clampTargetToSide(targets, name, base, side, minSide, isLeft, strength = 1)",
          "summary": ""
        },
        {
          "name": "alignFootToeTargets",
          "kind": "function",
          "signature": "alignFootToeTargets(entry, targets, yaw, leftLegIsSwing = false, rightLegIsSwing = false, isWalking = false)",
          "summary": ""
        },
        {
          "name": "clampLimbSideTargets",
          "kind": "function",
          "signature": "clampLimbSideTargets(entry, ragdoll, targets, yaw = null)",
          "summary": ""
        },
        {
          "name": "stabilizeLimbSideFrame",
          "kind": "function",
          "signature": "stabilizeLimbSideFrame(entry, ragdoll, dt)",
          "summary": ""
        },
        {
          "name": "stabilizeShoulderGirdleFrame",
          "kind": "function",
          "signature": "stabilizeShoulderGirdleFrame(entry, ragdoll)",
          "summary": ""
        },
        {
          "name": "dampRelativeVelocity",
          "kind": "function",
          "signature": "dampRelativeVelocity(child, parent, keep, dt)",
          "summary": ""
        },
        {
          "name": "stabilizeHeadNeckFrame",
          "kind": "function",
          "signature": "stabilizeHeadNeckFrame(entry, ragdoll, dt)",
          "summary": ""
        },
        {
          "name": "hasActiveMoveIntent",
          "kind": "function",
          "signature": "hasActiveMoveIntent(entry)",
          "summary": ""
        },
        {
          "name": "applyGroundedNoIntentSettleBrake",
          "kind": "function",
          "signature": "applyGroundedNoIntentSettleBrake(entry, ragdoll, dt)",
          "summary": ""
        },
        {
          "name": "applyBalanceCorrectionToTargets",
          "kind": "function",
          "signature": "applyBalanceCorrectionToTargets(targets, balanceState, weight = 1)",
          "summary": ""
        },
        {
          "name": "applyRhythmPoseModulation",
          "kind": "function",
          "signature": "applyRhythmPoseModulation(targets, rhythms, weight = 1, fatigue = 0)",
          "summary": ""
        },
        {
          "name": "makeReflexState",
          "kind": "function",
          "signature": "makeReflexState()",
          "summary": ""
        },
        {
          "name": "applyContactReflexTargets",
          "kind": "function",
          "signature": "applyContactReflexTargets(entry, ragdoll, targets, options = {})",
          "summary": ""
        },
        {
          "name": "classifyReflexMode",
          "kind": "function",
          "signature": "classifyReflexMode(entry, options)",
          "summary": ""
        },
        {
          "name": "reflexConfidence",
          "kind": "function",
          "signature": "reflexConfidence(contactTelemetry, mode, leftTrust, rightTrust)",
          "summary": ""
        },
        {
          "name": "buildMotorAuthorityMap",
          "kind": "function",
          "signature": "buildMotorAuthorityMap(entry, contactTelemetry)",
          "summary": ""
        },
        {
          "name": "applyFootReflexTarget",
          "kind": "function",
          "signature": "applyFootReflexTarget(entry, targets, record, options)",
          "summary": ""
        },
        {
          "name": "applyBraceProtectionTargets",
          "kind": "function",
          "signature": "applyBraceProtectionTargets(contactTelemetry, targets, options)",
          "summary": ""
        },
        {
          "name": "resolveActivePoseState",
          "kind": "function",
          "signature": "resolveActivePoseState(entry)",
          "summary": ""
        },
        {
          "name": "makePoseStateMeta",
          "kind": "function",
          "signature": "makePoseStateMeta(stateId)",
          "summary": ""
        },
        {
          "name": "applyStandingController",
          "kind": "function",
          "signature": "applyStandingController(ragdoll, entry, dt)",
          "summary": ""
        },
        {
          "name": "_bonesByName",
          "kind": "function",
          "signature": "_bonesByName(ragdoll)",
          "summary": ""
        },
        {
          "name": "applyGetupController",
          "kind": "function",
          "signature": "applyGetupController(ragdoll, entry, dt)",
          "summary": ""
        },
        {
          "name": "getBoneRadius",
          "kind": "function",
          "signature": "getBoneRadius(boneId, m)",
          "summary": ""
        },
        {
          "name": "stateToString",
          "kind": "function",
          "signature": "stateToString(state)",
          "summary": ""
        },
        {
          "name": "WALK_HORIZONTAL_SCALE_BY_BONE",
          "kind": "constant",
          "signature": "WALK_HORIZONTAL_SCALE_BY_BONE",
          "summary": ""
        },
        {
          "name": "WALK_HORIZONTAL_DAMPING_SCALE_BY_BONE",
          "kind": "constant",
          "signature": "WALK_HORIZONTAL_DAMPING_SCALE_BY_BONE",
          "summary": ""
        },
        {
          "name": "IDLE_HORIZONTAL_SCALE_BY_BONE",
          "kind": "constant",
          "signature": "IDLE_HORIZONTAL_SCALE_BY_BONE",
          "summary": ""
        },
        {
          "name": "IDLE_HORIZONTAL_DAMPING_SCALE_BY_BONE",
          "kind": "constant",
          "signature": "IDLE_HORIZONTAL_DAMPING_SCALE_BY_BONE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/UniversalLegScheduler",
      "path": "engine/reference/assets/rig/active-body/UniversalLegScheduler.md",
      "source": "engine/assets/rig/active-body/UniversalLegScheduler.js",
      "import": "/engine/assets/rig/active-body/UniversalLegScheduler.js",
      "sourceHash": "6ec7aa4e3c3db39543b7b9e9b493e84c081c39aef12d69178f923d4d344ec31c",
      "summary": "engine/assets/rig/active-body/UniversalLegScheduler.js — extracted from ActiveBodySystem.js (Ragdoll Stack Consolidation Roadmap, Phase 7). Owns N-legged support-polygon analysis and gait-preset recommendation for the generic/readback-only \"universal leg scheduler\" — the leg discovery, phase, and support-polygon math shared conceptually with the animal gait system, but exposed here purely as debug/readback (ActiveBodySystem's getReadback() is the only call site; it does not drive live pose targets).",
      "exports": [
        {
          "name": "makeUniversalLegSchedulerReadback",
          "kind": "function",
          "signature": "makeUniversalLegSchedulerReadback(entry, contactTelemetry)",
          "summary": ""
        },
        {
          "name": "discoverUniversalLegs",
          "kind": "function",
          "signature": "discoverUniversalLegs(entry)",
          "summary": ""
        },
        {
          "name": "normalizeUniversalLegDescriptors",
          "kind": "function",
          "signature": "normalizeUniversalLegDescriptors(descriptors, entry, allowMetadataOnly = true)",
          "summary": ""
        },
        {
          "name": "defaultUniversalLegRhythmIndex",
          "kind": "function",
          "signature": "defaultUniversalLegRhythmIndex(descriptor)",
          "summary": ""
        },
        {
          "name": "makeUniversalLegReadback",
          "kind": "function",
          "signature": "makeUniversalLegReadback(entry, leg, contactTelemetry)",
          "summary": ""
        },
        {
          "name": "makeUniversalSupportAnalysis",
          "kind": "function",
          "signature": "makeUniversalSupportAnalysis(entry, legs)",
          "summary": ""
        },
        {
          "name": "universalLegState",
          "kind": "function",
          "signature": "universalLegState(contact, swingAmount)",
          "summary": ""
        },
        {
          "name": "getUniversalLegPhase",
          "kind": "function",
          "signature": "getUniversalLegPhase(entry, leg)",
          "summary": ""
        },
        {
          "name": "supportModeFor",
          "kind": "function",
          "signature": "supportModeFor(pointCount, legCount)",
          "summary": ""
        },
        {
          "name": "supportComMargin",
          "kind": "function",
          "signature": "supportComMargin(com, points)",
          "summary": ""
        },
        {
          "name": "recoveryDirection",
          "kind": "function",
          "signature": "recoveryDirection(com, center)",
          "summary": ""
        },
        {
          "name": "signedPolygonMargin2D",
          "kind": "function",
          "signature": "signedPolygonMargin2D(point, polygon)",
          "summary": ""
        },
        {
          "name": "pointInPolygon2D",
          "kind": "function",
          "signature": "pointInPolygon2D(point, polygon)",
          "summary": ""
        },
        {
          "name": "distancePointToSegment2D",
          "kind": "function",
          "signature": "distancePointToSegment2D(point, a, b)",
          "summary": ""
        },
        {
          "name": "distance2D",
          "kind": "function",
          "signature": "distance2D(a, b)",
          "summary": ""
        },
        {
          "name": "particlePoint",
          "kind": "function",
          "signature": "particlePoint(entry, boneName)",
          "summary": ""
        },
        {
          "name": "hasBone",
          "kind": "function",
          "signature": "hasBone(entry, boneName)",
          "summary": ""
        },
        {
          "name": "recommendUniversalGaitPreset",
          "kind": "function",
          "signature": "recommendUniversalGaitPreset(entry, legCount)",
          "summary": ""
        },
        {
          "name": "copyUniversalGaitPresets",
          "kind": "function",
          "signature": "copyUniversalGaitPresets(legCount)",
          "summary": ""
        },
        {
          "name": "copyUniversalGaitPresetMap",
          "kind": "function",
          "signature": "copyUniversalGaitPresetMap()",
          "summary": ""
        },
        {
          "name": "makeGenericOddLegWavePreset",
          "kind": "function",
          "signature": "makeGenericOddLegWavePreset(legCount)",
          "summary": ""
        },
        {
          "name": "UNIVERSAL_GAIT_PRESETS",
          "kind": "constant",
          "signature": "UNIVERSAL_GAIT_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/BioelectricSignals",
      "path": "engine/reference/assets/rig/active-body/anatomy/BioelectricSignals.md",
      "source": "engine/assets/rig/active-body/anatomy/BioelectricSignals.js",
      "import": "/engine/assets/rig/active-body/anatomy/BioelectricSignals.js",
      "sourceHash": "61797b795d584da214afec1b25e0bd58f7fde93d342a10c406d7546f50e583f8",
      "summary": "",
      "exports": [
        {
          "name": "createBioelectricSignalState",
          "kind": "function",
          "signature": "createBioelectricSignalState()",
          "summary": ""
        },
        {
          "name": "stepBioelectricSignals",
          "kind": "function",
          "signature": "stepBioelectricSignals(state, inputs = {}, dt = 0)",
          "summary": ""
        },
        {
          "name": "getBioelectricSignalReadback",
          "kind": "function",
          "signature": "getBioelectricSignalReadback(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/BreathingBodyCoupling",
      "path": "engine/reference/assets/rig/active-body/anatomy/BreathingBodyCoupling.md",
      "source": "engine/assets/rig/active-body/anatomy/BreathingBodyCoupling.js",
      "import": "/engine/assets/rig/active-body/anatomy/BreathingBodyCoupling.js",
      "sourceHash": "46522ef6b4ff5ed2a3acd567e1acaaeb34f3955a8d9ec84706b4cd4aafe48a92",
      "summary": "",
      "exports": [
        {
          "name": "getBreathingBodyCouplingReadback",
          "kind": "function",
          "signature": "getBreathingBodyCouplingReadback(diaphragm = null, rhythms = null)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/CirculatorySystem",
      "path": "engine/reference/assets/rig/active-body/anatomy/CirculatorySystem.md",
      "source": "engine/assets/rig/active-body/anatomy/CirculatorySystem.js",
      "import": "/engine/assets/rig/active-body/anatomy/CirculatorySystem.js",
      "sourceHash": "3a48443b0fde9fe6798c124e204a89919e5647a08f327f4b4d3774943d6c7757",
      "summary": "",
      "exports": [
        {
          "name": "createCirculatoryState",
          "kind": "function",
          "signature": "createCirculatoryState()",
          "summary": ""
        },
        {
          "name": "stepCirculation",
          "kind": "function",
          "signature": "stepCirculation(state, inputs = {}, dt = 0)",
          "summary": ""
        },
        {
          "name": "getCirculatoryReadback",
          "kind": "function",
          "signature": "getCirculatoryReadback(state)",
          "summary": ""
        },
        {
          "name": "getCirculationGraphReadback",
          "kind": "function",
          "signature": "getCirculationGraphReadback(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/DiaphragmSystem",
      "path": "engine/reference/assets/rig/active-body/anatomy/DiaphragmSystem.md",
      "source": "engine/assets/rig/active-body/anatomy/DiaphragmSystem.js",
      "import": "/engine/assets/rig/active-body/anatomy/DiaphragmSystem.js",
      "sourceHash": "0db0ed59c44426ea5ed69947470eeaa284cc8a46f9ae6047db717a8af912d8ec",
      "summary": "",
      "exports": [
        {
          "name": "createDiaphragmState",
          "kind": "function",
          "signature": "createDiaphragmState(anatomy = null)",
          "summary": ""
        },
        {
          "name": "stepDiaphragm",
          "kind": "function",
          "signature": "stepDiaphragm(state, rhythms = null, dt = 0)",
          "summary": ""
        },
        {
          "name": "getDiaphragmReadback",
          "kind": "function",
          "signature": "getDiaphragmReadback(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/NervousSystem",
      "path": "engine/reference/assets/rig/active-body/anatomy/NervousSystem.md",
      "source": "engine/assets/rig/active-body/anatomy/NervousSystem.js",
      "import": "/engine/assets/rig/active-body/anatomy/NervousSystem.js",
      "sourceHash": "87c053a072fbf4c61c0774e0b2691a08945ccbaa7078cec74e1a2039d5e40e5f",
      "summary": "",
      "exports": [
        {
          "name": "createNervousSystemState",
          "kind": "function",
          "signature": "createNervousSystemState()",
          "summary": ""
        },
        {
          "name": "stepNervousSystem",
          "kind": "function",
          "signature": "stepNervousSystem(state, inputs = {}, dt = 0)",
          "summary": ""
        },
        {
          "name": "getNervousSystemReadback",
          "kind": "function",
          "signature": "getNervousSystemReadback(state)",
          "summary": ""
        },
        {
          "name": "getNerveGraphReadback",
          "kind": "function",
          "signature": "getNerveGraphReadback(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/OrganDamageSystem",
      "path": "engine/reference/assets/rig/active-body/anatomy/OrganDamageSystem.md",
      "source": "engine/assets/rig/active-body/anatomy/OrganDamageSystem.js",
      "import": "/engine/assets/rig/active-body/anatomy/OrganDamageSystem.js",
      "sourceHash": "d966140a921de055dc49c061d895728a05fbde0a55bd68492a69488ebb70f4f7",
      "summary": "",
      "exports": [
        {
          "name": "createOrganDamageState",
          "kind": "function",
          "signature": "createOrganDamageState()",
          "summary": ""
        },
        {
          "name": "applyOrganDamage",
          "kind": "function",
          "signature": "applyOrganDamage(state, organs, target, amount, options = {})",
          "summary": ""
        },
        {
          "name": "stepOrganDamage",
          "kind": "function",
          "signature": "stepOrganDamage(state, organs, inputs = {}, dt = 0)",
          "summary": ""
        },
        {
          "name": "getOrganDamageReadback",
          "kind": "function",
          "signature": "getOrganDamageReadback(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/OrganSystem",
      "path": "engine/reference/assets/rig/active-body/anatomy/OrganSystem.md",
      "source": "engine/assets/rig/active-body/anatomy/OrganSystem.js",
      "import": "/engine/assets/rig/active-body/anatomy/OrganSystem.js",
      "sourceHash": "4e1b03b28a3094b80f377571e87a40d239efe596e0954418d4b6a4380b8542f9",
      "summary": "",
      "exports": [
        {
          "name": "createOrganState",
          "kind": "function",
          "signature": "createOrganState(anatomy = null, attachments = null)",
          "summary": ""
        },
        {
          "name": "getOrganReadback",
          "kind": "function",
          "signature": "getOrganReadback(organs)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/PBPKSystem",
      "path": "engine/reference/assets/rig/active-body/anatomy/PBPKSystem.md",
      "source": "engine/assets/rig/active-body/anatomy/PBPKSystem.js",
      "import": "/engine/assets/rig/active-body/anatomy/PBPKSystem.js",
      "sourceHash": "61dd070c8f412c089b00f2be106c6e3894e6f06786aa9aa9629be82d9da5c638",
      "summary": "",
      "exports": [
        {
          "name": "createPBPKState",
          "kind": "function",
          "signature": "createPBPKState()",
          "summary": ""
        },
        {
          "name": "addPBPKDose",
          "kind": "function",
          "signature": "addPBPKDose(state, substanceId, amount, options = {})",
          "summary": ""
        },
        {
          "name": "stepPBPK",
          "kind": "function",
          "signature": "stepPBPK(state, inputs = {}, dt = 0)",
          "summary": ""
        },
        {
          "name": "getPBPKReadback",
          "kind": "function",
          "signature": "getPBPKReadback(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/SoftTissueSystem",
      "path": "engine/reference/assets/rig/active-body/anatomy/SoftTissueSystem.md",
      "source": "engine/assets/rig/active-body/anatomy/SoftTissueSystem.js",
      "import": "/engine/assets/rig/active-body/anatomy/SoftTissueSystem.js",
      "sourceHash": "b8e9554b27f3a970a7b3ca7fe065387da8487914c2a3498218f380f81bd44761",
      "summary": "",
      "exports": [
        {
          "name": "createSoftTissueState",
          "kind": "function",
          "signature": "createSoftTissueState(anatomy = null)",
          "summary": ""
        },
        {
          "name": "stepSoftTissue",
          "kind": "function",
          "signature": "stepSoftTissue(state, inputs = {}, dt = 0)",
          "summary": ""
        },
        {
          "name": "getSoftTissueReadback",
          "kind": "function",
          "signature": "getSoftTissueReadback(state)",
          "summary": ""
        },
        {
          "name": "sampleSoftTissueBoneMotion",
          "kind": "function",
          "signature": "sampleSoftTissueBoneMotion(ragdoll = null)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/VitalSigns",
      "path": "engine/reference/assets/rig/active-body/anatomy/VitalSigns.md",
      "source": "engine/assets/rig/active-body/anatomy/VitalSigns.js",
      "import": "/engine/assets/rig/active-body/anatomy/VitalSigns.js",
      "sourceHash": "ebbe7e8ce0a1f373c30c10d2cfc5432910d89e3694ed05673b638a9ce2d9d4d9",
      "summary": "",
      "exports": [
        {
          "name": "createVitalSignsState",
          "kind": "function",
          "signature": "createVitalSignsState()",
          "summary": ""
        },
        {
          "name": "stepVitalSigns",
          "kind": "function",
          "signature": "stepVitalSigns(state, inputs = {}, dt = 0)",
          "summary": ""
        },
        {
          "name": "getVitalSignsReadback",
          "kind": "function",
          "signature": "getVitalSignsReadback(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/active-body/anatomy/index",
      "path": "engine/reference/assets/rig/active-body/anatomy/index.md",
      "source": "engine/assets/rig/active-body/anatomy/index.js",
      "import": "/engine/assets/rig/active-body/anatomy/index.js",
      "sourceHash": "91f6bf23500772b0a1250ca2d2cd83a7756d7e77302a50fd41155c496e782d4b",
      "summary": "engine/assets/rig/active-body/anatomy/index.js — anatomy subsystem barrel. Every other subsystem in the engine exposes a barrel (`voxel/index.js`, `sim/ai/index.js`, `gameplay/perception/index.js`); the anatomy modules did not, which is part of why they were unreachable from any compiled bundle. This is purely additive — no module below is modified, and nothing that already imports these files by path is affected. The subsystem models a body as interacting physiological systems rather than a hit-point total: - `OrganSystem`        per-organ integrity, perfusion, oxygenation, function - `OrganDamageSystem`  wounds by mechanism, bleeding, hypoxia, shock - `CirculatorySystem`  cardiac output, per-limb and per-organ blood flow - `NervousSystem`      spinal cord, 16 peripheral regions, motor authority, and per-region motor/sensory/touch/pain channels - `VitalSigns`         heart rate, respiration, blood pressure, SpO2 - `DiaphragmSystem`    breathing drive and rib/sternum coupling - `BreathingBodyCoupling` breathing translated into bone pose offsets - `SoftTissueSystem`   mass-spring tissue displacement and strain - `PBPKSystem`         multi-compartment pharmacokinetics for any substance - `BioelectricSignals` low-level signal propagation",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/rig/index",
      "path": "engine/reference/assets/rig/index.md",
      "source": "engine/assets/rig/index.js",
      "import": "/engine/assets/rig/index.js",
      "sourceHash": "6e52ae51a35af1202bed06c804bcbd9b5d23a577c3912a3ccd615b01f3eb2dfe",
      "summary": "Stable public rig surface for raw modules, Engine.Rig, and bundled PE.Rig. The named groups preserve each source module's boundary while the flat functions keep the existing engine/assets API available without adapters.",
      "exports": [
        {
          "name": "JointLimits",
          "kind": "constant",
          "signature": "JointLimits",
          "summary": "Stable public rig surface for raw modules, Engine.Rig, and bundled PE.Rig. The named groups preserve each source module's boundary while the flat functions keep the existing engine/assets API available without adapters."
        },
        {
          "name": "RagdollBuilder",
          "kind": "constant",
          "signature": "RagdollBuilder",
          "summary": ""
        },
        {
          "name": "RagdollSim",
          "kind": "constant",
          "signature": "RagdollSim",
          "summary": ""
        },
        {
          "name": "RagdollSkinning",
          "kind": "constant",
          "signature": "RagdollSkinning",
          "summary": ""
        },
        {
          "name": "CharacterPhysicsAsset",
          "kind": "constant",
          "signature": "CharacterPhysicsAsset",
          "summary": ""
        },
        {
          "name": "BodyTemplateExport",
          "kind": "constant",
          "signature": "BodyTemplateExport",
          "summary": ""
        },
        {
          "name": "Rig",
          "kind": "constant",
          "signature": "Rig",
          "summary": ""
        },
        {
          "name": "CHARACTER_PHYSICS_ASSET_SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "CHARACTER_PHYSICS_ASSET_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "JOINT_TYPE",
          "kind": "re-export",
          "signature": "JOINT_TYPE",
          "summary": ""
        },
        {
          "name": "buildGenericRagdoll",
          "kind": "re-export",
          "signature": "buildGenericRagdoll",
          "summary": ""
        },
        {
          "name": "buildHumanoidRagdoll",
          "kind": "re-export",
          "signature": "buildHumanoidRagdoll",
          "summary": ""
        },
        {
          "name": "buildJointLimits",
          "kind": "re-export",
          "signature": "buildJointLimits",
          "summary": ""
        },
        {
          "name": "buildRagdoll",
          "kind": "re-export",
          "signature": "buildRagdoll",
          "summary": ""
        },
        {
          "name": "buildSkinnedRagdoll",
          "kind": "re-export",
          "signature": "buildSkinnedRagdoll",
          "summary": ""
        },
        {
          "name": "characterPhysicsAssetToBodyTemplate",
          "kind": "re-export",
          "signature": "characterPhysicsAssetToBodyTemplate",
          "summary": ""
        },
        {
          "name": "computeSkeletonFingerprint",
          "kind": "re-export",
          "signature": "computeSkeletonFingerprint",
          "summary": ""
        },
        {
          "name": "countTypes",
          "kind": "re-export",
          "signature": "countTypes",
          "summary": ""
        },
        {
          "name": "createCharacterPhysicsAsset",
          "kind": "re-export",
          "signature": "createCharacterPhysicsAsset",
          "summary": ""
        },
        {
          "name": "createRagdollSim",
          "kind": "re-export",
          "signature": "createRagdollSim",
          "summary": ""
        },
        {
          "name": "deriveBendDirection",
          "kind": "re-export",
          "signature": "deriveBendDirection",
          "summary": ""
        },
        {
          "name": "deriveHingeLimit",
          "kind": "re-export",
          "signature": "deriveHingeLimit",
          "summary": ""
        },
        {
          "name": "deriveHumanoidJointLimits",
          "kind": "re-export",
          "signature": "deriveHumanoidJointLimits",
          "summary": ""
        },
        {
          "name": "deriveJointType",
          "kind": "re-export",
          "signature": "deriveJointType",
          "summary": ""
        },
        {
          "name": "deriveSkeletonJointLimits",
          "kind": "re-export",
          "signature": "deriveSkeletonJointLimits",
          "summary": ""
        },
        {
          "name": "deriveSwingCone",
          "kind": "re-export",
          "signature": "deriveSwingCone",
          "summary": ""
        },
        {
          "name": "deriveTwistLimit",
          "kind": "re-export",
          "signature": "deriveTwistLimit",
          "summary": ""
        },
        {
          "name": "hingeAxis",
          "kind": "re-export",
          "signature": "hingeAxis",
          "summary": ""
        },
        {
          "name": "inferDriveType",
          "kind": "re-export",
          "signature": "inferDriveType",
          "summary": ""
        },
        {
          "name": "logSkinnedRagdoll",
          "kind": "re-export",
          "signature": "logSkinnedRagdoll",
          "summary": ""
        },
        {
          "name": "mirrorLeftRightLimits",
          "kind": "re-export",
          "signature": "mirrorLeftRightLimits",
          "summary": ""
        },
        {
          "name": "radiusRatio",
          "kind": "re-export",
          "signature": "radiusRatio",
          "summary": ""
        },
        {
          "name": "ragdollBoneFrames",
          "kind": "re-export",
          "signature": "ragdollBoneFrames",
          "summary": ""
        },
        {
          "name": "ragdollDebugStats",
          "kind": "re-export",
          "signature": "ragdollDebugStats",
          "summary": ""
        },
        {
          "name": "skinPrimitiveInterleaved",
          "kind": "re-export",
          "signature": "skinPrimitiveInterleaved",
          "summary": ""
        },
        {
          "name": "validJointTypeSet",
          "kind": "re-export",
          "signature": "validJointTypeSet",
          "summary": ""
        },
        {
          "name": "validateBoneTopology",
          "kind": "re-export",
          "signature": "validateBoneTopology",
          "summary": ""
        },
        {
          "name": "validateCharacterPhysicsAsset",
          "kind": "re-export",
          "signature": "validateCharacterPhysicsAsset",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vehicle/ChassisDetector",
      "path": "engine/reference/assets/vehicle/ChassisDetector.md",
      "source": "engine/assets/vehicle/ChassisDetector.js",
      "import": "/engine/assets/vehicle/ChassisDetector.js",
      "sourceHash": "742a859046945478eb2e322a0c673ac52e3acd82014e03d02892abc5554b42cd",
      "summary": "engine/assets/vehicle/ChassisDetector.js — identify the chassis + body parts (spec §11). The chassis is the largest non-wheel mesh; remaining meshes are categorized by name (glass/lights/doors) so segmentation and material edits (tint glass, emissive headlights, detach doors) can target them.",
      "exports": [
        {
          "name": "detectChassis",
          "kind": "function",
          "signature": "detectChassis(model, wheelNodeIds = [])",
          "summary": "Identify chassis + body part nodes, excluding the given wheel node ids."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vehicle/VehicleMath",
      "path": "engine/reference/assets/vehicle/VehicleMath.md",
      "source": "engine/assets/vehicle/VehicleMath.js",
      "import": "/engine/assets/vehicle/VehicleMath.js",
      "sourceHash": "1d45737d4a68487d4ebc3ee5e0179f41a482accbb25f3a00b191459187305d33",
      "summary": "engine/assets/vehicle/VehicleMath.js — minimal column-major 4x4 + quaternion helpers for vehicle rig assembly and the visual wheel transform chain. Kept local and dependency-free so the vehicle layer is self-contained and the math stays deterministic (and gate-testable without the renderer).",
      "exports": [
        {
          "name": "identity",
          "kind": "function",
          "signature": "identity()",
          "summary": ""
        },
        {
          "name": "multiply",
          "kind": "function",
          "signature": "multiply(a, b)",
          "summary": "Column-major multiply: out = a * b."
        },
        {
          "name": "composeTRS",
          "kind": "function",
          "signature": "composeTRS(t = [0, 0, 0], q = [0, 0, 0, 1], s = 1)",
          "summary": "Compose a TRS matrix (scale may be a number or [x,y,z])."
        },
        {
          "name": "quatFromAxisAngle",
          "kind": "function",
          "signature": "quatFromAxisAngle(axis, angle)",
          "summary": "Quaternion (xyzw) from an axis + angle (radians)."
        },
        {
          "name": "quatMul",
          "kind": "function",
          "signature": "quatMul(a, b)",
          "summary": "Hamilton product a*b (xyzw)."
        },
        {
          "name": "transformPoint",
          "kind": "function",
          "signature": "transformPoint(m, p)",
          "summary": "Transform a point (vec3) by a column-major 4x4."
        },
        {
          "name": "nodeLocalMatrix",
          "kind": "function",
          "signature": "nodeLocalMatrix(node)",
          "summary": "Local transform of a node (matrix override or TRS)."
        },
        {
          "name": "computeWorldMatrices",
          "kind": "function",
          "signature": "computeWorldMatrices(model)",
          "summary": "World matrices for every node, accumulating the parent chain. Returns a Map(nodeId → Float32Array(16))."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vehicle/VehicleRigBuilder",
      "path": "engine/reference/assets/vehicle/VehicleRigBuilder.md",
      "source": "engine/assets/vehicle/VehicleRigBuilder.js",
      "import": "/engine/assets/vehicle/VehicleRigBuilder.js",
      "sourceHash": "8ae5808e9db0c4398735978f0ef4a470d7b5c2cf2471ac2263d9243d573b326a",
      "summary": "engine/assets/vehicle/VehicleRigBuilder.js — assemble a VehicleAsset (spec §11).  Vehicles are rigged, not merely loaded. This turns detected wheels + chassis into explicit runtime data: WheelSlots (with suspension/tire/drivetrain), front-axle steering, a compound-collider descriptor for the chassis (built via the engine's ConvexDecomposition on demand), and a confidence. Detection failures (e.g. wheels merged into the body) flag needsCorrection rather than guessing — the editor exposes every decision (rule 62).",
      "exports": [
        {
          "name": "buildVehicleRig",
          "kind": "function",
          "signature": "buildVehicleRig(model, opts = {})",
          "summary": "Build a vehicle rig for a model and attach it at model.rigs.vehicle."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vehicle/WheelDetector",
      "path": "engine/reference/assets/vehicle/WheelDetector.md",
      "source": "engine/assets/vehicle/WheelDetector.js",
      "import": "/engine/assets/vehicle/WheelDetector.js",
      "sourceHash": "0a28f7df6d11591d8f3f1ba60d0a1193ccc36f056e2ed8ee0189fdaf361c20b3",
      "summary": "engine/assets/vehicle/WheelDetector.js — find wheels (spec §11).  Detection chain (cheap → expensive), each a HINT with a confidence, never an assertion: name match → cylinder geometry → symmetry / low-corner position → (editor correction). Wheels that are merged into the body mesh won't be found here and fall through to the editor (see VehicleRigBuilder.needsCorrection).",
      "exports": [
        {
          "name": "detectWheels",
          "kind": "function",
          "signature": "detectWheels(model, opts = {})",
          "summary": "Detect wheel candidates in a model."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vehicle/WheelPhysics",
      "path": "engine/reference/assets/vehicle/WheelPhysics.md",
      "source": "engine/assets/vehicle/WheelPhysics.js",
      "import": "/engine/assets/vehicle/WheelPhysics.js",
      "sourceHash": "d9c654cdd156c548ed3635a3b794c4a83b3a2587facfd90b338f45486179b343",
      "summary": "engine/assets/vehicle/WheelPhysics.js — suspension, tire slip, and the visual wheel transform chain (spec §11). Deterministic CPU model used for the inspector/demo and gates; production deployments route the same WheelSlot data into the engine's GPUVehicle. Wheel visuals FOLLOW physics state: chassisWorld · socket · suspension · steer · spin · meshCorrection.",
      "exports": [
        {
          "name": "suspensionForce",
          "kind": "function",
          "signature": "suspensionForce({ restLength, currentLength, stiffness, damping, compressionVelocity = 0 })",
          "summary": "Suspension spring + damper force. compression   = restLength - currentLength springForce   = stiffness * compression damperForce   = damping  * compressionVelocity normalLoad    = max(0, springForce + damperForce)"
        },
        {
          "name": "tireForce",
          "kind": "function",
          "signature": "tireForce(slip, normalLoad, grip, slipStiffness = 12)",
          "summary": "A slip-based tire force (Pacejka-lite): linear near zero slip, saturating at the friction limit `normalLoad * grip`. `slipStiffness` shapes the knee."
        },
        {
          "name": "longitudinalSlip",
          "kind": "function",
          "signature": "longitudinalSlip(wheelAngularVel, radius, groundSpeed)",
          "summary": "Longitudinal slip ratio from wheel surface speed vs ground speed."
        },
        {
          "name": "freeRollAngularVelocity",
          "kind": "function",
          "signature": "freeRollAngularVelocity(groundSpeed, radius)",
          "summary": "Free-rolling angular velocity (rad/s) for a given ground speed."
        },
        {
          "name": "visualWheelMatrix",
          "kind": "function",
          "signature": "visualWheelMatrix(chassisWorld, slot, state = {})",
          "summary": "Compose the visual world matrix for a wheel from chassis world + slot + state."
        },
        {
          "name": "advanceSpin",
          "kind": "function",
          "signature": "advanceSpin(spinAngle, groundSpeed, radius, dt)",
          "summary": "Advance a wheel's spin angle from a ground speed (visual integration)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vehicle/WheelSlot",
      "path": "engine/reference/assets/vehicle/WheelSlot.md",
      "source": "engine/assets/vehicle/WheelSlot.js",
      "import": "/engine/assets/vehicle/WheelSlot.js",
      "sourceHash": "1bc4ed1f7983abd720d317bc82fd6eeac2657fdfc4cc027f4247c674c05de034",
      "summary": "engine/assets/vehicle/WheelSlot.js — vehicle rig schemas (spec §11).  A vehicle is NOT a mesh: it's a visual model + chassis collider + wheel slots + suspension + tire model + drivetrain. Wheel runtime data is explicit and separate from the visible wheel mesh (matching Jolt/Unity wheel colliders), so visuals follow physics rather than the other way around.",
      "exports": [
        {
          "name": "createWheelSlot",
          "kind": "function",
          "signature": "createWheelSlot(init = {})",
          "summary": "A wheel slot: the runtime data for one wheel, decoupled from its visual mesh."
        },
        {
          "name": "createSuspension",
          "kind": "function",
          "signature": "createSuspension(init = {})",
          "summary": ""
        },
        {
          "name": "createTireProfile",
          "kind": "function",
          "signature": "createTireProfile(init = {})",
          "summary": ""
        },
        {
          "name": "createVehicleAsset",
          "kind": "function",
          "signature": "createVehicleAsset(init = {})",
          "summary": "The assembled vehicle rig produced by VehicleRigBuilder. It references the model's nodes/meshes and carries explicit runtime data; it can drive the engine's GPUVehicle physics or the CPU WheelPhysics fallback."
        },
        {
          "name": "DRIVETRAIN",
          "kind": "constant",
          "signature": "DRIVETRAIN",
          "summary": ""
        },
        {
          "name": "WHEEL_PHYSICS_MODE",
          "kind": "constant",
          "signature": "WHEEL_PHYSICS_MODE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vehicle/WheelSpinVisual",
      "path": "engine/reference/assets/vehicle/WheelSpinVisual.md",
      "source": "engine/assets/vehicle/WheelSpinVisual.js",
      "import": "/engine/assets/vehicle/WheelSpinVisual.js",
      "sourceHash": "1dbf87409513016dd0b22c6afec003812002217d6e1a45a81f12e9760776db8d",
      "summary": "engine/assets/vehicle/WheelSpinVisual.js — visual wheel-spin transforms for a rigged vehicle. Separated from physics (WheelPhysics) and detection so the importer/viewer, the editor preview, and the runtime can all reuse one correct implementation.  Approach (matches Unity `transform.Rotate(..,Space.Self)` / Godot `rotate_object_local`): the spin is built in the wheel's MESH-LOCAL space from the detector's per-wheel hub (`localPivot`) and axle (`axleAxisLocal`), then the node hierarchy + import correction carry it to the right world position and orientation automatically (the renderer does `draw = baseDraw · spin_local`).  This avoids transforming the axle into world space, PCA axis ambiguity on low-poly wheels, and pivot guessing — the failure modes of a world-space spin. The only world-space step is a per-wheel SIGN so mirrored wheels roll the same way; the axle vector itself stays the exact per-wheel local axis.",
      "exports": [
        {
          "name": "rotAxis",
          "kind": "function",
          "signature": "rotAxis(axis, angle)",
          "summary": "Column-major rotation about an arbitrary (unit-normalized) axis."
        },
        {
          "name": "pivotSpin",
          "kind": "function",
          "signature": "pivotSpin(pivot, axis, angle)",
          "summary": "Spin about an axis through a pivot: T(pivot) · R(axis,angle) · T(-pivot)."
        },
        {
          "name": "buildWheelSpinMap",
          "kind": "function",
          "signature": "buildWheelSpinMap(model, importMatrix, rig)",
          "summary": "Build a per-wheel spin descriptor map for a rigged model. Each entry carries the wheel's MESH-LOCAL pivot + axle (so the renderer applies the spin in local space: `draw = baseDraw · pivotSpin(pivot, axle, angle)`). The local axle is pre-signed so every wheel rolls the same visual direction. Steerable wheels also carry their local steer axis so the renderer can yaw them with input."
        },
        {
          "name": "rollAngle",
          "kind": "function",
          "signature": "rollAngle(distance, radius)",
          "summary": "Spin angle (radians) for a wheel that has rolled `distance` metres."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/vpath",
      "path": "engine/reference/assets/vpath.md",
      "source": "engine/assets/vpath.js",
      "import": "/engine/assets/vpath.js",
      "sourceHash": "4f5897a9052fa17fdabd4412f6122b7aa1f8e81ca7315656205ccc879420d756",
      "summary": "engine/assets/vpath.js — virtual path system.  Users never manage raw filesystem paths. Everything addresses through a scheme://path virtual path. The resolver (AssetResolver) maps a virtual path to a concrete backend handle; this module only parses/normalizes/builds them.  asset://   project asset library user://    user-selected local folder (File System Access) cache://   OPFS / local engine cache cloud://   optional remote mirror temp://    transient drag-drop import surface:// live render surface (no backing file)",
      "exports": [
        {
          "name": "parseVPath",
          "kind": "function",
          "signature": "parseVPath(vpath)",
          "summary": "Parse a virtual path into { scheme, path, segments }."
        },
        {
          "name": "isVPath",
          "kind": "function",
          "signature": "isVPath(vpath)",
          "summary": ""
        },
        {
          "name": "makeVPath",
          "kind": "function",
          "signature": "makeVPath(scheme, ...parts)",
          "summary": "Build a virtual path from a scheme + path parts."
        },
        {
          "name": "normalizeSegments",
          "kind": "function",
          "signature": "normalizeSegments(path)",
          "summary": "Collapse duplicate/empty separators and strip leading/trailing slashes."
        },
        {
          "name": "withScheme",
          "kind": "function",
          "signature": "withScheme(vpath, scheme)",
          "summary": "Swap the scheme of a virtual path, keeping the same path (e.g. for backups)."
        },
        {
          "name": "vpathBasename",
          "kind": "function",
          "signature": "vpathBasename(vpath)",
          "summary": "The basename (last segment) and extension of a virtual path."
        },
        {
          "name": "vpathExtension",
          "kind": "function",
          "signature": "vpathExtension(vpath)",
          "summary": ""
        },
        {
          "name": "cachePathFor",
          "kind": "function",
          "signature": "cachePathFor(kind, sourceHash, ext)",
          "summary": "Standard cache path for a converted artifact, keyed by content hash."
        },
        {
          "name": "VPATH_SCHEMES",
          "kind": "constant",
          "signature": "VPATH_SCHEMES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/weapon/WeaponRig",
      "path": "engine/reference/assets/weapon/WeaponRig.md",
      "source": "engine/assets/weapon/WeaponRig.js",
      "import": "/engine/assets/weapon/WeaponRig.js",
      "sourceHash": "12c66e75b48142d53b006fba9493966f81413c1502d5207dc3b1cf4d11d615fb",
      "summary": "engine/assets/weapon/WeaponRig.js — canonical weapon socket/part schema (spec §13). A weapon is a model + sockets (muzzle/chamber/grips/sight/…) + moving parts (slide/bolt/hammer/…) + a fire/reload timeline + a state machine. This is a GAME ABSTRACTION: sockets/timings are gameplay anchors, not real-firearm data. Every detection is a hint with confidence; ambiguous nodes go to the editor.",
      "exports": [
        {
          "name": "createWeaponRig",
          "kind": "function",
          "signature": "createWeaponRig(init = {})",
          "summary": "Create a weapon rig descriptor."
        },
        {
          "name": "WEAPON_SOCKET",
          "kind": "constant",
          "signature": "WEAPON_SOCKET",
          "summary": ""
        },
        {
          "name": "MOVING_PART",
          "kind": "constant",
          "signature": "MOVING_PART",
          "summary": ""
        },
        {
          "name": "WEAPON_TYPE",
          "kind": "constant",
          "signature": "WEAPON_TYPE",
          "summary": ""
        },
        {
          "name": "REQUIRED_SOCKETS",
          "kind": "constant",
          "signature": "REQUIRED_SOCKETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/weapon/WeaponRigBuilder",
      "path": "engine/reference/assets/weapon/WeaponRigBuilder.md",
      "source": "engine/assets/weapon/WeaponRigBuilder.js",
      "import": "/engine/assets/weapon/WeaponRigBuilder.js",
      "sourceHash": "10b7eea5d7c0f6964a6f32f673b2dc924c69d9b9cbc589d5e1ccfaf707f43300",
      "summary": "engine/assets/weapon/WeaponRigBuilder.js — assemble a WeaponRig from a model: detect sockets + moving parts + forward/muzzle, attach default fire/reload timelines and a state machine seed, and flag needsCorrection when required sockets are missing. Attaches at model.rigs.weapon. GAME ABSTRACTION ONLY.",
      "exports": [
        {
          "name": "buildWeaponRig",
          "kind": "function",
          "signature": "buildWeaponRig(model, opts = {})",
          "summary": "Build a weapon rig and attach it at model.rigs.weapon."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/weapon/WeaponSocketDetector",
      "path": "engine/reference/assets/weapon/WeaponSocketDetector.md",
      "source": "engine/assets/weapon/WeaponSocketDetector.js",
      "import": "/engine/assets/weapon/WeaponSocketDetector.js",
      "sourceHash": "fbe8b094e5ae632d425e3f79a464052701f7ee9bb1a00ce56945f4bd2d9e5aea",
      "summary": "engine/assets/weapon/WeaponSocketDetector.js — find weapon sockets + moving parts by NAME (priority-ordered patterns) and resolve the forward/aim axis + muzzle by geometry (a firearm is long along the barrel; the muzzle is the front-most node along that axis). Hints + confidence; ambiguous → editor. GAME ABSTRACTION ONLY — no real-firearm dimensions or ballistics here.",
      "exports": [
        {
          "name": "detectWeapon",
          "kind": "function",
          "signature": "detectWeapon(model)",
          "summary": "Detect weapon sockets, moving parts, forward axis, and muzzle."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/weapon/WeaponStateMachine",
      "path": "engine/reference/assets/weapon/WeaponStateMachine.md",
      "source": "engine/assets/weapon/WeaponStateMachine.js",
      "import": "/engine/assets/weapon/WeaponStateMachine.js",
      "sourceHash": "7dab2b294914eaedd3b9ca3be42f82e58f0f36bd5d6fd0cfbd205ac8b2754c1e",
      "summary": "engine/assets/weapon/WeaponStateMachine.js — a small, deterministic weapon state machine: idle ⇄ firing ⇄ empty, with reloading. It models a magazine + a chambered round (total = ammo + chambered) and auto-cycles a fresh round after each shot, so dry-fire, last-round, and reload-from-empty all behave correctly. GAME ABSTRACTION ONLY — no real-firearm mechanism is modelled.",
      "exports": [
        {
          "name": "createWeaponStateMachine",
          "kind": "function",
          "signature": "createWeaponStateMachine(init = {})",
          "summary": ""
        },
        {
          "name": "WEAPON_STATE",
          "kind": "constant",
          "signature": "WEAPON_STATE",
          "summary": ""
        },
        {
          "name": "WEAPON_INPUT",
          "kind": "constant",
          "signature": "WEAPON_INPUT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "assets/weapon/WeaponTimeline",
      "path": "engine/reference/assets/weapon/WeaponTimeline.md",
      "source": "engine/assets/weapon/WeaponTimeline.js",
      "import": "/engine/assets/weapon/WeaponTimeline.js",
      "sourceHash": "2899e4d083d03a272dce26c7759d17305eaf80e81b0fa63b4a0dcc368fcd9902",
      "summary": "engine/assets/weapon/WeaponTimeline.js — keyframed event tracks for weapon actions (fire, reload). An action is an ordered list of { t, type, payload } events over a duration; `eventsBetween` returns events crossed in a time step so the host fires them exactly once (deterministic, frame-rate independent). GAME ABSTRACTION — timings are gameplay anchors, not real mechanisms.",
      "exports": [
        {
          "name": "createWeaponAction",
          "kind": "function",
          "signature": "createWeaponAction(init = {})",
          "summary": "Create a single action timeline (e.g. one shot, or a reload)."
        },
        {
          "name": "defaultFireAction",
          "kind": "function",
          "signature": "defaultFireAction(duration = 0.12)",
          "summary": "A default semi-auto fire action (normalized 0..duration seconds)."
        },
        {
          "name": "defaultReloadAction",
          "kind": "function",
          "signature": "defaultReloadAction(duration = 2.0)",
          "summary": "A default reload action."
        },
        {
          "name": "eventsBetween",
          "kind": "function",
          "signature": "eventsBetween(action, t0, t1)",
          "summary": "Events whose time t lies in (t0, t1]. Use with an advancing playhead so each event fires exactly once regardless of frame rate."
        },
        {
          "name": "createTimelinePlayer",
          "kind": "function",
          "signature": "createTimelinePlayer(action)",
          "summary": "A small play-once cursor over an action."
        },
        {
          "name": "WEAPON_EVENT",
          "kind": "constant",
          "signature": "WEAPON_EVENT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/SpatialAudioEnvironment",
      "path": "engine/reference/audio/SpatialAudioEnvironment.md",
      "source": "engine/audio/SpatialAudioEnvironment.js",
      "import": "/engine/audio/SpatialAudioEnvironment.js",
      "sourceHash": "9d17ad3179968712a771f5e4b29bd6020940bc5e7a9fc9b4b82e86c01c8536fa",
      "summary": "SpatialAudioEnvironment.js - Advanced Spatial Audio Processing Industry-grade environment audio: material absorption, ground reflection, environment zones (underwater/cave/outdoor), diffraction, and dynamic reverb. Research basis: - FMOD/Wwise material absorption coefficients (ISO 354 standard) - Image-source method for early reflections (Allen & Berkley 1979) - Underwater acoustics: 300Hz LPF + extended reverb (Wikipedia/Navy research) - Diffraction: UTD edge diffraction approximation (Kouyoumjian & Pathak 1974) - Ground reflection: single-bounce mirror source below floor plane All processing uses Web Audio API nodes (BiquadFilter, Gain, Delay, Convolver). Zero external dependencies.",
      "exports": [
        {
          "name": "createSpatialEnvironment",
          "kind": "function",
          "signature": "createSpatialEnvironment(ctx, config = {})",
          "summary": "Create the spatial audio environment system. Attaches to an existing AudioContext and provides environment processing."
        },
        {
          "name": "setEnvironmentRaycast",
          "kind": "function",
          "signature": "setEnvironmentRaycast(env, fn)",
          "summary": "Set the raycast function for environment probing. Function signature: (origin: [x,y,z], direction: [x,y,z], maxDist: number) => { hit, distance, position, normal, entityId } | null"
        },
        {
          "name": "setEntityMaterialLookup",
          "kind": "function",
          "signature": "setEntityMaterialLookup(env, fn)",
          "summary": "Set the entity material lookup function. Function signature: (entityId) => 'stone' | 'wood' | 'metal' | etc."
        },
        {
          "name": "setWaterSurfaceY",
          "kind": "function",
          "signature": "setWaterSurfaceY(env, y)",
          "summary": "Set the water surface Y level. Listener below this = underwater. Pass null to disable underwater detection."
        },
        {
          "name": "updateEnvironment",
          "kind": "function",
          "signature": "updateEnvironment(env, listenerPos, listenerFwd)",
          "summary": "Update the environment system each frame. Detects environment zone, updates ground reflection, handles underwater."
        },
        {
          "name": "computeOcclusion",
          "kind": "function",
          "signature": "computeOcclusion(env, srcPos)",
          "summary": "Compute material-aware occlusion between a source and the listener. Returns { factor: 0-1, lpfMult: 0-1 } where factor affects volume, lpfMult affects high-frequency content (material filtering)."
        },
        {
          "name": "computeDiffraction",
          "kind": "function",
          "signature": "computeDiffraction(env, srcPos)",
          "summary": "Compute diffraction factor for partially occluded sources. Casts multiple rays slightly offset from the direct path. If some rays get through, the sound is partially diffracted (not fully blocked)."
        },
        {
          "name": "computeFullOcclusion",
          "kind": "function",
          "signature": "computeFullOcclusion(env, srcPos)",
          "summary": "Compute full spatial occlusion for a sound source. Combines material-based occlusion with edge diffraction. Returns 0-1 where 0 = fully blocked, 1 = clear."
        },
        {
          "name": "getEnvironmentIR",
          "kind": "function",
          "signature": "getEnvironmentIR(env, zoneName)",
          "summary": "Generate a procedural impulse response for a given environment. Cached per environment to avoid regeneration."
        },
        {
          "name": "connectToBridge",
          "kind": "function",
          "signature": "connectToBridge(env, bridge)",
          "summary": "Connect the environment system's master filters into the audio bridge's output chain. Call once after both bridge and environment are created. Inserts: bridge.masterGain → env.masterHPF → env.masterLPF → ctx.destination Also connects ground reflection send from bridge.compressor."
        },
        {
          "name": "getMaterialAbsorption",
          "kind": "function",
          "signature": "getMaterialAbsorption(materialKey)",
          "summary": "Get absorption data for a material key."
        },
        {
          "name": "getEnvironmentPresets",
          "kind": "function",
          "signature": "getEnvironmentPresets()",
          "summary": "Get all available environment presets."
        },
        {
          "name": "forceEnvironmentZone",
          "kind": "function",
          "signature": "forceEnvironmentZone(env, zoneName)",
          "summary": "Force a specific environment zone (overrides auto-detection). Pass null to re-enable auto-detection."
        },
        {
          "name": "getEnvironmentStats",
          "kind": "function",
          "signature": "getEnvironmentStats(env)",
          "summary": "Get current environment stats."
        },
        {
          "name": "destroySpatialEnvironment",
          "kind": "function",
          "signature": "destroySpatialEnvironment(env)",
          "summary": "Destroy the environment system and release all audio nodes."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/CharacterAudioBridge",
      "path": "engine/reference/audio/bridge/CharacterAudioBridge.md",
      "source": "engine/audio/bridge/CharacterAudioBridge.js",
      "import": "/engine/audio/bridge/CharacterAudioBridge.js",
      "sourceHash": "faeb41ced2018fdc8cd0190e0a117d84bb57b8501253a09408ed4541de7ac0a7",
      "summary": "CharacterAudioBridge.js - Character Movement → Audio Events Triggers footsteps, jumps, lands, and body foley based on character movement state (velocity, grounded, etc).",
      "exports": [
        {
          "name": "createCharacterAudioBridge",
          "kind": "function",
          "signature": "createCharacterAudioBridge(config = {})",
          "summary": "Create a character movement audio bridge."
        },
        {
          "name": "tickCharacterAudio",
          "kind": "function",
          "signature": "tickCharacterAudio(bridge, audioEngine, entityId, state, dt)",
          "summary": "Tick the character audio bridge for a single character. Call once per frame per character entity."
        },
        {
          "name": "removeCharacter",
          "kind": "function",
          "signature": "removeCharacter(bridge, entityId)",
          "summary": "Clean up character state when entity is destroyed."
        },
        {
          "name": "destroyCharacterAudioBridge",
          "kind": "function",
          "signature": "destroyCharacterAudioBridge(bridge)",
          "summary": "Destroy the character audio bridge and clean up all state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/DestructionAudioBridge",
      "path": "engine/reference/audio/bridge/DestructionAudioBridge.md",
      "source": "engine/audio/bridge/DestructionAudioBridge.js",
      "import": "/engine/audio/bridge/DestructionAudioBridge.js",
      "sourceHash": "6b537bf9e7f8068842094c2b507970b3786d72a65150c66d997bb7c0ebfc16c8",
      "summary": "DestructionAudioBridge.js - Destruction Events → Audio Hooks into VoronoiFracture, UnifiedDamageSystem, SeismicSystem, and ShockPropagation to trigger shattering, crumbling, rumble, and explosion sounds.",
      "exports": [
        {
          "name": "createDestructionAudioBridge",
          "kind": "function",
          "signature": "createDestructionAudioBridge(config = {})",
          "summary": "Create a destruction audio bridge."
        },
        {
          "name": "processDamageAudioEvent",
          "kind": "function",
          "signature": "processDamageAudioEvent(bridge, event, currentTime)",
          "summary": "Process a damage event."
        },
        {
          "name": "processFractureAudioEvent",
          "kind": "function",
          "signature": "processFractureAudioEvent(bridge, event, currentTime)",
          "summary": "Process a fracture event (Voronoi fracture)."
        },
        {
          "name": "processSeismicAudioEvent",
          "kind": "function",
          "signature": "processSeismicAudioEvent(bridge, event, currentTime)",
          "summary": "Process a seismic event (earthquake rumble)."
        },
        {
          "name": "flushDestructionAudio",
          "kind": "function",
          "signature": "flushDestructionAudio(bridge)",
          "summary": "Flush pending destruction audio events."
        },
        {
          "name": "setDestructionAudioListenerPos",
          "kind": "function",
          "signature": "setDestructionAudioListenerPos(bridge, pos)",
          "summary": "Update listener position."
        },
        {
          "name": "destroyDestructionAudioBridge",
          "kind": "function",
          "signature": "destroyDestructionAudioBridge(bridge)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/EmitterAmbientBridge",
      "path": "engine/reference/audio/bridge/EmitterAmbientBridge.md",
      "source": "engine/audio/bridge/EmitterAmbientBridge.js",
      "import": "/engine/audio/bridge/EmitterAmbientBridge.js",
      "sourceHash": "f87cc0433101804b597cb6e28e01d5620b415026904dcfb6cb3162ffdf4c6668",
      "summary": "EmitterAmbientBridge.js - Active Emitters → Continuous Ambient Loops When a substance emitter is active and has an ambientLoop defined, this bridge manages a looping spatial audio source at the emitter position. Sources are created when emitters start and removed when they stop.",
      "exports": [
        {
          "name": "createEmitterAmbientBridge",
          "kind": "function",
          "signature": "createEmitterAmbientBridge(config = {})",
          "summary": "Create an emitter ambient bridge."
        },
        {
          "name": "syncEmitterAmbients",
          "kind": "function",
          "signature": "syncEmitterAmbients(bridge, emitters)",
          "summary": "Sync active emitters with ambient audio loops. Call each frame with the current list of active emitters."
        },
        {
          "name": "registerEmitterLoop",
          "kind": "function",
          "signature": "registerEmitterLoop(bridge, emitterId, sourceId, substanceId, position)",
          "summary": "Register that a loop was started (store sourceId)."
        },
        {
          "name": "stopAllEmitterAmbients",
          "kind": "function",
          "signature": "stopAllEmitterAmbients(bridge)",
          "summary": "Stop all active ambient loops."
        },
        {
          "name": "destroyEmitterAmbientBridge",
          "kind": "function",
          "signature": "destroyEmitterAmbientBridge(bridge)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/FluidAudioBridge",
      "path": "engine/reference/audio/bridge/FluidAudioBridge.md",
      "source": "engine/audio/bridge/FluidAudioBridge.js",
      "import": "/engine/audio/bridge/FluidAudioBridge.js",
      "sourceHash": "26cfc36459e286d87f27857e771f93a162b4872968f13bcfa1cd9cc9fa3d1aca",
      "summary": "FluidAudioBridge.js - Fluid Events → Audio Hooks into fluid simulation (splashes, phase changes) and triggers appropriate audio events.",
      "exports": [
        {
          "name": "createFluidAudioBridge",
          "kind": "function",
          "signature": "createFluidAudioBridge(config = {})",
          "summary": "Create a fluid audio bridge."
        },
        {
          "name": "processFluidSplash",
          "kind": "function",
          "signature": "processFluidSplash(bridge, position, magnitude, currentTime)",
          "summary": "Process a fluid splash event."
        },
        {
          "name": "processPhaseChangeAudio",
          "kind": "function",
          "signature": "processPhaseChangeAudio(bridge, phaseType, position, magnitude, currentTime)",
          "summary": "Process a phase change event."
        },
        {
          "name": "flushFluidAudio",
          "kind": "function",
          "signature": "flushFluidAudio(bridge)",
          "summary": "Flush pending fluid audio events."
        },
        {
          "name": "setFluidAudioListenerPos",
          "kind": "function",
          "signature": "setFluidAudioListenerPos(bridge, pos)",
          "summary": "Update listener position."
        },
        {
          "name": "destroyFluidAudioBridge",
          "kind": "function",
          "signature": "destroyFluidAudioBridge(bridge)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/PhysicsAudioBridge",
      "path": "engine/reference/audio/bridge/PhysicsAudioBridge.md",
      "source": "engine/audio/bridge/PhysicsAudioBridge.js",
      "import": "/engine/audio/bridge/PhysicsAudioBridge.js",
      "sourceHash": "735e1df8d20e76dd61f54d2759e1032a42c8cf70b78cc806b80ce3efb1bcb71e",
      "summary": "PhysicsAudioBridge.js - Physics Collision → Audio Events Hooks into physics contact callbacks (PhysX/PBD) and triggers material-aware impact sounds via the AudioEngine.",
      "exports": [
        {
          "name": "createPhysicsAudioBridge",
          "kind": "function",
          "signature": "createPhysicsAudioBridge(config = {})",
          "summary": "Create a physics audio bridge."
        },
        {
          "name": "processPhysicsContact",
          "kind": "function",
          "signature": "processPhysicsContact(bridge, contact, currentTime)",
          "summary": "Process a physics contact event."
        },
        {
          "name": "flushPhysicsAudio",
          "kind": "function",
          "signature": "flushPhysicsAudio(bridge)",
          "summary": "Flush pending physics audio events."
        },
        {
          "name": "setPhysicsAudioListenerPos",
          "kind": "function",
          "signature": "setPhysicsAudioListenerPos(bridge, pos)",
          "summary": "Update listener position."
        },
        {
          "name": "destroyPhysicsAudioBridge",
          "kind": "function",
          "signature": "destroyPhysicsAudioBridge(bridge)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/SpellAudioBridge",
      "path": "engine/reference/audio/bridge/SpellAudioBridge.md",
      "source": "engine/audio/bridge/SpellAudioBridge.js",
      "import": "/engine/audio/bridge/SpellAudioBridge.js",
      "sourceHash": "80dd6a4fec88ec956e67f9252b14ee662f354f8576bbc91e38f34c78605900db",
      "summary": "SpellAudioBridge.js - Spell Cast → Audio Events Resolves soundHint strings from SpellGenerator and SpellElementMixer into AudioEngine trigger calls.",
      "exports": [
        {
          "name": "createSpellAudioBridge",
          "kind": "function",
          "signature": "createSpellAudioBridge(config = {})",
          "summary": "Create a spell audio bridge."
        },
        {
          "name": "buildSpellAudioTrigger",
          "kind": "function",
          "signature": "buildSpellAudioTrigger(bridge, spell, position, currentTime)",
          "summary": "Build audio trigger config from a spell cast."
        },
        {
          "name": "buildSoundHintTrigger",
          "kind": "function",
          "signature": "buildSoundHintTrigger(bridge, soundHint, position, currentTime)",
          "summary": "Build audio trigger from a raw soundHint string."
        },
        {
          "name": "destroySpellAudioBridge",
          "kind": "function",
          "signature": "destroySpellAudioBridge(bridge)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/SubstanceAudioResolver",
      "path": "engine/reference/audio/bridge/SubstanceAudioResolver.md",
      "source": "engine/audio/bridge/SubstanceAudioResolver.js",
      "import": "/engine/audio/bridge/SubstanceAudioResolver.js",
      "sourceHash": "fc713974b4cee46b4a5db9312cca40eba034b2de50c983132b920a70cbcfd5ef",
      "summary": "SubstanceAudioResolver.js - Resolve substance key → audio config Maps substance IDs to audio event configurations, supporting both sample-based fallback and procedural patch references.",
      "exports": [
        {
          "name": "resolveSubstanceAudio",
          "kind": "function",
          "signature": "resolveSubstanceAudio(substanceId)",
          "summary": "Resolve a substance key to its audio configuration."
        },
        {
          "name": "getSubstanceImpactSound",
          "kind": "function",
          "signature": "getSubstanceImpactSound(substanceId)",
          "summary": "Get the impact sound event ID for a substance."
        },
        {
          "name": "getSubstanceAmbientLoop",
          "kind": "function",
          "signature": "getSubstanceAmbientLoop(substanceId)",
          "summary": "Get the ambient loop event ID for a substance."
        },
        {
          "name": "getSubstanceCollisionSound",
          "kind": "function",
          "signature": "getSubstanceCollisionSound(substanceId)",
          "summary": "Get the collision sound event ID for a substance."
        },
        {
          "name": "getSubstanceProceduralPatch",
          "kind": "function",
          "signature": "getSubstanceProceduralPatch(substanceId)",
          "summary": "Get procedural patch ID for a substance (if defined)."
        },
        {
          "name": "getSubstanceParamMap",
          "kind": "function",
          "signature": "getSubstanceParamMap(substanceId)",
          "summary": "Get parameter mapping for procedural synthesis. Maps emitter params → synth params."
        },
        {
          "name": "getSubstanceAudioDefaults",
          "kind": "function",
          "signature": "getSubstanceAudioDefaults(substanceId)",
          "summary": "Get normalized default procedural params for a substance."
        },
        {
          "name": "applySubstanceParamMap",
          "kind": "function",
          "signature": "applySubstanceParamMap(substanceId, params = {}, mapOverrides = null)",
          "summary": "Apply a substance paramMap to source params. Supports runtime map override keys: _map_<src>_scale / _map_<src>_offset."
        },
        {
          "name": "buildSubstancePreviewParams",
          "kind": "function",
          "signature": "buildSubstancePreviewParams(substanceId, overrides = {}, sourceParams = {})",
          "summary": "Build preview/runtime-friendly patch params with shared defaults + paramMap transform."
        },
        {
          "name": "buildSubstanceTriggerConfig",
          "kind": "function",
          "signature": "buildSubstanceTriggerConfig(substanceId, eventType, params = {})",
          "summary": "Build a complete audio trigger config from substance + event params."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/WeatherAudioBridge",
      "path": "engine/reference/audio/bridge/WeatherAudioBridge.md",
      "source": "engine/audio/bridge/WeatherAudioBridge.js",
      "import": "/engine/audio/bridge/WeatherAudioBridge.js",
      "sourceHash": "783378b26ae984f3d69b7267cca1273be421eac7a0a985b89396c60a698bbab0",
      "summary": "WeatherAudioBridge.js - Weather/Time → Ambient Audio Crossfades ambient audio loops based on WorldTime day/night cycle, seasons, and weather conditions.",
      "exports": [
        {
          "name": "createWeatherAudioBridge",
          "kind": "function",
          "signature": "createWeatherAudioBridge(config = {})",
          "summary": "Create a weather audio bridge."
        },
        {
          "name": "tickWeatherAudio",
          "kind": "function",
          "signature": "tickWeatherAudio(bridge, worldTime, weather, currentTime)",
          "summary": "Tick weather audio — check time of day and weather, crossfade ambients."
        },
        {
          "name": "destroyWeatherAudioBridge",
          "kind": "function",
          "signature": "destroyWeatherAudioBridge(bridge)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/bridge/index",
      "path": "engine/reference/audio/bridge/index.md",
      "source": "engine/audio/bridge/index.js",
      "import": "/engine/audio/bridge/index.js",
      "sourceHash": "43a17939bffb0af449fd66b5484939e7b89405a2169c18056798e694bad806c1",
      "summary": "engine/audio/bridge/index.js — Barrel export for audio bridges.",
      "exports": [
        {
          "name": "buildSoundHintTrigger",
          "kind": "re-export",
          "signature": "buildSoundHintTrigger",
          "summary": ""
        },
        {
          "name": "buildSpellAudioTrigger",
          "kind": "re-export",
          "signature": "buildSpellAudioTrigger",
          "summary": ""
        },
        {
          "name": "buildSubstanceTriggerConfig",
          "kind": "re-export",
          "signature": "buildSubstanceTriggerConfig",
          "summary": ""
        },
        {
          "name": "createCharacterAudioBridge",
          "kind": "re-export",
          "signature": "createCharacterAudioBridge",
          "summary": ""
        },
        {
          "name": "createDestructionAudioBridge",
          "kind": "re-export",
          "signature": "createDestructionAudioBridge",
          "summary": ""
        },
        {
          "name": "createEmitterAmbientBridge",
          "kind": "re-export",
          "signature": "createEmitterAmbientBridge",
          "summary": ""
        },
        {
          "name": "createFluidAudioBridge",
          "kind": "re-export",
          "signature": "createFluidAudioBridge",
          "summary": ""
        },
        {
          "name": "createPhysicsAudioBridge",
          "kind": "re-export",
          "signature": "createPhysicsAudioBridge",
          "summary": ""
        },
        {
          "name": "createSpellAudioBridge",
          "kind": "re-export",
          "signature": "createSpellAudioBridge",
          "summary": ""
        },
        {
          "name": "createWeatherAudioBridge",
          "kind": "re-export",
          "signature": "createWeatherAudioBridge",
          "summary": ""
        },
        {
          "name": "destroyCharacterAudioBridge",
          "kind": "re-export",
          "signature": "destroyCharacterAudioBridge",
          "summary": ""
        },
        {
          "name": "destroyDestructionAudioBridge",
          "kind": "re-export",
          "signature": "destroyDestructionAudioBridge",
          "summary": ""
        },
        {
          "name": "destroyEmitterAmbientBridge",
          "kind": "re-export",
          "signature": "destroyEmitterAmbientBridge",
          "summary": ""
        },
        {
          "name": "destroyFluidAudioBridge",
          "kind": "re-export",
          "signature": "destroyFluidAudioBridge",
          "summary": ""
        },
        {
          "name": "destroyPhysicsAudioBridge",
          "kind": "re-export",
          "signature": "destroyPhysicsAudioBridge",
          "summary": ""
        },
        {
          "name": "destroySpellAudioBridge",
          "kind": "re-export",
          "signature": "destroySpellAudioBridge",
          "summary": ""
        },
        {
          "name": "destroyWeatherAudioBridge",
          "kind": "re-export",
          "signature": "destroyWeatherAudioBridge",
          "summary": ""
        },
        {
          "name": "flushDestructionAudio",
          "kind": "re-export",
          "signature": "flushDestructionAudio",
          "summary": ""
        },
        {
          "name": "flushFluidAudio",
          "kind": "re-export",
          "signature": "flushFluidAudio",
          "summary": ""
        },
        {
          "name": "flushPhysicsAudio",
          "kind": "re-export",
          "signature": "flushPhysicsAudio",
          "summary": ""
        },
        {
          "name": "getSubstanceAmbientLoop",
          "kind": "re-export",
          "signature": "getSubstanceAmbientLoop",
          "summary": ""
        },
        {
          "name": "getSubstanceCollisionSound",
          "kind": "re-export",
          "signature": "getSubstanceCollisionSound",
          "summary": ""
        },
        {
          "name": "getSubstanceImpactSound",
          "kind": "re-export",
          "signature": "getSubstanceImpactSound",
          "summary": ""
        },
        {
          "name": "getSubstanceParamMap",
          "kind": "re-export",
          "signature": "getSubstanceParamMap",
          "summary": ""
        },
        {
          "name": "getSubstanceProceduralPatch",
          "kind": "re-export",
          "signature": "getSubstanceProceduralPatch",
          "summary": ""
        },
        {
          "name": "processDamageAudioEvent",
          "kind": "re-export",
          "signature": "processDamageAudioEvent",
          "summary": ""
        },
        {
          "name": "processFluidSplash",
          "kind": "re-export",
          "signature": "processFluidSplash",
          "summary": ""
        },
        {
          "name": "processFractureAudioEvent",
          "kind": "re-export",
          "signature": "processFractureAudioEvent",
          "summary": ""
        },
        {
          "name": "processPhaseChangeAudio",
          "kind": "re-export",
          "signature": "processPhaseChangeAudio",
          "summary": ""
        },
        {
          "name": "processPhysicsContact",
          "kind": "re-export",
          "signature": "processPhysicsContact",
          "summary": ""
        },
        {
          "name": "processSeismicAudioEvent",
          "kind": "re-export",
          "signature": "processSeismicAudioEvent",
          "summary": ""
        },
        {
          "name": "registerEmitterLoop",
          "kind": "re-export",
          "signature": "registerEmitterLoop",
          "summary": ""
        },
        {
          "name": "removeCharacter",
          "kind": "re-export",
          "signature": "removeCharacter",
          "summary": ""
        },
        {
          "name": "resolveSubstanceAudio",
          "kind": "re-export",
          "signature": "resolveSubstanceAudio",
          "summary": ""
        },
        {
          "name": "setDestructionAudioListenerPos",
          "kind": "re-export",
          "signature": "setDestructionAudioListenerPos",
          "summary": ""
        },
        {
          "name": "setFluidAudioListenerPos",
          "kind": "re-export",
          "signature": "setFluidAudioListenerPos",
          "summary": ""
        },
        {
          "name": "setPhysicsAudioListenerPos",
          "kind": "re-export",
          "signature": "setPhysicsAudioListenerPos",
          "summary": ""
        },
        {
          "name": "stopAllEmitterAmbients",
          "kind": "re-export",
          "signature": "stopAllEmitterAmbients",
          "summary": ""
        },
        {
          "name": "syncEmitterAmbients",
          "kind": "re-export",
          "signature": "syncEmitterAmbients",
          "summary": ""
        },
        {
          "name": "tickCharacterAudio",
          "kind": "re-export",
          "signature": "tickCharacterAudio",
          "summary": ""
        },
        {
          "name": "tickWeatherAudio",
          "kind": "re-export",
          "signature": "tickWeatherAudio",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioAssetManager",
      "path": "engine/reference/audio/core/AudioAssetManager.md",
      "source": "engine/audio/core/AudioAssetManager.js",
      "import": "/engine/audio/core/AudioAssetManager.js",
      "sourceHash": "38fe6ee6917396b3ee8e0094a5f25c8015372af52da3e9205347d3387c83fc0a",
      "summary": "AudioAssetManager.js - Audio Asset Loading & Caching Fetches, decodes, and caches AudioBuffers. Supports pooling and streaming for large files (music).",
      "exports": [
        {
          "name": "createAudioAssetManager",
          "kind": "function",
          "signature": "createAudioAssetManager(context)",
          "summary": "Create an audio asset manager."
        },
        {
          "name": "loadAudioAsset",
          "kind": "function",
          "signature": "async loadAudioAsset(manager, path)",
          "summary": "Load and decode an audio file. Returns cached buffer if already loaded."
        },
        {
          "name": "preloadAudioAssets",
          "kind": "function",
          "signature": "async preloadAudioAssets(manager, paths)",
          "summary": "Preload multiple audio assets."
        },
        {
          "name": "registerAudioBuffer",
          "kind": "function",
          "signature": "registerAudioBuffer(manager, path, buffer)",
          "summary": "Register a pre-decoded AudioBuffer directly."
        },
        {
          "name": "getAudioBuffer",
          "kind": "function",
          "signature": "getAudioBuffer(manager, path)",
          "summary": "Get a cached buffer (synchronous)."
        },
        {
          "name": "hasAudioBuffer",
          "kind": "function",
          "signature": "hasAudioBuffer(manager, path)",
          "summary": "Check if a buffer is cached."
        },
        {
          "name": "unloadAudioAsset",
          "kind": "function",
          "signature": "unloadAudioAsset(manager, path)",
          "summary": "Remove a cached buffer."
        },
        {
          "name": "clearAudioCache",
          "kind": "function",
          "signature": "clearAudioCache(manager)",
          "summary": "Clear all cached buffers."
        },
        {
          "name": "setAudioBaseUrl",
          "kind": "function",
          "signature": "setAudioBaseUrl(manager, url)",
          "summary": "Set base URL for relative asset paths."
        },
        {
          "name": "destroyAudioAssetManager",
          "kind": "function",
          "signature": "destroyAudioAssetManager(manager)",
          "summary": "Destroy the asset manager and clear all caches."
        },
        {
          "name": "_origCreate",
          "kind": "re-export",
          "signature": "_origCreate",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioBus",
      "path": "engine/reference/audio/core/AudioBus.md",
      "source": "engine/audio/core/AudioBus.js",
      "import": "/engine/audio/core/AudioBus.js",
      "sourceHash": "a21f721057e287f7058767604cd58b05e396865461c4de6d239e68e0dc0a86b7",
      "summary": "AudioBus.js - Audio Category Bus A bus is a GainNode chain representing an audio category (sfx, music, ambient, voice, ui). Supports volume, mute, solo, and ducking (automatic volume reduction when another bus plays).",
      "exports": [
        {
          "name": "createAudioBus",
          "kind": "function",
          "signature": "createAudioBus(context, destination, config = {})",
          "summary": "Create an audio bus."
        },
        {
          "name": "setBusVolume",
          "kind": "function",
          "signature": "setBusVolume(bus, volume, currentTime)",
          "summary": "Set bus volume."
        },
        {
          "name": "setBusMute",
          "kind": "function",
          "signature": "setBusMute(bus, muted)",
          "summary": "Mute/unmute the bus."
        },
        {
          "name": "setBusDuck",
          "kind": "function",
          "signature": "setBusDuck(bus, amount)",
          "summary": "Set duck amount (used for automatic ducking, e.g. voice ducks music)."
        },
        {
          "name": "getBusOutput",
          "kind": "function",
          "signature": "getBusOutput(bus)",
          "summary": "Get the bus's output node (for sources to connect to)."
        },
        {
          "name": "destroyAudioBus",
          "kind": "function",
          "signature": "destroyAudioBus(bus)",
          "summary": "Destroy a bus and disconnect it."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioConcurrency",
      "path": "engine/reference/audio/core/AudioConcurrency.md",
      "source": "engine/audio/core/AudioConcurrency.js",
      "import": "/engine/audio/core/AudioConcurrency.js",
      "sourceHash": "296812ede59c58d3a8aaae34f7780f32e2aec1662a387b1a81a3c45d1fa309c8",
      "summary": "AudioConcurrency.js - Voice Management & Stealing Manages the maximum number of concurrent voices. When the limit is reached, uses priority-based voice stealing (quietest, oldest, or farthest).",
      "exports": [
        {
          "name": "createAudioConcurrency",
          "kind": "function",
          "signature": "createAudioConcurrency(config = {})",
          "summary": "Create a concurrency manager."
        },
        {
          "name": "tickConcurrency",
          "kind": "function",
          "signature": "tickConcurrency(concurrency, activeSources, time)",
          "summary": "Tick concurrency — steal voices if over limit."
        },
        {
          "name": "canAddVoice",
          "kind": "function",
          "signature": "canAddVoice(concurrency, activeSources, newPriority)",
          "summary": "Check if a new voice can be added, or which voice to steal."
        },
        {
          "name": "destroyAudioConcurrency",
          "kind": "function",
          "signature": "destroyAudioConcurrency(concurrency)",
          "summary": "Destroy concurrency manager."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioDoppler",
      "path": "engine/reference/audio/core/AudioDoppler.md",
      "source": "engine/audio/core/AudioDoppler.js",
      "import": "/engine/audio/core/AudioDoppler.js",
      "sourceHash": "3b6295268c33090d7148300099c326d5114797226a2df3d71475c16b0238126c",
      "summary": "AudioDoppler.js - Doppler Effect Manually computes pitch shift from radial velocity between source and listener. Web Audio's built-in Doppler was removed from the spec, so we implement it ourselves. Doppler ratio = (speedOfSound + listenerRadialVelocity) / (speedOfSound + sourceRadialVelocity)",
      "exports": [
        {
          "name": "createAudioDoppler",
          "kind": "function",
          "signature": "createAudioDoppler(config = {})",
          "summary": "Create a Doppler processor."
        },
        {
          "name": "tickDoppler",
          "kind": "function",
          "signature": "tickDoppler(doppler, activeSources, listenerPos, listenerVel)",
          "summary": "Tick Doppler — adjust pitch of all spatial sources based on relative velocity."
        },
        {
          "name": "destroyAudioDoppler",
          "kind": "function",
          "signature": "destroyAudioDoppler(doppler)",
          "summary": "Destroy Doppler processor."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioEngine",
      "path": "engine/reference/audio/core/AudioEngine.md",
      "source": "engine/audio/core/AudioEngine.js",
      "import": "/engine/audio/core/AudioEngine.js",
      "sourceHash": "0455e0b457e5b4d8678e4d24ca33b62fb14761f92dcb4e6d32f588c15a730661",
      "summary": "AudioEngine.js - Core Audio Engine Central audio system for the engine. Manages AudioContext lifecycle, master gain, tick loop, and coordinates all audio subsystems. Usage: const engine = createAudioEngine({ maxVoices: 64 }); await initAudioEngine(engine); // In main loop: tickAudioEngine(engine, dt); // Cleanup: destroyAudioEngine(engine);",
      "exports": [
        {
          "name": "createAudioEngine",
          "kind": "function",
          "signature": "createAudioEngine(config = {})",
          "summary": "Create an audio engine instance."
        },
        {
          "name": "initAudioEngine",
          "kind": "function",
          "signature": "async initAudioEngine(engine)",
          "summary": "Initialize the audio engine. Creates AudioContext and all subsystems. Must be called after a user gesture (click/tap) to comply with autoplay policy."
        },
        {
          "name": "resumeAudioEngine",
          "kind": "function",
          "signature": "async resumeAudioEngine(engine)",
          "summary": "Ensure the AudioContext is resumed (call after user gesture)."
        },
        {
          "name": "tickAudioEngine",
          "kind": "function",
          "signature": "tickAudioEngine(engine, dt)",
          "summary": "Tick the audio engine. Updates active sources, cleans up finished ones."
        },
        {
          "name": "triggerAudioEvent",
          "kind": "function",
          "signature": "triggerAudioEvent(engine, eventId, options = {})",
          "summary": "Trigger an audio event by ID."
        },
        {
          "name": "playSound",
          "kind": "function",
          "signature": "playSound(engine, eventId, options = {})",
          "summary": "Backward-compatible alias used by older bridge code."
        },
        {
          "name": "playBuffer",
          "kind": "function",
          "signature": "playBuffer(engine, buffer, options = {})",
          "summary": "Play a buffer directly (bypasses event resolution)."
        },
        {
          "name": "stopSource",
          "kind": "function",
          "signature": "stopSource(engine, sourceId, fadeOut = 0.05)",
          "summary": "Stop a specific source by ID."
        },
        {
          "name": "stopAllSources",
          "kind": "function",
          "signature": "stopAllSources(engine, fadeOut = 0.1)",
          "summary": "Stop all active sources."
        },
        {
          "name": "registerAudioEvent",
          "kind": "function",
          "signature": "registerAudioEvent(engine, eventId, descriptor)",
          "summary": "Register an audio event descriptor."
        },
        {
          "name": "unregisterAudioEvent",
          "kind": "function",
          "signature": "unregisterAudioEvent(engine, eventId)",
          "summary": "Unregister an audio event."
        },
        {
          "name": "setMasterVolume",
          "kind": "function",
          "signature": "setMasterVolume(engine, volume)",
          "summary": "Set master volume."
        },
        {
          "name": "setBusVolumeByName",
          "kind": "function",
          "signature": "setBusVolumeByName(engine, busName, volume)",
          "summary": "Set volume for a specific bus."
        },
        {
          "name": "destroyAudioEngine",
          "kind": "function",
          "signature": "destroyAudioEngine(engine)",
          "summary": "Destroy the audio engine and release all resources."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioEvent",
      "path": "engine/reference/audio/core/AudioEvent.md",
      "source": "engine/audio/core/AudioEvent.js",
      "import": "/engine/audio/core/AudioEvent.js",
      "sourceHash": "18b63dee437451122e88de88571fd6309b803b71a51f3280e4ddacaf8c778fa9",
      "summary": "AudioEvent.js - Audio Event Descriptors Defines how audio events are resolved: one-shots, random containers, sequences, and loops. An event maps an ID to concrete playback params. Event descriptor format: { type: 'oneshot' | 'random' | 'sequence' | 'loop', sounds: ['path1.ogg', 'path2.ogg'],  // Pool of sounds volume: [0.8, 1.0],       // Random range or fixed value pitch: [0.9, 1.1],        // Random range or fixed value bus: 'sfx',               // Target bus priority: 0,              // Voice stealing priority cooldown: 0,              // Min seconds between triggers maxInstances: 0,          // Max simultaneous (0 = unlimited) }",
      "exports": [
        {
          "name": "resolveAudioEvent",
          "kind": "function",
          "signature": "resolveAudioEvent(event, eventId, options, time)",
          "summary": "Resolve an audio event descriptor to concrete play parameters."
        },
        {
          "name": "createAudioEventDescriptor",
          "kind": "function",
          "signature": "createAudioEventDescriptor(config = {})",
          "summary": "Create an audio event descriptor."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioListener",
      "path": "engine/reference/audio/core/AudioListener.md",
      "source": "engine/audio/core/AudioListener.js",
      "import": "/engine/audio/core/AudioListener.js",
      "sourceHash": "7d354373c91c1c5d7da4b316e5864eb6c3df65f741f4b77d08826e18144e6855",
      "summary": "AudioListener.js - 3D Audio Listener Wraps the Web Audio API AudioListener, syncing camera position, orientation, and velocity for accurate 3D spatialization.",
      "exports": [
        {
          "name": "createAudioListener",
          "kind": "function",
          "signature": "createAudioListener(context)",
          "summary": "Create an audio listener wrapper."
        },
        {
          "name": "updateAudioListener",
          "kind": "function",
          "signature": "updateAudioListener(listener, position, forward, up, dt)",
          "summary": "Update listener position, orientation, and velocity. Call once per frame with camera data."
        },
        {
          "name": "getListenerPosition",
          "kind": "function",
          "signature": "getListenerPosition(listener)",
          "summary": "Get the listener's current position."
        },
        {
          "name": "getListenerVelocity",
          "kind": "function",
          "signature": "getListenerVelocity(listener)",
          "summary": "Get the listener's current velocity."
        },
        {
          "name": "destroyAudioListener",
          "kind": "function",
          "signature": "destroyAudioListener(listener)",
          "summary": "Destroy the listener wrapper."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioOcclusion",
      "path": "engine/reference/audio/core/AudioOcclusion.md",
      "source": "engine/audio/core/AudioOcclusion.js",
      "import": "/engine/audio/core/AudioOcclusion.js",
      "sourceHash": "84e29371a45c10d42fd9f26529566765d4a0533a5ef94d97105c8a4bb94569fb",
      "summary": "AudioOcclusion.js - Sound Occlusion via Raycasting Casts a ray from each active source to the listener. If the ray intersects occluders (walls, objects), applies lowpass filter + volume attenuation to simulate sound being blocked/muffled. Uses simple AABB intersection for performance. Can be upgraded to use the engine's physics raycasts (PhysX/PBD) for higher fidelity.",
      "exports": [
        {
          "name": "createAudioOcclusion",
          "kind": "function",
          "signature": "createAudioOcclusion(config = {})",
          "summary": "Create an occlusion system."
        },
        {
          "name": "addOccluder",
          "kind": "function",
          "signature": "addOccluder(occlusion, min, max, transmission = 0.2)",
          "summary": "Add an AABB occluder."
        },
        {
          "name": "removeOccluder",
          "kind": "function",
          "signature": "removeOccluder(occlusion, index)",
          "summary": "Remove an occluder by index."
        },
        {
          "name": "clearOccluders",
          "kind": "function",
          "signature": "clearOccluders(occlusion)",
          "summary": "Clear all occluders."
        },
        {
          "name": "tickOcclusion",
          "kind": "function",
          "signature": "tickOcclusion(occlusion, activeSources, listenerPos, context, dt)",
          "summary": "Tick occlusion: check sources against occluders and apply filters."
        },
        {
          "name": "destroyAudioOcclusion",
          "kind": "function",
          "signature": "destroyAudioOcclusion(occlusion)",
          "summary": "Destroy occlusion system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioReverbZone",
      "path": "engine/reference/audio/core/AudioReverbZone.md",
      "source": "engine/audio/core/AudioReverbZone.js",
      "import": "/engine/audio/core/AudioReverbZone.js",
      "sourceHash": "6f50ecb4b37f0dfcd16df0fd38cbcff9ee6b356aff9d6613b109f8daff9d48da",
      "summary": "Create a reverb zone system.",
      "exports": [
        {
          "name": "createReverbZoneSystem",
          "kind": "function",
          "signature": "createReverbZoneSystem(context, destination)",
          "summary": "Create a reverb zone system."
        },
        {
          "name": "addReverbZone",
          "kind": "function",
          "signature": "addReverbZone(system, config = {})",
          "summary": "Add a reverb zone."
        },
        {
          "name": "removeReverbZone",
          "kind": "function",
          "signature": "removeReverbZone(system, index)",
          "summary": "Remove a reverb zone."
        },
        {
          "name": "tickReverbZones",
          "kind": "function",
          "signature": "tickReverbZones(system, listenerPos)",
          "summary": "Tick reverb zones — blend based on listener position."
        },
        {
          "name": "connectSourceToReverb",
          "kind": "function",
          "signature": "connectSourceToReverb(system, source, sendLevel = 0.3)",
          "summary": "Connect a source to the reverb system's convolver (send)."
        },
        {
          "name": "destroyReverbZoneSystem",
          "kind": "function",
          "signature": "destroyReverbZoneSystem(system)",
          "summary": "Destroy reverb zone system."
        },
        {
          "name": "REVERB_PRESETS",
          "kind": "constant",
          "signature": "REVERB_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/AudioSource",
      "path": "engine/reference/audio/core/AudioSource.md",
      "source": "engine/audio/core/AudioSource.js",
      "import": "/engine/audio/core/AudioSource.js",
      "sourceHash": "79f188697e20356be5026adeac4afc043613a60d6e2e201414b17f0d0825f7be",
      "summary": "AudioSource.js - 3D Sound Emitter Wraps a BufferSourceNode + PannerNode (HRTF) + GainNode chain. Represents a single playing sound in 3D space.",
      "exports": [
        {
          "name": "createAudioSource",
          "kind": "function",
          "signature": "createAudioSource(context, config = {})",
          "summary": "Create and start an audio source."
        },
        {
          "name": "tickAudioSource",
          "kind": "function",
          "signature": "tickAudioSource(source, dt)",
          "summary": "Tick a source (per-frame update)."
        },
        {
          "name": "setSourcePosition",
          "kind": "function",
          "signature": "setSourcePosition(source, position)",
          "summary": "Update source 3D position explicitly."
        },
        {
          "name": "setSourceVolume",
          "kind": "function",
          "signature": "setSourceVolume(source, volume)",
          "summary": "Set source volume."
        },
        {
          "name": "setSourcePitch",
          "kind": "function",
          "signature": "setSourcePitch(source, pitch)",
          "summary": "Set source pitch/playback rate."
        },
        {
          "name": "stopAudioSource",
          "kind": "function",
          "signature": "stopAudioSource(source, fadeOut = 0.05)",
          "summary": "Stop a source with optional fade-out."
        },
        {
          "name": "isSourceDone",
          "kind": "function",
          "signature": "isSourceDone(source)",
          "summary": "Check if source is finished playing."
        },
        {
          "name": "getSourceEffectiveVolume",
          "kind": "function",
          "signature": "getSourceEffectiveVolume(source)",
          "summary": "Get effective volume (volume × occlusion)."
        },
        {
          "name": "destroyAudioSource",
          "kind": "function",
          "signature": "destroyAudioSource(source)",
          "summary": "Destroy a source and disconnect all nodes."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/FootstepEvents",
      "path": "engine/reference/audio/core/FootstepEvents.md",
      "source": "engine/audio/core/FootstepEvents.js",
      "import": "/engine/audio/core/FootstepEvents.js",
      "sourceHash": "7a955a1924b3bda009cc7120c0e483f056ae0202ebe0d74203c6390fb4ec5483",
      "summary": "FootstepEvents.js - Footstep Audio Event Registration Registers all footstep and land audio events with the AudioEngine. Called during engine initialization.",
      "exports": [
        {
          "name": "registerFootstepEvents",
          "kind": "function",
          "signature": "registerFootstepEvents(audioEngine)",
          "summary": "Register all footstep audio events with the AudioEngine. Should be called once during engine initialization."
        },
        {
          "name": "unregisterFootstepEvents",
          "kind": "function",
          "signature": "unregisterFootstepEvents(audioEngine)",
          "summary": "Unregister all footstep events (for cleanup)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/FootstepMaterials",
      "path": "engine/reference/audio/core/FootstepMaterials.md",
      "source": "engine/audio/core/FootstepMaterials.js",
      "import": "/engine/audio/core/FootstepMaterials.js",
      "sourceHash": "279bc841de0f173a8cf65ed0929bf7706d2f8a5bdef2c2bfb5083573ebf8c0e9",
      "summary": "FootstepMaterials.js - Footstep Material Taxonomy & Mapping Defines acoustic materials for footsteps (distinct from physics materials) and provides mapping from physics/voxel materials to footstep materials.",
      "exports": [
        {
          "name": "resolveFootstepMaterial",
          "kind": "function",
          "signature": "resolveFootstepMaterial(material)",
          "summary": "Resolve a physics material ID to a footstep material key."
        },
        {
          "name": "getFootstepConfig",
          "kind": "function",
          "signature": "getFootstepConfig(materialKey)",
          "summary": "Get footstep material config."
        },
        {
          "name": "getAllFootstepMaterials",
          "kind": "function",
          "signature": "getAllFootstepMaterials()",
          "summary": "Get all footstep material keys."
        },
        {
          "name": "FOOTSTEP_MATERIALS",
          "kind": "constant",
          "signature": "FOOTSTEP_MATERIALS",
          "summary": "Footstep material configurations. Each defines the procedural patch to use and number of variants."
        },
        {
          "name": "PHYSICS_TO_FOOTSTEP",
          "kind": "constant",
          "signature": "PHYSICS_TO_FOOTSTEP",
          "summary": "Map physics material IDs to footstep materials. Physics materials are from PhysicsAudioBridge.js MATERIAL_TO_SUBSTANCE."
        },
        {
          "name": "VOXEL_TO_FOOTSTEP",
          "kind": "constant",
          "signature": "VOXEL_TO_FOOTSTEP",
          "summary": "Map voxel/terrain material strings to footstep materials. Used when querying terrain directly."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/core/index",
      "path": "engine/reference/audio/core/index.md",
      "source": "engine/audio/core/index.js",
      "import": "/engine/audio/core/index.js",
      "sourceHash": "cd7a0a62955a9370419f0dec2a1cd3e60cf904fe0d12698ff5906cb63157a11e",
      "summary": "engine/audio/core/index.js — Barrel export for core audio engine.",
      "exports": [
        {
          "name": "FOOTSTEP_MATERIALS",
          "kind": "re-export",
          "signature": "FOOTSTEP_MATERIALS",
          "summary": ""
        },
        {
          "name": "PHYSICS_TO_FOOTSTEP",
          "kind": "re-export",
          "signature": "PHYSICS_TO_FOOTSTEP",
          "summary": ""
        },
        {
          "name": "REVERB_PRESETS",
          "kind": "re-export",
          "signature": "REVERB_PRESETS",
          "summary": ""
        },
        {
          "name": "VOXEL_TO_FOOTSTEP",
          "kind": "re-export",
          "signature": "VOXEL_TO_FOOTSTEP",
          "summary": ""
        },
        {
          "name": "addOccluder",
          "kind": "re-export",
          "signature": "addOccluder",
          "summary": ""
        },
        {
          "name": "addReverbZone",
          "kind": "re-export",
          "signature": "addReverbZone",
          "summary": ""
        },
        {
          "name": "canAddVoice",
          "kind": "re-export",
          "signature": "canAddVoice",
          "summary": ""
        },
        {
          "name": "clearAudioCache",
          "kind": "re-export",
          "signature": "clearAudioCache",
          "summary": ""
        },
        {
          "name": "clearOccluders",
          "kind": "re-export",
          "signature": "clearOccluders",
          "summary": ""
        },
        {
          "name": "connectSourceToReverb",
          "kind": "re-export",
          "signature": "connectSourceToReverb",
          "summary": ""
        },
        {
          "name": "createAudioAssetManager",
          "kind": "re-export",
          "signature": "createAudioAssetManager",
          "summary": ""
        },
        {
          "name": "createAudioBus",
          "kind": "re-export",
          "signature": "createAudioBus",
          "summary": ""
        },
        {
          "name": "createAudioConcurrency",
          "kind": "re-export",
          "signature": "createAudioConcurrency",
          "summary": ""
        },
        {
          "name": "createAudioDoppler",
          "kind": "re-export",
          "signature": "createAudioDoppler",
          "summary": ""
        },
        {
          "name": "createAudioEngine",
          "kind": "re-export",
          "signature": "createAudioEngine",
          "summary": ""
        },
        {
          "name": "createAudioEventDescriptor",
          "kind": "re-export",
          "signature": "createAudioEventDescriptor",
          "summary": ""
        },
        {
          "name": "createAudioListener",
          "kind": "re-export",
          "signature": "createAudioListener",
          "summary": ""
        },
        {
          "name": "createAudioOcclusion",
          "kind": "re-export",
          "signature": "createAudioOcclusion",
          "summary": ""
        },
        {
          "name": "createAudioSource",
          "kind": "re-export",
          "signature": "createAudioSource",
          "summary": ""
        },
        {
          "name": "createReverbZoneSystem",
          "kind": "re-export",
          "signature": "createReverbZoneSystem",
          "summary": ""
        },
        {
          "name": "destroyAudioAssetManager",
          "kind": "re-export",
          "signature": "destroyAudioAssetManager",
          "summary": ""
        },
        {
          "name": "destroyAudioBus",
          "kind": "re-export",
          "signature": "destroyAudioBus",
          "summary": ""
        },
        {
          "name": "destroyAudioConcurrency",
          "kind": "re-export",
          "signature": "destroyAudioConcurrency",
          "summary": ""
        },
        {
          "name": "destroyAudioDoppler",
          "kind": "re-export",
          "signature": "destroyAudioDoppler",
          "summary": ""
        },
        {
          "name": "destroyAudioEngine",
          "kind": "re-export",
          "signature": "destroyAudioEngine",
          "summary": ""
        },
        {
          "name": "destroyAudioListener",
          "kind": "re-export",
          "signature": "destroyAudioListener",
          "summary": ""
        },
        {
          "name": "destroyAudioOcclusion",
          "kind": "re-export",
          "signature": "destroyAudioOcclusion",
          "summary": ""
        },
        {
          "name": "destroyAudioSource",
          "kind": "re-export",
          "signature": "destroyAudioSource",
          "summary": ""
        },
        {
          "name": "destroyReverbZoneSystem",
          "kind": "re-export",
          "signature": "destroyReverbZoneSystem",
          "summary": ""
        },
        {
          "name": "getAllFootstepMaterials",
          "kind": "re-export",
          "signature": "getAllFootstepMaterials",
          "summary": ""
        },
        {
          "name": "getAudioBuffer",
          "kind": "re-export",
          "signature": "getAudioBuffer",
          "summary": ""
        },
        {
          "name": "getBusOutput",
          "kind": "re-export",
          "signature": "getBusOutput",
          "summary": ""
        },
        {
          "name": "getFootstepConfig",
          "kind": "re-export",
          "signature": "getFootstepConfig",
          "summary": ""
        },
        {
          "name": "getListenerPosition",
          "kind": "re-export",
          "signature": "getListenerPosition",
          "summary": ""
        },
        {
          "name": "getListenerVelocity",
          "kind": "re-export",
          "signature": "getListenerVelocity",
          "summary": ""
        },
        {
          "name": "getSourceEffectiveVolume",
          "kind": "re-export",
          "signature": "getSourceEffectiveVolume",
          "summary": ""
        },
        {
          "name": "hasAudioBuffer",
          "kind": "re-export",
          "signature": "hasAudioBuffer",
          "summary": ""
        },
        {
          "name": "initAudioEngine",
          "kind": "re-export",
          "signature": "initAudioEngine",
          "summary": ""
        },
        {
          "name": "isSourceDone",
          "kind": "re-export",
          "signature": "isSourceDone",
          "summary": ""
        },
        {
          "name": "loadAudioAsset",
          "kind": "re-export",
          "signature": "loadAudioAsset",
          "summary": ""
        },
        {
          "name": "playBuffer",
          "kind": "re-export",
          "signature": "playBuffer",
          "summary": ""
        },
        {
          "name": "playSound",
          "kind": "re-export",
          "signature": "playSound",
          "summary": ""
        },
        {
          "name": "preloadAudioAssets",
          "kind": "re-export",
          "signature": "preloadAudioAssets",
          "summary": ""
        },
        {
          "name": "registerAudioBuffer",
          "kind": "re-export",
          "signature": "registerAudioBuffer",
          "summary": ""
        },
        {
          "name": "registerAudioEvent",
          "kind": "re-export",
          "signature": "registerAudioEvent",
          "summary": ""
        },
        {
          "name": "registerFootstepEvents",
          "kind": "re-export",
          "signature": "registerFootstepEvents",
          "summary": ""
        },
        {
          "name": "removeOccluder",
          "kind": "re-export",
          "signature": "removeOccluder",
          "summary": ""
        },
        {
          "name": "removeReverbZone",
          "kind": "re-export",
          "signature": "removeReverbZone",
          "summary": ""
        },
        {
          "name": "resolveAudioEvent",
          "kind": "re-export",
          "signature": "resolveAudioEvent",
          "summary": ""
        },
        {
          "name": "resolveFootstepMaterial",
          "kind": "re-export",
          "signature": "resolveFootstepMaterial",
          "summary": ""
        },
        {
          "name": "resumeAudioEngine",
          "kind": "re-export",
          "signature": "resumeAudioEngine",
          "summary": ""
        },
        {
          "name": "setAudioBaseUrl",
          "kind": "re-export",
          "signature": "setAudioBaseUrl",
          "summary": ""
        },
        {
          "name": "setBusDuck",
          "kind": "re-export",
          "signature": "setBusDuck",
          "summary": ""
        },
        {
          "name": "setBusMute",
          "kind": "re-export",
          "signature": "setBusMute",
          "summary": ""
        },
        {
          "name": "setBusVolume",
          "kind": "re-export",
          "signature": "setBusVolume",
          "summary": ""
        },
        {
          "name": "setBusVolumeByName",
          "kind": "re-export",
          "signature": "setBusVolumeByName",
          "summary": ""
        },
        {
          "name": "setMasterVolume",
          "kind": "re-export",
          "signature": "setMasterVolume",
          "summary": ""
        },
        {
          "name": "setSourcePitch",
          "kind": "re-export",
          "signature": "setSourcePitch",
          "summary": ""
        },
        {
          "name": "setSourcePosition",
          "kind": "re-export",
          "signature": "setSourcePosition",
          "summary": ""
        },
        {
          "name": "setSourceVolume",
          "kind": "re-export",
          "signature": "setSourceVolume",
          "summary": ""
        },
        {
          "name": "stopAllSources",
          "kind": "re-export",
          "signature": "stopAllSources",
          "summary": ""
        },
        {
          "name": "stopAudioSource",
          "kind": "re-export",
          "signature": "stopAudioSource",
          "summary": ""
        },
        {
          "name": "stopSource",
          "kind": "re-export",
          "signature": "stopSource",
          "summary": ""
        },
        {
          "name": "tickAudioEngine",
          "kind": "re-export",
          "signature": "tickAudioEngine",
          "summary": ""
        },
        {
          "name": "tickAudioSource",
          "kind": "re-export",
          "signature": "tickAudioSource",
          "summary": ""
        },
        {
          "name": "tickConcurrency",
          "kind": "re-export",
          "signature": "tickConcurrency",
          "summary": ""
        },
        {
          "name": "tickDoppler",
          "kind": "re-export",
          "signature": "tickDoppler",
          "summary": ""
        },
        {
          "name": "tickOcclusion",
          "kind": "re-export",
          "signature": "tickOcclusion",
          "summary": ""
        },
        {
          "name": "tickReverbZones",
          "kind": "re-export",
          "signature": "tickReverbZones",
          "summary": ""
        },
        {
          "name": "triggerAudioEvent",
          "kind": "re-export",
          "signature": "triggerAudioEvent",
          "summary": ""
        },
        {
          "name": "unloadAudioAsset",
          "kind": "re-export",
          "signature": "unloadAudioAsset",
          "summary": ""
        },
        {
          "name": "unregisterAudioEvent",
          "kind": "re-export",
          "signature": "unregisterAudioEvent",
          "summary": ""
        },
        {
          "name": "unregisterFootstepEvents",
          "kind": "re-export",
          "signature": "unregisterFootstepEvents",
          "summary": ""
        },
        {
          "name": "updateAudioListener",
          "kind": "re-export",
          "signature": "updateAudioListener",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/index",
      "path": "engine/reference/audio/index.md",
      "source": "engine/audio/index.js",
      "import": "/engine/audio/index.js",
      "sourceHash": "3a9da152ea1a90b39ef4fcf78e0de55f830d2d6d67b7f46f8223fbf3ba0d0080",
      "summary": "engine/audio/index.js — Top-level barrel export for the complete audio system. Exports: Core engine, Spatial pipeline, Bridges, Synth kernel, Sound atoms, Physics models.",
      "exports": [
        {
          "name": "MAX_EMITTERS",
          "kind": "re-export",
          "signature": "MAX_EMITTERS",
          "summary": ""
        },
        {
          "name": "PARAMS_PER_EMITTER",
          "kind": "re-export",
          "signature": "PARAMS_PER_EMITTER",
          "summary": ""
        },
        {
          "name": "PARAM_LAYOUT",
          "kind": "re-export",
          "signature": "PARAM_LAYOUT",
          "summary": ""
        },
        {
          "name": "TOTAL_FLOAT_COUNT",
          "kind": "re-export",
          "signature": "TOTAL_FLOAT_COUNT",
          "summary": ""
        },
        {
          "name": "clearAllEmitterStats",
          "kind": "re-export",
          "signature": "clearAllEmitterStats",
          "summary": ""
        },
        {
          "name": "clearEmitterStats",
          "kind": "re-export",
          "signature": "clearEmitterStats",
          "summary": ""
        },
        {
          "name": "createCombustionPatch",
          "kind": "re-export",
          "signature": "createCombustionPatch",
          "summary": ""
        },
        {
          "name": "createCrackleAtomPatch",
          "kind": "re-export",
          "signature": "createCrackleAtomPatch",
          "summary": ""
        },
        {
          "name": "createDropAtomPatch",
          "kind": "re-export",
          "signature": "createDropAtomPatch",
          "summary": ""
        },
        {
          "name": "createFluidPatch",
          "kind": "re-export",
          "signature": "createFluidPatch",
          "summary": ""
        },
        {
          "name": "createHissAtomPatch",
          "kind": "re-export",
          "signature": "createHissAtomPatch",
          "summary": ""
        },
        {
          "name": "createModalImpactPatch",
          "kind": "re-export",
          "signature": "createModalImpactPatch",
          "summary": ""
        },
        {
          "name": "createRumbleAtomPatch",
          "kind": "re-export",
          "signature": "createRumbleAtomPatch",
          "summary": ""
        },
        {
          "name": "createSharedParamBuffer",
          "kind": "re-export",
          "signature": "createSharedParamBuffer",
          "summary": ""
        },
        {
          "name": "createWeatherPatch",
          "kind": "re-export",
          "signature": "createWeatherPatch",
          "summary": ""
        },
        {
          "name": "createWhooshAtomPatch",
          "kind": "re-export",
          "signature": "createWhooshAtomPatch",
          "summary": ""
        },
        {
          "name": "createWindPatch",
          "kind": "re-export",
          "signature": "createWindPatch",
          "summary": ""
        },
        {
          "name": "getModalMaterials",
          "kind": "re-export",
          "signature": "getModalMaterials",
          "summary": ""
        },
        {
          "name": "getModalPreset",
          "kind": "re-export",
          "signature": "getModalPreset",
          "summary": ""
        },
        {
          "name": "readEmitterParam",
          "kind": "re-export",
          "signature": "readEmitterParam",
          "summary": ""
        },
        {
          "name": "writeEmitterStats",
          "kind": "re-export",
          "signature": "writeEmitterStats",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/BodyFoleyPatches",
      "path": "engine/reference/audio/synth/BodyFoleyPatches.md",
      "source": "engine/audio/synth/BodyFoleyPatches.js",
      "import": "/engine/audio/synth/BodyFoleyPatches.js",
      "sourceHash": "44ecb543510169eb6ce1d49710583c861e044fec2d1da32c36e68585c1b37597",
      "summary": "Jump effort sound — short vocal grunt (bandpassed noise + formant)",
      "exports": [
        {
          "name": "body_jump_effort",
          "kind": "function",
          "signature": "body_jump_effort(ctx, dest, p)",
          "summary": "Jump effort sound — short vocal grunt (bandpassed noise + formant)"
        },
        {
          "name": "body_slide",
          "kind": "function",
          "signature": "body_slide(ctx, dest, p)",
          "summary": "Slide friction sound — continuous lowpass swept noise"
        },
        {
          "name": "body_cloth",
          "kind": "function",
          "signature": "body_cloth(ctx, dest, p)",
          "summary": "Cloth rustle — short high-freq noise burst"
        },
        {
          "name": "body_breath_light",
          "kind": "function",
          "signature": "body_breath_light(ctx, dest, p)",
          "summary": "Light breathing — soft airy noise with bandpass"
        },
        {
          "name": "body_breath_heavy",
          "kind": "function",
          "signature": "body_breath_heavy(ctx, dest, p)",
          "summary": "Heavy breathing — louder breath with low-end rumble"
        },
        {
          "name": "BODY_FOLEY_PATCHES",
          "kind": "constant",
          "signature": "BODY_FOLEY_PATCHES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/FootstepPatches",
      "path": "engine/reference/audio/synth/FootstepPatches.md",
      "source": "engine/audio/synth/FootstepPatches.js",
      "import": "/engine/audio/synth/FootstepPatches.js",
      "sourceHash": "aee0f7394cadde2be30a8bfaee8bbe20fd64726a9dce58e04517da4f732f9fd0",
      "summary": "FootstepPatches.js - Procedural Footstep Sound Generators Generates material-specific footstep sounds procedurally using Web Audio API. Each patch creates layered sounds (body impact + surface texture) with parameters for speed, weight, and pitch variation.",
      "exports": [
        {
          "name": "footstep_dirt",
          "kind": "function",
          "signature": "footstep_dirt(ctx, dest, p)",
          "summary": "Dirt footstep — muffled thud + grain scatter"
        },
        {
          "name": "footstep_grass",
          "kind": "function",
          "signature": "footstep_grass(ctx, dest, p)",
          "summary": "Grass footstep — soft rustle + muffled thud"
        },
        {
          "name": "footstep_sand",
          "kind": "function",
          "signature": "footstep_sand(ctx, dest, p)",
          "summary": "Sand footstep — soft grain scatter + muffled impact"
        },
        {
          "name": "footstep_gravel",
          "kind": "function",
          "signature": "footstep_gravel(ctx, dest, p)",
          "summary": "Gravel footstep — sharp scatter + rattle"
        },
        {
          "name": "footstep_mud",
          "kind": "function",
          "signature": "footstep_mud(ctx, dest, p)",
          "summary": "Mud footstep — wet squelch + suction release"
        },
        {
          "name": "footstep_snow",
          "kind": "function",
          "signature": "footstep_snow(ctx, dest, p)",
          "summary": "Snow footstep — soft crunch + squeak"
        },
        {
          "name": "footstep_stone",
          "kind": "function",
          "signature": "footstep_stone(ctx, dest, p)",
          "summary": "Stone footstep — hard impact + high-freq crack"
        },
        {
          "name": "footstep_concrete",
          "kind": "function",
          "signature": "footstep_concrete(ctx, dest, p)",
          "summary": "Concrete footstep — dull thud + mid-freq resonance"
        },
        {
          "name": "footstep_marble",
          "kind": "function",
          "signature": "footstep_marble(ctx, dest, p)",
          "summary": "Marble footstep — bright click + ring"
        },
        {
          "name": "footstep_brick",
          "kind": "function",
          "signature": "footstep_brick(ctx, dest, p)",
          "summary": "Brick footstep — textured impact + dust scatter"
        },
        {
          "name": "footstep_wood_plank",
          "kind": "function",
          "signature": "footstep_wood_plank(ctx, dest, p)",
          "summary": "Wood plank footstep — resonant body + plank slap"
        },
        {
          "name": "footstep_wood_creak",
          "kind": "function",
          "signature": "footstep_wood_creak(ctx, dest, p)",
          "summary": "Wood creak footstep — creaking friction + resonance"
        },
        {
          "name": "footstep_metal_solid",
          "kind": "function",
          "signature": "footstep_metal_solid(ctx, dest, p)",
          "summary": "Metal solid footstep — clang + ring"
        },
        {
          "name": "footstep_metal_grate",
          "kind": "function",
          "signature": "footstep_metal_grate(ctx, dest, p)",
          "summary": "Metal grate footstep — rattle + metallic ring"
        },
        {
          "name": "footstep_water_shallow",
          "kind": "function",
          "signature": "footstep_water_shallow(ctx, dest, p)",
          "summary": "Water shallow footstep — splash + plop"
        },
        {
          "name": "footstep_water_puddle",
          "kind": "function",
          "signature": "footstep_water_puddle(ctx, dest, p)",
          "summary": "Water puddle footstep — small splash"
        },
        {
          "name": "footstep_leaves",
          "kind": "function",
          "signature": "footstep_leaves(ctx, dest, p)",
          "summary": "Leaves footstep — crunch + rustle"
        },
        {
          "name": "footstep_glass",
          "kind": "function",
          "signature": "footstep_glass(ctx, dest, p)",
          "summary": "Glass footstep — delicate clink + shimmer"
        },
        {
          "name": "footstep_ice",
          "kind": "function",
          "signature": "footstep_ice(ctx, dest, p)",
          "summary": "Ice footstep — crack + slide"
        },
        {
          "name": "land_generic",
          "kind": "function",
          "signature": "land_generic(ctx, dest, p)",
          "summary": "Generic land sound — reuses footstep patch but with heavier weight/volume Can be used as a wrapper for any footstep material"
        },
        {
          "name": "getFootstepPatch",
          "kind": "function",
          "signature": "getFootstepPatch(material)",
          "summary": "Get footstep patch function by material key."
        },
        {
          "name": "FOOTSTEP_PATCHES",
          "kind": "constant",
          "signature": "FOOTSTEP_PATCHES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/NodeRegistry",
      "path": "engine/reference/audio/synth/NodeRegistry.md",
      "source": "engine/audio/synth/NodeRegistry.js",
      "import": "/engine/audio/synth/NodeRegistry.js",
      "sourceHash": "6882e7630a9314ff81cf6368b193daa1ea90649951b50c96b23b6b365abf8eb6",
      "summary": "NodeRegistry.js — Unified Node Type Registry Single source of truth for mapping node type names to their Web Audio factory functions and worklet processor names. Usage: import { getNodeFactory, getRegisteredTypes } from './NodeRegistry.js'; const factory = getNodeFactory('Waveguide'); const node = factory(ctx, params, pitchRatio);",
      "exports": [
        {
          "name": "getNodeFactory",
          "kind": "function",
          "signature": "getNodeFactory(type)",
          "summary": "Get the Web Audio factory function for a node type. Returns a function: (ctx, nodeDefinition, pitchRatio) => { output, input, sources }"
        },
        {
          "name": "getRegisteredTypes",
          "kind": "function",
          "signature": "getRegisteredTypes()",
          "summary": "Get all registered type names."
        },
        {
          "name": "getNodeCategory",
          "kind": "function",
          "signature": "getNodeCategory(type)",
          "summary": "Get the category for a node type."
        },
        {
          "name": "hasWorkletProcessor",
          "kind": "function",
          "signature": "hasWorkletProcessor(type)",
          "summary": "Check if a type has a worklet processor implementation."
        },
        {
          "name": "NODE_CATEGORIES",
          "kind": "constant",
          "signature": "NODE_CATEGORIES",
          "summary": "Node category definitions for organization/UI."
        },
        {
          "name": "ALL_NODE_TYPES",
          "kind": "constant",
          "signature": "ALL_NODE_TYPES",
          "summary": "All registered node type names (flat list)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/PatchCompiler",
      "path": "engine/reference/audio/synth/PatchCompiler.md",
      "source": "engine/audio/synth/PatchCompiler.js",
      "import": "/engine/audio/synth/PatchCompiler.js",
      "sourceHash": "663570e9e9b3543e9b0f9168b193f52ca26ccd39b166752ff1db22d52793f97f",
      "summary": "PatchCompiler.js - Compile Patch JSON → Execution Graph Parses a patch JSON descriptor, validates nodes and wires, performs topological sort, detects feedback loops, and outputs a compiled execution plan for PatchRunner.worklet.js.",
      "exports": [
        {
          "name": "registerNodeType",
          "kind": "function",
          "signature": "registerNodeType(type, def)",
          "summary": "Register a node type for the compiler."
        },
        {
          "name": "getNodeTypes",
          "kind": "function",
          "signature": "getNodeTypes()",
          "summary": "Get all registered node types."
        },
        {
          "name": "compilePatch",
          "kind": "function",
          "signature": "compilePatch(patch)",
          "summary": "Compile a patch JSON into an execution plan."
        },
        {
          "name": "validatePatch",
          "kind": "function",
          "signature": "validatePatch(patch)",
          "summary": "Validate a patch without fully compiling."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/PatchRunner.worklet",
      "path": "engine/reference/audio/synth/PatchRunner.worklet.md",
      "source": "engine/audio/synth/PatchRunner.worklet.js",
      "import": "/engine/audio/synth/PatchRunner.worklet.js",
      "sourceHash": "6e8edf6343ab3edecefe41874c6056dc422ec3b839f1b8681ce79c68e9c133ba",
      "summary": "PatchRunner.worklet.js - AudioWorkletProcessor Executes a compiled patch graph at sample rate (128 samples/block). Receives compiled plans via MessagePort, reads game params from SharedArrayBuffer, and outputs synthesized audio. Register with: audioContext.audioWorklet.addModule('PatchRunner.worklet.js')",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/ProceduralPatches",
      "path": "engine/reference/audio/synth/ProceduralPatches.md",
      "source": "engine/audio/synth/ProceduralPatches.js",
      "import": "/engine/audio/synth/ProceduralPatches.js",
      "sourceHash": "99019ac19beb5cd6099c25f60010903dfd9e0205356c578aacd8fd23812a4498",
      "summary": "ProceduralPatches.js - Real-time procedural sound patches for particle substances Each patch is a factory: (ctx, destination, params) => { stop(), update?(params) } ctx         — AudioContext destination — AudioNode (pre-spatialized via PannerNode) params      — { volume, pitch, speed, temperature, ... } Impact patches are one-shot (auto-stop). Ambient patches loop until stop() is called, and support update() for real-time modulation.",
      "exports": [
        {
          "name": "impact_fluid",
          "kind": "function",
          "signature": "impact_fluid(ctx, dest, p)",
          "summary": "Water/fluid impact — velocity-driven splat/drip/splash. Sound design based on real water acoustics: - \"Plop\" body: fast sine pitch-sweep downward (Helmholtz cavity resonance). A water droplet traps an air bubble on impact; the bubble oscillates at a frequency that sweeps down as it grows. Duration ~15-40ms. - \"Spray\" transient: ultra-short highpass noise burst (<20ms) for the broadband crack of water hitting a surface. Only audible at higher speeds. - Bubble resonances: at high speed, 1-3 random short sine pips simulate secondary bubbles breaking the surface. Speed mapping: slow  (< 1)  → gentle drip: mostly plop body, minimal spray medium (1-4)  → splat: plop + moderate spray fast  (> 4)  → full splash: plop + loud spray + bubble pips"
        },
        {
          "name": "impact_metal",
          "kind": "function",
          "signature": "impact_metal(ctx, dest, p)",
          "summary": "Metal clang — multi-partial ring + noise transient"
        },
        {
          "name": "impact_glass",
          "kind": "function",
          "signature": "impact_glass(ctx, dest, p)",
          "summary": "Glass clink — high FM harmonics, crystalline"
        },
        {
          "name": "impact_stone",
          "kind": "function",
          "signature": "impact_stone(ctx, dest, p)",
          "summary": "Stone/debris thud — low filtered noise + crack + sub thump"
        },
        {
          "name": "impact_wood",
          "kind": "function",
          "signature": "impact_wood(ctx, dest, p)",
          "summary": "Wood knock — multi-mode resonant body + knock transient"
        },
        {
          "name": "impact_ice",
          "kind": "function",
          "signature": "impact_ice(ctx, dest, p)",
          "summary": "Ice crack — sharp noise + crystalline inharmonic pings"
        },
        {
          "name": "impact_combustion",
          "kind": "function",
          "signature": "impact_combustion(ctx, dest, p)",
          "summary": "Fire/lava impact burst — noise burst + low boom + rumble tail"
        },
        {
          "name": "impact_sand",
          "kind": "function",
          "signature": "impact_sand(ctx, dest, p)",
          "summary": "Sand soft impact — muffled body + grain scatter"
        },
        {
          "name": "impact_drop",
          "kind": "function",
          "signature": "impact_drop(ctx, dest, p)",
          "summary": "Viscous liquid drop/drip — thicker plop than water, low resonance, no spray"
        },
        {
          "name": "impact_hiss",
          "kind": "function",
          "signature": "impact_hiss(ctx, dest, p)",
          "summary": "Gas/vapor/granular hiss — soft broadband whoosh, not a hard impact"
        },
        {
          "name": "impact_crackle",
          "kind": "function",
          "signature": "impact_crackle(ctx, dest, p)",
          "summary": "Spark/debris crackle — scattered hard micro-transients"
        },
        {
          "name": "impact_electric",
          "kind": "function",
          "signature": "impact_electric(ctx, dest, p)",
          "summary": "Plasma/spark electric snap"
        },
        {
          "name": "ambient_combustion",
          "kind": "function",
          "signature": "ambient_combustion(ctx, dest, p)",
          "summary": "Fire/lava crackling ambient — random noise bursts + low rumble"
        },
        {
          "name": "ambient_fluid",
          "kind": "function",
          "signature": "ambient_fluid(ctx, dest, p)",
          "summary": "Viscous/fluid flow ambient — subtle high-freq trickle. Shared by water + viscous liquids through AMBIENT_PATCHES aliases."
        },
        {
          "name": "ambient_electric",
          "kind": "function",
          "signature": "ambient_electric(ctx, dest, p)",
          "summary": "Plasma/electric buzz ambient — FM buzz + noise crackle"
        },
        {
          "name": "ambient_wind",
          "kind": "function",
          "signature": "ambient_wind(ctx, dest, p)",
          "summary": "Smoke/steam/wind ambient — airy bandpass sweep"
        },
        {
          "name": "getImpactPatch",
          "kind": "function",
          "signature": "getImpactPatch(key)",
          "summary": "Get the impact patch function for a substance key. If runtime overrides exist for this key, returns a wrapper that merges them."
        },
        {
          "name": "getAmbientPatch",
          "kind": "function",
          "signature": "getAmbientPatch(key)",
          "summary": "Get the ambient patch function for a substance key. If runtime overrides exist for this key, returns a wrapper that merges them."
        },
        {
          "name": "setPatchOverride",
          "kind": "function",
          "signature": "setPatchOverride(key, param, value)",
          "summary": "Set a param override for a material patch. These overrides are merged into patch params at call time."
        },
        {
          "name": "setPatchOverrides",
          "kind": "function",
          "signature": "setPatchOverrides(key, overrides)",
          "summary": "Set all overrides for a material at once."
        },
        {
          "name": "getPatchOverride",
          "kind": "function",
          "signature": "getPatchOverride(key)",
          "summary": "Get current overrides for a material."
        },
        {
          "name": "clearPatchOverrides",
          "kind": "function",
          "signature": "clearPatchOverrides()",
          "summary": "Clear all runtime overrides (reset to defaults)."
        },
        {
          "name": "getAllPatchKeys",
          "kind": "function",
          "signature": "getAllPatchKeys()",
          "summary": "Get all unique canonical material keys (de-duplicated patch function names). Returns objects with { key, type, patchFn } for both impact and ambient."
        },
        {
          "name": "getAllMaterialAliases",
          "kind": "function",
          "signature": "getAllMaterialAliases()",
          "summary": "Get a flat list of all material alias keys (including duplicates)."
        },
        {
          "name": "IMPACT_PATCHES",
          "kind": "constant",
          "signature": "IMPACT_PATCHES",
          "summary": "Map of proceduralPatch strings → impact patch functions"
        },
        {
          "name": "AMBIENT_PATCHES",
          "kind": "constant",
          "signature": "AMBIENT_PATCHES",
          "summary": "Map of proceduralPatch strings → ambient patch functions"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/SfxGenerator",
      "path": "engine/reference/audio/synth/SfxGenerator.md",
      "source": "engine/audio/synth/SfxGenerator.js",
      "import": "/engine/audio/synth/SfxGenerator.js",
      "sourceHash": "3aa06ed5eec2acd85533c12646fe0d15b79b53d91636c4700be6541084c4adae",
      "summary": "SfxGenerator.js — Parametric Sound Effect Generator sfxr-inspired procedural SFX system. Every sound is defined by a compact parameter object — no samples needed. Renders to AudioBuffer or plays directly via Web Audio. Parameters cover: waveform, envelope, frequency sweep, vibrato, arpeggiation, duty cycle, retrigger, flanger, LP/HP filter, gain. Preset categories with randomize/mutate for instant sound creation: Pickup, Laser, Explosion, Powerup, Hit, Jump, Blip, Click, Error, Coin Usage: import { createSfxParams, randomizePreset, mutateSfx, renderSfx, playSfx } from './SfxGenerator.js'; const params = randomizePreset('laser'); const buffer = renderSfx(audioCtx, params); playSfx(audioCtx, buffer);",
      "exports": [
        {
          "name": "createSfxParams",
          "kind": "function",
          "signature": "createSfxParams()",
          "summary": "Create a default SFX parameter set. All values normalized to sensible ranges."
        },
        {
          "name": "randomizePreset",
          "kind": "function",
          "signature": "randomizePreset(preset)",
          "summary": "Generate a randomized SFX from a preset category."
        },
        {
          "name": "randomizeFull",
          "kind": "function",
          "signature": "randomizeFull()",
          "summary": "Fully random SFX (no preset bias)."
        },
        {
          "name": "mutateSfx",
          "kind": "function",
          "signature": "mutateSfx(params, amount = 0.05)",
          "summary": "Mutate an existing SFX params slightly (small random nudge to each param)."
        },
        {
          "name": "getPresetNames",
          "kind": "function",
          "signature": "getPresetNames()",
          "summary": "Get list of available preset names."
        },
        {
          "name": "renderSfx",
          "kind": "function",
          "signature": "renderSfx(ctx, params)",
          "summary": "Render an SFX to an AudioBuffer. This is a pure software synthesizer — runs offline, produces a buffer."
        },
        {
          "name": "playSfx",
          "kind": "function",
          "signature": "playSfx(ctx, buffer, options = {})",
          "summary": "Play a rendered SFX buffer."
        },
        {
          "name": "renderAndPlay",
          "kind": "function",
          "signature": "renderAndPlay(ctx, params, options = {})",
          "summary": "Render and immediately play an SFX."
        },
        {
          "name": "encodeSfxParams",
          "kind": "function",
          "signature": "encodeSfxParams(params)",
          "summary": "Encode SFX params to a compact JSON string."
        },
        {
          "name": "decodeSfxParams",
          "kind": "function",
          "signature": "decodeSfxParams(str)",
          "summary": "Decode SFX params from a JSON string."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/SharedParamBuffer",
      "path": "engine/reference/audio/synth/SharedParamBuffer.md",
      "source": "engine/audio/synth/SharedParamBuffer.js",
      "import": "/engine/audio/synth/SharedParamBuffer.js",
      "sourceHash": "9e32094f0ecc6dc49ab5c06a27b4709467a611d042e709920dcc24f7e5830273",
      "summary": "SharedParamBuffer.js - Game → AudioWorklet Parameter Streaming Allocates a SharedArrayBuffer for zero-copy, zero-latency parameter updates from the main game thread to the AudioWorklet synthesis thread. Layout: Float32Array where each slot maps to an exposed synth parameter. The main thread writes emitter aggregate stats each frame; the worklet reads them.",
      "exports": [
        {
          "name": "createSharedParamBuffer",
          "kind": "function",
          "signature": "createSharedParamBuffer()",
          "summary": "Create a shared parameter buffer."
        },
        {
          "name": "writeEmitterStats",
          "kind": "function",
          "signature": "writeEmitterStats(view, emitterIndex, stats)",
          "summary": "Write emitter aggregate stats to the shared buffer."
        },
        {
          "name": "clearAllEmitterStats",
          "kind": "function",
          "signature": "clearAllEmitterStats(view)",
          "summary": "Clear all emitter stats (e.g. when emitters stop)."
        },
        {
          "name": "clearEmitterStats",
          "kind": "function",
          "signature": "clearEmitterStats(view, emitterIndex)",
          "summary": "Clear stats for a specific emitter."
        },
        {
          "name": "readEmitterParam",
          "kind": "function",
          "signature": "readEmitterParam(view, emitterIndex, paramIndex)",
          "summary": "Read a single param value from the shared buffer."
        },
        {
          "name": "PARAM_LAYOUT",
          "kind": "constant",
          "signature": "PARAM_LAYOUT",
          "summary": "Standard parameter indices for emitter → synth streaming. Each active emitter gets one set of these slots."
        },
        {
          "name": "PARAMS_PER_EMITTER",
          "kind": "constant",
          "signature": "PARAMS_PER_EMITTER",
          "summary": ""
        },
        {
          "name": "MAX_EMITTERS",
          "kind": "constant",
          "signature": "MAX_EMITTERS",
          "summary": ""
        },
        {
          "name": "TOTAL_FLOAT_COUNT",
          "kind": "constant",
          "signature": "TOTAL_FLOAT_COUNT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/SoundBlender",
      "path": "engine/reference/audio/synth/SoundBlender.md",
      "source": "engine/audio/synth/SoundBlender.js",
      "import": "/engine/audio/synth/SoundBlender.js",
      "sourceHash": "05fc5a76d35f0d966a4ca68f1c4e953f7d5b884dfbeaddddbcdb0d6da527fe9b",
      "summary": "SoundBlender.js — Multi-Layer Sound Effect Mixer Blends 2-4 sound sources (AudioBuffers) with per-layer controls: - Volume, pitch shift, delay offset - Crossfade curves (linear, equal-power, cosine) - Random variation ranges per parameter - Trigger modes: simultaneous, sequential, random-pick, round-robin Produces infinite unique variations from a small set of source sounds. Usage: import { createBlendPreset, renderBlend, playBlend } from './SoundBlender.js'; const preset = createBlendPreset([buffer1, buffer2], { layers: [ { volume: 0.8, pitch: 1.0, delay: 0, volumeRandom: 0.1, pitchRandom: 0.05 }, { volume: 0.5, pitch: 1.2, delay: 0.05, volumeRandom: 0.2, pitchRandom: 0.1 } ], mode: 'simultaneous' }); playBlend(ctx, preset);",
      "exports": [
        {
          "name": "createBlendPreset",
          "kind": "function",
          "signature": "createBlendPreset(buffers = [], config = {})",
          "summary": "Create a blend preset from source buffers and layer config."
        },
        {
          "name": "addLayer",
          "kind": "function",
          "signature": "addLayer(preset, buffer, layerConfig = {})",
          "summary": "Add a layer to an existing preset."
        },
        {
          "name": "removeLayer",
          "kind": "function",
          "signature": "removeLayer(preset, index)",
          "summary": "Remove a layer by index."
        },
        {
          "name": "playBlend",
          "kind": "function",
          "signature": "playBlend(ctx, preset, options = {})",
          "summary": "Play a blend preset. Returns an object with stop() method."
        },
        {
          "name": "renderBlend",
          "kind": "function",
          "signature": "async renderBlend(ctx, preset)",
          "summary": "Render a blend preset to a single AudioBuffer (offline)."
        },
        {
          "name": "generateVariations",
          "kind": "function",
          "signature": "async generateVariations(ctx, preset, count = 10)",
          "summary": "Generate N unique variations of a blend preset. Each variation resolves random ranges differently."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/SoundSchema",
      "path": "engine/reference/audio/synth/SoundSchema.md",
      "source": "engine/audio/synth/SoundSchema.js",
      "import": "/engine/audio/synth/SoundSchema.js",
      "sourceHash": "9c5e67309f1f069f25bf97421a91d0eda50390734700a100cb92f5c1b25d482c",
      "summary": "SoundSchema.js — JSON Schema Definitions for All Sound Types Each schema defines every parameter with: type, min, max, step, default, label, description, unit, group Used by: - AudioNodeInspector: auto-generate UI controls from schema - VariationGenerator: derive ranges/limits automatically - Validation: validateParams() catches bad data on import/paste - Sound Palette: self-describing serialized entries Schema field types: 'float'   → slider (min/max/step) 'int'     → integer slider or number input 'enum'    → dropdown (options array) 'bool'    → toggle 'string'  → text input 'array'   → special handling per context",
      "exports": [
        {
          "name": "getSchema",
          "kind": "function",
          "signature": "getSchema(type)",
          "summary": "Get a schema by type name."
        },
        {
          "name": "getSchemaNames",
          "kind": "function",
          "signature": "getSchemaNames()",
          "summary": "Get all schema names."
        },
        {
          "name": "validateParams",
          "kind": "function",
          "signature": "validateParams(params, schema)",
          "summary": "Validate a params object against a schema. Returns { valid, errors, sanitized }. - sanitized: a clean copy with missing keys filled from defaults and out-of-range values clamped. - errors: array of { key, message } for any issues found."
        },
        {
          "name": "defaultsFromSchema",
          "kind": "function",
          "signature": "defaultsFromSchema(schema)",
          "summary": "Create default params from a schema."
        },
        {
          "name": "variationRangesFromSchema",
          "kind": "function",
          "signature": "variationRangesFromSchema(schema, proportion = 0.1)",
          "summary": "Extract variation ranges from a schema (for VariationGenerator). Returns { ranges, limits } where: ranges[key] = (max - min) * proportion limits[key] = [min, max]"
        },
        {
          "name": "getParamGroups",
          "kind": "function",
          "signature": "getParamGroups(schema)",
          "summary": "Get parameter groups from a schema (for UI grouping)."
        },
        {
          "name": "SFX_SCHEMA",
          "kind": "constant",
          "signature": "SFX_SCHEMA",
          "summary": ""
        },
        {
          "name": "FM_SCHEMA",
          "kind": "constant",
          "signature": "FM_SCHEMA",
          "summary": ""
        },
        {
          "name": "KARPLUS_SCHEMA",
          "kind": "constant",
          "signature": "KARPLUS_SCHEMA",
          "summary": ""
        },
        {
          "name": "GRANULAR_SCHEMA",
          "kind": "constant",
          "signature": "GRANULAR_SCHEMA",
          "summary": ""
        },
        {
          "name": "OSCILLATOR_SCHEMA",
          "kind": "constant",
          "signature": "OSCILLATOR_SCHEMA",
          "summary": ""
        },
        {
          "name": "NOISE_SCHEMA",
          "kind": "constant",
          "signature": "NOISE_SCHEMA",
          "summary": ""
        },
        {
          "name": "IMPULSE_SCHEMA",
          "kind": "constant",
          "signature": "IMPULSE_SCHEMA",
          "summary": ""
        },
        {
          "name": "MODAL_SCHEMA",
          "kind": "constant",
          "signature": "MODAL_SCHEMA",
          "summary": ""
        },
        {
          "name": "WAVEGUIDE_SCHEMA",
          "kind": "constant",
          "signature": "WAVEGUIDE_SCHEMA",
          "summary": ""
        },
        {
          "name": "SAMPLE_SCHEMA",
          "kind": "constant",
          "signature": "SAMPLE_SCHEMA",
          "summary": ""
        },
        {
          "name": "FORMANT_SCHEMA",
          "kind": "constant",
          "signature": "FORMANT_SCHEMA",
          "summary": ""
        },
        {
          "name": "BLEND_SCHEMA",
          "kind": "constant",
          "signature": "BLEND_SCHEMA",
          "summary": ""
        },
        {
          "name": "BLEND_LAYER_SCHEMA",
          "kind": "constant",
          "signature": "BLEND_LAYER_SCHEMA",
          "summary": ""
        },
        {
          "name": "SOUND_SCHEMAS",
          "kind": "constant",
          "signature": "SOUND_SCHEMAS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/SynthManager",
      "path": "engine/reference/audio/synth/SynthManager.md",
      "source": "engine/audio/synth/SynthManager.js",
      "import": "/engine/audio/synth/SynthManager.js",
      "sourceHash": "10574ebe84a1e8ab5f6681470aa3acb8b276b0bd170460e8a698e864c0c0d872",
      "summary": "SynthManager.js - Main-Thread Synthesis Orchestrator Manages AudioWorklet registration, patch instance lifecycle, parameter updates via MessagePort and SharedArrayBuffer.",
      "exports": [
        {
          "name": "createSynthManager",
          "kind": "function",
          "signature": "createSynthManager(context, destination)",
          "summary": "Create a synth manager."
        },
        {
          "name": "initSynthManager",
          "kind": "function",
          "signature": "async initSynthManager(manager, workletUrl)",
          "summary": "Initialize the synth manager — register the AudioWorklet."
        },
        {
          "name": "registerPatch",
          "kind": "function",
          "signature": "registerPatch(manager, patchJson)",
          "summary": "Register a patch in the library (compile and cache)."
        },
        {
          "name": "getPatch",
          "kind": "function",
          "signature": "getPatch(manager, patchId)",
          "summary": "Get a compiled patch plan."
        },
        {
          "name": "createPatchInstance",
          "kind": "function",
          "signature": "createPatchInstance(manager, patchId, options = {})",
          "summary": "Create and start a patch instance (a playing synth voice)."
        },
        {
          "name": "setInstanceParam",
          "kind": "function",
          "signature": "setInstanceParam(manager, instanceId, paramName, value)",
          "summary": "Set an exposed parameter on a running instance."
        },
        {
          "name": "setInstanceVolume",
          "kind": "function",
          "signature": "setInstanceVolume(manager, instanceId, volume)",
          "summary": "Set volume on a running instance."
        },
        {
          "name": "destroyPatchInstance",
          "kind": "function",
          "signature": "destroyPatchInstance(manager, instanceId, fadeOut = 0.05)",
          "summary": "Stop and destroy a patch instance."
        },
        {
          "name": "destroyAllInstances",
          "kind": "function",
          "signature": "destroyAllInstances(manager)",
          "summary": "Stop all instances."
        },
        {
          "name": "destroySynthManager",
          "kind": "function",
          "signature": "destroySynthManager(manager)",
          "summary": "Destroy the synth manager."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/VariationGenerator",
      "path": "engine/reference/audio/synth/VariationGenerator.md",
      "source": "engine/audio/synth/VariationGenerator.js",
      "import": "/engine/audio/synth/VariationGenerator.js",
      "sourceHash": "f3de018051ff20daaadcb62b160bc1ef0bbe8620a942ec45f3e3354b6a74247a",
      "summary": "VariationGenerator.js — Automatic Sound Variation System Takes any parametric sound definition and generates N unique variations by randomizing parameters within user-defined ranges. Works with: - SfxGenerator params - FM synthesis configs - Karplus-Strong configs - Any flat parameter object Also provides batch rendering to AudioBuffer arrays and a sound palette system for saving/loading favorites. Usage: import { createVariationConfig, generateVariations, renderVariationBatch } from './VariationGenerator.js'; const vc = createVariationConfig(baseParams, { startFrequency: 0.1, decayTime: 0.05 }); const variations = generateVariations(vc, 20); const buffers = await renderVariationBatch(ctx, variations, renderFn);",
      "exports": [
        {
          "name": "createVariationConfig",
          "kind": "function",
          "signature": "createVariationConfig(baseParams, ranges = {}, options = {})",
          "summary": "Create a variation configuration."
        },
        {
          "name": "createVariationConfigFromSchema",
          "kind": "function",
          "signature": "createVariationConfigFromSchema(baseParams, schema, proportion = 0.1, options = {})",
          "summary": "Create a variation config from a SoundSchema. Auto-derives ranges and limits from the schema definition."
        },
        {
          "name": "lockParam",
          "kind": "function",
          "signature": "lockParam(vc, key)",
          "summary": "Lock a parameter so it won't be varied."
        },
        {
          "name": "unlockParam",
          "kind": "function",
          "signature": "unlockParam(vc, key)",
          "summary": "Unlock a parameter for variation."
        },
        {
          "name": "setRange",
          "kind": "function",
          "signature": "setRange(vc, key, range)",
          "summary": "Set the random range for a specific parameter."
        },
        {
          "name": "setLimits",
          "kind": "function",
          "signature": "setLimits(vc, key, min, max)",
          "summary": "Set per-key min/max limits."
        },
        {
          "name": "generateVariations",
          "kind": "function",
          "signature": "generateVariations(vc, count = 10)",
          "summary": "Generate N parameter variations from a variation config."
        },
        {
          "name": "generateOneVariation",
          "kind": "function",
          "signature": "generateOneVariation(vc)",
          "summary": "Generate a single variation."
        },
        {
          "name": "renderVariationBatch",
          "kind": "function",
          "signature": "renderVariationBatch(ctx, paramsList, renderFn)",
          "summary": "Render an array of parameter variations to AudioBuffers."
        },
        {
          "name": "renderVariationBatchAsync",
          "kind": "function",
          "signature": "async renderVariationBatchAsync(ctx, paramsList, renderFn, onProgress = null)",
          "summary": "Render variations async (yields between each to avoid blocking)."
        },
        {
          "name": "readSoundPaletteRecord",
          "kind": "function",
          "signature": "readSoundPaletteRecord(storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "writeSoundPaletteRecord",
          "kind": "function",
          "signature": "writeSoundPaletteRecord(palette, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "createSoundPalette",
          "kind": "function",
          "signature": "createSoundPalette()",
          "summary": "Create a sound palette for organizing favorite sounds."
        },
        {
          "name": "addToPalette",
          "kind": "function",
          "signature": "addToPalette(palette, entry)",
          "summary": "Add a sound to the palette."
        },
        {
          "name": "removeFromPalette",
          "kind": "function",
          "signature": "removeFromPalette(palette, id)",
          "summary": "Remove a sound from the palette."
        },
        {
          "name": "searchPalette",
          "kind": "function",
          "signature": "searchPalette(palette, query = {})",
          "summary": "Find sounds in the palette by category or tag."
        },
        {
          "name": "savePalette",
          "kind": "function",
          "signature": "savePalette(palette, storage = globalThis.localStorage)",
          "summary": "Save palette to localStorage."
        },
        {
          "name": "loadPalette",
          "kind": "function",
          "signature": "loadPalette(storage = globalThis.localStorage)",
          "summary": "Load palette from localStorage."
        },
        {
          "name": "exportPalette",
          "kind": "function",
          "signature": "exportPalette(palette)",
          "summary": "Export palette as JSON string (for sharing/backup)."
        },
        {
          "name": "importPalette",
          "kind": "function",
          "signature": "importPalette(json)",
          "summary": "Import palette from JSON string."
        },
        {
          "name": "SOUND_PALETTE_SCHEMA",
          "kind": "constant",
          "signature": "SOUND_PALETTE_SCHEMA",
          "summary": ""
        },
        {
          "name": "SOUND_PALETTE_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "SOUND_PALETTE_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/WebAudioNodeFactory",
      "path": "engine/reference/audio/synth/WebAudioNodeFactory.md",
      "source": "engine/audio/synth/WebAudioNodeFactory.js",
      "import": "/engine/audio/synth/WebAudioNodeFactory.js",
      "sourceHash": "f4cbaa8d9c30bd5838947b6b56b5da0565a0de1599658b0958d54cdb38b86dcc",
      "summary": "WebAudioNodeFactory.js — Unified Web Audio Node Factory Central factory for creating main-thread Web Audio nodes from patch graph node definitions. Delegates to modular node files where possible. Used by AudioEditorPanel.js for preview playback. Usage: import { createWebAudioNode, buildVoice } from './WebAudioNodeFactory.js'; const node = createWebAudioNode(ctx, { type: 'Waveguide', params: {...} }, pitchRatio); const voice = buildVoice(ctx, patchJSON, pitchRatio);",
      "exports": [
        {
          "name": "normalizeWaveShape",
          "kind": "function",
          "signature": "normalizeWaveShape(shape)",
          "summary": "Normalize oscillator wave shape names to Web Audio API values."
        },
        {
          "name": "buildVoice",
          "kind": "function",
          "signature": "buildVoice(ctx, patch, pitchRatio = 1.0)",
          "summary": "Build a complete voice from a patch graph, scaling frequencies by pitchRatio."
        },
        {
          "name": "createWebAudioNode",
          "kind": "function",
          "signature": "createWebAudioNode(ctx, node, pitchRatio = 1.0)",
          "summary": "Create a Web Audio node (or subgraph) for a given patch graph node definition. Returns { output, input, inputMap?, sources } or null."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/index",
      "path": "engine/reference/audio/synth/index.md",
      "source": "engine/audio/synth/index.js",
      "import": "/engine/audio/synth/index.js",
      "sourceHash": "b9f9d411d729e1b13fecc3b07ae68c364874ea1aee333ded63bf2559521d4de0",
      "summary": "engine/audio/synth/index.js — Barrel export for procedural synthesis engine.",
      "exports": [
        {
          "name": "AMBIENT_PATCHES",
          "kind": "re-export",
          "signature": "AMBIENT_PATCHES",
          "summary": ""
        },
        {
          "name": "BLEND_LAYER_SCHEMA",
          "kind": "re-export",
          "signature": "BLEND_LAYER_SCHEMA",
          "summary": ""
        },
        {
          "name": "BLEND_SCHEMA",
          "kind": "re-export",
          "signature": "BLEND_SCHEMA",
          "summary": ""
        },
        {
          "name": "FM_PRESETS",
          "kind": "re-export",
          "signature": "FM_PRESETS",
          "summary": ""
        },
        {
          "name": "FM_SCHEMA",
          "kind": "re-export",
          "signature": "FM_SCHEMA",
          "summary": ""
        },
        {
          "name": "FORMANT_PRESETS",
          "kind": "re-export",
          "signature": "FORMANT_PRESETS",
          "summary": ""
        },
        {
          "name": "FORMANT_SCHEMA",
          "kind": "re-export",
          "signature": "FORMANT_SCHEMA",
          "summary": ""
        },
        {
          "name": "GRANULAR_SCHEMA",
          "kind": "re-export",
          "signature": "GRANULAR_SCHEMA",
          "summary": ""
        },
        {
          "name": "IMPACT_PATCHES",
          "kind": "re-export",
          "signature": "IMPACT_PATCHES",
          "summary": ""
        },
        {
          "name": "KARPLUS_SCHEMA",
          "kind": "re-export",
          "signature": "KARPLUS_SCHEMA",
          "summary": ""
        },
        {
          "name": "MATERIAL_OPTIONS",
          "kind": "re-export",
          "signature": "MATERIAL_OPTIONS",
          "summary": ""
        },
        {
          "name": "MODAL_MATERIALS",
          "kind": "re-export",
          "signature": "MODAL_MATERIALS",
          "summary": ""
        },
        {
          "name": "NOISE_COLOR_OPTIONS",
          "kind": "re-export",
          "signature": "NOISE_COLOR_OPTIONS",
          "summary": ""
        },
        {
          "name": "SFX_SCHEMA",
          "kind": "re-export",
          "signature": "SFX_SCHEMA",
          "summary": ""
        },
        {
          "name": "SOUND_SCHEMAS",
          "kind": "re-export",
          "signature": "SOUND_SCHEMAS",
          "summary": ""
        },
        {
          "name": "WAVEGUIDE_MODE_OPTIONS",
          "kind": "re-export",
          "signature": "WAVEGUIDE_MODE_OPTIONS",
          "summary": ""
        },
        {
          "name": "WAVEGUIDE_TERMINATIONS",
          "kind": "re-export",
          "signature": "WAVEGUIDE_TERMINATIONS",
          "summary": ""
        },
        {
          "name": "addLayer",
          "kind": "re-export",
          "signature": "addLayer",
          "summary": ""
        },
        {
          "name": "addToPalette",
          "kind": "re-export",
          "signature": "addToPalette",
          "summary": ""
        },
        {
          "name": "ambient_combustion",
          "kind": "re-export",
          "signature": "ambient_combustion",
          "summary": ""
        },
        {
          "name": "ambient_electric",
          "kind": "re-export",
          "signature": "ambient_electric",
          "summary": ""
        },
        {
          "name": "ambient_fluid",
          "kind": "re-export",
          "signature": "ambient_fluid",
          "summary": ""
        },
        {
          "name": "ambient_wind",
          "kind": "re-export",
          "signature": "ambient_wind",
          "summary": ""
        },
        {
          "name": "buildVoice",
          "kind": "re-export",
          "signature": "buildVoice",
          "summary": ""
        },
        {
          "name": "calculateModeAmplitudes",
          "kind": "re-export",
          "signature": "calculateModeAmplitudes",
          "summary": ""
        },
        {
          "name": "calculateModeDecays",
          "kind": "re-export",
          "signature": "calculateModeDecays",
          "summary": ""
        },
        {
          "name": "calculateModeFrequencies",
          "kind": "re-export",
          "signature": "calculateModeFrequencies",
          "summary": ""
        },
        {
          "name": "compilePatch",
          "kind": "re-export",
          "signature": "compilePatch",
          "summary": ""
        },
        {
          "name": "connectGranular",
          "kind": "re-export",
          "signature": "connectGranular",
          "summary": ""
        },
        {
          "name": "createBlendPreset",
          "kind": "re-export",
          "signature": "createBlendPreset",
          "summary": ""
        },
        {
          "name": "createFMPatch",
          "kind": "re-export",
          "signature": "createFMPatch",
          "summary": ""
        },
        {
          "name": "createFormantFilter",
          "kind": "re-export",
          "signature": "createFormantFilter",
          "summary": ""
        },
        {
          "name": "createFormantPatch",
          "kind": "re-export",
          "signature": "createFormantPatch",
          "summary": ""
        },
        {
          "name": "createGranularEngine",
          "kind": "re-export",
          "signature": "createGranularEngine",
          "summary": ""
        },
        {
          "name": "createGranularPatch",
          "kind": "re-export",
          "signature": "createGranularPatch",
          "summary": ""
        },
        {
          "name": "createKarplusStrongPatch",
          "kind": "re-export",
          "signature": "createKarplusStrongPatch",
          "summary": ""
        },
        {
          "name": "createModalBank",
          "kind": "re-export",
          "signature": "createModalBank",
          "summary": ""
        },
        {
          "name": "createNoiseBuffer",
          "kind": "re-export",
          "signature": "createNoiseBuffer",
          "summary": ""
        },
        {
          "name": "createNoiseSource",
          "kind": "re-export",
          "signature": "createNoiseSource",
          "summary": ""
        },
        {
          "name": "createPatchInstance",
          "kind": "re-export",
          "signature": "createPatchInstance",
          "summary": ""
        },
        {
          "name": "createSfxParams",
          "kind": "re-export",
          "signature": "createSfxParams",
          "summary": ""
        },
        {
          "name": "createSoundPalette",
          "kind": "re-export",
          "signature": "createSoundPalette",
          "summary": ""
        },
        {
          "name": "createStereoNoiseSource",
          "kind": "re-export",
          "signature": "createStereoNoiseSource",
          "summary": ""
        },
        {
          "name": "createSynthManager",
          "kind": "re-export",
          "signature": "createSynthManager",
          "summary": ""
        },
        {
          "name": "createVariationConfig",
          "kind": "re-export",
          "signature": "createVariationConfig",
          "summary": ""
        },
        {
          "name": "createVariationConfigFromSchema",
          "kind": "re-export",
          "signature": "createVariationConfigFromSchema",
          "summary": ""
        },
        {
          "name": "createWaveguide",
          "kind": "re-export",
          "signature": "createWaveguide",
          "summary": ""
        },
        {
          "name": "createWebAudioNode",
          "kind": "re-export",
          "signature": "createWebAudioNode",
          "summary": ""
        },
        {
          "name": "decodeSfxParams",
          "kind": "re-export",
          "signature": "decodeSfxParams",
          "summary": ""
        },
        {
          "name": "defaultsFromSchema",
          "kind": "re-export",
          "signature": "defaultsFromSchema",
          "summary": ""
        },
        {
          "name": "destroyAllInstances",
          "kind": "re-export",
          "signature": "destroyAllInstances",
          "summary": ""
        },
        {
          "name": "destroyFormantFilter",
          "kind": "re-export",
          "signature": "destroyFormantFilter",
          "summary": ""
        },
        {
          "name": "destroyGranular",
          "kind": "re-export",
          "signature": "destroyGranular",
          "summary": ""
        },
        {
          "name": "destroyPatchInstance",
          "kind": "re-export",
          "signature": "destroyPatchInstance",
          "summary": ""
        },
        {
          "name": "destroySynthManager",
          "kind": "re-export",
          "signature": "destroySynthManager",
          "summary": ""
        },
        {
          "name": "encodeSfxParams",
          "kind": "re-export",
          "signature": "encodeSfxParams",
          "summary": ""
        },
        {
          "name": "exportPalette",
          "kind": "re-export",
          "signature": "exportPalette",
          "summary": ""
        },
        {
          "name": "generateBlendVariations",
          "kind": "re-export",
          "signature": "generateBlendVariations",
          "summary": ""
        },
        {
          "name": "generateOneVariation",
          "kind": "re-export",
          "signature": "generateOneVariation",
          "summary": ""
        },
        {
          "name": "generateVariations",
          "kind": "re-export",
          "signature": "generateVariations",
          "summary": ""
        },
        {
          "name": "getAmbientPatch",
          "kind": "re-export",
          "signature": "getAmbientPatch",
          "summary": ""
        },
        {
          "name": "getFMPresetNames",
          "kind": "re-export",
          "signature": "getFMPresetNames",
          "summary": ""
        },
        {
          "name": "getFormantPresetNames",
          "kind": "re-export",
          "signature": "getFormantPresetNames",
          "summary": ""
        },
        {
          "name": "getImpactPatch",
          "kind": "re-export",
          "signature": "getImpactPatch",
          "summary": ""
        },
        {
          "name": "getNodeTypes",
          "kind": "re-export",
          "signature": "getNodeTypes",
          "summary": ""
        },
        {
          "name": "getParamGroups",
          "kind": "re-export",
          "signature": "getParamGroups",
          "summary": ""
        },
        {
          "name": "getPatch",
          "kind": "re-export",
          "signature": "getPatch",
          "summary": ""
        },
        {
          "name": "getPresetNames",
          "kind": "re-export",
          "signature": "getPresetNames",
          "summary": ""
        },
        {
          "name": "getSchema",
          "kind": "re-export",
          "signature": "getSchema",
          "summary": ""
        },
        {
          "name": "getSchemaNames",
          "kind": "re-export",
          "signature": "getSchemaNames",
          "summary": ""
        },
        {
          "name": "impact_combustion",
          "kind": "re-export",
          "signature": "impact_combustion",
          "summary": ""
        },
        {
          "name": "impact_crackle",
          "kind": "re-export",
          "signature": "impact_crackle",
          "summary": ""
        },
        {
          "name": "impact_drop",
          "kind": "re-export",
          "signature": "impact_drop",
          "summary": ""
        },
        {
          "name": "impact_electric",
          "kind": "re-export",
          "signature": "impact_electric",
          "summary": ""
        },
        {
          "name": "impact_fluid",
          "kind": "re-export",
          "signature": "impact_fluid",
          "summary": ""
        },
        {
          "name": "impact_glass",
          "kind": "re-export",
          "signature": "impact_glass",
          "summary": ""
        },
        {
          "name": "impact_hiss",
          "kind": "re-export",
          "signature": "impact_hiss",
          "summary": ""
        },
        {
          "name": "impact_ice",
          "kind": "re-export",
          "signature": "impact_ice",
          "summary": ""
        },
        {
          "name": "impact_metal",
          "kind": "re-export",
          "signature": "impact_metal",
          "summary": ""
        },
        {
          "name": "impact_sand",
          "kind": "re-export",
          "signature": "impact_sand",
          "summary": ""
        },
        {
          "name": "impact_stone",
          "kind": "re-export",
          "signature": "impact_stone",
          "summary": ""
        },
        {
          "name": "impact_wood",
          "kind": "re-export",
          "signature": "impact_wood",
          "summary": ""
        },
        {
          "name": "importPalette",
          "kind": "re-export",
          "signature": "importPalette",
          "summary": ""
        },
        {
          "name": "initSynthManager",
          "kind": "re-export",
          "signature": "initSynthManager",
          "summary": ""
        },
        {
          "name": "loadPalette",
          "kind": "re-export",
          "signature": "loadPalette",
          "summary": ""
        },
        {
          "name": "lockParam",
          "kind": "re-export",
          "signature": "lockParam",
          "summary": ""
        },
        {
          "name": "morphFormants",
          "kind": "re-export",
          "signature": "morphFormants",
          "summary": ""
        },
        {
          "name": "mutateSfx",
          "kind": "re-export",
          "signature": "mutateSfx",
          "summary": ""
        },
        {
          "name": "normalizeWaveShape",
          "kind": "re-export",
          "signature": "normalizeWaveShape",
          "summary": ""
        },
        {
          "name": "playBlend",
          "kind": "re-export",
          "signature": "playBlend",
          "summary": ""
        },
        {
          "name": "playFM",
          "kind": "re-export",
          "signature": "playFM",
          "summary": ""
        },
        {
          "name": "playKarplusStrong",
          "kind": "re-export",
          "signature": "playKarplusStrong",
          "summary": ""
        },
        {
          "name": "playSfx",
          "kind": "re-export",
          "signature": "playSfx",
          "summary": ""
        },
        {
          "name": "randomizeFull",
          "kind": "re-export",
          "signature": "randomizeFull",
          "summary": ""
        },
        {
          "name": "randomizePreset",
          "kind": "re-export",
          "signature": "randomizePreset",
          "summary": ""
        },
        {
          "name": "registerNodeType",
          "kind": "re-export",
          "signature": "registerNodeType",
          "summary": ""
        },
        {
          "name": "registerPatch",
          "kind": "re-export",
          "signature": "registerPatch",
          "summary": ""
        },
        {
          "name": "removeFromPalette",
          "kind": "re-export",
          "signature": "removeFromPalette",
          "summary": ""
        },
        {
          "name": "removeLayer",
          "kind": "re-export",
          "signature": "removeLayer",
          "summary": ""
        },
        {
          "name": "renderAndPlay",
          "kind": "re-export",
          "signature": "renderAndPlay",
          "summary": ""
        },
        {
          "name": "renderBlend",
          "kind": "re-export",
          "signature": "renderBlend",
          "summary": ""
        },
        {
          "name": "renderFM",
          "kind": "re-export",
          "signature": "renderFM",
          "summary": ""
        },
        {
          "name": "renderFM4",
          "kind": "re-export",
          "signature": "renderFM4",
          "summary": ""
        },
        {
          "name": "renderKarplusStrong",
          "kind": "re-export",
          "signature": "renderKarplusStrong",
          "summary": ""
        },
        {
          "name": "renderSfx",
          "kind": "re-export",
          "signature": "renderSfx",
          "summary": ""
        },
        {
          "name": "renderVariationBatch",
          "kind": "re-export",
          "signature": "renderVariationBatch",
          "summary": ""
        },
        {
          "name": "renderVariationBatchAsync",
          "kind": "re-export",
          "signature": "renderVariationBatchAsync",
          "summary": ""
        },
        {
          "name": "renderWaveguide",
          "kind": "re-export",
          "signature": "renderWaveguide",
          "summary": ""
        },
        {
          "name": "savePalette",
          "kind": "re-export",
          "signature": "savePalette",
          "summary": ""
        },
        {
          "name": "searchPalette",
          "kind": "re-export",
          "signature": "searchPalette",
          "summary": ""
        },
        {
          "name": "setFormantFrequencies",
          "kind": "re-export",
          "signature": "setFormantFrequencies",
          "summary": ""
        },
        {
          "name": "setFormantMorphTime",
          "kind": "re-export",
          "signature": "setFormantMorphTime",
          "summary": ""
        },
        {
          "name": "setFormantVowel",
          "kind": "re-export",
          "signature": "setFormantVowel",
          "summary": ""
        },
        {
          "name": "setGranularBuffer",
          "kind": "re-export",
          "signature": "setGranularBuffer",
          "summary": ""
        },
        {
          "name": "setGranularParam",
          "kind": "re-export",
          "signature": "setGranularParam",
          "summary": ""
        },
        {
          "name": "setInstanceParam",
          "kind": "re-export",
          "signature": "setInstanceParam",
          "summary": ""
        },
        {
          "name": "setInstanceVolume",
          "kind": "re-export",
          "signature": "setInstanceVolume",
          "summary": ""
        },
        {
          "name": "setLimits",
          "kind": "re-export",
          "signature": "setLimits",
          "summary": ""
        },
        {
          "name": "setRange",
          "kind": "re-export",
          "signature": "setRange",
          "summary": ""
        },
        {
          "name": "startGranular",
          "kind": "re-export",
          "signature": "startGranular",
          "summary": ""
        },
        {
          "name": "stopGranular",
          "kind": "re-export",
          "signature": "stopGranular",
          "summary": ""
        },
        {
          "name": "unlockParam",
          "kind": "re-export",
          "signature": "unlockParam",
          "summary": ""
        },
        {
          "name": "validateParams",
          "kind": "re-export",
          "signature": "validateParams",
          "summary": ""
        },
        {
          "name": "validatePatch",
          "kind": "re-export",
          "signature": "validatePatch",
          "summary": ""
        },
        {
          "name": "variationRangesFromSchema",
          "kind": "re-export",
          "signature": "variationRangesFromSchema",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/FMOperatorNode",
      "path": "engine/reference/audio/synth/nodes/FMOperatorNode.md",
      "source": "engine/audio/synth/nodes/FMOperatorNode.js",
      "import": "/engine/audio/synth/nodes/FMOperatorNode.js",
      "sourceHash": "5e02cc4384db8f9912f47c09ff49a2118b651d2933c1f004e06b4fa9dc3e3380",
      "summary": "FMOperatorNode.js — FM Synthesis Engine Frequency Modulation synthesis: one oscillator (modulator) modulates the frequency of another (carrier), producing complex harmonic and inharmonic timbres from simple parameters. Supports up to 4 operators in series/parallel configurations. Each operator has: frequency ratio, detune, envelope, feedback. Usage: import { renderFM, playFM, createFMPatch } from './FMOperatorNode.js'; const buffer = renderFM(audioCtx, { carrierFreq: 440, modRatio: 2, modDepth: 200 });",
      "exports": [
        {
          "name": "renderFM",
          "kind": "function",
          "signature": "renderFM(ctx, config = {})",
          "summary": "Render 2-operator FM synthesis to an AudioBuffer."
        },
        {
          "name": "renderFM4",
          "kind": "function",
          "signature": "renderFM4(ctx, config = {})",
          "summary": "Render a 4-operator FM stack. Operators are chained: op4 → op3 → op2 → op1 (carrier)."
        },
        {
          "name": "playFM",
          "kind": "function",
          "signature": "playFM(ctx, config = {}, destination = null)",
          "summary": "Play FM synthesis directly."
        },
        {
          "name": "getFMPresetNames",
          "kind": "function",
          "signature": "getFMPresetNames()",
          "summary": "Get list of FM preset names."
        },
        {
          "name": "createFMPatch",
          "kind": "function",
          "signature": "createFMPatch(config = {})",
          "summary": ""
        },
        {
          "name": "FM_PRESETS",
          "kind": "constant",
          "signature": "FM_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/FormantFilterNode",
      "path": "engine/reference/audio/synth/nodes/FormantFilterNode.md",
      "source": "engine/audio/synth/nodes/FormantFilterNode.js",
      "import": "/engine/audio/synth/nodes/FormantFilterNode.js",
      "sourceHash": "4d7a1cf0c9bb2b2fac4618e2e03f88c06cc9cd66174de74ca7b0e2288af86cd3",
      "summary": "FormantFilterNode.js — Formant Filter for Vocal/Creature Sounds Parallel bank of bandpass filters tuned to vocal formant frequencies. Shapes any input signal into vowel-like resonances. Useful for: - Creature vocalizations - Vocal pads and textures - Talking/singing synthesis - Resonant environmental effects Includes presets for standard vowels (A, E, I, O, U) and creature sounds. Usage: import { createFormantFilter, setFormantVowel, destroyFormantFilter } from './FormantFilterNode.js'; const filter = createFormantFilter(audioCtx); sourceNode.connect(filter.input); filter.output.connect(audioCtx.destination); setFormantVowel(filter, 'A');",
      "exports": [
        {
          "name": "createFormantFilter",
          "kind": "function",
          "signature": "createFormantFilter(ctx, config = {})",
          "summary": "Create a formant filter bank."
        },
        {
          "name": "setFormantVowel",
          "kind": "function",
          "signature": "setFormantVowel(instance, vowelName)",
          "summary": "Set the formant filter to a vowel preset."
        },
        {
          "name": "setFormantFrequencies",
          "kind": "function",
          "signature": "setFormantFrequencies(instance, frequencies, bandwidths, gains)",
          "summary": "Set formant frequencies directly (bypass presets)."
        },
        {
          "name": "morphFormants",
          "kind": "function",
          "signature": "morphFormants(instance, vowelA, vowelB, blend)",
          "summary": "Morph between two vowel presets."
        },
        {
          "name": "setFormantMorphTime",
          "kind": "function",
          "signature": "setFormantMorphTime(instance, seconds)",
          "summary": "Set morph time (transition speed)."
        },
        {
          "name": "destroyFormantFilter",
          "kind": "function",
          "signature": "destroyFormantFilter(instance)",
          "summary": "Destroy the formant filter and release resources."
        },
        {
          "name": "getFormantPresetNames",
          "kind": "function",
          "signature": "getFormantPresetNames()",
          "summary": "Get list of available formant preset names."
        },
        {
          "name": "createFormantPatch",
          "kind": "function",
          "signature": "createFormantPatch(config = {})",
          "summary": ""
        },
        {
          "name": "FORMANT_PRESETS",
          "kind": "constant",
          "signature": "FORMANT_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/GranularNode",
      "path": "engine/reference/audio/synth/nodes/GranularNode.md",
      "source": "engine/audio/synth/nodes/GranularNode.js",
      "import": "/engine/audio/synth/nodes/GranularNode.js",
      "sourceHash": "7b036e675901f13c4bd96456012328da4861acdb7490fcb9e03113fcc6b35c82",
      "summary": "Create a granular synthesis engine.",
      "exports": [
        {
          "name": "createGranularEngine",
          "kind": "function",
          "signature": "createGranularEngine(ctx, buffer, config = {})",
          "summary": "Create a granular synthesis engine."
        },
        {
          "name": "startGranular",
          "kind": "function",
          "signature": "startGranular(engine)",
          "summary": "Start the granular engine — begins spawning grains."
        },
        {
          "name": "stopGranular",
          "kind": "function",
          "signature": "stopGranular(engine, fadeTime = 0.1)",
          "summary": "Stop the granular engine."
        },
        {
          "name": "setGranularParam",
          "kind": "function",
          "signature": "setGranularParam(engine, key, value)",
          "summary": "Set a granular parameter."
        },
        {
          "name": "setGranularBuffer",
          "kind": "function",
          "signature": "setGranularBuffer(engine, buffer)",
          "summary": "Replace the source buffer."
        },
        {
          "name": "connectGranular",
          "kind": "function",
          "signature": "connectGranular(engine, destination)",
          "summary": "Connect granular output to a destination."
        },
        {
          "name": "destroyGranular",
          "kind": "function",
          "signature": "destroyGranular(engine)",
          "summary": "Destroy and clean up."
        },
        {
          "name": "createGranularPatch",
          "kind": "function",
          "signature": "createGranularPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/ImpulseNode",
      "path": "engine/reference/audio/synth/nodes/ImpulseNode.md",
      "source": "engine/audio/synth/nodes/ImpulseNode.js",
      "import": "/engine/audio/synth/nodes/ImpulseNode.js",
      "sourceHash": "40892fc4f69c88cfb764c0c7ba832e5d887d38d5ad00167e3fb486e33e58639b",
      "summary": "Create a real-time impulse generator engine.",
      "exports": [
        {
          "name": "createImpulseEngine",
          "kind": "function",
          "signature": "createImpulseEngine(ctx, config = {})",
          "summary": "Create a real-time impulse generator engine."
        },
        {
          "name": "generateImpulseBuffer",
          "kind": "function",
          "signature": "generateImpulseBuffer(ctx, config = {})",
          "summary": "Generate a single impulse as an AudioBuffer."
        },
        {
          "name": "isValidImpulseShape",
          "kind": "function",
          "signature": "isValidImpulseShape(shape)",
          "summary": ""
        },
        {
          "name": "IMPULSE_SHAPE_OPTIONS",
          "kind": "constant",
          "signature": "IMPULSE_SHAPE_OPTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/KarplusStrongNode",
      "path": "engine/reference/audio/synth/nodes/KarplusStrongNode.md",
      "source": "engine/audio/synth/nodes/KarplusStrongNode.js",
      "import": "/engine/audio/synth/nodes/KarplusStrongNode.js",
      "sourceHash": "75e2adbd6933e2cc1d6f3214a759be3aa5dd0ab975449c67edd016857d60cbd3",
      "summary": "Render a Karplus-Strong plucked string to an AudioBuffer.",
      "exports": [
        {
          "name": "renderKarplusStrong",
          "kind": "function",
          "signature": "renderKarplusStrong(ctx, config = {})",
          "summary": "Render a Karplus-Strong plucked string to an AudioBuffer."
        },
        {
          "name": "playKarplusStrong",
          "kind": "function",
          "signature": "playKarplusStrong(ctx, config = {}, destination = null)",
          "summary": "Play a Karplus-Strong sound directly."
        },
        {
          "name": "createKarplusStrongPatch",
          "kind": "function",
          "signature": "createKarplusStrongPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/MidiInputNode",
      "path": "engine/reference/audio/synth/nodes/MidiInputNode.md",
      "source": "engine/audio/synth/nodes/MidiInputNode.js",
      "import": "/engine/audio/synth/nodes/MidiInputNode.js",
      "sourceHash": "91c2f10fe56bdfc7a619aa6b13369e6b5c9c0e60f601ac9f5d220d31a4473c63",
      "summary": "MidiInputNode.js — MIDI Input Integration Receives MIDI input from external controllers or DAW via Web MIDI API. Outputs gate, note, velocity, and CC signals for driving synth nodes. Usage: import { createMidiInput, requestMidiAccess } from './MidiInputNode.js'; await requestMidiAccess(); const midi = createMidiInput({ channel: 0 }); midi.onNoteOn = (note, velocity) => synth.noteOn(note, velocity);",
      "exports": [
        {
          "name": "requestMidiAccess",
          "kind": "function",
          "signature": "async requestMidiAccess()",
          "summary": "Request MIDI access from the browser."
        },
        {
          "name": "getMidiInputs",
          "kind": "function",
          "signature": "getMidiInputs()",
          "summary": "Get list of available MIDI inputs."
        },
        {
          "name": "createMidiInput",
          "kind": "function",
          "signature": "createMidiInput(config = {})",
          "summary": "Create a MIDI input node that processes incoming MIDI messages."
        },
        {
          "name": "createMidiCCMap",
          "kind": "function",
          "signature": "createMidiCCMap(config = {})",
          "summary": "Create a CC mapper that scales CC values to a target range."
        },
        {
          "name": "VELOCITY_CURVES",
          "kind": "constant",
          "signature": "VELOCITY_CURVES",
          "summary": ""
        },
        {
          "name": "CC_CURVES",
          "kind": "constant",
          "signature": "CC_CURVES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/ModalBankNode",
      "path": "engine/reference/audio/synth/nodes/ModalBankNode.md",
      "source": "engine/audio/synth/nodes/ModalBankNode.js",
      "import": "/engine/audio/synth/nodes/ModalBankNode.js",
      "sourceHash": "ea9697ad3c596e07a4ad0d2b9ec811471bcc9fe934acf53888735705e4f2e812",
      "summary": "ModalBankNode.js — Modal Synthesis Engine Physical modeling using parallel resonant filters (modes). Each mode has frequency, amplitude, and decay characteristics. Material presets auto-calculate modes based on: - Stiff string formula (metal, piano strings) - Beam formula (wood, glass bars) - Circular membrane formula (drums) - Rectangular plate formula (bells, gongs) Usage: import { createModalBank, MODAL_MATERIALS } from './ModalBankNode.js'; const bank = createModalBank(audioCtx, { material: 'metal', frequency: 440 }); bank.excite(impulseBuffer);",
      "exports": [
        {
          "name": "calculateModeFrequencies",
          "kind": "function",
          "signature": "calculateModeFrequencies(formula, f0, modeCount, inharmonicity = 0)",
          "summary": "Calculate modal frequencies based on material formula."
        },
        {
          "name": "calculateModeAmplitudes",
          "kind": "function",
          "signature": "calculateModeAmplitudes(modeCount, strikePosition, brightness = 0.5)",
          "summary": "Calculate mode amplitudes based on strike position."
        },
        {
          "name": "calculateModeDecays",
          "kind": "function",
          "signature": "calculateModeDecays(frequencies, baseDamping, highDamp, f0)",
          "summary": "Calculate mode decay times based on frequency and damping."
        },
        {
          "name": "createModalBank",
          "kind": "function",
          "signature": "createModalBank(ctx, config = {})",
          "summary": "Create a modal bank synthesis engine."
        },
        {
          "name": "isValidMaterial",
          "kind": "function",
          "signature": "isValidMaterial(material)",
          "summary": ""
        },
        {
          "name": "MODAL_MATERIALS",
          "kind": "constant",
          "signature": "MODAL_MATERIALS",
          "summary": ""
        },
        {
          "name": "MATERIAL_OPTIONS",
          "kind": "constant",
          "signature": "MATERIAL_OPTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/NoiseGeneratorNode",
      "path": "engine/reference/audio/synth/nodes/NoiseGeneratorNode.md",
      "source": "engine/audio/synth/nodes/NoiseGeneratorNode.js",
      "import": "/engine/audio/synth/nodes/NoiseGeneratorNode.js",
      "sourceHash": "4a7c396435c6585fbc151f9ac5bbdd8b46794a30c00ed6e5ea9289333372084f",
      "summary": "Create a noise AudioBuffer of the specified color.",
      "exports": [
        {
          "name": "createNoiseBuffer",
          "kind": "function",
          "signature": "createNoiseBuffer(ctx, color = 'white', duration = DEFAULT_DURATION, options = {})",
          "summary": "Create a noise AudioBuffer of the specified color."
        },
        {
          "name": "createNoiseSource",
          "kind": "function",
          "signature": "createNoiseSource(ctx, color = 'white', options = {})",
          "summary": "Create a looping noise source node."
        },
        {
          "name": "createStereoNoiseSource",
          "kind": "function",
          "signature": "createStereoNoiseSource(ctx, color = 'white', options = {})",
          "summary": "Create stereo noise with decorrelated channels."
        },
        {
          "name": "isValidNoiseColor",
          "kind": "function",
          "signature": "isValidNoiseColor(color)",
          "summary": ""
        },
        {
          "name": "NOISE_COLOR_OPTIONS",
          "kind": "constant",
          "signature": "NOISE_COLOR_OPTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/OscillatorNode",
      "path": "engine/reference/audio/synth/nodes/OscillatorNode.md",
      "source": "engine/audio/synth/nodes/OscillatorNode.js",
      "import": "/engine/audio/synth/nodes/OscillatorNode.js",
      "sourceHash": "f42e82e7f1e13d3be8b1bb292847360c3fa481b115208f54dce43489c78fc81c",
      "summary": "OscillatorNode.js — Advanced Oscillator Synthesis Supports multiple waveform types beyond Web Audio defaults: - sine, square, sawtooth, triangle (native) - pulse (variable duty cycle via PeriodicWave) - supersaw (multiple detuned sawtooths) - custom (user-defined wavetable) Additional features: - Sub-oscillator (-1 or -2 octaves) - Unison/supersaw with configurable voice count and spread - Pulse width modulation Usage: import { createOscillator, createSupersawOscillator } from './OscillatorNode.js'; const osc = createOscillator(audioCtx, { shape: 'pulse', frequency: 440, pulseWidth: 0.3 }); osc.output.connect(destination); osc.start();",
      "exports": [
        {
          "name": "createOscillator",
          "kind": "function",
          "signature": "createOscillator(ctx, config = {})",
          "summary": "Create an advanced oscillator node."
        },
        {
          "name": "isValidShape",
          "kind": "function",
          "signature": "isValidShape(shape)",
          "summary": ""
        },
        {
          "name": "WAVETABLE_PRESETS",
          "kind": "constant",
          "signature": "WAVETABLE_PRESETS",
          "summary": ""
        },
        {
          "name": "OSCILLATOR_SHAPES",
          "kind": "constant",
          "signature": "OSCILLATOR_SHAPES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/SamplePlayerNode",
      "path": "engine/reference/audio/synth/nodes/SamplePlayerNode.md",
      "source": "engine/audio/synth/nodes/SamplePlayerNode.js",
      "import": "/engine/audio/synth/nodes/SamplePlayerNode.js",
      "sourceHash": "0709ac24a85644f8eea02e3db6edff6fbaf2b78a8289e9354855d3f7125a27d0",
      "summary": "SamplePlayerNode.js — Advanced Sample Playback Enhanced sample player with: - Loop modes: forward, pingpong, reverse - Start/end points and loop regions - Crossfade looping for seamless loops - Built-in ADSR envelope - Pitch tracking from MIDI note Usage: import { createSamplePlayer } from './SamplePlayerNode.js'; const player = createSamplePlayer(audioCtx, buffer, { loop: true, loopMode: 'pingpong' }); player.trigger();",
      "exports": [
        {
          "name": "createSamplePlayer",
          "kind": "function",
          "signature": "createSamplePlayer(ctx, buffer, config = {})",
          "summary": "Create an advanced sample player."
        },
        {
          "name": "createCrossfadeLoopBuffer",
          "kind": "function",
          "signature": "createCrossfadeLoopBuffer(ctx, buffer, loopStart, loopEnd, crossfadeDuration)",
          "summary": "Create a crossfade loop buffer. Blends the end of the loop region back into the start for seamless looping."
        },
        {
          "name": "isValidLoopMode",
          "kind": "function",
          "signature": "isValidLoopMode(mode)",
          "summary": ""
        },
        {
          "name": "SAMPLE_LOOP_MODES",
          "kind": "constant",
          "signature": "SAMPLE_LOOP_MODES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/SequencerNode",
      "path": "engine/reference/audio/synth/nodes/SequencerNode.md",
      "source": "engine/audio/synth/nodes/SequencerNode.js",
      "import": "/engine/audio/synth/nodes/SequencerNode.js",
      "sourceHash": "9c5a2e489bb2bffc4cf1844e43d26943529cca91a27de2ac97bfcb031513fb20",
      "summary": "Create a master clock with BPM and time signature.",
      "exports": [
        {
          "name": "createClock",
          "kind": "function",
          "signature": "createClock(ctx, config = {})",
          "summary": "Create a master clock with BPM and time signature."
        },
        {
          "name": "createStepSequencer",
          "kind": "function",
          "signature": "createStepSequencer(ctx, config = {})",
          "summary": "Create a step sequencer."
        },
        {
          "name": "createArpeggiator",
          "kind": "function",
          "signature": "createArpeggiator(ctx, config = {})",
          "summary": "Create an arpeggiator."
        },
        {
          "name": "SEQUENCER_RATES",
          "kind": "constant",
          "signature": "SEQUENCER_RATES",
          "summary": ""
        },
        {
          "name": "ARPEGGIATOR_MODES",
          "kind": "constant",
          "signature": "ARPEGGIATOR_MODES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/SynthesisTypes",
      "path": "engine/reference/audio/synth/nodes/SynthesisTypes.md",
      "source": "engine/audio/synth/nodes/SynthesisTypes.js",
      "import": "/engine/audio/synth/nodes/SynthesisTypes.js",
      "sourceHash": "da05fecb8e320bfb6c1fcc4fff5fc24b32b8887a6efcc86c2877749ea862fe52",
      "summary": "SynthesisTypes.js — Additional Synthesis Methods Extended synthesis techniques: - Additive: Harmonic/partial-based synthesis - Wavetable: Morphing wavetable oscillator - PhaseDistortion: CZ-style phase distortion - Subtractive: Classic subtractive synth voice Usage: import { createAdditiveSynth, createWavetableSynth } from './SynthesisTypes.js'; const add = createAdditiveSynth(audioCtx, { partialCount: 32 });",
      "exports": [
        {
          "name": "createAdditiveSynth",
          "kind": "function",
          "signature": "createAdditiveSynth(ctx, config = {})",
          "summary": "Create an additive synthesizer."
        },
        {
          "name": "createWavetableSynth",
          "kind": "function",
          "signature": "createWavetableSynth(ctx, config = {})",
          "summary": "Create a wavetable synthesizer."
        },
        {
          "name": "createPhaseDistortionSynth",
          "kind": "function",
          "signature": "createPhaseDistortionSynth(ctx, config = {})",
          "summary": "Create a phase distortion synthesizer (CZ-style)."
        },
        {
          "name": "createSubtractiveSynth",
          "kind": "function",
          "signature": "createSubtractiveSynth(ctx, config = {})",
          "summary": "Create a classic subtractive synthesizer voice."
        },
        {
          "name": "WAVETABLE_NAMES",
          "kind": "constant",
          "signature": "WAVETABLE_NAMES",
          "summary": ""
        },
        {
          "name": "PD_SHAPE_OPTIONS",
          "kind": "constant",
          "signature": "PD_SHAPE_OPTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/WaveguideNode",
      "path": "engine/reference/audio/synth/nodes/WaveguideNode.md",
      "source": "engine/audio/synth/nodes/WaveguideNode.js",
      "import": "/engine/audio/synth/nodes/WaveguideNode.js",
      "sourceHash": "51e48dcfcf4da2762ba79faee3d3e9cb029dab4a9f70433894a64f400d276c22",
      "summary": "Render a waveguide to an AudioBuffer (offline).",
      "exports": [
        {
          "name": "renderWaveguide",
          "kind": "function",
          "signature": "renderWaveguide(ctx, config = {})",
          "summary": "Render a waveguide to an AudioBuffer (offline)."
        },
        {
          "name": "createWaveguide",
          "kind": "function",
          "signature": "createWaveguide(ctx, config = {})",
          "summary": "Create a real-time waveguide engine using Web Audio nodes. This is a simplified version using delay + filter + feedback."
        },
        {
          "name": "isValidTermination",
          "kind": "function",
          "signature": "isValidTermination(term)",
          "summary": ""
        },
        {
          "name": "isValidWaveguideMode",
          "kind": "function",
          "signature": "isValidWaveguideMode(mode)",
          "summary": ""
        },
        {
          "name": "WAVEGUIDE_TERMINATIONS",
          "kind": "constant",
          "signature": "WAVEGUIDE_TERMINATIONS",
          "summary": ""
        },
        {
          "name": "WAVEGUIDE_MODE_OPTIONS",
          "kind": "constant",
          "signature": "WAVEGUIDE_MODE_OPTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/atoms/CrackleAtom",
      "path": "engine/reference/audio/synth/nodes/atoms/CrackleAtom.md",
      "source": "engine/audio/synth/nodes/atoms/CrackleAtom.js",
      "import": "/engine/audio/synth/nodes/atoms/CrackleAtom.js",
      "sourceHash": "095e6c744d5600c4ec8c6318f761855d95c1dcdac779920e3b0150282acdf7d2",
      "summary": "CrackleAtom.js - Crackle Sound Atom (Verron 2012) Pre-wired patch: Impulse → ModalBank (2-3 modes) → Envelope (AD) → Gain Driven by: emitRate → density, temperature → brightness Use case: fire crackle, ice crack, sparks",
      "exports": [
        {
          "name": "createCrackleAtomPatch",
          "kind": "function",
          "signature": "createCrackleAtomPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/atoms/DropAtom",
      "path": "engine/reference/audio/synth/nodes/atoms/DropAtom.md",
      "source": "engine/audio/synth/nodes/atoms/DropAtom.js",
      "import": "/engine/audio/synth/nodes/atoms/DropAtom.js",
      "sourceHash": "debbedfbbd6a5c8a70a54d1e50296481d7a28df0d3cb2e1c79d08a73912fef82",
      "summary": "DropAtom.js - Drop Sound Atom (Verron 2012) Pre-wired patch: Impulse → Resonator (single mode) → Envelope (AD) Driven by: mass → pitch, velocity → amplitude Use case: rain drops, drips, liquid impacts",
      "exports": [
        {
          "name": "createDropAtomPatch",
          "kind": "function",
          "signature": "createDropAtomPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/atoms/HissAtom",
      "path": "engine/reference/audio/synth/nodes/atoms/HissAtom.md",
      "source": "engine/audio/synth/nodes/atoms/HissAtom.js",
      "import": "/engine/audio/synth/nodes/atoms/HissAtom.js",
      "sourceHash": "ba4d9cddf94ee31cb9139cdbf0881235f589dbf3f0e374b1cc22543cf5c5e9f5",
      "summary": "HissAtom.js - Hiss Sound Atom (Verron 2012) Pre-wired patch: Noise(white) → HighPass → Gain Driven by: temperature → cutoff, emitRate → volume Use case: steam, gas escape, sizzle, continuous background",
      "exports": [
        {
          "name": "createHissAtomPatch",
          "kind": "function",
          "signature": "createHissAtomPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/atoms/RumbleAtom",
      "path": "engine/reference/audio/synth/nodes/atoms/RumbleAtom.md",
      "source": "engine/audio/synth/nodes/atoms/RumbleAtom.js",
      "import": "/engine/audio/synth/nodes/atoms/RumbleAtom.js",
      "sourceHash": "65c40aa8991a953377cb80faacbea2c8a00bdc52d36ee78f8990f4bf680ba667",
      "summary": "RumbleAtom.js - Rumble Sound Atom (Verron 2012) Pre-wired patch: BrownNoise → LowPass → Gain Driven by: size → cutoff, velocity → volume Use case: thunder, ground shake, lava, explosions",
      "exports": [
        {
          "name": "createRumbleAtomPatch",
          "kind": "function",
          "signature": "createRumbleAtomPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/atoms/WhooshAtom",
      "path": "engine/reference/audio/synth/nodes/atoms/WhooshAtom.md",
      "source": "engine/audio/synth/nodes/atoms/WhooshAtom.js",
      "import": "/engine/audio/synth/nodes/atoms/WhooshAtom.js",
      "sourceHash": "58c3b4a518711195742c5940983f5af9c5311009dfd8f88036c0616096f26ea0",
      "summary": "WhooshAtom.js - Whoosh Sound Atom (Verron 2012) Pre-wired patch: Noise → BandPass → Envelope → Gain Driven by: velocity → centerFreq, size → bandwidth Use case: wind, projectile flyby, movement",
      "exports": [
        {
          "name": "createWhooshAtomPatch",
          "kind": "function",
          "signature": "createWhooshAtomPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/instruments/InstrumentPresets",
      "path": "engine/reference/audio/synth/nodes/instruments/InstrumentPresets.md",
      "source": "engine/audio/synth/nodes/instruments/InstrumentPresets.js",
      "import": "/engine/audio/synth/nodes/instruments/InstrumentPresets.js",
      "sourceHash": "57b0fe3c47337a4c22c60521ea9eca9e094fcfb958b3d46905d394496f27c7d6",
      "summary": "Convert MIDI note number to frequency.",
      "exports": [
        {
          "name": "midiToFreq",
          "kind": "function",
          "signature": "midiToFreq(note)",
          "summary": "Convert MIDI note number to frequency."
        },
        {
          "name": "freqToMidi",
          "kind": "function",
          "signature": "freqToMidi(freq)",
          "summary": "Convert frequency to MIDI note number."
        },
        {
          "name": "createPianoInstrument",
          "kind": "function",
          "signature": "createPianoInstrument(ctx, config = {})",
          "summary": "Create a piano instrument using Karplus-Strong + FM."
        },
        {
          "name": "createStringsInstrument",
          "kind": "function",
          "signature": "createStringsInstrument(ctx, config = {})",
          "summary": "Create a string ensemble instrument."
        },
        {
          "name": "createBrassInstrument",
          "kind": "function",
          "signature": "createBrassInstrument(ctx, config = {})",
          "summary": "Create a brass instrument with growl and brightness."
        },
        {
          "name": "createPadSynth",
          "kind": "function",
          "signature": "createPadSynth(ctx, config = {})",
          "summary": "Create a lush pad synthesizer."
        },
        {
          "name": "createLeadSynth",
          "kind": "function",
          "signature": "createLeadSynth(ctx, config = {})",
          "summary": "Create a mono lead synthesizer with glide."
        },
        {
          "name": "createBassSynth",
          "kind": "function",
          "signature": "createBassSynth(ctx, config = {})",
          "summary": "Create a bass synthesizer."
        },
        {
          "name": "createDrumSynth",
          "kind": "function",
          "signature": "createDrumSynth(ctx, config = {})",
          "summary": "Create an analog-style drum synthesizer."
        },
        {
          "name": "INSTRUMENT_TYPES",
          "kind": "constant",
          "signature": "INSTRUMENT_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/physics/CombustionModel",
      "path": "engine/reference/audio/synth/nodes/physics/CombustionModel.md",
      "source": "engine/audio/synth/nodes/physics/CombustionModel.js",
      "import": "/engine/audio/synth/nodes/physics/CombustionModel.js",
      "sourceHash": "398384d0a4233e471ef0d06ec954c06bcdc7c4c208f271b48f3bf43f57e28295",
      "summary": "CombustionModel.js - Fire/Combustion Synthesis Model Combines Crackle + Hiss + Rumble atoms mixed by intensity. Low intensity = gentle crackle. High intensity = roaring fire with rumble. Driven by: emitRate, temperature",
      "exports": [
        {
          "name": "createCombustionPatch",
          "kind": "function",
          "signature": "createCombustionPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/physics/FluidModel",
      "path": "engine/reference/audio/synth/nodes/physics/FluidModel.md",
      "source": "engine/audio/synth/nodes/physics/FluidModel.js",
      "import": "/engine/audio/synth/nodes/physics/FluidModel.js",
      "sourceHash": "abdd44e52e5c860f03160dc7ac18064d4f8dea3089e76bb5d442b9187b6a1a92",
      "summary": "FluidModel.js - Fluid/Water Synthesis Model Combines Drop atoms (splashes) + Hiss (flow) for liquid sounds. Driven by: emitRate, velocity, splash rate",
      "exports": [
        {
          "name": "createFluidPatch",
          "kind": "function",
          "signature": "createFluidPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/physics/ModalImpactModel",
      "path": "engine/reference/audio/synth/nodes/physics/ModalImpactModel.md",
      "source": "engine/audio/synth/nodes/physics/ModalImpactModel.js",
      "import": "/engine/audio/synth/nodes/physics/ModalImpactModel.js",
      "sourceHash": "af812c14dbffb28ffded2f1ad1712c42f45e741b11b89fc2c28bb7a4b325e28d",
      "summary": "ModalImpactModel.js - Material-Aware Impact Synthesis Excites a bank of resonators on collision. Material properties determine mode frequencies, Q factors, and decay times. Uses MATERIAL enum from SubstanceSchema for lookup. Based on Cook/Smith modal synthesis (Stanford CCRMA).",
      "exports": [
        {
          "name": "getModalPreset",
          "kind": "function",
          "signature": "getModalPreset(material)",
          "summary": "Get modal preset for a material."
        },
        {
          "name": "getModalMaterials",
          "kind": "function",
          "signature": "getModalMaterials()",
          "summary": "Get all available material names."
        },
        {
          "name": "createModalImpactPatch",
          "kind": "function",
          "signature": "createModalImpactPatch(config = {})",
          "summary": "Generate a ModalImpact patch descriptor for a given material."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/physics/WeatherModel",
      "path": "engine/reference/audio/synth/nodes/physics/WeatherModel.md",
      "source": "engine/audio/synth/nodes/physics/WeatherModel.js",
      "import": "/engine/audio/synth/nodes/physics/WeatherModel.js",
      "sourceHash": "e30b6b2b02e2ecd2d3b2e374dff312e85a89beb4caadcab75fd25d1dcf9faeef",
      "summary": "WeatherModel.js - Weather Synthesis Model Rain (grain cloud of drops), hail, thunder (rumble). Driven by: weather type, intensity",
      "exports": [
        {
          "name": "createWeatherPatch",
          "kind": "function",
          "signature": "createWeatherPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "audio/synth/nodes/physics/WindModel",
      "path": "engine/reference/audio/synth/nodes/physics/WindModel.md",
      "source": "engine/audio/synth/nodes/physics/WindModel.js",
      "import": "/engine/audio/synth/nodes/physics/WindModel.js",
      "sourceHash": "936e813a13336c43c2e3ea9e75e5b82d1796a424820f133dcd64b5a7929ef75e",
      "summary": "WindModel.js - Wind Synthesis Model Combines Whoosh + Rumble, with gust modulation from WindSystem. Driven by: windSpeed, gustiness",
      "exports": [
        {
          "name": "createWindPatch",
          "kind": "function",
          "signature": "createWindPatch(config = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabAnonymousRelay",
      "path": "engine/reference/collab/CollabAnonymousRelay.md",
      "source": "engine/collab/CollabAnonymousRelay.js",
      "import": "/engine/collab/CollabAnonymousRelay.js",
      "sourceHash": "81a67d05584f59af67db05b09dabe3785d52a3f70a721238212d2c7dcf4fe9b3",
      "summary": "CollabAnonymousRelay.js Anonymous peer mapping and routing for P2P collab channels. Inspired by Tor onion routing, I2P garlic routing, and AP3 pseudonymous overlays — adapted for real-time game networking where latency matters. Three layers of anonymity: 1. Pseudonymous IDs — each peer gets a random session token (anonId). All ops use anonIds instead of real selfIds. Peers never see each other's real identity. Different anonId each session prevents cross-session correlation. 2. TURN-only relay — forces iceTransportPolicy:'relay' so WebRTC ICE candidates never leak real IP addresses between peers. 3. Garlic encryption — each message payload is encrypted with the recipient's ECDH public key before being sent through the relay. The relay host can route messages (via anonId headers) but cannot read the encrypted payload. Only the intended recipient can decrypt. Architecture: - The host acts as an anonymizing relay (already in relay mode) - Peers send messages to the host with a destination anonId - The host maps anonId → realPeerId, forwards the message - The forwarded message has the sender's anonId (not real ID) - Result: no peer knows any other peer's real identity or IP Flow: 1. createAnonymousRelay() → relay state with self anonId 2. Host: registerPeer(realPeerId) → assigns anonId, stores mapping 3. Outgoing: sanitizeOp(op) → replaces peerId with anonId 4. Host routing: resolveAnonToReal(anonId) → realPeerId for delivery 5. Incoming: the op already has sender's anonId (safe to process) 6. Garlic: wrapGarlic(op, recipientEcdhPub) → encrypted payload 7. Garlic: unwrapGarlic(op, ownEcdhPrivate) → decrypted payload",
      "exports": [
        {
          "name": "collabAnonTimestampReport",
          "kind": "function",
          "signature": "collabAnonTimestampReport(timestamp, nowMs = Date.now()",
          "summary": ""
        },
        {
          "name": "collabAnonScoreReport",
          "kind": "function",
          "signature": "collabAnonScoreReport(scoreData, nowMs = Date.now()",
          "summary": ""
        },
        {
          "name": "getAnonUsername",
          "kind": "function",
          "signature": "getAnonUsername(anonId)",
          "summary": "Generate an anonymous username from an anonId. Format: \"Anon-XXXX\" where XXXX is first 4 chars of the anonId."
        },
        {
          "name": "createAnonymousRelay",
          "kind": "function",
          "signature": "createAnonymousRelay(config)",
          "summary": "Create an anonymous relay state."
        },
        {
          "name": "registerAnonPeer",
          "kind": "function",
          "signature": "registerAnonPeer(relay, realPeerId, ecdhPublicKey)",
          "summary": "Register a peer and assign them an anonymous ID. On the host: stores both directions of the mapping. On non-host: only stores our own mapping (we know our own anonId)."
        },
        {
          "name": "removeAnonPeer",
          "kind": "function",
          "signature": "removeAnonPeer(relay, realPeerId)",
          "summary": "Remove a peer from the anonymous mapping."
        },
        {
          "name": "resolveRealToAnon",
          "kind": "function",
          "signature": "resolveRealToAnon(relay, realPeerId)",
          "summary": "Resolve a real peer ID to its anonymous ID."
        },
        {
          "name": "resolveAnonToReal",
          "kind": "function",
          "signature": "resolveAnonToReal(relay, anonId)",
          "summary": "Resolve an anonymous ID back to the real peer ID. HOST ONLY — non-host peers cannot resolve other peers' anonIds."
        },
        {
          "name": "resolveAnonUsername",
          "kind": "function",
          "signature": "resolveAnonUsername(relay, anonIdOrRealId)",
          "summary": "Get the anonymous username for a peer."
        },
        {
          "name": "sanitizeOutgoingOp",
          "kind": "function",
          "signature": "sanitizeOutgoingOp(relay, op)",
          "summary": "Sanitize an outgoing op: replace all real peer IDs with anonymous IDs. This is called before broadcasting — peers only see anonIds."
        },
        {
          "name": "deanonymizeIncomingOp",
          "kind": "function",
          "signature": "deanonymizeIncomingOp(relay, op)",
          "summary": "De-anonymize an incoming op: resolve anonIds back to real peer IDs. HOST ONLY — used for internal routing decisions. The forwarded copy to other peers keeps the anonIds intact."
        },
        {
          "name": "reanonymizeForForward",
          "kind": "function",
          "signature": "reanonymizeForForward(relay, op, senderRealPeerId)",
          "summary": "Re-anonymize an op for forwarding to another peer. The host de-anonymizes for routing, then this re-anonymizes for delivery. This ensures the recipient only sees the sender's anonId."
        },
        {
          "name": "wrapGarlic",
          "kind": "function",
          "signature": "async wrapGarlic(relay, op, recipientAnonId, ownEcdhPrivateKey)",
          "summary": "Wrap an op in garlic encryption for a specific recipient. The payload is encrypted with a shared key derived from our ECDH private key + the recipient's ECDH public key. The relay host can route (via 'to' field) but cannot read the encrypted payload."
        },
        {
          "name": "unwrapGarlic",
          "kind": "function",
          "signature": "async unwrapGarlic(relay, garlicOp, ownEcdhPrivateKey)",
          "summary": "Unwrap a garlic-encrypted message using our ECDH private key."
        },
        {
          "name": "buildAnonHello",
          "kind": "function",
          "signature": "buildAnonHello(relay, realHello)",
          "summary": "Build an anonymous hello payload. Replaces the real selfId/username with anonymous versions. The ECDH public key is still included (needed for garlic encryption) but it's an ephemeral session key, not tied to persistent identity."
        },
        {
          "name": "processAnonHello",
          "kind": "function",
          "signature": "processAnonHello(relay, realPeerId, anonHello)",
          "summary": "Process an anonymous hello on the host side. The host needs to map the anonymous selfId to the real peer connection."
        },
        {
          "name": "getAnonIceConfig",
          "kind": "function",
          "signature": "getAnonIceConfig(iceServers)",
          "summary": "Get ICE configuration for anonymous mode. Forces TURN-only relay to prevent IP address leakage."
        },
        {
          "name": "sanitizePresence",
          "kind": "function",
          "signature": "sanitizePresence(relay, presenceEntry)",
          "summary": "Check if a peer list entry should be visible to other peers. In anonymous mode, strip real identifiers from presence data."
        },
        {
          "name": "getAnonRelayStats",
          "kind": "function",
          "signature": "getAnonRelayStats(relay)",
          "summary": "Get anonymous relay stats for UI display."
        },
        {
          "name": "isAnonEnabled",
          "kind": "function",
          "signature": "isAnonEnabled(relay)",
          "summary": "Check if anonymous mode is active on a relay."
        },
        {
          "name": "generateSessionSeed",
          "kind": "function",
          "signature": "generateSessionSeed()",
          "summary": "Generate a session seed (host only). Shared with all peers so they can build their credential proof."
        },
        {
          "name": "generateAnonSigningKey",
          "kind": "function",
          "signature": "async generateAnonSigningKey()",
          "summary": "Generate a fresh session ECDSA P-256 key pair for anonymous signing. This key is ephemeral — different every session, never persisted."
        },
        {
          "name": "buildAnonCredential",
          "kind": "function",
          "signature": "async buildAnonCredential(persistentIdentity, sessionSeed)",
          "summary": "Build an anonymous credential: prove we're a legitimate peer by signing the sessionSeed with our persistent ECDSA key. The credential proves: \"I possess the private key for a registered identity\" without revealing WHICH identity (the credential is sent only to the host via E2E encrypted channel, and the host discards the mapping after verification)."
        },
        {
          "name": "verifyAnonCredential",
          "kind": "function",
          "signature": "async verifyAnonCredential(persistentPubKeyRaw, sessionSeed, credential)",
          "summary": "Verify an anonymous credential (HOST ONLY). Confirms the credential was signed by the persistent key we know for this peer."
        },
        {
          "name": "signAnonScoreReceipt",
          "kind": "function",
          "signature": "async signAnonScoreReceipt(sessionKeyPair, scoreData)",
          "summary": "Sign a score receipt with the anonymous session key. Uses the same canonical format as signScoreReceipt but with the session key. The anonId is used instead of the real selfId in the signed data."
        },
        {
          "name": "verifyAnonScoreReceipt",
          "kind": "function",
          "signature": "async verifyAnonScoreReceipt(certifiedSessionKeys, scoreData, signature, signerPublicKey = null, nowMs = Date.now()",
          "summary": "Verify an anonymous score receipt against the list of certified session keys. Returns true if ANY certified session key validates the signature. This is the key anonymity property: verifier confirms the receipt is from a legitimate peer without learning WHICH peer."
        },
        {
          "name": "anonRelayPayloadHash",
          "kind": "function",
          "signature": "async anonRelayPayloadHash(payloadStr)",
          "summary": ""
        },
        {
          "name": "signAnonCriticalOp",
          "kind": "function",
          "signature": "async signAnonCriticalOp(sessionKeyPair, sessionPubKeyRaw, op, anonId)",
          "summary": "Sign a critical op with the anonymous session key. Same canonical format as signCriticalOp but uses session key + anonId."
        },
        {
          "name": "verifyAnonCriticalOp",
          "kind": "function",
          "signature": "async verifyAnonCriticalOp(op, senderAnonId, certifiedSessionKeys, relay = null, nowMs = Date.now()",
          "summary": "Verify a critical op signed with an anonymous session key. Checks the signature against ALL certified session keys."
        },
        {
          "name": "initAnonCredentials",
          "kind": "function",
          "signature": "initAnonCredentials(relay, sessionSeed, ownSessionKey)",
          "summary": "Initialize the anonymous credential state on the relay. Called after the relay is created and the host generates a session seed."
        },
        {
          "name": "certifySessionKey",
          "kind": "function",
          "signature": "certifySessionKey(relay, sessionPubKeyRaw)",
          "summary": "Add a verified session public key to the certified list (HOST). Called after the host verifies a peer's anonymous credential."
        },
        {
          "name": "setCertifiedSessionKeys",
          "kind": "function",
          "signature": "setCertifiedSessionKeys(relay, keyList)",
          "summary": "Set the full certified session key list (NON-HOST peers). Called when the host broadcasts the shuffled list of all certified keys."
        },
        {
          "name": "getCertifiedSessionKeys",
          "kind": "function",
          "signature": "getCertifiedSessionKeys(relay)",
          "summary": "Get the list of certified session keys."
        },
        {
          "name": "buildAnonCredentialOp",
          "kind": "function",
          "signature": "buildAnonCredentialOp(relay, credential)",
          "summary": "Build an __anon_credential__ op for the host. Sent after joining to prove legitimacy and register session key."
        },
        {
          "name": "buildAnonKeylistOp",
          "kind": "function",
          "signature": "buildAnonKeylistOp(relay)",
          "summary": "Build an __anon_keylist__ op to broadcast the certified session key list. HOST ONLY — sent to all peers after verifying credentials."
        },
        {
          "name": "buildAnonScoreReportOp",
          "kind": "function",
          "signature": "async buildAnonScoreReportOp(relay, targetAnonId, score)",
          "summary": "Build an anonymous score report op. Uses the session key for signing instead of the persistent ECDSA key."
        },
        {
          "name": "isAnonCredentialsReady",
          "kind": "function",
          "signature": "isAnonCredentialsReady(relay)",
          "summary": "Check if anonymous credentials are ready for signing/verification."
        },
        {
          "name": "resetAnonymousRelay",
          "kind": "function",
          "signature": "resetAnonymousRelay(relay)",
          "summary": ""
        },
        {
          "name": "destroyAnonymousRelay",
          "kind": "function",
          "signature": "destroyAnonymousRelay(relay)",
          "summary": ""
        },
        {
          "name": "COLLAB_ANON_RELAY_LIMITS",
          "kind": "constant",
          "signature": "COLLAB_ANON_RELAY_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabCameraInterp",
      "path": "engine/reference/collab/CollabCameraInterp.md",
      "source": "engine/collab/CollabCameraInterp.js",
      "import": "/engine/collab/CollabCameraInterp.js",
      "sourceHash": "537ff4bfadd967778b7f450f4feedc686dd6f4090447540fb0b298b5398d466e",
      "summary": "CollabCameraInterp.js Hermite-spline camera interpolation for smooth remote peer camera rendering. Based on Glenn Fiedler's \"Snapshot Interpolation\" (Gaffer on Games, GDC 2015): - Buffer camera snapshots and render slightly behind real-time - Use cubic Hermite splines (position + velocity at each sample) for C1 continuity - Adaptive jitter compensation adjusts the playback delay automatically Hermite basis: H(t) = (2t³ - 3t² + 1)·p0  +  (t³ - 2t² + t)·v0·Δt + (-2t³ + 3t²)·p1      +  (t³ - t²)·v1·Δt This guarantees the curve passes through p0 and p1 with matching velocities, eliminating the 1st-order discontinuity artifacts that linear interpolation causes.",
      "exports": [
        {
          "name": "createCameraInterpState",
          "kind": "function",
          "signature": "createCameraInterpState()",
          "summary": "Create the global camera interpolation state. Attach to editor.collab or pass around explicitly."
        },
        {
          "name": "pushCameraSnapshot",
          "kind": "function",
          "signature": "pushCameraSnapshot(state, peerId, pos, target, vel, targetVel, remoteTs)",
          "summary": "Push a camera_sync snapshot into the interpolation buffer. Call this from the camera_sync op handler instead of snapping peer.camera directly."
        },
        {
          "name": "getInterpolatedCamera",
          "kind": "function",
          "signature": "getInterpolatedCamera(state, peerId)",
          "summary": "Get the smoothly interpolated camera position for a remote peer. Call this every render frame from CollabOverlayRenderer."
        },
        {
          "name": "pruneStaleInterpBuffers",
          "kind": "function",
          "signature": "pruneStaleInterpBuffers(state)",
          "summary": "Remove stale peer buffers. Call periodically (~1Hz)."
        },
        {
          "name": "removePeerInterpBuffer",
          "kind": "function",
          "signature": "removePeerInterpBuffer(state, peerId)",
          "summary": "Remove a specific peer's buffer (on disconnect)."
        },
        {
          "name": "getInterpStats",
          "kind": "function",
          "signature": "getInterpStats(state)",
          "summary": "Get interpolation stats for UI display."
        },
        {
          "name": "destroyCameraInterpState",
          "kind": "function",
          "signature": "destroyCameraInterpState(state)",
          "summary": "Destroy all state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabCodec",
      "path": "engine/reference/collab/CollabCodec.md",
      "source": "engine/collab/CollabCodec.js",
      "import": "/engine/collab/CollabCodec.js",
      "sourceHash": "0392294f129cd89df5b61802c3909f324eb88d8fd328d2c26a0425a96b5dd45b",
      "summary": "CollabCodec.js Inline MessagePack encoder/decoder for binary collab messages. Zero dependencies — implements msgpack spec directly. Supports: null, bool, int (safe integer range), float64, string, bin (Uint8Array), array, map (plain objects). Special extension type 0x01: Float32Array with canonical little-endian bytes. Usage: import { encode, decode } from './CollabCodec.js'; const bytes = encode({ ch: 'ops', data: { type: 'transform', pos: new Float32Array([1,2,3]) } }); const obj = decode(bytes);",
      "exports": [
        {
          "name": "encode",
          "kind": "function",
          "signature": "encode(value, options = {})",
          "summary": "Encode a JS value into a msgpack Uint8Array."
        },
        {
          "name": "codecEncodeReport",
          "kind": "function",
          "signature": "codecEncodeReport(value, options = {})",
          "summary": ""
        },
        {
          "name": "decode",
          "kind": "function",
          "signature": "decode(data, options = {})",
          "summary": "Decode a msgpack Uint8Array (or ArrayBuffer) back into a JS value."
        },
        {
          "name": "codecDecodeReport",
          "kind": "function",
          "signature": "codecDecodeReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "COLLAB_CODEC_LIMITS",
          "kind": "constant",
          "signature": "COLLAB_CODEC_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabCore",
      "path": "engine/reference/collab/CollabCore.md",
      "source": "engine/collab/CollabCore.js",
      "import": "/engine/collab/CollabCore.js",
      "sourceHash": "145b1d28121779715f435b47d8810d202256f23b6a1409e5f7c929daa3390801",
      "summary": "CollabCore.js WebRTC peer connection management. Manages RTCPeerConnection instances, data channels, and reconnection. Two data channels per peer: 'ops'      — reliable, ordered (scene operations) 'presence' — unreliable, unordered (camera/selection at 10Hz)",
      "exports": [
        {
          "name": "createCollabCore",
          "kind": "function",
          "signature": "createCollabCore(config)",
          "summary": "Create a collab core instance. config: { projectId, selfId, username, onOp, onPresence, onPeerDiscovered, shouldConnectPeer, onPeerJoin, onPeerLeave }"
        },
        {
          "name": "startCollab",
          "kind": "function",
          "signature": "startCollab(core)",
          "summary": "Start signaling and begin peer discovery."
        },
        {
          "name": "forceDiscovery",
          "kind": "function",
          "signature": "forceDiscovery(core)",
          "summary": "Force an immediate discovery pass: re-announce on all signaling tiers right now. Lets an app-layer \"Connect now\" find a known contact without waiting for the periodic announce cycle. Does not tear down existing peers."
        },
        {
          "name": "broadcastOp",
          "kind": "function",
          "signature": "broadcastOp(core, op)",
          "summary": "Broadcast an op to all connected peers. Transport priority: 1. FastChannel (same-origin BroadcastChannel) — <1ms 2. Gossip mesh (partial mesh / supernode mode) — K neighbors, O(log N) delivery 3. Full mesh WebRTC — direct to all (≤6 peers)"
        },
        {
          "name": "broadcastPresence",
          "kind": "function",
          "signature": "broadcastPresence(core, presenceData)",
          "summary": "Broadcast presence data to all connected peers (unreliable channel). Prefers fast channel for same-origin peers."
        },
        {
          "name": "collabChunkEnvelopeReport",
          "kind": "function",
          "signature": "collabChunkEnvelopeReport(data)",
          "summary": ""
        },
        {
          "name": "sendToPeer",
          "kind": "function",
          "signature": "sendToPeer(core, peerId, data)",
          "summary": "Send data to a specific peer only. Prefers fast channel for same-origin peers. Auto-chunks large messages to avoid SCTP size limits."
        },
        {
          "name": "relayOp",
          "kind": "function",
          "signature": "relayOp(core, fromPeerId, op)",
          "summary": "Relay an op from one peer to all other peers (host-only, relay mode). Optionally filters by spatial interest set."
        },
        {
          "name": "computeDynamicCapacity",
          "kind": "function",
          "signature": "computeDynamicCapacity(core, peerReputation)",
          "summary": "Compute the dynamic peer capacity based on connection quality. Fast channel peers are free. Trusted peers expand the mesh limit."
        },
        {
          "name": "collabRelayThresholdReport",
          "kind": "function",
          "signature": "collabRelayThresholdReport(value)",
          "summary": ""
        },
        {
          "name": "collabPeerScoreReport",
          "kind": "function",
          "signature": "collabPeerScoreReport(value)",
          "summary": ""
        },
        {
          "name": "checkRelayMode",
          "kind": "function",
          "signature": "checkRelayMode(core, peerReputation)",
          "summary": "Check peer count and toggle relay mode if threshold is crossed. Now uses dynamic capacity — fast peers don't count, trusted peers expand the limit."
        },
        {
          "name": "setCoreRelayConfig",
          "kind": "function",
          "signature": "setCoreRelayConfig(core, opts)",
          "summary": "Set the spatial authority reference for interest-filtered relay."
        },
        {
          "name": "setCoreFastChannel",
          "kind": "function",
          "signature": "setCoreFastChannel(core, fastChannel)",
          "summary": "Set the fast channel reference on the core. Called by EditorCollab after creating the fast channel."
        },
        {
          "name": "setCoreTopology",
          "kind": "function",
          "signature": "setCoreTopology(core, topology)",
          "summary": "Set the mesh topology reference on the core. Called by EditorCollab after creating the topology manager."
        },
        {
          "name": "isPeerTrusted",
          "kind": "function",
          "signature": "isPeerTrusted(core, peerId, peerScore)",
          "summary": "Check if a peer is trusted (high reputation) and should get a direct connection even in relay mode. Trusted peers bypass the relay host for lower latency."
        },
        {
          "name": "getPeerConnectionTier",
          "kind": "function",
          "signature": "getPeerConnectionTier(core, peerId, peerScore, fastChannel)",
          "summary": "Get the connection tier label for a peer."
        },
        {
          "name": "getMaxBufferedAmount",
          "kind": "function",
          "signature": "getMaxBufferedAmount(core)",
          "summary": "Get the maximum bufferedAmount across all peer ops channels. Used by CollabMessageRouter for backpressure detection."
        },
        {
          "name": "collabBufferedAmountReport",
          "kind": "function",
          "signature": "collabBufferedAmountReport(value)",
          "summary": ""
        },
        {
          "name": "getSelfId",
          "kind": "function",
          "signature": "getSelfId(core)",
          "summary": "Get the local peer ID."
        },
        {
          "name": "getPeers",
          "kind": "function",
          "signature": "getPeers(core)",
          "summary": "Get all connected peers."
        },
        {
          "name": "connectCollabPeer",
          "kind": "function",
          "signature": "connectCollabPeer(core, peerId, username = 'Remote')",
          "summary": "Begin a targeted WebRTC connection to an already-discovered peer."
        },
        {
          "name": "disconnectCollabPeer",
          "kind": "function",
          "signature": "disconnectCollabPeer(core, peerId)",
          "summary": "Close one direct peer connection without tearing down discovery."
        },
        {
          "name": "observeCollabPeerMetrics",
          "kind": "function",
          "signature": "async observeCollabPeerMetrics(core, peerId)",
          "summary": "Collect locally observed transport quality. Remote peers cannot supply or inflate these values, which makes them suitable input for topology roles."
        },
        {
          "name": "destroyCollabCore",
          "kind": "function",
          "signature": "destroyCollabCore(core)",
          "summary": "Destroy all connections and signaling."
        },
        {
          "name": "deriveCollabChannelId",
          "kind": "function",
          "signature": "async deriveCollabChannelId(selfId, peerId)",
          "summary": "Derive a shared AES-256-GCM key from ECDH key exchange. Called after hello handshake when both peers have ECDH public keys."
        },
        {
          "name": "collabReconnectPlanReport",
          "kind": "function",
          "signature": "collabReconnectPlanReport(attempts)",
          "summary": ""
        },
        {
          "name": "collabHeartbeatReport",
          "kind": "function",
          "signature": "collabHeartbeatReport(lastPongMs, timestampMs)",
          "summary": ""
        },
        {
          "name": "broadcastGoodbye",
          "kind": "function",
          "signature": "broadcastGoodbye(core)",
          "summary": "Broadcast a graceful goodbye to all peers before leaving. This lets other peers immediately remove us instead of waiting for heartbeat timeout or WebRTC state change."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabCrypto",
      "path": "engine/reference/collab/CollabCrypto.md",
      "source": "engine/collab/CollabCrypto.js",
      "import": "/engine/collab/CollabCrypto.js",
      "sourceHash": "a5e0167ce58d23341f7c29dcd7518fb05ba81604f9d7228dec8059a25444e548",
      "summary": "CollabCrypto.js ECDH P-256 key exchange + AES-256-GCM encryption for P2P collab channels. Uses the SubtleCrypto API with shared finite-number admission. Flow: 1. Each peer calls generateKeyPair() on connect 2. Peers exchange public keys during hello handshake 3. deriveSharedKey() produces an AES-256-GCM key via ECDH + HKDF 4. All subsequent messages: encrypt() before send, decrypt() on receive 5. HMAC for challenge-response authentication during handshake Nonce scheme: 12 bytes = [8-byte channelId | 4-byte monotonic counter] Counter MUST never repeat for a given key.",
      "exports": [
        {
          "name": "generateKeyPair",
          "kind": "function",
          "signature": "async generateKeyPair()",
          "summary": "Generate an ECDH P-256 key pair for key exchange."
        },
        {
          "name": "importPublicKey",
          "kind": "function",
          "signature": "async importPublicKey(rawKey)",
          "summary": "Import a raw public key (65 bytes) received from a remote peer."
        },
        {
          "name": "deriveSharedKey",
          "kind": "function",
          "signature": "async deriveSharedKey(privateKey, remotePublicKey, salt)",
          "summary": "Derive a shared AES-256-GCM key from our private key + remote public key. Optionally mixes in a room password for authentication."
        },
        {
          "name": "deriveHmacKey",
          "kind": "function",
          "signature": "async deriveHmacKey(privateKey, remotePublicKey, salt)",
          "summary": "Derive an HMAC-SHA256 key from ECDH shared bits for challenge-response auth."
        },
        {
          "name": "cryptoNonceReport",
          "kind": "function",
          "signature": "cryptoNonceReport(counter, channelId = null)",
          "summary": ""
        },
        {
          "name": "encryptedMessageReport",
          "kind": "function",
          "signature": "encryptedMessageReport(message, channelId = null)",
          "summary": ""
        },
        {
          "name": "nextCryptoSendCounter",
          "kind": "function",
          "signature": "nextCryptoSendCounter(state)",
          "summary": ""
        },
        {
          "name": "resetCryptoCounters",
          "kind": "function",
          "signature": "resetCryptoCounters(state)",
          "summary": ""
        },
        {
          "name": "encrypt",
          "kind": "function",
          "signature": "async encrypt(key, plaintext, counter, channelId)",
          "summary": "Encrypt a msgpack payload with AES-256-GCM."
        },
        {
          "name": "decrypt",
          "kind": "function",
          "signature": "async decrypt(key, message, channelId, replayState = null)",
          "summary": "Decrypt an AES-256-GCM encrypted message."
        },
        {
          "name": "generateChallenge",
          "kind": "function",
          "signature": "generateChallenge()",
          "summary": "Generate a random 32-byte challenge."
        },
        {
          "name": "signChallenge",
          "kind": "function",
          "signature": "async signChallenge(hmacKey, challenge)",
          "summary": "Sign a challenge with HMAC-SHA256."
        },
        {
          "name": "verifyChallenge",
          "kind": "function",
          "signature": "async verifyChallenge(hmacKey, challenge, signature)",
          "summary": "Verify a challenge signature."
        },
        {
          "name": "createPeerCryptoState",
          "kind": "function",
          "signature": "createPeerCryptoState()",
          "summary": "Create crypto state for a single peer connection."
        },
        {
          "name": "initPeerCrypto",
          "kind": "function",
          "signature": "async initPeerCrypto(state)",
          "summary": "Initialize crypto state with a fresh key pair."
        },
        {
          "name": "completePeerCrypto",
          "kind": "function",
          "signature": "async completePeerCrypto(state, remotePublicKeyRaw, roomPassword)",
          "summary": "Complete the handshake: import remote public key, derive shared keys."
        },
        {
          "name": "isCryptoAvailable",
          "kind": "function",
          "signature": "isCryptoAvailable()",
          "summary": "Check if crypto is available in this environment."
        },
        {
          "name": "COLLAB_CRYPTO_LIMITS",
          "kind": "constant",
          "signature": "COLLAB_CRYPTO_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabDivergenceTracker",
      "path": "engine/reference/collab/CollabDivergenceTracker.md",
      "source": "engine/collab/CollabDivergenceTracker.js",
      "import": "/engine/collab/CollabDivergenceTracker.js",
      "sourceHash": "a7f39090c7d42a1b9f070247e370db0572b74a0a3b16369a29380ed42cb08f2a",
      "summary": "CollabDivergenceTracker.js Records per-frame position hashes during play mode and compares them across peers to detect simulation divergence. Hash algorithm: FNV-1a 32-bit over quantized entity positions.",
      "exports": [
        {
          "name": "createDivergenceTracker",
          "kind": "function",
          "signature": "createDivergenceTracker()",
          "summary": ""
        },
        {
          "name": "divergenceHeartbeatReport",
          "kind": "function",
          "signature": "divergenceHeartbeatReport(payload)",
          "summary": ""
        },
        {
          "name": "divergenceFrameHashReport",
          "kind": "function",
          "signature": "divergenceFrameHashReport(samples)",
          "summary": ""
        },
        {
          "name": "recordLocalFrame",
          "kind": "function",
          "signature": "recordLocalFrame(tracker, simTime, editor)",
          "summary": "Record a local frame hash. Call every simHistoryInterval during play."
        },
        {
          "name": "receiveRemoteHash",
          "kind": "function",
          "signature": "receiveRemoteHash(tracker, peerId, simTime, frameHash)",
          "summary": "Receive a remote heartbeat hash from a peer."
        },
        {
          "name": "removePeerDivergence",
          "kind": "function",
          "signature": "removePeerDivergence(tracker, peerId)",
          "summary": "Remove a peer's data on disconnect."
        },
        {
          "name": "getDivergenceLog",
          "kind": "function",
          "signature": "getDivergenceLog(tracker)",
          "summary": "Get all recorded divergence events."
        },
        {
          "name": "resetDivergenceTracker",
          "kind": "function",
          "signature": "resetDivergenceTracker(tracker)",
          "summary": "Clear all tracking data (call on exitPlayMode)."
        },
        {
          "name": "exportDivergenceReport",
          "kind": "function",
          "signature": "exportDivergenceReport(tracker, localUsername)",
          "summary": "Export a JSON report of all divergences + local timeline."
        },
        {
          "name": "computeFrameHash",
          "kind": "function",
          "signature": "computeFrameHash(editor)",
          "summary": "Compute a fast FNV-1a hash of all entity positions in the scene. Quantizes positions to 3 decimal places for float stability."
        },
        {
          "name": "collabDivergenceFrameHash",
          "kind": "function",
          "signature": "collabDivergenceFrameHash(samples)",
          "summary": ""
        },
        {
          "name": "injectDivergenceDeps",
          "kind": "function",
          "signature": "injectDivergenceDeps(deps)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabEntityAuthority",
      "path": "engine/reference/collab/CollabEntityAuthority.md",
      "source": "engine/collab/CollabEntityAuthority.js",
      "import": "/engine/collab/CollabEntityAuthority.js",
      "sourceHash": "a728d9b631532d7a040b72fec54f43fb5e33995b924abdae162ca91f337def99",
      "summary": "CollabEntityAuthority.js Per-entity ownership model for collaborative multiplayer. Every entity has at most one \"owner\" peer. The owner is the sole source of truth for that entity's transform, physics, and interactive state. Ownership transfers via explicit claim/release ops — no server needed. Priority levels (higher number wins): 0 DEFAULT   — physics authority (host) owns unclaimed entities 1 PROXIMITY — auto-assigned to nearest peer's camera (future) 2 SELECTED  — peer clicked/selected the entity in the inspector 3 GRABBED   — peer is actively dragging/manipulating the entity Conflict resolution: - Higher priority always wins (grab beats select beats proximity) - Equal priority: earlier timestamp wins (first-come-first-served) - Owner can always release voluntarily - Stale claims (no refresh for STALE_TIMEOUT_MS) are auto-released Inspired by: Photon Takeover policy, Gaffer on Games authority scheme, Roblox Network Ownership, Source Engine shadow controllers.",
      "exports": [
        {
          "name": "createEntityAuthority",
          "kind": "function",
          "signature": "createEntityAuthority(selfId)",
          "summary": "Create an entity authority state object."
        },
        {
          "name": "getEntityOwner",
          "kind": "function",
          "signature": "getEntityOwner(auth, entityId)",
          "summary": "Get the current owner of an entity."
        },
        {
          "name": "isLocallyOwned",
          "kind": "function",
          "signature": "isLocallyOwned(auth, entityId)",
          "summary": "Check if the local peer owns an entity."
        },
        {
          "name": "isEntityClaimed",
          "kind": "function",
          "signature": "isEntityClaimed(auth, entityId)",
          "summary": "Check if an entity is owned by anyone (not default authority)."
        },
        {
          "name": "getEntitiesOwnedBy",
          "kind": "function",
          "signature": "getEntitiesOwnedBy(auth, peerId)",
          "summary": "Get all entities owned by a specific peer."
        },
        {
          "name": "getLocallyOwnedSet",
          "kind": "function",
          "signature": "getLocallyOwnedSet(auth)",
          "summary": "Get all locally owned entity IDs as a Set (for fast lookup in sync loops)."
        },
        {
          "name": "shouldBroadcastEntity",
          "kind": "function",
          "signature": "shouldBroadcastEntity(auth, entityId, isPlayAuthority)",
          "summary": "Check if the local peer should broadcast transforms for an entity. Returns true if: (a) we own it, or (b) nobody owns it and we're play authority."
        },
        {
          "name": "shouldAcceptRemoteTransform",
          "kind": "function",
          "signature": "shouldAcceptRemoteTransform(auth, entityId)",
          "summary": "Check if the local peer should accept remote transforms for an entity. Returns true if we do NOT own it."
        },
        {
          "name": "claimEntity",
          "kind": "function",
          "signature": "claimEntity(auth, entityId, priority)",
          "summary": "Claim ownership of an entity at a given priority. Returns the op to broadcast, or null if claim was rejected locally."
        },
        {
          "name": "releaseEntity",
          "kind": "function",
          "signature": "releaseEntity(auth, entityId)",
          "summary": "Release ownership of an entity. Reverts to default authority. Returns the op to broadcast, or null if we didn't own it."
        },
        {
          "name": "releaseAllLocal",
          "kind": "function",
          "signature": "releaseAllLocal(auth)",
          "summary": "Release ALL claims owned by the local peer (e.g. on disconnect or exit play mode). Returns array of ops to broadcast."
        },
        {
          "name": "onRemoteAuthorityOp",
          "kind": "function",
          "signature": "onRemoteAuthorityOp(auth, op)",
          "summary": "Handle an incoming entity_authority op from a remote peer. Applies the claim/release to local state after conflict resolution. Returns true if the claim was accepted."
        },
        {
          "name": "tickAuthority",
          "kind": "function",
          "signature": "tickAuthority(auth)",
          "summary": "Build refresh ops for all local claims (call at ~2Hz from the collab loop). Also prunes stale remote claims."
        },
        {
          "name": "onPeerDisconnected",
          "kind": "function",
          "signature": "onPeerDisconnected(auth, peerId)",
          "summary": "Handle a peer disconnecting — release all their claims."
        },
        {
          "name": "getHandoffBlend",
          "kind": "function",
          "signature": "getHandoffBlend(auth, entityId)",
          "summary": "Get handoff blend factor for an entity (0 = fully old owner, 1 = fully new owner). Used by interpolation to smoothly blend during ownership transfer."
        },
        {
          "name": "onOwnershipChanged",
          "kind": "function",
          "signature": "onOwnershipChanged(auth, callback)",
          "summary": "Set callback for ownership changes."
        },
        {
          "name": "destroyEntityAuthority",
          "kind": "function",
          "signature": "destroyEntityAuthority(auth)",
          "summary": "Destroy / reset authority state."
        },
        {
          "name": "AUTHORITY_PRIORITY",
          "kind": "constant",
          "signature": "AUTHORITY_PRIORITY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabFastChannel",
      "path": "engine/reference/collab/CollabFastChannel.md",
      "source": "engine/collab/CollabFastChannel.js",
      "import": "/engine/collab/CollabFastChannel.js",
      "sourceHash": "5802267e46edb76a3f6ecb697bbb67e7a73c31962ac23953f996775141b91474",
      "summary": "CollabFastChannel.js Low-overhead data transport for same-origin peers via BroadcastChannel. Problem: WebRTC DataChannels add ~50-100ms RTT even on localhost due to DTLS encryption, SCTP transport, and msgpack encode/decode overhead. Solution: For peers sharing the same browser origin (same-machine testing, same-domain deployment), use the BroadcastChannel API which provides: - Structured clone transfer (no msgpack encode/decode) - No encryption overhead (same-origin security model) - Browser-scheduled local delivery without ICE/STUN/DTLS setup - Zero setup — no ICE/STUN/DTLS negotiation This module creates a dedicated data BroadcastChannel (separate from the signaling channel in CollabSignal.js) that carries ops and presence. CollabCore detects same-origin peers and prefers this transport. For cross-origin / cross-machine peers, WebRTC is still used. Inspired by: Meshtastic's tiered transport (LoRa → BLE → WiFi), choosing the fastest available link per peer.",
      "exports": [
        {
          "name": "createFastChannel",
          "kind": "function",
          "signature": "createFastChannel(projectId, selfId, callbacks = {})",
          "summary": "Create a fast channel instance."
        },
        {
          "name": "fastChannelSendOp",
          "kind": "function",
          "signature": "fastChannelSendOp(fc, op)",
          "summary": "Send an op via fast channel to all same-origin peers. Uses structured clone (no msgpack encode/decode)."
        },
        {
          "name": "fastChannelSendPresence",
          "kind": "function",
          "signature": "fastChannelSendPresence(fc, presenceData)",
          "summary": "Send presence data via fast channel."
        },
        {
          "name": "fastChannelSendToPeer",
          "kind": "function",
          "signature": "fastChannelSendToPeer(fc, peerId, op)",
          "summary": "Send an op to a specific peer via fast channel."
        },
        {
          "name": "isFastPeer",
          "kind": "function",
          "signature": "isFastPeer(fc, peerId)",
          "summary": "Check if a specific peer is reachable via fast channel."
        },
        {
          "name": "getFastPeerIds",
          "kind": "function",
          "signature": "getFastPeerIds(fc)",
          "summary": "Get the set of all fast peer IDs."
        },
        {
          "name": "getFastChannelStats",
          "kind": "function",
          "signature": "getFastChannelStats(fc)",
          "summary": "Get fast channel stats."
        },
        {
          "name": "destroyFastChannel",
          "kind": "function",
          "signature": "destroyFastChannel(fc)",
          "summary": "Destroy the fast channel. Sends a bye message to peers first."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabHostMigration",
      "path": "engine/reference/collab/CollabHostMigration.md",
      "source": "engine/collab/CollabHostMigration.js",
      "import": "/engine/collab/CollabHostMigration.js",
      "sourceHash": "887409c082278d78ec48ed589aa97cde874510da8d93e8b2383332d2281555cf",
      "summary": "CollabHostMigration.js Automatic host migration for P2P collaboration sessions. Problem: When the host peer drops (closes tab, network outage, crash), relay mode breaks — all non-host peers lose the ability to communicate through the relay hub. The session effectively dies. Solution: Bully-style host election with reputation-weighted scoring. When the host is detected as dead: 1. All peers start a migration election 2. The peer with the highest \"candidacy score\" wins 3. New host assumes relay duties and notifies all peers 4. If the original host returns, it can reclaim the role Election Algorithm (modified Bully): - Each peer computes a candidacy score based on: • Reputation score (40%) — trustworthy peers preferred • Uptime in session (30%) — stable peers preferred • Connection count (20%) — well-connected peers preferred • Deterministic tiebreaker (10%) — lexicographic selfId for consistency - All peers broadcast their candidacy - After a short election timeout, the highest-scoring peer wins - If two peers tie, the one with the lexicographically higher selfId wins Inspired by: - Xbox Live host migration (Halo 2/3) - Photon PUN MasterClient migration - Raft leader election (simplified — no log replication needed) - Bully algorithm (Garcia-Molina, 1982) Current scope: this module elects a relay host and reconfigures routing. Authority-map handoff, replicated-log consensus, election terms/quorums, and signature-gated dispatch are not implemented here and remain audit gaps. Candidate reputation/connection metrics remain locally self-reported, and captured multi-peer host-failure/rejoin traces remain absent.",
      "exports": [
        {
          "name": "createHostMigration",
          "kind": "function",
          "signature": "createHostMigration(selfId, config = {})",
          "summary": "Create a host migration manager."
        },
        {
          "name": "startHostMigration",
          "kind": "function",
          "signature": "startHostMigration(hm, isHost, hostPeerId)",
          "summary": "Start host migration monitoring."
        },
        {
          "name": "migrationSetHost",
          "kind": "function",
          "signature": "migrationSetHost(hm, hostPeerId)",
          "summary": "Set the host peer ID (for joiners who didn't know at startup). Starts the host liveness monitor if not already running."
        },
        {
          "name": "stopHostMigration",
          "kind": "function",
          "signature": "stopHostMigration(hm)",
          "summary": "Stop host migration monitoring."
        },
        {
          "name": "hostHeartbeatReceived",
          "kind": "function",
          "signature": "hostHeartbeatReceived(hm, fromPeerId)",
          "summary": "Record that we received a heartbeat (or any message) from the host. Call this from the heartbeat handler."
        },
        {
          "name": "hostActivityReceived",
          "kind": "function",
          "signature": "hostActivityReceived(hm, fromPeerId)",
          "summary": "Record that we received ANY op from a peer (used for liveness). Even non-heartbeat ops prove the host is alive."
        },
        {
          "name": "onElectionCandidacy",
          "kind": "function",
          "signature": "onElectionCandidacy(hm, peerId, payload)",
          "summary": "Handle a received election candidacy from another peer."
        },
        {
          "name": "onElectionResult",
          "kind": "function",
          "signature": "onElectionResult(hm, payload)",
          "summary": "Handle a received election result from another peer."
        },
        {
          "name": "onHostReclaimRequest",
          "kind": "function",
          "signature": "onHostReclaimRequest(hm, originalHostId)",
          "summary": "Handle the original host returning to the session. The original host broadcasts a reclaim request. The current acting host defers after a grace period, handing duties back."
        },
        {
          "name": "requestHostReclaim",
          "kind": "function",
          "signature": "requestHostReclaim(hm)",
          "summary": "Called by the original host when it returns to reclaim. Only call if we ARE the original host and someone else took over."
        },
        {
          "name": "hostMigrationTiebreakerNorm",
          "kind": "function",
          "signature": "hostMigrationTiebreakerNorm(selfId)",
          "summary": ""
        },
        {
          "name": "hostMigrationCandidacyScoreReport",
          "kind": "function",
          "signature": "hostMigrationCandidacyScoreReport(metrics = {}, timestampMs = Date.now()",
          "summary": ""
        },
        {
          "name": "migrationAddPeer",
          "kind": "function",
          "signature": "migrationAddPeer(hm, peerId)",
          "summary": "Register a known peer."
        },
        {
          "name": "migrationRemovePeer",
          "kind": "function",
          "signature": "migrationRemovePeer(hm, peerId)",
          "summary": "Remove a known peer."
        },
        {
          "name": "migrationUpdateSelfMetrics",
          "kind": "function",
          "signature": "migrationUpdateSelfMetrics(hm, score, connectionCount)",
          "summary": "Update our own metrics (call from collab loop)."
        },
        {
          "name": "onHostElectionOp",
          "kind": "function",
          "signature": "onHostElectionOp(hm, peerId, op)",
          "summary": "Handle an incoming host_election op. Routes to the appropriate handler based on phase."
        },
        {
          "name": "buildGoodbyeOp",
          "kind": "function",
          "signature": "buildGoodbyeOp(hm)",
          "summary": "Build a goodbye op to broadcast before leaving. Other peers use this to immediately detect departure instead of waiting for heartbeat timeout."
        },
        {
          "name": "onPeerGoodbye",
          "kind": "function",
          "signature": "onPeerGoodbye(hm, payload, fromPeerId = payload?.peerId)",
          "summary": "Handle a received goodbye from a departing peer. If the host sent the goodbye, immediately start election (no timeout wait)."
        },
        {
          "name": "getMigrationState",
          "kind": "function",
          "signature": "getMigrationState(hm)",
          "summary": ""
        },
        {
          "name": "getMigrationStats",
          "kind": "function",
          "signature": "getMigrationStats(hm)",
          "summary": ""
        },
        {
          "name": "isCurrentHost",
          "kind": "function",
          "signature": "isCurrentHost(hm)",
          "summary": ""
        },
        {
          "name": "getCurrentHostId",
          "kind": "function",
          "signature": "getCurrentHostId(hm)",
          "summary": ""
        },
        {
          "name": "destroyHostMigration",
          "kind": "function",
          "signature": "destroyHostMigration(hm)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabIdentity",
      "path": "engine/reference/collab/CollabIdentity.md",
      "source": "engine/collab/CollabIdentity.js",
      "import": "/engine/collab/CollabIdentity.js",
      "sourceHash": "83acc6170f768b572ac212327918157743880e07ba36326450cd868bc30552e3",
      "summary": "CollabIdentity.js Cryptographic peer identity using ECDSA P-256 (Web Crypto API). Each peer generates an ECDSA key pair on init. The public key's SHA-256 fingerprint becomes the peer's verified identity — unforgeable without the private key. During the hello handshake, peers exchange public keys and a signed proof (signature of their selfId). The remote side verifies the signature, confirming the peer truly owns the claimed public key. Host verification: the host's fingerprint is embedded in the invite code. Joiners verify the host's fingerprint matches the one in the invite code, preventing host impersonation. Reputation receipts: peers sign their score reports. Others verify the signature before trusting the score, preventing score tampering. Flow: 1. createIdentity() → ECDSA P-256 key pair + fingerprint 2. buildIdentityProof(identity, selfId) → signed selfId (for hello) 3. Remote receives proof → verifyIdentityProof(publicKey, selfId, proof) 4. If host: fingerprint embedded in invite code → joiner checks match 5. signScoreReceipt(identity, scoreData) → signed score for reputation 6. verifyScoreReceipt(publicKey, scoreData, signature) → boolean",
      "exports": [
        {
          "name": "collabIdentityTimestampReport",
          "kind": "function",
          "signature": "collabIdentityTimestampReport(timestamp, nowMs = Date.now()",
          "summary": ""
        },
        {
          "name": "collabIdentityPayloadReport",
          "kind": "function",
          "signature": "collabIdentityPayloadReport(payload)",
          "summary": ""
        },
        {
          "name": "prepareCollabIdentityRecord",
          "kind": "function",
          "signature": "prepareCollabIdentityRecord(record)",
          "summary": "Validate one bounded v1/v2 identity record without guessing future shapes."
        },
        {
          "name": "collabIdentityCurrentKey",
          "kind": "function",
          "signature": "collabIdentityCurrentKey(keyId = COLLAB_IDENTITY_KEY_ID)",
          "summary": ""
        },
        {
          "name": "createIdentity",
          "kind": "function",
          "signature": "async createIdentity(keyId = COLLAB_IDENTITY_KEY_ID)",
          "summary": "Generate or load an ECDSA P-256 key pair. Tries IndexedDB first for persistent identity across sessions. If not found, generates a new key pair and stores it. The fingerprint (SHA-256 of public key) stays the same across sessions, enabling long-term reputation tracking."
        },
        {
          "name": "computeFingerprint",
          "kind": "function",
          "signature": "async computeFingerprint(publicKeyRaw)",
          "summary": "Compute fingerprint from a raw public key (public API for verification)."
        },
        {
          "name": "buildIdentityProof",
          "kind": "function",
          "signature": "async buildIdentityProof(identity, selfId)",
          "summary": "Build an identity proof: sign our selfId with our private key. The remote peer verifies this signature to confirm we own the public key."
        },
        {
          "name": "verifyIdentityProof",
          "kind": "function",
          "signature": "async verifyIdentityProof(publicKeyRaw, selfId, signature)",
          "summary": "Verify an identity proof from a remote peer."
        },
        {
          "name": "collabIdentityScoreReceiptReport",
          "kind": "function",
          "signature": "collabIdentityScoreReceiptReport(scoreData, nowMs = Date.now()",
          "summary": ""
        },
        {
          "name": "signScoreReceipt",
          "kind": "function",
          "signature": "async signScoreReceipt(identity, scoreData)",
          "summary": "Sign a reputation score receipt. The receipt proves that this peer calculated and reported a specific score for a target peer at a specific time. Other peers verify the signature to prevent score tampering."
        },
        {
          "name": "verifyScoreReceipt",
          "kind": "function",
          "signature": "async verifyScoreReceipt(publicKeyRaw, scoreData, signature, nowMs = Date.now()",
          "summary": "Verify a reputation score receipt from a remote peer."
        },
        {
          "name": "signData",
          "kind": "function",
          "signature": "async signData(identity, data)",
          "summary": "Sign arbitrary string data with our identity."
        },
        {
          "name": "signRawBytes",
          "kind": "function",
          "signature": "async signRawBytes(identity, bytes)",
          "summary": "Sign raw bytes with our identity (no TextEncoder step) — needed when the verifier expects a signature over an exact byte string it issued (e.g. a random challenge), not over the UTF-8 encoding of some stringified form of it. See signData() for the string-based counterpart."
        },
        {
          "name": "verifyRawBytes",
          "kind": "function",
          "signature": "async verifyRawBytes(publicKeyRaw, bytes, signature)",
          "summary": "Verify a signature on raw bytes. Counterpart to signRawBytes()."
        },
        {
          "name": "verifyData",
          "kind": "function",
          "signature": "async verifyData(publicKeyRaw, data, signature)",
          "summary": "Verify a signature on arbitrary string data."
        },
        {
          "name": "createIdentityRegistry",
          "kind": "function",
          "signature": "createIdentityRegistry(selfId, identity)",
          "summary": "Create a registry that tracks verified identities for all connected peers. Each peer's identity is verified once during the hello handshake and then cached. The registry also tracks cross-verified reputation scores."
        },
        {
          "name": "registerPeerIdentity",
          "kind": "function",
          "signature": "async registerPeerIdentity(registry, peerId, publicKeyRaw, identityProof, isHost = false)",
          "summary": "Register a peer's identity after verifying their proof. Called during the enhanced hello handshake."
        },
        {
          "name": "removePeerIdentity",
          "kind": "function",
          "signature": "removePeerIdentity(registry, peerId)",
          "summary": "Remove a peer's identity from the registry."
        },
        {
          "name": "getPeerIdentity",
          "kind": "function",
          "signature": "getPeerIdentity(registry, peerId)",
          "summary": "Get a peer's verified identity info."
        },
        {
          "name": "setExpectedHostFingerprint",
          "kind": "function",
          "signature": "setExpectedHostFingerprint(registry, fingerprint)",
          "summary": "Set the expected host fingerprint (from the invite code)."
        },
        {
          "name": "resetIdentityRegistry",
          "kind": "function",
          "signature": "resetIdentityRegistry(registry, options = {})",
          "summary": ""
        },
        {
          "name": "destroyIdentityRegistry",
          "kind": "function",
          "signature": "destroyIdentityRegistry(registry)",
          "summary": ""
        },
        {
          "name": "recordScoreReceipt",
          "kind": "function",
          "signature": "async recordScoreReceipt(registry, reporterPeerId, targetPeerId, score, timestamp, signature)",
          "summary": "Record a signed score receipt from a remote peer. Each peer tracks what scores others have reported about them AND about other peers."
        },
        {
          "name": "getConsensusScore",
          "kind": "function",
          "signature": "getConsensusScore(registry, peerId)",
          "summary": "Get the consensus score for a peer based on all verified receipts. Returns the median of all verified scores reported by different peers. Also detects disputes (significant score disagreements)."
        },
        {
          "name": "buildScoreReportOp",
          "kind": "function",
          "signature": "async buildScoreReportOp(identity, selfId, targetPeerId, score)",
          "summary": "Build a signed score report op for broadcasting to all peers."
        },
        {
          "name": "getIdentityStats",
          "kind": "function",
          "signature": "getIdentityStats(registry, reputationScores)",
          "summary": "Get identity system stats for UI display."
        },
        {
          "name": "isIdentityAvailable",
          "kind": "function",
          "signature": "isIdentityAvailable()",
          "summary": "Check if crypto identity is available."
        },
        {
          "name": "isCriticalOp",
          "kind": "function",
          "signature": "isCriticalOp(opType)",
          "summary": "Check if an op type requires a signature."
        },
        {
          "name": "collabIdentityCriticalOpReport",
          "kind": "function",
          "signature": "collabIdentityCriticalOpReport(op, senderPeerId, nowMs = Date.now()",
          "summary": ""
        },
        {
          "name": "signCriticalOp",
          "kind": "function",
          "signature": "async signCriticalOp(identity, op, selfId)",
          "summary": "Sign a critical op with our ECDSA identity. Appends `_sig` (signature) and `_pub` (public key) fields to the op. The canonical signed data is: `op-sig:type:senderId:timestamp:payloadHash`"
        },
        {
          "name": "verifyCriticalOp",
          "kind": "function",
          "signature": "async verifyCriticalOp(op, senderPeerId, registry)",
          "summary": "Verify a signed critical op from a remote peer."
        },
        {
          "name": "collabIdentityPayloadHash",
          "kind": "function",
          "signature": "async collabIdentityPayloadHash(str)",
          "summary": "Helper: SHA-256 hash a string to hex (for canonical op signing)."
        },
        {
          "name": "computeTrustLevel",
          "kind": "function",
          "signature": "computeTrustLevel(registry, peerId, reputationScore)",
          "summary": "Compute the trust level for a peer."
        },
        {
          "name": "getTrustColor",
          "kind": "function",
          "signature": "getTrustColor(level)",
          "summary": "Get the display color for a trust level."
        },
        {
          "name": "getTrustLabel",
          "kind": "function",
          "signature": "getTrustLabel(level)",
          "summary": "Get the display label for a trust level."
        },
        {
          "name": "COLLAB_IDENTITY_DB_NAME",
          "kind": "constant",
          "signature": "COLLAB_IDENTITY_DB_NAME",
          "summary": ""
        },
        {
          "name": "COLLAB_IDENTITY_STORE_NAME",
          "kind": "constant",
          "signature": "COLLAB_IDENTITY_STORE_NAME",
          "summary": ""
        },
        {
          "name": "COLLAB_IDENTITY_KEY_ID",
          "kind": "constant",
          "signature": "COLLAB_IDENTITY_KEY_ID",
          "summary": ""
        },
        {
          "name": "COLLAB_IDENTITY_RECORD_SCHEMA",
          "kind": "constant",
          "signature": "COLLAB_IDENTITY_RECORD_SCHEMA",
          "summary": ""
        },
        {
          "name": "COLLAB_IDENTITY_RECORD_VERSION",
          "kind": "constant",
          "signature": "COLLAB_IDENTITY_RECORD_VERSION",
          "summary": ""
        },
        {
          "name": "COLLAB_IDENTITY_LIMITS",
          "kind": "constant",
          "signature": "COLLAB_IDENTITY_LIMITS",
          "summary": ""
        },
        {
          "name": "TRUST_LEVEL",
          "kind": "constant",
          "signature": "TRUST_LEVEL",
          "summary": ""
        },
        {
          "name": "publicKeyRaw",
          "kind": "constant",
          "signature": "publicKeyRaw",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabIntegrityVerifier",
      "path": "engine/reference/collab/CollabIntegrityVerifier.md",
      "source": "engine/collab/CollabIntegrityVerifier.js",
      "import": "/engine/collab/CollabIntegrityVerifier.js",
      "sourceHash": "3bcaed84dcab13fc3b72f0f58c864d77d8d2e1e7a7c7529e199509e67b1c4412",
      "summary": "CollabIntegrityVerifier.js Integrity validation and anomaly tracking for P2P collab. Inspired by: - Hash-chain receipts: valid ops contribute to a local rolling chain. - Server-side validation rules adapted to pairwise peer validation. - Lockstep P2P: periodic state hashing — all peers hash their zone state and exchange hashes for pairwise divergence detection. - FairPlay: operation whitelist — only registered op types are accepted. Unknown op types are rejected and penalized. Components: 1. Op Receipt Chain — local rolling hash chain per peer 2. Zone State Digest — periodic position hash for pairwise comparison 3. Anomaly Detector — physics/spatial rule violations 4. Operation Whitelist — only valid op types accepted 5. Violation Tracker — accumulates strikes, triggers auto-kick 6. Reputation Integration — violations lower peer score Hashes preserve the existing non-cryptographic legacy FNV-like wire format.",
      "exports": [
        {
          "name": "collabIntegrityLegacyHash",
          "kind": "function",
          "signature": "collabIntegrityLegacyHash(str)",
          "summary": "Preserve the existing integrity-chain FNV-like string hash. This intentionally keeps the old JavaScript-number multiply path instead of switching to canonical Math.imul FNV-1a, which would change peer digests."
        },
        {
          "name": "createIntegrityVerifier",
          "kind": "function",
          "signature": "createIntegrityVerifier(selfId, config = {})",
          "summary": "Create an integrity verifier."
        },
        {
          "name": "validateIncomingOp",
          "kind": "function",
          "signature": "validateIncomingOp(verifier, peerId, op)",
          "summary": "Validate an incoming op from a peer. Checks: 1. Op type is in the whitelist 2. Op has valid structure 3. Entity position changes are within physics limits"
        },
        {
          "name": "recordOpInChain",
          "kind": "function",
          "signature": "recordOpInChain(verifier, peerId, op)",
          "summary": "Record an op in the peer's hash chain for tamper-evidence. Call after validateIncomingOp succeeds."
        },
        {
          "name": "getChainHead",
          "kind": "function",
          "signature": "getChainHead(verifier, peerId)",
          "summary": "Get the current chain head hash for a peer (for verification exchange)."
        },
        {
          "name": "computeZoneDigest",
          "kind": "function",
          "signature": "computeZoneDigest(verifier, sceneEntities, ecsWorld, getEntityComponent, authoritySet)",
          "summary": "Compute a hash digest of all entity positions in the caller's zone. This is exchanged with peers for consensus-based state verification."
        },
        {
          "name": "buildDigestOp",
          "kind": "function",
          "signature": "buildDigestOp(verifier)",
          "summary": "Build an integrity_digest op to broadcast."
        },
        {
          "name": "onRemoteDigest",
          "kind": "function",
          "signature": "onRemoteDigest(verifier, peerId, digestOp)",
          "summary": "Handle an incoming integrity_digest from a remote peer. Compares against our own digest — mismatch indicates desync or tampering."
        },
        {
          "name": "tickIntegrity",
          "kind": "function",
          "signature": "tickIntegrity(verifier, peerReputation)",
          "summary": "Tick the verifier: decay violations, build trust, compute social influence. Call at ~1Hz."
        },
        {
          "name": "getPeerViolationCount",
          "kind": "function",
          "signature": "getPeerViolationCount(verifier, peerId)",
          "summary": "Get the violation count for a peer."
        },
        {
          "name": "getPeerViolations",
          "kind": "function",
          "signature": "getPeerViolations(verifier, peerId)",
          "summary": "Get recent violations for a peer."
        },
        {
          "name": "getAllViolationSummaries",
          "kind": "function",
          "signature": "getAllViolationSummaries(verifier)",
          "summary": "Get all peer violation summaries."
        },
        {
          "name": "getPeerTier",
          "kind": "function",
          "signature": "getPeerTier(verifier, peerId)",
          "summary": "Get the current tier for a peer."
        },
        {
          "name": "getPeerTrust",
          "kind": "function",
          "signature": "getPeerTrust(verifier, peerId)",
          "summary": "Get trust level for a peer (0.0-1.0)."
        },
        {
          "name": "setPlayMode",
          "kind": "function",
          "signature": "setPlayMode(verifier, isPlayMode)",
          "summary": "Set play mode flag — violations during play mode are weighted less."
        },
        {
          "name": "isPeerThrottled",
          "kind": "function",
          "signature": "isPeerThrottled(verifier, peerId)",
          "summary": "Check if a peer's ops should be throttled (tier >= THROTTLED)."
        },
        {
          "name": "isPeerMuted",
          "kind": "function",
          "signature": "isPeerMuted(verifier, peerId)",
          "summary": "Check if a peer's scene-edit ops should be blocked (tier >= MUTED)."
        },
        {
          "name": "getIntegrityStats",
          "kind": "function",
          "signature": "getIntegrityStats(verifier)",
          "summary": "Get verifier stats."
        },
        {
          "name": "buildCapabilitiesOp",
          "kind": "function",
          "signature": "buildCapabilitiesOp(verifier)",
          "summary": "Build a __capabilities__ op to send to a peer on connect. Contains our supported op types and version string so the remote peer can be lenient about ops we don't recognize (version mismatch, not cheating)."
        },
        {
          "name": "registerPeerCapabilities",
          "kind": "function",
          "signature": "registerPeerCapabilities(verifier, peerId, capabilitiesPayload)",
          "summary": "Register a remote peer's declared capabilities. Called when we receive a __capabilities__ op from them. Unknown ops from peers with declared capabilities that include the op are treated as version mismatches (INFO), not cheating (HIGH)."
        },
        {
          "name": "setLocalVersion",
          "kind": "function",
          "signature": "setLocalVersion(verifier, version)",
          "summary": "Set the local version string for capability comparison."
        },
        {
          "name": "integrityRemovePeer",
          "kind": "function",
          "signature": "integrityRemovePeer(verifier, peerId)",
          "summary": "Remove a peer's tracking state."
        },
        {
          "name": "destroyIntegrityVerifier",
          "kind": "function",
          "signature": "destroyIntegrityVerifier(verifier)",
          "summary": "Destroy verifier state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabMeshTopology",
      "path": "engine/reference/collab/CollabMeshTopology.md",
      "source": "engine/collab/CollabMeshTopology.js",
      "import": "/engine/collab/CollabMeshTopology.js",
      "sourceHash": "c880f9b5916d185ccf0bfd79c84ed9bc0ab66d0f1a657383cb1379f54168724c",
      "summary": "CollabMeshTopology.js Adaptive mesh topology for scalable P2P collaboration. Problem: Full mesh is O(N²) connections. At 8+ WebRTC peers, browsers struggle with connection management, DTLS overhead, and bandwidth. The old system had a hard limit of 4-8 peers before switching to star relay (single point of failure, bottleneck on host). Solution: Hybrid topology combining proven P2P techniques: 1. PARTIAL MESH — Each peer maintains K direct WebRTC connections to its \"best\" neighbors (lowest latency, highest reputation). K = 3-6 instead of N-1. Scales linearly, not quadratically. 2. GOSSIP PROPAGATION — Ops ripple through the partial mesh. Each peer forwards received ops to its neighbors (minus sender). With K=4, messages reach all 50 peers in ~3 hops (log_K(N)). Deduplication via op fingerprint prevents infinite loops. 3. SUPERNODE ELECTION — High-reputation peers (score ≥ 700) with good uptime and low latency are elected as supernodes. They maintain more connections (up to 2K) and serve as relay hubs between clusters. Inspired by Skype's original P2P architecture. 4. FAST CHANNEL BRIDGING — Same-origin peers use BroadcastChannel (zero cost). They don't count toward K and act as free bridges. Topology modes (auto-selected based on peer count): - FULL_MESH:   ≤6 WebRTC peers → everyone connects to everyone - PARTIAL_MESH: 7-50 peers → K-neighbor gossip mesh - SUPERNODE:    20+ peers → supernodes bridge clusters Inspired by: libp2p (IPFS), Kademlia, Bitcoin gossip, Meshtastic, Skype supernode architecture, and epidemic broadcast protocols. Current policy boundaries: topology callbacks recommend connection changes but EditorCollab does not execute them; topology reports are advisory rather than consensus; gossip envelopes are forwarded before application-level integrity validation; and captured large-room WebRTC traces remain absent.",
      "exports": [
        {
          "name": "createMeshTopology",
          "kind": "function",
          "signature": "createMeshTopology(selfId, config = {})",
          "summary": "Create a topology manager."
        },
        {
          "name": "resolveTopology",
          "kind": "function",
          "signature": "resolveTopology(topo)",
          "summary": "Resolve the current topology mode based on peer count and quality. Called after peer join/leave and during periodic rebalance."
        },
        {
          "name": "topologyAddPeer",
          "kind": "function",
          "signature": "topologyAddPeer(topo, peerId, info = {})",
          "summary": "Register a discovered peer (from signaling)."
        },
        {
          "name": "topologyRemovePeer",
          "kind": "function",
          "signature": "topologyRemovePeer(topo, peerId)",
          "summary": "Remove a peer (disconnected / left)."
        },
        {
          "name": "topologyPeerConnected",
          "kind": "function",
          "signature": "topologyPeerConnected(topo, peerId)",
          "summary": "Mark a peer as connected (WebRTC DataChannel open)."
        },
        {
          "name": "topologyPeerDisconnected",
          "kind": "function",
          "signature": "topologyPeerDisconnected(topo, peerId)",
          "summary": "Mark a peer as disconnected."
        },
        {
          "name": "topologyUpdatePeerMetrics",
          "kind": "function",
          "signature": "topologyUpdatePeerMetrics(topo, peerId, metrics)",
          "summary": "Update a peer's metrics (called from reputation system)."
        },
        {
          "name": "computeIdealNeighbors",
          "kind": "function",
          "signature": "computeIdealNeighbors(topo)",
          "summary": "Compute the ideal neighbor set based on current metrics. Returns { connect: string[], disconnect: string[] } — peers to add/remove."
        },
        {
          "name": "evaluateSupernodeStatus",
          "kind": "function",
          "signature": "evaluateSupernodeStatus(topo, selfScore, selfLatencyAvg, integrityInfo)",
          "summary": "Evaluate whether this peer should be a supernode. Criteria: high reputation, low latency, good uptime, clean integrity, trusted. Peers with violations (throttled/muted/kicked) are immediately disqualified. Trust and social standing boost candidacy score."
        },
        {
          "name": "topologyUpdatePeerIntegrity",
          "kind": "function",
          "signature": "topologyUpdatePeerIntegrity(topo, peerId, info)",
          "summary": "Update a peer's integrity data (called from integrity verifier tick)."
        },
        {
          "name": "evaluateRemoteSupernodes",
          "kind": "function",
          "signature": "evaluateRemoteSupernodes(topo)",
          "summary": "Evaluate all remote supernodes and demote any that have degraded. Called during rebalance tick. Demoted supernodes are unregistered and a topology change is triggered so the mesh re-routes around them."
        },
        {
          "name": "topologyRegisterSupernode",
          "kind": "function",
          "signature": "topologyRegisterSupernode(topo, peerId, announcement = null)",
          "summary": "Register a remote peer as a supernode."
        },
        {
          "name": "topologyUnregisterSupernode",
          "kind": "function",
          "signature": "topologyUnregisterSupernode(topo, peerId)",
          "summary": "Unregister a remote peer as a supernode."
        },
        {
          "name": "topologyApplyInfo",
          "kind": "function",
          "signature": "topologyApplyInfo(topo, fromPeerId, payload)",
          "summary": "Validate and apply one advisory topology_info payload atomically. The report may expand discovery knowledge but never mutates live routes."
        },
        {
          "name": "gossipFingerprint",
          "kind": "function",
          "signature": "gossipFingerprint(op, originPeerId)",
          "summary": "Generate a gossip fingerprint for deduplication. Uses a compact hash of the op to avoid forwarding the same op twice."
        },
        {
          "name": "gossipWrap",
          "kind": "function",
          "signature": "gossipWrap(topo, op)",
          "summary": "Wrap an op for gossip propagation. Adds gossip metadata: origin, TTL, hop count, fingerprint."
        },
        {
          "name": "gossipReceive",
          "kind": "function",
          "signature": "gossipReceive(topo, fromPeerId, op)",
          "summary": "Process an incoming gossip-wrapped op. Returns { forward: boolean, op: Object, targets: string[] } - forward: true if this op should be forwarded to neighbors - op: the op with decremented TTL - targets: peerIds to forward to (excludes sender and origin)"
        },
        {
          "name": "startTopology",
          "kind": "function",
          "signature": "startTopology(topo)",
          "summary": "Start the periodic rebalance timer."
        },
        {
          "name": "stopTopology",
          "kind": "function",
          "signature": "stopTopology(topo)",
          "summary": "Stop the rebalance timer."
        },
        {
          "name": "getTopologyMode",
          "kind": "function",
          "signature": "getTopologyMode(topo)",
          "summary": "Get current topology mode."
        },
        {
          "name": "shouldGossip",
          "kind": "function",
          "signature": "shouldGossip(topo)",
          "summary": "Check if we should use gossip forwarding (partial/supernode mode)."
        },
        {
          "name": "isSupernode",
          "kind": "function",
          "signature": "isSupernode(topo)",
          "summary": "Check if we're a supernode."
        },
        {
          "name": "getNeighborIds",
          "kind": "function",
          "signature": "getNeighborIds(topo)",
          "summary": "Get the list of our current neighbor peerIds."
        },
        {
          "name": "getTopologyStats",
          "kind": "function",
          "signature": "getTopologyStats(topo)",
          "summary": "Get topology stats for UI display."
        },
        {
          "name": "buildSupernodeAnnounce",
          "kind": "function",
          "signature": "buildSupernodeAnnounce(topo)",
          "summary": "Build a supernode announcement op to broadcast. Peers use this to discover supernodes."
        },
        {
          "name": "buildTopologyInfoOp",
          "kind": "function",
          "signature": "buildTopologyInfoOp(topo)",
          "summary": "Build a topology_info op for neighbor exchange. Peers periodically share their neighbor lists so the mesh can discover better paths (inspired by BGP route sharing)."
        },
        {
          "name": "destroyMeshTopology",
          "kind": "function",
          "signature": "destroyMeshTopology(topo)",
          "summary": "Destroy the topology manager."
        },
        {
          "name": "rebalanceTopologyNow",
          "kind": "function",
          "signature": "rebalanceTopologyNow(topo)",
          "summary": "Run one topology rebalance immediately (useful after discovery/metrics changes)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabMessageRouter",
      "path": "engine/reference/collab/CollabMessageRouter.md",
      "source": "engine/collab/CollabMessageRouter.js",
      "import": "/engine/collab/CollabMessageRouter.js",
      "sourceHash": "6c1d8906253108481aa844a5495d602c9894dbfd4fb92f05e3252ae5f48a00c4",
      "summary": "CollabMessageRouter.js Priority-based message orchestration for collab sync. Sits between EditorCollab and CollabCore, providing: - 4 priority lanes (critical → ephemeral) - Bandwidth monitoring via channel.bufferedAmount - Transform coalescing (latest position wins per entity) - Adaptive rate control under backpressure Priority lanes: 0 — Critical:  play_sync, __kick__, snapshot         → immediate, never throttled 1 — Realtime:  play transforms/PBD/grab force        → coalesced or rate-budgeted 2 — Scene:     create, delete, transform, property…  → ordered, rate-budgeted 3 — Ephemeral: sim_heartbeat                          → latest-only, droppable",
      "exports": [
        {
          "name": "createMessageRouter",
          "kind": "function",
          "signature": "createMessageRouter(sendFn, getBufferedAmount)",
          "summary": "Create a message router instance."
        },
        {
          "name": "routerEnqueue",
          "kind": "function",
          "signature": "routerEnqueue(router, op)",
          "summary": "Enqueue an op for prioritized delivery."
        },
        {
          "name": "messageRouterOpReport",
          "kind": "function",
          "signature": "messageRouterOpReport(op)",
          "summary": ""
        },
        {
          "name": "messageRouterBufferedAmountReport",
          "kind": "function",
          "signature": "messageRouterBufferedAmountReport(value)",
          "summary": ""
        },
        {
          "name": "routerFlush",
          "kind": "function",
          "signature": "routerFlush(router)",
          "summary": "Flush all queued ops respecting priority and backpressure. Call once per render frame from the render loop."
        },
        {
          "name": "routerStart",
          "kind": "function",
          "signature": "routerStart(router)",
          "summary": "Start automatic flush timer (call once on init)."
        },
        {
          "name": "routerStop",
          "kind": "function",
          "signature": "routerStop(router)",
          "summary": "Stop the automatic flush timer."
        },
        {
          "name": "getRouterStats",
          "kind": "function",
          "signature": "getRouterStats(router)",
          "summary": "Get router statistics."
        },
        {
          "name": "resetRouter",
          "kind": "function",
          "signature": "resetRouter(router)",
          "summary": "Reset router state (on disconnect/reconnect)."
        },
        {
          "name": "destroyRouter",
          "kind": "function",
          "signature": "destroyRouter(router)",
          "summary": "Destroy router."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabOpQueue",
      "path": "engine/reference/collab/CollabOpQueue.md",
      "source": "engine/collab/CollabOpQueue.js",
      "import": "/engine/collab/CollabOpQueue.js",
      "sourceHash": "464bad375259ccab650a6b5667fa80809efa68fc7f0a1593e412acaf7d353586",
      "summary": "CollabOpQueue.js Op ordering, deduplication, and per-peer sequence gap handling. Each op: { id, peerId, seq, type, payload, ts } Current scope: bounded local ordering for admitted logical peer IDs. Sequence epochs/wrap, retransmission/NACK, cryptographic sender binding, and captured loss/reordering transport traces remain audit gaps.",
      "exports": [
        {
          "name": "collabOpAdmissionReport",
          "kind": "function",
          "signature": "collabOpAdmissionReport(op)",
          "summary": ""
        },
        {
          "name": "createOpQueue",
          "kind": "function",
          "signature": "createOpQueue()",
          "summary": ""
        },
        {
          "name": "enqueueOp",
          "kind": "function",
          "signature": "enqueueOp(queue, op)",
          "summary": "Enqueue an incoming op. Returns array of ops ready to apply."
        },
        {
          "name": "flushPeer",
          "kind": "function",
          "signature": "flushPeer(queue, peerId)",
          "summary": "Flush all held ops for a peer (called on timeout or peer leave)."
        },
        {
          "name": "removePeer",
          "kind": "function",
          "signature": "removePeer(queue, peerId)",
          "summary": "Remove all state for a peer (on disconnect)."
        },
        {
          "name": "tickOpQueue",
          "kind": "function",
          "signature": "tickOpQueue(queue)",
          "summary": "Tick — flush any peers with stale gaps."
        },
        {
          "name": "getOpQueueStats",
          "kind": "function",
          "signature": "getOpQueueStats(queue)",
          "summary": ""
        },
        {
          "name": "clearOpQueue",
          "kind": "function",
          "signature": "clearOpQueue(queue)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabPeerReputation",
      "path": "engine/reference/collab/CollabPeerReputation.md",
      "source": "engine/collab/CollabPeerReputation.js",
      "import": "/engine/collab/CollabPeerReputation.js",
      "sourceHash": "32b6305e19cefa8a0d52b5a95a22678bdc039cb4dc70ff92f6a75ff8b43723d0",
      "summary": "CollabPeerReputation.js Peer quality scoring system — rates each peer 0-1000 based on real-time connection metrics. Inspired by Meshtastic SNR-based prioritization and multi-layer throttling. Score breakdown (1000 total): 250 — Latency (RTT from heartbeat pings) 200 — Packet delivery (sent vs received ratio) 200 — Connection stability (reconnection count) 150 — Session duration (longer = more trusted) 100 — Jitter (variance in latency — lower = better) 100 — Throughput quality (buffered amount / backpressure) Each sub-score is 0.0–1.0, multiplied by its weight. The total is rounded to an integer 0–1000. Scores update every 2 seconds; observed peer scores are shared through signed reports, while the local self-score rides pongs. Inspired by: Meshtastic SNR-based node prioritization, role-based priority, and automatic traffic scaling for large meshes.",
      "exports": [
        {
          "name": "createPeerReputation",
          "kind": "function",
          "signature": "createPeerReputation(selfId)",
          "summary": "Create a reputation tracker for all peers."
        },
        {
          "name": "reputationAddPeer",
          "kind": "function",
          "signature": "reputationAddPeer(rep, peerId)",
          "summary": "Register a new peer."
        },
        {
          "name": "reputationRemovePeer",
          "kind": "function",
          "signature": "reputationRemovePeer(rep, peerId)",
          "summary": "Remove a peer."
        },
        {
          "name": "buildPingOps",
          "kind": "function",
          "signature": "buildPingOps(rep)",
          "summary": "Build ping ops to send to all peers. Call at PING_INTERVAL_MS."
        },
        {
          "name": "buildPongOp",
          "kind": "function",
          "signature": "buildPongOp(pingOp, selfScore)",
          "summary": "Build a pong response to an incoming ping."
        },
        {
          "name": "onPongReceived",
          "kind": "function",
          "signature": "onPongReceived(rep, peerId, pongOp)",
          "summary": "Handle an incoming pong from a peer. Records RTT and jitter."
        },
        {
          "name": "recordBufferedAmount",
          "kind": "function",
          "signature": "recordBufferedAmount(rep, peerId, bufferedAmount)",
          "summary": "Record the current bufferedAmount for a peer's data channel. Call this periodically (e.g., every presence tick)."
        },
        {
          "name": "tickReputation",
          "kind": "function",
          "signature": "tickReputation(rep)",
          "summary": "Recompute scores for all peers. Call at ~0.5Hz."
        },
        {
          "name": "getPeerScore",
          "kind": "function",
          "signature": "getPeerScore(rep, peerId)",
          "summary": "Get the reputation score for a specific peer (0-1000)."
        },
        {
          "name": "getPeerMetrics",
          "kind": "function",
          "signature": "getPeerMetrics(rep, peerId)",
          "summary": "Get full metrics for a specific peer (for debug / stats display)."
        },
        {
          "name": "getSelfScore",
          "kind": "function",
          "signature": "getSelfScore(rep)",
          "summary": "Get the local peer's self-score. This remains the bootstrap score until a self-observation consensus path exists."
        },
        {
          "name": "getAllPeerScores",
          "kind": "function",
          "signature": "getAllPeerScores(rep)",
          "summary": "Get all peer scores as an array of { peerId, score, subScores, avgRtt, avgJitter }."
        },
        {
          "name": "getScoreColor",
          "kind": "function",
          "signature": "getScoreColor(score)",
          "summary": "Get the score color for rendering (green → yellow → red gradient)."
        },
        {
          "name": "getScoreLabel",
          "kind": "function",
          "signature": "getScoreLabel(score)",
          "summary": "Get a human-readable label for a score range."
        },
        {
          "name": "destroyPeerReputation",
          "kind": "function",
          "signature": "destroyPeerReputation(rep)",
          "summary": "Destroy reputation state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabPlaySync",
      "path": "engine/reference/collab/CollabPlaySync.md",
      "source": "engine/collab/CollabPlaySync.js",
      "import": "/engine/collab/CollabPlaySync.js",
      "sourceHash": "6eb749d8695913b4ab10b9ef5f968b4936eccedf3882bee9048918785538ec92",
      "summary": "CollabPlaySync.js Synchronizes play/pause/stop across all connected peers. Broadcasts a shared determinism seed so all simulations run identically. Sends heartbeat hashes every 1s for divergence detection.",
      "exports": [
        {
          "name": "createPlaySync",
          "kind": "function",
          "signature": "createPlaySync(config = {})",
          "summary": ""
        },
        {
          "name": "playSyncCommandReport",
          "kind": "function",
          "signature": "playSyncCommandReport(payload)",
          "summary": ""
        },
        {
          "name": "playSyncTickReport",
          "kind": "function",
          "signature": "playSyncTickReport(simTime)",
          "summary": ""
        },
        {
          "name": "playSyncHeartbeatReport",
          "kind": "function",
          "signature": "playSyncHeartbeatReport(payload, currentSeed)",
          "summary": ""
        },
        {
          "name": "playSyncCorrectionTargetReport",
          "kind": "function",
          "signature": "playSyncCorrectionTargetReport(authoritySimTime, localSimTime)",
          "summary": ""
        },
        {
          "name": "playSyncAccumulatorCorrectionReport",
          "kind": "function",
          "signature": "playSyncAccumulatorCorrectionReport(targetSimTime, localSimTime, correctionRate)",
          "summary": ""
        },
        {
          "name": "playSyncTimelineReport",
          "kind": "function",
          "signature": "playSyncTimelineReport(editor)",
          "summary": ""
        },
        {
          "name": "broadcastPlay",
          "kind": "function",
          "signature": "broadcastPlay(playSync, seed)",
          "summary": "Broadcast a play command to all peers. Called when local user hits Play. seed: optional 32-bit int. Generated here if not provided."
        },
        {
          "name": "broadcastPause",
          "kind": "function",
          "signature": "broadcastPause(playSync)",
          "summary": "Broadcast a pause command to all peers."
        },
        {
          "name": "broadcastStop",
          "kind": "function",
          "signature": "broadcastStop(playSync)",
          "summary": "Broadcast a stop command to all peers."
        },
        {
          "name": "onRemotePlayCommand",
          "kind": "function",
          "signature": "onRemotePlayCommand(playSync, op)",
          "summary": "Handle an incoming play_sync op from a remote peer. Returns the action taken: 'play' | 'pause' | 'stop' | null"
        },
        {
          "name": "onRemoteHeartbeat",
          "kind": "function",
          "signature": "onRemoteHeartbeat(playSync, op)",
          "summary": "Handle an incoming sim_heartbeat op from a remote peer."
        },
        {
          "name": "exportTimeline",
          "kind": "function",
          "signature": "exportTimeline(editor, filename)",
          "summary": "Export local simHistory as a downloadable JSON file."
        },
        {
          "name": "isRemotePlay",
          "kind": "function",
          "signature": "isRemotePlay(playSync)",
          "summary": "Check if the current play command was triggered remotely."
        },
        {
          "name": "getCurrentSeed",
          "kind": "function",
          "signature": "getCurrentSeed(playSync)",
          "summary": "Get the current determinism seed."
        },
        {
          "name": "destroyPlaySync",
          "kind": "function",
          "signature": "destroyPlaySync(playSync)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabPresence",
      "path": "engine/reference/collab/CollabPresence.md",
      "source": "engine/collab/CollabPresence.js",
      "import": "/engine/collab/CollabPresence.js",
      "sourceHash": "0d1e5fa0cea40f53608044211caccc806623fdc8eb1bef6060d43111bf8052c2",
      "summary": "CollabPresence.js Tracks all peers' camera positions, usernames, selections, and colors. Presence packet: { v:1, u:username, c:[x,y,z], t:[tx,ty,tz], s:[entityIds] } Current scope: lossy latest-state presence. Authenticated presence identity, sequence/freshness fields, cross-system stale-peer cleanup, interpolation ownership, and captured churn traces remain audit gaps.",
      "exports": [
        {
          "name": "presencePacketReport",
          "kind": "function",
          "signature": "presencePacketReport(packet)",
          "summary": ""
        },
        {
          "name": "createPresenceState",
          "kind": "function",
          "signature": "createPresenceState()",
          "summary": ""
        },
        {
          "name": "buildLocalPresencePacket",
          "kind": "function",
          "signature": "buildLocalPresencePacket(username, cameraPos, cameraTarget, selectionIds, simTime, mode, userColor)",
          "summary": "Build a presence packet from local state to broadcast."
        },
        {
          "name": "applyRemotePresence",
          "kind": "function",
          "signature": "applyRemotePresence(state, peerId, packet)",
          "summary": "Apply a remote presence packet for a peer."
        },
        {
          "name": "addPeer",
          "kind": "function",
          "signature": "addPeer(state, peerId, username)",
          "summary": "Register a peer joining (before first presence packet)."
        },
        {
          "name": "removePresence",
          "kind": "function",
          "signature": "removePresence(state, peerId)",
          "summary": "Remove a peer (on disconnect)."
        },
        {
          "name": "getPresenceList",
          "kind": "function",
          "signature": "getPresenceList(state)",
          "summary": "Get list of all known peers with their presence data."
        },
        {
          "name": "getPeerColor",
          "kind": "function",
          "signature": "getPeerColor(state, peerId)",
          "summary": "Get color for a specific peer."
        },
        {
          "name": "pruneStalePresence",
          "kind": "function",
          "signature": "pruneStalePresence(state)",
          "summary": "Prune peers not seen for > 30s."
        },
        {
          "name": "clearPresenceState",
          "kind": "function",
          "signature": "clearPresenceState(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabSceneSync",
      "path": "engine/reference/collab/CollabSceneSync.md",
      "source": "engine/collab/CollabSceneSync.js",
      "import": "/engine/collab/CollabSceneSync.js",
      "sourceHash": "dd76eba5a0a28b7e5892801777c540f1461c0c493abf4b9becd1c540ce1b31d9",
      "summary": "Convert an EditorHistory action into a collab op payload.",
      "exports": [
        {
          "name": "collabSceneEntityIdReport",
          "kind": "function",
          "signature": "collabSceneEntityIdReport(value)",
          "summary": ""
        },
        {
          "name": "collabSceneValueReport",
          "kind": "function",
          "signature": "collabSceneValueReport(value, options = {})",
          "summary": ""
        },
        {
          "name": "actionToOp",
          "kind": "function",
          "signature": "actionToOp(action, selfId, seq)",
          "summary": "Convert an EditorHistory action into a collab op payload."
        },
        {
          "name": "opToAction",
          "kind": "function",
          "signature": "opToAction(op)",
          "summary": "Convert a collab op back into an EditorHistory-compatible action."
        },
        {
          "name": "collabSceneOpReport",
          "kind": "function",
          "signature": "collabSceneOpReport(op)",
          "summary": ""
        },
        {
          "name": "serializeSnapshot",
          "kind": "function",
          "signature": "serializeSnapshot(editor)",
          "summary": "Serialize the full scene state into a compact snapshot for new joiners."
        },
        {
          "name": "collabSceneSnapshotReport",
          "kind": "function",
          "signature": "collabSceneSnapshotReport(snapshot)",
          "summary": ""
        },
        {
          "name": "applySnapshot",
          "kind": "function",
          "signature": "applySnapshot(editor, snapshot)",
          "summary": "Apply a full scene snapshot to the editor (for new joiners). Clears existing scene and rebuilds from snapshot."
        },
        {
          "name": "registerCollabSceneEntity",
          "kind": "function",
          "signature": "registerCollabSceneEntity(world, entityId)",
          "summary": ""
        },
        {
          "name": "destroyCollabSceneEntity",
          "kind": "function",
          "signature": "destroyCollabSceneEntity(world, entityId)",
          "summary": ""
        },
        {
          "name": "injectSceneSyncDeps",
          "kind": "function",
          "signature": "injectSceneSyncDeps(deps)",
          "summary": ""
        },
        {
          "name": "COLLAB_SCENE_LIMITS",
          "kind": "constant",
          "signature": "COLLAB_SCENE_LIMITS",
          "summary": "CollabSceneSync.js Serializes EditorHistory actions <-> collab ops. Handles full scene snapshots for new joiners."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabSignal",
      "path": "engine/reference/collab/CollabSignal.md",
      "source": "engine/collab/CollabSignal.js",
      "import": "/engine/collab/CollabSignal.js",
      "sourceHash": "90937dd124e88f85d474265f27f31aa077aaf62e9430dc13079e25814d15e381",
      "summary": "CollabSignal.js 4-tier signaling abstraction for WebRTC peer discovery. Tier 1: BroadcastChannel     — same machine, instant, offline Tier 2: SharedWorker         — same machine multi-tab relay Tier 4: Particle Masterserver — PRIMARY cross-internet signaling relay. Pinned V2 endpoints use the shared ParticleNetworkDaemon; legacy V1 is accepted only when that endpoint explicitly opts in. Uses the same room/route-scoped HELLO/OFFER/ANSWER/CANDIDATE dispatch as Tiers 1/2 (see _handleSignalMessage) rather than a binary swarm protocol — the Masterserver just fans opaque JSON out to every other session attached to the same locally-derived opaque route. This is server-mediated, so it works across NATs/networks without any third-party dependency. Server-configured via localStorage 'os.network.masterServers' (same list the Particle Network control panel app manages); falls back to the pinned production bootstrap if unset. Tier 3: BitTorrent WSS       — EXPLICIT FALLBACK ONLY. It remains off by default and can run only after the user opts in. A V2 integrity failure always fails closed and suppresses legacy/BitTorrent downgrade. Tiers 1/2/4 start immediately; Tier 3 is deferred/conditional (see above). First tier to form a WebRTC connection to a given peer wins — after that, signaling is no longer needed for that peer.",
      "exports": [
        {
          "name": "createSignalChannel",
          "kind": "function",
          "signature": "createSignalChannel(config)",
          "summary": "Create a signal channel. config: { projectId, selfId, username, onOffer, onAnswer, onCandidate, onPeerJoin, onPeerLeave } Negotiation callbacks receive (peerId, payload, offerId). Generic signaling is deliberately strict: every OFFER/ANSWER/CANDIDATE is addressed to one peer and correlated to one offer generation. The WebTorrent tier retains its independent tracker offer_id lifecycle and does not use these envelopes."
        },
        {
          "name": "fetchTurnCredentials",
          "kind": "function",
          "signature": "async fetchTurnCredentials(channel)",
          "summary": "Fetch TURN relay credentials from Cloudflare Pages Function. ONLY called as a fallback when STUN-only P2P connection fails. TURN relays ALL traffic through Cloudflare = expensive. Avoid unless necessary."
        },
        {
          "name": "startSignaling",
          "kind": "function",
          "signature": "startSignaling(channel)",
          "summary": "Start all 3 signaling tiers simultaneously. Uses FREE STUN servers only — no Cloudflare data cost. TURN relay is only fetched on-demand when a direct P2P connection fails."
        },
        {
          "name": "forceAnnounce",
          "kind": "function",
          "signature": "forceAnnounce(channel)",
          "summary": "Force an immediate discovery re-announce across all active tiers, bypassing the periodic announce timers. Used by app-layer \"Connect now\" so a known contact is found without waiting for the next BC hello / tracker announce cycle."
        },
        {
          "name": "collabSignalTextReport",
          "kind": "function",
          "signature": "collabSignalTextReport(value, maxBytes, options = {})",
          "summary": ""
        },
        {
          "name": "collabSignalPayloadReport",
          "kind": "function",
          "signature": "collabSignalPayloadReport(payload)",
          "summary": ""
        },
        {
          "name": "collabIceServerListReport",
          "kind": "function",
          "signature": "collabIceServerListReport(value)",
          "summary": ""
        },
        {
          "name": "sendOffer",
          "kind": "function",
          "signature": "sendOffer(channel, peerId, sdpOffer, offerId)",
          "summary": "Send one SDP offer to one discovered peer on the generic signaling tiers."
        },
        {
          "name": "broadcastOffer",
          "kind": "function",
          "signature": "broadcastOffer(channel, peerId, sdpOffer, offerId)",
          "summary": "Retained as a strict compatibility symbol. Untargeted offers are unsafe in a multi-peer room, so callers must now supply the target and offer generation."
        },
        {
          "name": "sendAnswer",
          "kind": "function",
          "signature": "sendAnswer(channel, peerId, sdpAnswer, offerId)",
          "summary": "Send an SDP answer to a specific peer."
        },
        {
          "name": "sendCandidate",
          "kind": "function",
          "signature": "sendCandidate(channel, peerId, candidate, offerId)",
          "summary": "Send an ICE candidate to a specific peer."
        },
        {
          "name": "destroySignalChannel",
          "kind": "function",
          "signature": "destroySignalChannel(channel)",
          "summary": "Destroy all signaling resources."
        },
        {
          "name": "collabSignalReconnectPlanReport",
          "kind": "function",
          "signature": "collabSignalReconnectPlanReport(attempt)",
          "summary": ""
        },
        {
          "name": "collabSignalOfferPlanReport",
          "kind": "function",
          "signature": "collabSignalOfferPlanReport(pendingCount, inFlightCount = 0)",
          "summary": ""
        },
        {
          "name": "collabSignalPeerCapacityReport",
          "kind": "function",
          "signature": "collabSignalPeerCapacityReport(connectionCount)",
          "summary": ""
        },
        {
          "name": "collabSignalTrackerIdHex",
          "kind": "function",
          "signature": "collabSignalTrackerIdHex(value)",
          "summary": ""
        },
        {
          "name": "collabSignalTrackerBinaryReport",
          "kind": "function",
          "signature": "collabSignalTrackerBinaryReport(value)",
          "summary": ""
        },
        {
          "name": "collabSignalHelloReport",
          "kind": "function",
          "signature": "collabSignalHelloReport(message, selfId = '')",
          "summary": ""
        },
        {
          "name": "collabSignalPeerHelloReport",
          "kind": "function",
          "signature": "collabSignalPeerHelloReport(message, selfId = '')",
          "summary": ""
        },
        {
          "name": "isBitTorrentFallbackEnabled",
          "kind": "function",
          "signature": "isBitTorrentFallbackEnabled()",
          "summary": ""
        },
        {
          "name": "setBitTorrentFallbackEnabled",
          "kind": "function",
          "signature": "setBitTorrentFallbackEnabled(enabled)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabSpatialAuthority",
      "path": "engine/reference/collab/CollabSpatialAuthority.md",
      "source": "engine/collab/CollabSpatialAuthority.js",
      "import": "/engine/collab/CollabSpatialAuthority.js",
      "sourceHash": "860fb2f6d3390806d1c5869b77a2acdff2047fdab9a3ca1e94dc56067456a023",
      "summary": "CollabSpatialAuthority.js Distributed spatial authority for collaborative multiplayer. Each peer owns a circular \"zone\" centered on their camera position. Entities within a peer's zone are simulated locally by that peer. Entities outside all zones are dormant (no physics, no sync). Authority resolution (Roblox + Gaffer hybrid): - Nearest peer within zone radius wins (automatic proximity) - 20% hysteresis prevents ping-pong at boundaries - Higher-priority claims (SELECTED, GRABBED) override proximity - Sequence numbers resolve conflicts (Gaffer-style) Interest management (Photon-style): - Interest area = zoneRadius × interestMultiplier (default 1.3×) - Only send state for entities you're authoritative over - Only receive state for entities in your interest area Inspired by: Star Citizen dynamic server meshing, Roblox Network Ownership, Photon Fusion Shared Authority + AoI grid, Gaffer on Games authority scheme.",
      "exports": [
        {
          "name": "createSpatialAuthority",
          "kind": "function",
          "signature": "createSpatialAuthority(selfId, config)",
          "summary": "Create a spatial authority state."
        },
        {
          "name": "computeZoneRadius",
          "kind": "function",
          "signature": "computeZoneRadius(sceneBounds)",
          "summary": "Auto-compute zone radius from scene bounds."
        },
        {
          "name": "setZoneRadius",
          "kind": "function",
          "signature": "setZoneRadius(auth, radius)",
          "summary": "Update the zone radius (e.g., after scene bounds change or manual override). Rebuilds the spatial grid with the new cell size."
        },
        {
          "name": "updatePeerPosition",
          "kind": "function",
          "signature": "updatePeerPosition(auth, peerId, position)",
          "summary": "Update a peer's camera position (called from presence packets)."
        },
        {
          "name": "removePeer",
          "kind": "function",
          "signature": "removePeer(auth, peerId)",
          "summary": "Remove a peer (on disconnect)."
        },
        {
          "name": "updateEntityPosition",
          "kind": "function",
          "signature": "updateEntityPosition(auth, entityId, x, z)",
          "summary": "Update an entity's position in the spatial grid. Call this when entity transforms change (from physics step or remote sync)."
        },
        {
          "name": "removeEntity",
          "kind": "function",
          "signature": "removeEntity(auth, entityId)",
          "summary": "Remove an entity from the spatial grid (on entity delete)."
        },
        {
          "name": "resolveAuthority",
          "kind": "function",
          "signature": "resolveAuthority(auth, entityId, x, z)",
          "summary": "Resolve authority for a single entity based on proximity. Applies hysteresis: current owner keeps it unless new peer is 20% closer."
        },
        {
          "name": "getMyAuthoritySet",
          "kind": "function",
          "signature": "getMyAuthoritySet(auth)",
          "summary": "Get all entity IDs that the local peer is authoritative over. Uses the auto-authority map (resolved at RESOLVE_INTERVAL_MS)."
        },
        {
          "name": "getMyInterestSet",
          "kind": "function",
          "signature": "getMyInterestSet(auth)",
          "summary": "Get all entity IDs within the local peer's interest area (zone × interestMultiplier)."
        },
        {
          "name": "getPeerInterestSet",
          "kind": "function",
          "signature": "getPeerInterestSet(auth, peerId)",
          "summary": "Get the interest set for a specific peer (used by relay host for filtering)."
        },
        {
          "name": "isInMyZone",
          "kind": "function",
          "signature": "isInMyZone(auth, x, z)",
          "summary": "Check if an entity position is within the local peer's authority zone."
        },
        {
          "name": "isInBufferZone",
          "kind": "function",
          "signature": "isInBufferZone(auth, x, z)",
          "summary": "Check if an entity position is within the buffer zone (boundary ring)."
        },
        {
          "name": "isDormant",
          "kind": "function",
          "signature": "isDormant(auth, entityId)",
          "summary": "Check if an entity is dormant (outside all peer zones)."
        },
        {
          "name": "tickSpatialAuthority",
          "kind": "function",
          "signature": "tickSpatialAuthority(auth)",
          "summary": "Periodic tick: re-resolve auto-authority for all tracked entities. Call this at ~2Hz from the collab loop (or faster if needed)."
        },
        {
          "name": "destroySpatialAuthority",
          "kind": "function",
          "signature": "destroySpatialAuthority(auth)",
          "summary": "Clear all state (on leave room / exit play mode)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabTransformSync",
      "path": "engine/reference/collab/CollabTransformSync.md",
      "source": "engine/collab/CollabTransformSync.js",
      "import": "/engine/collab/CollabTransformSync.js",
      "sourceHash": "216ba966056a93e4b512526e3d187a0124073efbc78bbfb3370d9a9db66bfb55",
      "summary": "CollabTransformSync.js Broadcasts entity transform updates during play mode so grabbed/moved objects are visible on all peer screens in real time. Authority model: - The peer who presses Play becomes the physics authority. - Authority broadcasts ALL entity transforms at ~10Hz. - Non-authority peers receive and apply transforms, skipping local physics. - Grabbed entity transforms are always sent at ~15Hz by anyone.",
      "exports": [
        {
          "name": "createTransformSync",
          "kind": "function",
          "signature": "createTransformSync()",
          "summary": "Create a transform sync state object."
        },
        {
          "name": "trackLocalGrab",
          "kind": "function",
          "signature": "trackLocalGrab(syncState, entityId)",
          "summary": "Mark an entity as being actively grabbed/dragged by the local user."
        },
        {
          "name": "untrackLocalGrab",
          "kind": "function",
          "signature": "untrackLocalGrab(syncState, entityId)",
          "summary": "Unmark an entity when released."
        },
        {
          "name": "buildPlayTransformOp",
          "kind": "function",
          "signature": "buildPlayTransformOp(syncState, ecsWorld, getEntityComponent)",
          "summary": "Build a play_transforms op for grabbed entities only. Returns null if nothing to broadcast or if throttled."
        },
        {
          "name": "buildFullPlayTransformOp",
          "kind": "function",
          "signature": "buildFullPlayTransformOp(syncState, ecsWorld, getEntityComponent, sceneEntities, entityAuthority, spatialAuthoritySet)",
          "summary": "Build a play_transforms op for ALL scene entities. Only called by the physics authority at ~10Hz."
        },
        {
          "name": "buildPbdStateOp",
          "kind": "function",
          "signature": "buildPbdStateOp(syncState, physicsSimulations, spatialAuthoritySet)",
          "summary": "Build a play_pbd_state op that snapshots PBD particle positions. Any peer running physics simulations broadcasts at ~30Hz for real-time rope sync. Only includes sims with >0 particles. Full float precision for smooth visual sync."
        },
        {
          "name": "applyRemotePbdState",
          "kind": "function",
          "signature": "applyRemotePbdState(op, physicsSimulations)",
          "summary": "Apply incoming PBD particle state from the authority (host). Non-authority clients do NOT run their own PBD solver for these sims — they just apply the received positions directly. Tags each sim with `_remoteAuthority = true` so stepPhysicsSimulations skips the local solver for it (prevents local physics from fighting the authoritative positions)."
        },
        {
          "name": "applyRemotePlayTransforms",
          "kind": "function",
          "signature": "applyRemotePlayTransforms(op, peerId, ecsWorld, getEntityComponent, setEntityComponent, syncState)",
          "summary": "Apply incoming play_transforms from a remote peer. Pushes transforms into the interpolation buffer, measures jitter for adaptive delay, and detects \"nuke\" events (massive state changes) for instant snap."
        },
        {
          "name": "interpolateRemoteEntities",
          "kind": "function",
          "signature": "interpolateRemoteEntities(syncState, ecsWorld, getEntityComponent, localDragEntityId, entityAuthority)",
          "summary": "Interpolate buffered remote transforms and write to ECS + physics. Called every render frame by non-authority peers. Uses adaptive render delay that auto-adjusts based on measured packet jitter. On LAN/good connections: as low as ~20ms. On jittery links: up to 150ms. Slowly tightens delay when stable; instantly widens on late arrivals."
        },
        {
          "name": "getInterpDelay",
          "kind": "function",
          "signature": "getInterpDelay(syncState)",
          "summary": "Get the current adaptive interpolation delay (ms) for diagnostics."
        },
        {
          "name": "getRemoteGrabGlows",
          "kind": "function",
          "signature": "getRemoteGrabGlows(syncState, presenceState)",
          "summary": "Get set of entity IDs currently being grabbed by remote peers. Returns Map<entityId, peerColor> for glow rendering."
        },
        {
          "name": "destroyTransformSync",
          "kind": "function",
          "signature": "destroyTransformSync(syncState)",
          "summary": "Destroy / reset transform sync state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/CollabZoneHandoff",
      "path": "engine/reference/collab/CollabZoneHandoff.md",
      "source": "engine/collab/CollabZoneHandoff.js",
      "import": "/engine/collab/CollabZoneHandoff.js",
      "sourceHash": "caac89e016c76f2c87a451b784dd443a9e63790cbca94496b87c57362ea04d6f",
      "summary": "CollabZoneHandoff.js Smooth authority transfer protocol when entities cross spatial zone boundaries. Buffer zone (15% of zone radius): - Entity enters buffer → both peers simulate, current owner broadcasts state - Entity crosses buffer center → handoff op with full state snapshot - 500ms hysteresis prevents rapid back-and-forth Handoff op: { type: 'zone_handoff', payload: { entityId, fromPeer, toPeer, seq, state } } - state: { pos, rot, vel, angVel, pbdParticles? } - seq: authority sequence number (higher always wins, Gaffer-style) Assembly awareness: if entity A is constrained to entity B, both get handed off together to the same peer. Fallback: if fromPeer disconnects mid-handoff, nearest remaining peer takes ownership immediately. Inspired by: Roblox \"buffer zone\" (red outline), Star Citizen entity graph authority transfers, Gaffer on Games ownership sequence numbers.",
      "exports": [
        {
          "name": "createZoneHandoff",
          "kind": "function",
          "signature": "createZoneHandoff()",
          "summary": "Create a zone handoff manager."
        },
        {
          "name": "initiateHandoff",
          "kind": "function",
          "signature": "initiateHandoff(handoff, entityId, fromPeer, toPeer)",
          "summary": "Start a pending handoff for an entity (called when spatial authority detects a zone change). Does NOT commit yet — waits for hysteresis period."
        },
        {
          "name": "cancelHandoff",
          "kind": "function",
          "signature": "cancelHandoff(handoff, entityId)",
          "summary": "Cancel a pending handoff (entity moved back to original zone)."
        },
        {
          "name": "buildHandoffOp",
          "kind": "function",
          "signature": "buildHandoffOp(entityId, fromPeer, toPeer, seq, entityState)",
          "summary": "Build a zone_handoff op with full entity state for network transmission. Called by the outgoing peer when handoff commits."
        },
        {
          "name": "captureEntityState",
          "kind": "function",
          "signature": "captureEntityState(ecsWorld, getEntityComponent, entityId, physicsSimulations)",
          "summary": "Capture entity state for the handoff snapshot."
        },
        {
          "name": "onRemoteHandoffOp",
          "kind": "function",
          "signature": "onRemoteHandoffOp(handoff, op, selfId, ecsWorld, setEntityComponent, getEntityComponent, physicsSimulations)",
          "summary": "Handle an incoming zone_handoff op from a remote peer. Applies the state snapshot if the sequence number is higher than our last."
        },
        {
          "name": "tickZoneHandoff",
          "kind": "function",
          "signature": "tickZoneHandoff(handoff, selfId)",
          "summary": "Tick pending handoffs. Commits any that have passed the hysteresis period. Prunes stale pending handoffs."
        },
        {
          "name": "onHandoffPeerDisconnect",
          "kind": "function",
          "signature": "onHandoffPeerDisconnect(handoff, peerId)",
          "summary": "Handle peer disconnect: cancel pending handoffs involving this peer and reassign any entities that were mid-handoff."
        },
        {
          "name": "onHandoffComplete",
          "kind": "function",
          "signature": "onHandoffComplete(handoff, callback)",
          "summary": "Set callback for handoff completion."
        },
        {
          "name": "destroyZoneHandoff",
          "kind": "function",
          "signature": "destroyZoneHandoff(handoff)",
          "summary": "Destroy handoff state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/PhysicsGrab",
      "path": "engine/reference/collab/PhysicsGrab.md",
      "source": "engine/collab/PhysicsGrab.js",
      "import": "/engine/collab/PhysicsGrab.js",
      "sourceHash": "d25759edb1b6bb5b572e474544a3e82c3cceb9cec69b37c60e058374a3f72c2c",
      "summary": "PhysicsGrab.js Mass-proportional spring-damper (PD controller) physics grab system. How other games do it: - Garry's Mod Physgun:     pure spring-damper, body stays dynamic - Half-Life 2 gravity gun: spring + angular correction torque - Boneworks/BONELAB VR:    PD controller with grip strength cap - UE4 Physics Handle:      D6 joint linear drive to target pos This implementation uses a **frequency / damping-ratio** parameterization (ref: Orange Duck \"Spring-It-On\", Gaffer on Games \"Spring Physics\"): omega = 2π × frequency         (natural frequency, rad/s) kp    = omega² × mass           (spring stiffness, N/m)  ← mass-proportional kd    = 2 × ζ × omega × mass    (damping, N·s/m)       ← mass-proportional With ζ = 1.0 (critical damping), the object reaches the target as fast as possible with zero overshoot regardless of mass. A 0.5 kg ball and a 200 kg crate both converge at the same rate. Multiple players grabbing the same object creates competing spring forces that resolve naturally through physics — tug-of-war emerges with no special-case code needed. Fatigue model (Boneworks-inspired): - Holding heavy objects drains fatigue over time - Effective strength = baseStrength * (0.2 + 0.8 * fatigue) - Minimum 20% strength even when exhausted - Fatigue recovers quickly when not holding Grip break: - Progressive grip weakening beyond GRIP_WEAKEN_DIST - Full slip at GRIP_BREAK_DIST Scope: point-target PD forces for dynamic rigid bodies. Constraint/joint drives, rotational grabs, continuous collision detection, solver substep tuning, and captured multi-peer PhysX traces remain outside this module.",
      "exports": [
        {
          "name": "physicsGrabPeerIdReport",
          "kind": "function",
          "signature": "physicsGrabPeerIdReport(peerId)",
          "summary": ""
        },
        {
          "name": "physicsGrabVectorReport",
          "kind": "function",
          "signature": "physicsGrabVectorReport(value, kind = 'position')",
          "summary": ""
        },
        {
          "name": "physicsGrabForceReport",
          "kind": "function",
          "signature": "physicsGrabForceReport(objPos, objVel, targetPos, strength, mass)",
          "summary": ""
        },
        {
          "name": "grabForceOperationReport",
          "kind": "function",
          "signature": "grabForceOperationReport(op, transportPeerId = null)",
          "summary": ""
        },
        {
          "name": "admitRemoteGrabForce",
          "kind": "function",
          "signature": "admitRemoteGrabForce(remoteGrabs, op, transportPeerId, receivedAtMs = Date.now()",
          "summary": ""
        },
        {
          "name": "pruneRemoteGrabForces",
          "kind": "function",
          "signature": "pruneRemoteGrabForces(remoteGrabs, nowMs = Date.now()",
          "summary": ""
        },
        {
          "name": "removeRemoteGrabPeer",
          "kind": "function",
          "signature": "removeRemoteGrabPeer(remoteGrabs, peerId)",
          "summary": ""
        },
        {
          "name": "computeGrabForce",
          "kind": "function",
          "signature": "computeGrabForce(objPos, objVel, targetPos, strength, mass)",
          "summary": "Compute mass-proportional spring-damper grab force. Uses frequency/damping-ratio parameterization so the convergence rate is identical regardless of object mass. Critical damping (ζ=1) means the object reaches the cursor as fast as possible with zero overshoot."
        },
        {
          "name": "tickFatigue",
          "kind": "function",
          "signature": "tickFatigue(fatigue, loadRatio, dt)",
          "summary": "Update fatigue based on load this frame."
        },
        {
          "name": "effectiveStrength",
          "kind": "function",
          "signature": "effectiveStrength(baseStrength, fatigue)",
          "summary": "Effective strength considering fatigue. Even fully exhausted players retain 20% strength (adrenaline)."
        },
        {
          "name": "canGrab",
          "kind": "function",
          "signature": "canGrab(mass, strength)",
          "summary": "Check if an object is too heavy to pick up at all. Returns false if mass > 4x strength (can't apply meaningful force)."
        },
        {
          "name": "createLocalGrab",
          "kind": "function",
          "signature": "createLocalGrab(entityId, targetPos, baseStrength)",
          "summary": "Create a local grab state for the player's own grab."
        },
        {
          "name": "buildGrabForceOp",
          "kind": "function",
          "signature": "buildGrabForceOp(peerId, entityId, targetPos, strength, fatigue)",
          "summary": "Build a play_grab_force op to broadcast our cursor target to peers. Other peers apply the same spring force, creating tug-of-war physics."
        },
        {
          "name": "applyGrabForcesToActor",
          "kind": "function",
          "signature": "applyGrabForcesToActor(actor, PhysX, objPos, objVel, grabs, mass)",
          "summary": "Apply all active grab forces to a PhysX actor. Call this BEFORE stepPhysicsWorld each frame."
        },
        {
          "name": "GRAB_FREQUENCY",
          "kind": "constant",
          "signature": "GRAB_FREQUENCY",
          "summary": ""
        },
        {
          "name": "GRAB_DAMPING_RATIO",
          "kind": "constant",
          "signature": "GRAB_DAMPING_RATIO",
          "summary": ""
        },
        {
          "name": "GRAB_MASS_DEFAULT",
          "kind": "constant",
          "signature": "GRAB_MASS_DEFAULT",
          "summary": ""
        },
        {
          "name": "PLAYER_STRENGTH",
          "kind": "constant",
          "signature": "PLAYER_STRENGTH",
          "summary": ""
        },
        {
          "name": "GRIP_WEAKEN_DIST",
          "kind": "constant",
          "signature": "GRIP_WEAKEN_DIST",
          "summary": ""
        },
        {
          "name": "GRIP_BREAK_DIST",
          "kind": "constant",
          "signature": "GRIP_BREAK_DIST",
          "summary": ""
        },
        {
          "name": "FATIGUE_RATE",
          "kind": "constant",
          "signature": "FATIGUE_RATE",
          "summary": ""
        },
        {
          "name": "FATIGUE_RECOVERY",
          "kind": "constant",
          "signature": "FATIGUE_RECOVERY",
          "summary": ""
        },
        {
          "name": "STALE_GRAB_MS",
          "kind": "constant",
          "signature": "STALE_GRAB_MS",
          "summary": ""
        },
        {
          "name": "PHYSICS_GRAB_LIMITS",
          "kind": "constant",
          "signature": "PHYSICS_GRAB_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/SpatialHashGrid",
      "path": "engine/reference/collab/SpatialHashGrid.md",
      "source": "engine/collab/SpatialHashGrid.js",
      "import": "/engine/collab/SpatialHashGrid.js",
      "sourceHash": "48103be11b8c0976da457398bb8b69ad0b35ac67a91ce8bd159474f6312ed1ad",
      "summary": "SpatialHashGrid.js O(1) spatial lookup grid for interest management and zone queries. Uses a 2D grid (XZ plane) where each cell stores a Set of entity IDs. Supports radius and AABB queries without iterating all entities. Inspired by: Photon Fusion AoI grid, SpatialOS worker partitioning.",
      "exports": [
        {
          "name": "spatialHashGridIdReport",
          "kind": "function",
          "signature": "spatialHashGridIdReport(id)",
          "summary": ""
        },
        {
          "name": "spatialHashGridPointReport",
          "kind": "function",
          "signature": "spatialHashGridPointReport(grid, x, z)",
          "summary": ""
        },
        {
          "name": "createSpatialHashGrid",
          "kind": "function",
          "signature": "createSpatialHashGrid(cellSize, options = {})",
          "summary": "Create a spatial hash grid."
        },
        {
          "name": "gridInsert",
          "kind": "function",
          "signature": "gridInsert(grid, id, x, z)",
          "summary": "Insert an entity into the grid."
        },
        {
          "name": "gridRemove",
          "kind": "function",
          "signature": "gridRemove(grid, id)",
          "summary": "Remove an entity from the grid."
        },
        {
          "name": "gridClear",
          "kind": "function",
          "signature": "gridClear(grid)",
          "summary": "Clear all entities from the grid."
        },
        {
          "name": "gridQueryRadius",
          "kind": "function",
          "signature": "gridQueryRadius(grid, x, z, radius)",
          "summary": "Query all entity IDs within a radius of a point (XZ plane). Returns entities whose grid position is within the radius."
        },
        {
          "name": "gridQueryRect",
          "kind": "function",
          "signature": "gridQueryRect(grid, minX, minZ, maxX, maxZ)",
          "summary": "Query all entity IDs within an axis-aligned bounding box (XZ plane)."
        },
        {
          "name": "gridGetPosition",
          "kind": "function",
          "signature": "gridGetPosition(grid, id)",
          "summary": "Get the stored position for an entity."
        },
        {
          "name": "gridSize",
          "kind": "function",
          "signature": "gridSize(grid)",
          "summary": "Get the total number of entities in the grid."
        },
        {
          "name": "gridGetStats",
          "kind": "function",
          "signature": "gridGetStats(grid)",
          "summary": ""
        },
        {
          "name": "destroySpatialHashGrid",
          "kind": "function",
          "signature": "destroySpatialHashGrid(grid)",
          "summary": ""
        },
        {
          "name": "SPATIAL_HASH_GRID_LIMITS",
          "kind": "constant",
          "signature": "SPATIAL_HASH_GRID_LIMITS",
          "summary": ""
        },
        {
          "name": "gridUpdate",
          "kind": "constant",
          "signature": "gridUpdate",
          "summary": "Update an entity's position. Alias for insert (handles cell migration)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "collab/index",
      "path": "engine/reference/collab/index.md",
      "source": "engine/collab/index.js",
      "import": "/engine/collab/index.js",
      "sourceHash": "8356c3e7e65211508b9b2cd943001692fdb5438f1743fd1b89962bf096fb44d6",
      "summary": "engine/collab/index.js Barrel export for all collab modules.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/bootloader",
      "path": "engine/reference/compat/bootloader.md",
      "source": "engine/compat/bootloader.js",
      "import": "/engine/compat/bootloader.js",
      "sourceHash": "e460c4298b2126ff9b7159ba3430559e202519909287cbfeb24349105f69a647",
      "summary": "bootloader.js — the Engine Compatibility Bootloader entry point. Boot flow (Phases 1-2 implemented here; 3-7 plug in via ctx hooks): 1. load source              (source-loader) 2. parse HTML               (html-ingestor) 3. static probe → profile   (probe-scanner + profile-builder) 4. merge with cached profile(profile-cache) 5. [validate]               (ctx.validate — schema-registry, Phase 3) 6. [heal]                   (ctx.heal — healing-pipeline, Phase 4) 7. build scoped realm + heal DOM + scope CSS   (runtime-realm) 8. [interpose]              (ctx.interpose — interposers, Phase 5) 9. execute guest scripts 10. cache profile, install error recovery, return an app handle The bootloader is engine-agnostic: pass a `ctx` with optional { storage, profileCache, gpu, scheduler, validate, heal, interpose, onError }.",
      "exports": [
        {
          "name": "CompatBootloader",
          "kind": "class",
          "signature": "class CompatBootloader",
          "summary": ""
        },
        {
          "name": "CompatApp",
          "kind": "class",
          "signature": "class CompatApp",
          "summary": "A booted guest app handle."
        },
        {
          "name": "bootExternalApp",
          "kind": "function",
          "signature": "async bootExternalApp(options, ctx = {})",
          "summary": "Convenience one-shot boot without holding a CompatBootloader instance."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/css-healer",
      "path": "engine/reference/compat/css-healer.md",
      "source": "engine/compat/css-healer.js",
      "import": "/engine/compat/css-healer.js",
      "sourceHash": "01b6bd528da890518e15151d8978952b531d5f50ab7933d881fa52195271804c",
      "summary": "css-healer.js — scope a guest app's CSS so it cannot style the OS shell. External WebGPU apps routinely style `html, body, canvas, *, :root` globally. `scopeCss(css, scope)` rewrites every style rule so it only applies inside the guest's realm container (e.g. `[data-engine-app=\"tempolux\"]`): html, body            →  [data-engine-app=\"id\"] canvas                →  [data-engine-app=\"id\"] canvas *                     →  [data-engine-app=\"id\"] * .hud .row             →  [data-engine-app=\"id\"] .hud .row At-rules are handled correctly: @media/@supports/@container/@layer/@scope have their inner rules scoped; @keyframes/@font-face/@page/@property/@import are left intact (their \"selectors\" are not element selectors).",
      "exports": [
        {
          "name": "scopeCss",
          "kind": "function",
          "signature": "scopeCss(css, scope)",
          "summary": "Scope a full stylesheet string to `scope` (a selector like `[data-engine-app=\"id\"]`)."
        },
        {
          "name": "scopeSelectorFor",
          "kind": "function",
          "signature": "scopeSelectorFor(appId)",
          "summary": "Convenience: the canonical realm scope selector for an app id."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/dom-healer",
      "path": "engine/reference/compat/dom-healer.md",
      "source": "engine/compat/dom-healer.js",
      "import": "/engine/compat/dom-healer.js",
      "sourceHash": "dcfe566bd11c2d23bfc4ec9d6856d25440183733d39c2c7844e58516d651a170",
      "summary": "dom-healer.js — create DOM elements a guest app requires but that are missing. Many single-file WebGPU apps assume `<canvas id=\"c\">`, an overlay `#ov`, a HUD `#hud`, etc. already exist. The compatibility profile lists those in `profile.dom.requiredElements`; this healer ensures each exists inside the guest's realm container BEFORE the guest's scripts run, so `getElementById` and friends resolve instead of throwing.",
      "exports": [
        {
          "name": "healDom",
          "kind": "function",
          "signature": "healDom(rootEl, profile)",
          "summary": "Ensure every `profile.dom.requiredElements` entry exists under `rootEl`."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/error-recovery",
      "path": "engine/reference/compat/error-recovery.md",
      "source": "engine/compat/error-recovery.js",
      "import": "/engine/compat/error-recovery.js",
      "sourceHash": "70f015036138359a5c47082e4a88948d483d652173a949302d0703fa84123578",
      "summary": "error-recovery.js — keep a crashing guest from taking down the OS. Installs scoped error capture and drives a recovery ladder when a guest throws repeatedly within a short window: 1. tolerate isolated errors (already recorded), 2. reboot the realm (fresh parse + heal + run), 3. reboot in SAFE MODE (network off, shader-heal off, GPU limits clamped), 4. render an in-realm error panel with a manual Restart — OS stays alive. Errors counted toward escalation: runtime-error, promise-error, script, gpu-device-lost. Benign infos (warnings, clamps, recovery notices) are ignored.",
      "exports": [
        {
          "name": "installErrorRecovery",
          "kind": "function",
          "signature": "installErrorRecovery(app, { win = (typeof window !== 'undefined' ? window : null)",
          "summary": ""
        },
        {
          "name": "makeSafeProfile",
          "kind": "function",
          "signature": "makeSafeProfile(profile)",
          "summary": "A safer variant of a profile used for safe-mode reboots."
        },
        {
          "name": "renderErrorPanel",
          "kind": "function",
          "signature": "renderErrorPanel(app, info)",
          "summary": "Render a friendly, non-fatal error panel inside the guest's realm container."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/healers/asset-healer",
      "path": "engine/reference/compat/healers/asset-healer.md",
      "source": "engine/compat/healers/asset-healer.js",
      "import": "/engine/compat/healers/asset-healer.js",
      "sourceHash": "9f8e5ca3da39a6ab8597cc30cf94afc8fcd010522272d586c384d57481859aac",
      "summary": "healers/asset-healer.js — resolve bundled relative asset references. A multi-file guest references `<img src=\"logo.png\">`, `<source src=\"clip.webm\">`, etc. Those relative URLs won't resolve inside the realm, so this pass rewrites any reference present in the package `files` map to a blob URL. The created URLs are recorded on `model._assetBlobs` so the realm revokes them on destroy.",
      "exports": [
        {
          "name": "healAssets",
          "kind": "function",
          "signature": "healAssets({ model, files }, report)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/healers/error-healer",
      "path": "engine/reference/compat/healers/error-healer.md",
      "source": "engine/compat/healers/error-healer.js",
      "import": "/engine/compat/healers/error-healer.js",
      "sourceHash": "0ce5fe8f4b04a57f8f11d501775dac536ae779f264b8d02f3eb8a74c4ca27814",
      "summary": "healers/error-healer.js — enable scoped error capture for the guest. Marks the profile so the bootloader installs error/unhandledrejection capture (Phase 7's recovery layer reads `healing.captureErrors`). Kept as its own pass so the recovery policy can grow independently.",
      "exports": [
        {
          "name": "healErrorPolicy",
          "kind": "function",
          "signature": "healErrorPolicy({ profile }, report)",
          "summary": "healers/error-healer.js — enable scoped error capture for the guest. Marks the profile so the bootloader installs error/unhandledrejection capture (Phase 7's recovery layer reads `healing.captureErrors`). Kept as its own pass so the recovery policy can grow independently."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/healers/gpu-healer",
      "path": "engine/reference/compat/healers/gpu-healer.md",
      "source": "engine/compat/healers/gpu-healer.js",
      "import": "/engine/compat/healers/gpu-healer.js",
      "sourceHash": "1545fccc75ed5bdb85c0cc17879bc6a0164cf24cd639d9541aa55b0819d13b1b",
      "summary": "healers/gpu-healer.js — normalise GPU-related profile fields before boot. Sets a sensible `gpu.presentation` and ensures the runtime healing flags the interposer relies on (`clampGpuLimits`, `wrapQueueSubmit`) are populated. The actual limit-clamping happens at runtime in `interposers/gpu.js`.",
      "exports": [
        {
          "name": "healGpu",
          "kind": "function",
          "signature": "healGpu({ profile }, report)",
          "summary": "healers/gpu-healer.js — normalise GPU-related profile fields before boot. Sets a sensible `gpu.presentation` and ensures the runtime healing flags the interposer relies on (`clampGpuLimits`, `wrapQueueSubmit`) are populated. The actual limit-clamping happens at runtime in `interposers/gpu.js`."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/healers/lifecycle-healer",
      "path": "engine/reference/compat/healers/lifecycle-healer.md",
      "source": "engine/compat/healers/lifecycle-healer.js",
      "import": "/engine/compat/healers/lifecycle-healer.js",
      "sourceHash": "bfa3c1da7ec852c0aeaadcaf0218bc3619cc5a43be07f47a97727c9d3c7c0e81",
      "summary": "healers/lifecycle-healer.js — ensure lifecycle healing flags are populated. These flags drive the interposers and the recovery layer (Phase 7): whether to recover on GPU context loss, namespace storage, and route downloads safely.",
      "exports": [
        {
          "name": "healLifecycle",
          "kind": "function",
          "signature": "healLifecycle({ profile }, report)",
          "summary": "healers/lifecycle-healer.js — ensure lifecycle healing flags are populated. These flags drive the interposers and the recovery layer (Phase 7): whether to recover on GPU context loss, namespace storage, and route downloads safely."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/healers/shader-healer",
      "path": "engine/reference/compat/healers/shader-healer.md",
      "source": "engine/compat/healers/shader-healer.js",
      "import": "/engine/compat/healers/shader-healer.js",
      "sourceHash": "4856cc4ceda0f129133a2a511d0ddd1a6c0c6fca6e26d2ac98834c1f355fdc26",
      "summary": "healers/shader-healer.js — migrate deprecated WGSL attribute syntax. Older WGSL used `[[stage(...)]]` / `[[group(x), binding(y)]]` / `[[location(n)]]` / `[[builtin(...)]]`, which modern WebGPU rejects. This pass rewrites those tokens to the current `@stage` / `@group @binding` / `@location` / `@builtin` forms inside inline guest scripts. The patterns are WGSL-specific and do not occur in normal JS, so the rewrite is safe. Gated by `profile.healing.healShaders`.",
      "exports": [
        {
          "name": "healShaders",
          "kind": "function",
          "signature": "healShaders({ model, profile }, report)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/healing-pipeline",
      "path": "engine/reference/compat/healing-pipeline.md",
      "source": "engine/compat/healing-pipeline.js",
      "import": "/engine/compat/healing-pipeline.js",
      "sourceHash": "0ae6ff990638f031e7dc45c5372d59be67e3073a70e6449747e389ddf6ff5fae",
      "summary": "healing-pipeline.js — ordered pre-boot healing passes over a guest. Runs after probing and before the realm is built, mutating the parsed model and the profile in place. Ordered per the compat spec: DOM/CSS scoping happen in the realm itself; here we do the model/profile-level passes: GPU flags → lifecycle flags → error policy → asset URL rewrite → WGSL repair. Each pass is isolated (a throwing healer never aborts the others) and appends to a human-readable report returned to the caller.",
      "exports": [
        {
          "name": "runHealingPipeline",
          "kind": "function",
          "signature": "runHealingPipeline(ctxObj)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/html-ingestor",
      "path": "engine/reference/compat/html-ingestor.md",
      "source": "engine/compat/html-ingestor.js",
      "import": "/engine/compat/html-ingestor.js",
      "sourceHash": "f46ae40ea0c0f80615b2d9083b13fb4f1ac04de9babed7d02f4181ff7c4c15fa",
      "summary": "html-ingestor.js — parse a guest HTML document into a structured model. Uses DOMParser (scripts parsed this way are INERT — they will not execute on insertion), so we can safely inspect and relocate the DOM, then hand the extracted scripts to the runtime realm to execute in controlled order. The returned model: { doc,                       // the parsed Document (inert) title, scripts: [{ module, src, code, async, defer }],   // document order styles:  [{ inline, href, code }],                // document order links:   [{ rel, href }], canvases:[{ id, width, height }], assets:  string[],         // referenced asset URLs (img/src, etc.) }",
      "exports": [
        {
          "name": "parseHTML",
          "kind": "function",
          "signature": "parseHTML(html, baseUrl = null)",
          "summary": "html-ingestor.js — parse a guest HTML document into a structured model. Uses DOMParser (scripts parsed this way are INERT — they will not execute on insertion), so we can safely inspect and relocate the DOM, then hand the extracted scripts to the runtime realm to execute in controlled order. The returned model: { doc,                       // the parsed Document (inert) title, scripts: [{ module, src, code, async, defer }],   // document order styles:  [{ inline, href, code }],                // document order links:   [{ rel, href }], canvases:[{ id, width, height }], assets:  string[],         // referenced asset URLs (img/src, etc.) }"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/iframe-realm",
      "path": "engine/reference/compat/iframe-realm.md",
      "source": "engine/compat/iframe-realm.js",
      "import": "/engine/compat/iframe-realm.js",
      "sourceHash": "4624e30e3c859591e7425baa3bc98a3f7ffc07425a8541dae8030721f4721304",
      "summary": "iframe-realm.js — a hard-isolation execution root for UNTRUSTED guest apps. Unlike RuntimeRealm (light-DOM, shared OS origin — best-effort isolation), this runs the guest inside a `sandbox=\"allow-scripts\"` iframe WITHOUT `allow-same-origin`, so it gets a unique opaque origin and cannot touch the OS document, cookies, localStorage/IndexedDB, or kernel globals. It is a real security boundary suitable for community/unverified packages and live remote sites. The guest document is assembled self-contained (bundled JS → `data:` modules with imports rewritten; bundled CSS/assets → inline/`data:` URLs) because parent-origin blob URLs are unreachable from the opaque-origin iframe. A tiny injected bridge routes window.open()/anchor navigations up to the host via postMessage (the host opens them in the OS Browser). Trade-offs vs RuntimeRealm: no shared WebGPU device (the iframe requests its own), and no direct syscall access (a postMessage RPC would be needed). Used only when isolation is requested.",
      "exports": [
        {
          "name": "IframeRealm",
          "kind": "class",
          "signature": "class IframeRealm",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/index",
      "path": "engine/reference/compat/index.md",
      "source": "engine/compat/index.js",
      "import": "/engine/compat/index.js",
      "sourceHash": "c8382c030e2e0e979d5f3713c020d8c08bd9b56eebb0a62e1d5b463c6745546b",
      "summary": "engine/compat/index.js — the Engine Compatibility namespace. `createCompat(ctx)` returns the `engine.compat` API used across the OS: await engine.compat.boot({ id, source, mount, mode, permissions }); `ctx` wires the compat layer to the host engine/kernel (all optional): storage   — kernel.storageManager (profile/snapshot persistence) gpu       — { getOrCreateSharedDevice(adapter, desc), format, healDeviceDescriptor } scheduler — engine frame scheduler (RAF interposition, Phase 5/6) validate  — async (profile) => { valid, errors }      (Phase 3) heal      — async ({ model, profile, files, appId })  (Phase 4) interpose — async ({ realm, profile, app, ctx })      (Phase 5) onError   — (info) => void Phases 3-7 register their hooks onto the same ctx, so this factory stays the single, stable entry point as the pipeline grows.",
      "exports": [
        {
          "name": "createCompat",
          "kind": "function",
          "signature": "createCompat(ctx = {})",
          "summary": ""
        },
        {
          "name": "COMPAT_VERSION",
          "kind": "constant",
          "signature": "COMPAT_VERSION",
          "summary": ""
        },
        {
          "name": "CompatBootloader",
          "kind": "re-export",
          "signature": "CompatBootloader",
          "summary": ""
        },
        {
          "name": "ProfileCache",
          "kind": "re-export",
          "signature": "ProfileCache",
          "summary": ""
        },
        {
          "name": "bootExternalApp",
          "kind": "re-export",
          "signature": "bootExternalApp",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/fetch",
      "path": "engine/reference/compat/interposers/fetch.md",
      "source": "engine/compat/interposers/fetch.js",
      "import": "/engine/compat/interposers/fetch.js",
      "sourceHash": "ea590fee8f7eaff993be16af3cdf72c0711099d8f5ee9308060a52b4577cb098",
      "summary": "interposers/fetch.js — default-deny network egress for guest apps + serving bundled package files. Resolution order: 1. If the ref resolves to a bundled package file (e.g. `fetch('data.json')` or a `.wasm`), serve it directly from the file map — relative paths in a blob-loaded module would otherwise 404 against the OS origin. 2. Same-origin, relative, `blob:` and `data:` requests pass through. 3. Cross-origin requests are blocked unless the profile granted `network.fetch` — preventing a wrapped third-party app from phoning home.",
      "exports": [
        {
          "name": "makeFetchShim",
          "kind": "function",
          "signature": "makeFetchShim({ profile, onError, realm = null } = {})",
          "summary": "interposers/fetch.js — default-deny network egress for guest apps + serving bundled package files. Resolution order: 1. If the ref resolves to a bundled package file (e.g. `fetch('data.json')` or a `.wasm`), serve it directly from the file map — relative paths in a blob-loaded module would otherwise 404 against the OS origin. 2. Same-origin, relative, `blob:` and `data:` requests pass through. 3. Cross-origin requests are blocked unless the profile granted `network.fetch` — preventing a wrapped third-party app from phoning home."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/file-export",
      "path": "engine/reference/compat/interposers/file-export.md",
      "source": "engine/compat/interposers/file-export.js",
      "import": "/engine/compat/interposers/file-export.js",
      "sourceHash": "2ea761a2705a5efb2fac2a10376b35a37b48edf150097f270799a2b46ae4102b",
      "summary": "interposers/file-export.js — safe blob/download handling for a guest realm. Guests export files via `URL.createObjectURL(blob)` + an `<a download>` click (or `showSaveFilePicker`). Two problems: created object URLs leak if never revoked, and downloads are invisible to the OS. This shim wraps `URL` so every `createObjectURL` is tracked (and revoked on realm destroy) and each export is counted into the app's metrics — without blocking the legitimate download.",
      "exports": [
        {
          "name": "makeUrlShim",
          "kind": "function",
          "signature": "makeUrlShim(realm, { metrics, onExport } = {})",
          "summary": "interposers/file-export.js — safe blob/download handling for a guest realm. Guests export files via `URL.createObjectURL(blob)` + an `<a download>` click (or `showSaveFilePicker`). Two problems: created object URLs leak if never revoked, and downloads are invisible to the OS. This shim wraps `URL` so every `createObjectURL` is tracked (and revoked on realm destroy) and each export is counted into the app's metrics — without blocking the legitimate download."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/gpu",
      "path": "engine/reference/compat/interposers/gpu.md",
      "source": "engine/compat/interposers/gpu.js",
      "import": "/engine/compat/interposers/gpu.js",
      "sourceHash": "5b254642ab7e1f06c6cfac748ece27c5ebbcb0e886ebf1f7551e2612d79dcb63",
      "summary": "interposers/gpu.js — wrap `navigator.gpu` for a guest realm. The guest keeps using the real WebGPU implementation, but through a shim that: • clamps `requiredLimits` to what the adapter actually supports (a very common crash cause when an app hard-codes limits from a beefier GPU), • drops unsupported `requiredFeatures` instead of throwing, • counts `queue.submit` calls into the app's metrics, • reports device-loss (so the recovery layer can react) without spamming on intentional `destroy()`. It deliberately does NOT share the kernel's device — each guest gets its own device so it cannot corrupt OS GPU state. Sharing/surface hand-off is Phase 6.",
      "exports": [
        {
          "name": "makeGpuShim",
          "kind": "function",
          "signature": "makeGpuShim({ metrics, onError } = {})",
          "summary": "interposers/gpu.js — wrap `navigator.gpu` for a guest realm. The guest keeps using the real WebGPU implementation, but through a shim that: • clamps `requiredLimits` to what the adapter actually supports (a very common crash cause when an app hard-codes limits from a beefier GPU), • drops unsupported `requiredFeatures` instead of throwing, • counts `queue.submit` calls into the app's metrics, • reports device-loss (so the recovery layer can react) without spamming on intentional `destroy()`. It deliberately does NOT share the kernel's device — each guest gets its own device so it cannot corrupt OS GPU state. Sharing/surface hand-off is Phase 6."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/index",
      "path": "engine/reference/compat/interposers/index.md",
      "source": "engine/compat/interposers/index.js",
      "import": "/engine/compat/interposers/index.js",
      "sourceHash": "faf80bed633d2ed7b8ecf644a18f35522720c039adfd9414f3291602b887ca82",
      "summary": "interposers/index.js — install per-realm API shims for a guest app. Guests run in the shared window, so we cannot replace globals process-wide without breaking the OS. Instead we: 1. build a per-realm `context` of shims (gpu/raf/storage/fetch), 2. register it at `globalThis.__engineRealms.get(appId)`, 3. return a code `transform` that prepends a tiny prelude to each guest script which LEXICALLY SHADOWS the relevant globals with the shims. Module scripts: the prelude's top-level `const`s shadow the globals within the module's own scope. Classic scripts: wrapped in an IIFE (only when there's a single classic script, to avoid breaking cross-script global sharing). Which globals are shadowed is driven by `profile.uses`, minimising both collision risk and overhead.",
      "exports": [
        {
          "name": "installInterposers",
          "kind": "function",
          "signature": "installInterposers({ realm, profile, ctx, app } = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/navigation",
      "path": "engine/reference/compat/interposers/navigation.md",
      "source": "engine/compat/interposers/navigation.js",
      "import": "/engine/compat/interposers/navigation.js",
      "sourceHash": "bf074fc0524d3cebcd874c6fb17dc033eb33be4fd1b999d83eb605f21628b430",
      "summary": "navigation.js — keep a guest's \"open a new window\" / external navigation INSIDE the OS instead of spawning a real browser popup or navigating the whole OS page away. Guests run in the shared OS document (light DOM, not an iframe), so an unhandled `<a href>` click or `window.open()` would either pop a real browser window or unload the entire OS. We intercept both and hand the URL to the host via `onOpenWindow(url, info)` — the host decides where it goes (default: the in-OS Browser app). Two mechanisms: 1. DOM click-capture on the realm container — anchors that open a new window (target=_blank/_new) or point off-origin are cancelled and routed. Always installed (cheap, prevents the OS-unload footgun). 2. Lexically-shadowed `window.open` / `open()` / `location` — routes JS-driven popups and redirects. Only bound when the probe detected such usage (`profile.uses.windowOpen`), to minimise shadowing blast radius.",
      "exports": [
        {
          "name": "makeOpenShim",
          "kind": "function",
          "signature": "makeOpenShim({ onOpenWindow, onError } = {})",
          "summary": "Replacement for window.open / open(): route the URL, return a harmless stub."
        },
        {
          "name": "makeWindowProxy",
          "kind": "function",
          "signature": "makeWindowProxy(openShim, { onOpenWindow, onError } = {})",
          "summary": "Proxy over the real window that only overrides `open` and `location` writes."
        },
        {
          "name": "makeLocationProxy",
          "kind": "function",
          "signature": "makeLocationProxy({ onOpenWindow, onError } = {})",
          "summary": "Proxy over location: reads pass through; href=/assign/replace are routed."
        },
        {
          "name": "installNavCapture",
          "kind": "function",
          "signature": "installNavCapture(realm, { onOpenWindow, onError } = {})",
          "summary": "Capture-phase click handler on the realm container. Cancels + routes anchor navigations that would open a new window or leave the OS origin. Returns a cleanup function (also registered on the realm)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/raf",
      "path": "engine/reference/compat/interposers/raf.md",
      "source": "engine/compat/interposers/raf.js",
      "import": "/engine/compat/interposers/raf.js",
      "sourceHash": "da4600bd5f756bafbdf8dfa83f9c09d876e31e315dce785d12d1c4b2d3cd7056",
      "summary": "interposers/raf.js — managed requestAnimationFrame for a guest realm. Guest render loops are the #1 resource leak when an app's window closes: the raw `requestAnimationFrame` loop keeps running forever. This shim tracks every pending frame and cancels them all on `realm.destroy()`, so closing a guest window actually stops its GPU work. Errors thrown inside a frame callback are reported instead of silently killing the loop's owner.",
      "exports": [
        {
          "name": "makeRafShim",
          "kind": "function",
          "signature": "makeRafShim(realm)",
          "summary": "interposers/raf.js — managed requestAnimationFrame for a guest realm. Guest render loops are the #1 resource leak when an app's window closes: the raw `requestAnimationFrame` loop keeps running forever. This shim tracks every pending frame and cancels them all on `realm.destroy()`, so closing a guest window actually stops its GPU work. Errors thrown inside a frame callback are reported instead of silently killing the loop's owner."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/storage",
      "path": "engine/reference/compat/interposers/storage.md",
      "source": "engine/compat/interposers/storage.js",
      "import": "/engine/compat/interposers/storage.js",
      "sourceHash": "9c9ea4a132b652585799460a4b72d7fec8b650f3eca3dadf2394ff229ff1f6f7",
      "summary": "interposers/storage.js — per-app namespaced localStorage / sessionStorage. Guests freely use `localStorage.foo = x` and `localStorage.getItem(...)`. Left unscoped they would collide with each other and with the OS. This shim transparently prefixes every key with `compat:<appId>:` and supports both the Storage method API and direct property access (via a Proxy). Falls back to an in-memory store when Web Storage is unavailable.",
      "exports": [
        {
          "name": "makeStorageShim",
          "kind": "function",
          "signature": "makeStorageShim(appId, backing)",
          "summary": "interposers/storage.js — per-app namespaced localStorage / sessionStorage. Guests freely use `localStorage.foo = x` and `localStorage.getItem(...)`. Left unscoped they would collide with each other and with the OS. This shim transparently prefixes every key with `compat:<appId>:` and supports both the Storage method API and direct property access (via a Proxy). Falls back to an in-memory store when Web Storage is unavailable."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/interposers/worker",
      "path": "engine/reference/compat/interposers/worker.md",
      "source": "engine/compat/interposers/worker.js",
      "import": "/engine/compat/interposers/worker.js",
      "sourceHash": "3f1f3ef4f83374f126b7356605a6ca16047d5e0d376f04bc756137dcd363d7f4",
      "summary": "interposers/worker.js — resolve guest Worker(url) references to bundled blobs. A guest's `new Worker('worker.js')` references a path relative to its original document, which won't resolve once the guest runs from blob URLs in the OS realm. This shim rewrites a relative/bundled worker URL to its pre-linked module blob (imports already rewritten + shims applied), or a blob of the bundled file. Remote/absolute URLs pass through unchanged. Returns a Worker subclass, or null if Worker is unavailable.",
      "exports": [
        {
          "name": "makeWorkerShim",
          "kind": "function",
          "signature": "makeWorkerShim(realm, RealWorker = (typeof Worker !== 'undefined' ? Worker : null)",
          "summary": "interposers/worker.js — resolve guest Worker(url) references to bundled blobs. A guest's `new Worker('worker.js')` references a path relative to its original document, which won't resolve once the guest runs from blob URLs in the OS realm. This shim rewrites a relative/bundled worker URL to its pre-linked module blob (imports already rewritten + shims applied), or a blob of the bundled file. Remote/absolute URLs pass through unchanged. Returns a Worker subclass, or null if Worker is unavailable."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/module-linker",
      "path": "engine/reference/compat/module-linker.md",
      "source": "engine/compat/module-linker.js",
      "import": "/engine/compat/module-linker.js",
      "sourceHash": "2f754c26d47d2b3487d332881a529533aaa54cba76c84d74f501b472f19d7ce9",
      "summary": "module-linker.js — turn an in-memory file map into runnable blob-URL modules. Loading an ES module from a `blob:` URL loses its path context, so relative imports (`import './a.js'`) and `import.meta.url`-relative resolution break (the blob has no directory). Following the es-module-shims technique, we rewrite every relative / bundled import specifier in each JS module to the `blob:` URL of its resolved target (created in dependency order), optionally apply a code transform (the interposer prelude / shader healing), and return a `path → blobURL` map plus a resolver for inline-module imports. Bare specifiers (`import 'three'`) may be resolved by the caller-provided import resolver (import map / CDN fallback). Absolute/remote URLs are left untouched.",
      "exports": [
        {
          "name": "buildModuleBlobs",
          "kind": "function",
          "signature": "buildModuleBlobs({ files, transform = null, onWarn = null, resolveBare = null, resolveExternal = null, urlKind = 'blob' } = {})",
          "summary": "Build blob-URL modules for every bundled JS file, with relative imports rewritten to reference each other's blob URLs."
        },
        {
          "name": "buildImportResolver",
          "kind": "function",
          "signature": "buildImportResolver(profile)",
          "summary": "Build a resolver for BARE import specifiers (`three`, `@scope/pkg`, subpaths) from a compat profile. Resolution order: 1. exact match in `profile.imports.map` 2. longest trailing-slash prefix match (`three/` → base) in the map 3. CDN fallback `<cdn><spec>` when `profile.healing.cdnImports !== false` (default CDN https://esm.sh/, overridable via `profile.imports.cdn`) Returns null when nothing matches (the import is left unresolved)."
        },
        {
          "name": "isBareSpecifier",
          "kind": "function",
          "signature": "isBareSpecifier(spec)",
          "summary": "A bare specifier: not relative (./ ../ /), not an absolute/remote URL."
        },
        {
          "name": "isRelativeSpecifier",
          "kind": "function",
          "signature": "isRelativeSpecifier(spec)",
          "summary": ""
        },
        {
          "name": "isPackageSpecifier",
          "kind": "function",
          "signature": "isPackageSpecifier(spec)",
          "summary": ""
        },
        {
          "name": "discoverSpecs",
          "kind": "function",
          "signature": "discoverSpecs(code)",
          "summary": "Collect every (string-literal) import specifier from module code."
        },
        {
          "name": "rewriteSpecs",
          "kind": "function",
          "signature": "rewriteSpecs(code, urlFor)",
          "summary": "Replace import specifiers using `urlFor(spec)`. When it returns a falsy value the original specifier is kept (bare/remote/cyclic)."
        },
        {
          "name": "resolveSpec",
          "kind": "function",
          "signature": "resolveSpec(spec, importerRel, files)",
          "summary": "Resolve an import specifier to a bundled file path, or null when it is bare (no leading ./ ../ or /) or absolute/remote. Tries the literal path, then `.js`/`.mjs`, then `/index.js`."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/probe-scanner",
      "path": "engine/reference/compat/probe-scanner.md",
      "source": "engine/compat/probe-scanner.js",
      "import": "/engine/compat/probe-scanner.js",
      "sourceHash": "df6195017e8b826e0b546145ded842d28b11007a7625f33f82530dc577e943d7",
      "summary": "probe-scanner.js — statically detect what a guest app uses. Combines the parsed DOM model with a regex scan of all script source to infer the `uses`, `dom`, and `gpu` sections of a compatibility profile. This is a heuristic pass (static, no execution) — the healing + interposition layers refine it at runtime and the profile cache promotes it once it boots.",
      "exports": [
        {
          "name": "scanSource",
          "kind": "function",
          "signature": "scanSource(model, files = null)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/profile-builder",
      "path": "engine/reference/compat/profile-builder.md",
      "source": "engine/compat/profile-builder.js",
      "import": "/engine/compat/profile-builder.js",
      "sourceHash": "949a73707c4b3c1503a3e4d070431f69b10a23fd52da48d8fa6c8f309a69ed45",
      "summary": "Build a full profile from a static scan result.",
      "exports": [
        {
          "name": "buildProfile",
          "kind": "function",
          "signature": "buildProfile(id, scan, opts = {})",
          "summary": "Build a full profile from a static scan result."
        },
        {
          "name": "mergeProfiles",
          "kind": "function",
          "signature": "mergeProfiles(saved, fresh)",
          "summary": "Merge a saved profile with a freshly scanned one. Saved healing/permissions decisions win (they were promoted as working); newly detected requirements and `uses`/`gpu` flags are unioned in."
        },
        {
          "name": "profilePermissionList",
          "kind": "function",
          "signature": "profilePermissionList(profile)",
          "summary": "Map a profile to a kernel/AppRegistry permission list (best-effort)."
        },
        {
          "name": "sha256Hex",
          "kind": "function",
          "signature": "async sha256Hex(str)",
          "summary": "SHA-256 hex of a string (used for source/version hashing)."
        },
        {
          "name": "PROFILE_FORMAT",
          "kind": "constant",
          "signature": "PROFILE_FORMAT",
          "summary": "profile-builder.js — assemble & merge compatibility profiles. A profile is the durable description of what a guest app needs and how to heal it. The static scanner produces a fresh profile; the cache may hold a saved one from a previous version. `mergeProfiles` reuses known-good healing decisions and layers in newly detected requirements."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/profile-cache",
      "path": "engine/reference/compat/profile-cache.md",
      "source": "engine/compat/profile-cache.js",
      "import": "/engine/compat/profile-cache.js",
      "sourceHash": "5eff703e5cac636ee24742b0e8f076dc3ba81e51900585c1c3426308a45d9ba5",
      "summary": "profile-cache.js — persist & version compatibility profiles. Storage layout (via the kernel StorageManager facade): /os/compat/profiles/{id}.json        ← active (stable or testing) profile /os/compat/index.json                ← { [id]: { knownVersions: [...] } } /os/compat/snapshots/{id}/{ts}.json  ← runtime snapshots (Phase 7) If no storage facade is provided (or a write fails), it degrades to an in-memory cache so the bootloader still works in a bare harness/test.",
      "exports": [
        {
          "name": "ProfileCache",
          "kind": "class",
          "signature": "class ProfileCache",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/runtime-realm",
      "path": "engine/reference/compat/runtime-realm.md",
      "source": "engine/compat/runtime-realm.js",
      "import": "/engine/compat/runtime-realm.js",
      "sourceHash": "a763db46bdc35d97cd2eb4a2979e39953da34326bbbda03cbb13d1f43398fb6d",
      "summary": "runtime-realm.js — a controlled, scoped execution root for a guest app. Trusted same-origin guests (Mode A/B) reference elements via `document.*`, so the realm is a SCOPED LIGHT-DOM container (`<div data-engine-app=\"id\">`) rather than a shadow root — `getElementById('c')` must still resolve. Isolation comes from: • CSS scoping (css-healer) so guest styles can't touch the OS shell, • API interposition (Phase 5) so guest browser calls route through the engine, • DOM healing so required elements exist before scripts run. Scripts parsed by DOMParser are inert; the realm re-executes them in document order: classic inline → fresh <script>; module inline → blob import(); src → resolved against the package file map (blob) or left as a URL for the browser.",
      "exports": [
        {
          "name": "RuntimeRealm",
          "kind": "class",
          "signature": "class RuntimeRealm",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/schema-registry",
      "path": "engine/reference/compat/schema-registry.md",
      "source": "engine/compat/schema-registry.js",
      "import": "/engine/compat/schema-registry.js",
      "sourceHash": "948a12f4fa12065f545d794dfc5f57722e975a228fabbd66dbe4f103f3540b2a",
      "summary": "schema-registry.js — validate a compatibility profile before boot. Self-contained: a tiny JSON-Schema-subset checker (type / required / enum / properties / items / additionalProperties) plus `validateProfile()` which also applies cross-field consistency rules (e.g. GPU pipelines imply uses.webgpu). The bootloader calls this via `ctx.validate`; Package Studio can call `engine.compat.validateProfile(profile)` to preview problems before compiling.",
      "exports": [
        {
          "name": "CompatSchemaRegistry",
          "kind": "class",
          "signature": "class CompatSchemaRegistry",
          "summary": ""
        },
        {
          "name": "validateProfile",
          "kind": "function",
          "signature": "validateProfile(profile)",
          "summary": "Validate a full compatibility profile: structural schema + consistency rules."
        },
        {
          "name": "compatSchemas",
          "kind": "constant",
          "signature": "compatSchemas",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/schemas",
      "path": "engine/reference/compat/schemas.md",
      "source": "engine/compat/schemas.js",
      "import": "/engine/compat/schemas.js",
      "sourceHash": "e59c4d39bf98f710dbf7342c8c48d5fefe84582d2414787fd1deed5d775f290d",
      "summary": "schemas.js — declarative schemas for the compatibility profile and its parts. Kept as plain JS descriptors (not .json) so the engine module is self-contained and needs no fetch. Validated by `schema-registry.js`'s tiny checker, which supports: type, required, enum, properties, items, additionalProperties.",
      "exports": [
        {
          "name": "permissionsSchema",
          "kind": "constant",
          "signature": "permissionsSchema",
          "summary": "schemas.js — declarative schemas for the compatibility profile and its parts. Kept as plain JS descriptors (not .json) so the engine module is self-contained and needs no fetch. Validated by `schema-registry.js`'s tiny checker, which supports: type, required, enum, properties, items, additionalProperties."
        },
        {
          "name": "domSchema",
          "kind": "constant",
          "signature": "domSchema",
          "summary": ""
        },
        {
          "name": "gpuSchema",
          "kind": "constant",
          "signature": "gpuSchema",
          "summary": ""
        },
        {
          "name": "usesSchema",
          "kind": "constant",
          "signature": "usesSchema",
          "summary": ""
        },
        {
          "name": "healingSchema",
          "kind": "constant",
          "signature": "healingSchema",
          "summary": ""
        },
        {
          "name": "importsSchema",
          "kind": "constant",
          "signature": "importsSchema",
          "summary": ""
        },
        {
          "name": "appProfileSchema",
          "kind": "constant",
          "signature": "appProfileSchema",
          "summary": ""
        },
        {
          "name": "COMPAT_SCHEMAS",
          "kind": "constant",
          "signature": "COMPAT_SCHEMAS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/source-loader",
      "path": "engine/reference/compat/source-loader.md",
      "source": "engine/compat/source-loader.js",
      "import": "/engine/compat/source-loader.js",
      "sourceHash": "f0607014a91db6123b1b612873a8346dc38a4d312ae815681261b8c1e90f01b6",
      "summary": "source-loader.js — load a guest app's source from any supported origin. Supported `source` shapes: string                         → treated as raw HTML if it looks like HTML, else a URL { html }                       → raw HTML string { url, fetch? }                → remote fetch (CORS-aware; optional custom fetch) { file: File }                 → an imported File (uses .text()) { files: Map|object, entry }   → an in-memory file map (folder/zip), entry = HTML path { vfsPath, storage }           → read from the OS VFS via a StorageManager Returns: { html, files: Map<string,string|ArrayBuffer>, baseUrl, sourceType, sourceHash }",
      "exports": [
        {
          "name": "loadSource",
          "kind": "function",
          "signature": "async loadSource(source, ctx = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/surface/engine-texture-surface",
      "path": "engine/reference/compat/surface/engine-texture-surface.md",
      "source": "engine/compat/surface/engine-texture-surface.js",
      "import": "/engine/compat/surface/engine-texture-surface.js",
      "sourceHash": "2b7c64fefc76fcc46cd716875eda127320af572cebcf70d780abfe7a56f1fa0e",
      "summary": "surface/engine-texture-surface.js — present the guest's render into an engine texture instead of a DOM canvas (so it can be composited in the 3D/GPU UI). STUB: the full implementation redirects the guest's WebGPU context to an offscreen target on the shared kernel device, then imports the result as an engine texture each frame. That requires the canvas-interposer to hand the guest a wrapped context and the kernel compositor to accept an external texture. Until that lands, `supported` is false so `selectSurface` falls back to the webgpu-canvas surface — the profile can already request this mode, so flipping it on later needs no guest changes.",
      "exports": [
        {
          "name": "EngineTextureSurface",
          "kind": "class",
          "signature": "class EngineTextureSurface",
          "summary": "surface/engine-texture-surface.js — present the guest's render into an engine texture instead of a DOM canvas (so it can be composited in the 3D/GPU UI). STUB: the full implementation redirects the guest's WebGPU context to an offscreen target on the shared kernel device, then imports the result as an engine texture each frame. That requires the canvas-interposer to hand the guest a wrapped context and the kernel compositor to accept an external texture. Until that lands, `supported` is false so `selectSurface` falls back to the webgpu-canvas surface — the profile can already request this mode, so flipping it on later needs no guest changes."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/surface/offscreen-surface",
      "path": "engine/reference/compat/surface/offscreen-surface.md",
      "source": "engine/compat/surface/offscreen-surface.js",
      "import": "/engine/compat/surface/offscreen-surface.js",
      "sourceHash": "b033283edcb252346296a95902387f7b7961d81e9dcadcf9877af78ae6c2bbc2",
      "summary": "surface/offscreen-surface.js — render the guest on an OffscreenCanvas. STUB: intended for guests that can run their render loop on a worker / detached canvas (transferControlToOffscreen) for isolation and throttling. Behind the same Surface interface; `supported` is false until the offscreen transfer + present path is implemented, so `selectSurface` falls back to webgpu-canvas.",
      "exports": [
        {
          "name": "OffscreenSurface",
          "kind": "class",
          "signature": "class OffscreenSurface",
          "summary": "surface/offscreen-surface.js — render the guest on an OffscreenCanvas. STUB: intended for guests that can run their render loop on a worker / detached canvas (transferControlToOffscreen) for isolation and throttling. Behind the same Surface interface; `supported` is false until the offscreen transfer + present path is implemented, so `selectSurface` falls back to webgpu-canvas."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/surface/surface-manager",
      "path": "engine/reference/compat/surface/surface-manager.md",
      "source": "engine/compat/surface/surface-manager.js",
      "import": "/engine/compat/surface/surface-manager.js",
      "sourceHash": "258da4496199c9d90778ffa1aa46e95a5cd8e05e6040b006da9011db1e354627",
      "summary": "surface/surface-manager.js — pick the presentation surface for a guest. Selected by `profile.gpu.presentation`. `webgpu-canvas` (and `canvas-2d`) are fully implemented; `engine-texture` / `offscreen` are stubs that report `supported === false`, so we transparently fall back to the canvas surface — the profile can request them today and they'll light up when implemented, with no guest changes.",
      "exports": [
        {
          "name": "selectSurface",
          "kind": "function",
          "signature": "selectSurface(profile, deps = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "compat/surface/webgpu-canvas-surface",
      "path": "engine/reference/compat/surface/webgpu-canvas-surface.md",
      "source": "engine/compat/surface/webgpu-canvas-surface.js",
      "import": "/engine/compat/surface/webgpu-canvas-surface.js",
      "sourceHash": "1a22c36d64494dfb9574d8220bd1254ea5bcb323138ebaa09a68394fcce5237d",
      "summary": "surface/webgpu-canvas-surface.js — default presentation: the guest's own <canvas> inside the realm container. For trusted same-origin guests this is mostly pass-through (the app configures its own WebGPU canvas context). The surface's job is to LOCATE the primary canvas and, when `profile.healing.autoCanvasSize` is enabled, keep its backing store sized to the container with a clamped device-pixel-ratio — fixing the common \"canvas stuck at 300×150 / wrong DPR\" class of bugs without fighting an app that manages its own sizing.",
      "exports": [
        {
          "name": "WebgpuCanvasSurface",
          "kind": "class",
          "signature": "class WebgpuCanvasSurface",
          "summary": "surface/webgpu-canvas-surface.js — default presentation: the guest's own <canvas> inside the realm container. For trusted same-origin guests this is mostly pass-through (the app configures its own WebGPU canvas context). The surface's job is to LOCATE the primary canvas and, when `profile.healing.autoCanvasSize` is enabled, keep its backing store sized to the container with a clamped device-pixel-ratio — fixing the common \"canvas stuck at 300×150 / wrong DPR\" class of bugs without fighting an app that manages its own sizing."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "config/EngineConfig",
      "path": "engine/reference/config/EngineConfig.md",
      "source": "engine/config/EngineConfig.js",
      "import": "/engine/config/EngineConfig.js",
      "sourceHash": "8d12b8ccab81fcb0932df1e637d18c754a0f34d02a141ecbf75f9e01a8e68d77",
      "summary": "",
      "exports": [
        {
          "name": "parseSimpleYaml",
          "kind": "function",
          "signature": "parseSimpleYaml(text)",
          "summary": ""
        },
        {
          "name": "loadEngineConfig",
          "kind": "function",
          "signature": "async loadEngineConfig(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "config/EngineDefaultConfig",
      "path": "engine/reference/config/EngineDefaultConfig.md",
      "source": "engine/config/EngineDefaultConfig.js",
      "import": "/engine/config/EngineDefaultConfig.js",
      "sourceHash": "705b6416e50e3f7af2135c55e0d762126fd47a432bbc405ac034d72e4fcdd1c4",
      "summary": "",
      "exports": [
        {
          "name": "DefaultEngineConfig",
          "kind": "constant",
          "signature": "DefaultEngineConfig",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "config/EngineState",
      "path": "engine/reference/config/EngineState.md",
      "source": "engine/config/EngineState.js",
      "import": "/engine/config/EngineState.js",
      "sourceHash": "8c82c4208202f1efb850b5e170cc54788e7a6e4997e61c78da79ea48dffb869d",
      "summary": "Create GPU state object",
      "exports": [
        {
          "name": "createGpuState",
          "kind": "function",
          "signature": "createGpuState()",
          "summary": "Create GPU state object"
        },
        {
          "name": "createWaterPassState",
          "kind": "function",
          "signature": "createWaterPassState()",
          "summary": "Create water pass state object Used for screen-space fluid/water/metaball rendering"
        },
        {
          "name": "createConfigState",
          "kind": "function",
          "signature": "createConfigState(overrides = {})",
          "summary": "Create scene configuration state (merge with engine.cfg overrides)"
        },
        {
          "name": "createPhysicsState",
          "kind": "function",
          "signature": "createPhysicsState(overrides = {})",
          "summary": "Create physics configuration state"
        },
        {
          "name": "createEcsState",
          "kind": "function",
          "signature": "createEcsState()",
          "summary": "Create ECS state object"
        },
        {
          "name": "createSpawnState",
          "kind": "function",
          "signature": "createSpawnState()",
          "summary": "Create spawn/ghost state object"
        },
        {
          "name": "createParticlesState",
          "kind": "function",
          "signature": "createParticlesState()",
          "summary": "Create particle system state object"
        },
        {
          "name": "createSmokeState",
          "kind": "function",
          "signature": "createSmokeState()",
          "summary": "Create volumetric smoke state object"
        },
        {
          "name": "createRenderState",
          "kind": "function",
          "signature": "createRenderState(overrides = {})",
          "summary": "Create render settings state"
        },
        {
          "name": "createCameraState",
          "kind": "function",
          "signature": "createCameraState(config = {})",
          "summary": "Create camera state object"
        },
        {
          "name": "createInputState",
          "kind": "function",
          "signature": "createInputState()",
          "summary": "Create input state object"
        },
        {
          "name": "createAudioState",
          "kind": "function",
          "signature": "createAudioState()",
          "summary": "Create audio state object"
        },
        {
          "name": "createAllState",
          "kind": "function",
          "signature": "createAllState(options = {})",
          "summary": "Create all state objects at once."
        },
        {
          "name": "applyEngineConfigToState",
          "kind": "function",
          "signature": "applyEngineConfigToState(config, cfg)",
          "summary": "Apply engine.cfg values to config state. Call this after loading engine.cfg."
        },
        {
          "name": "applyEngineConfigToPhysics",
          "kind": "function",
          "signature": "applyEngineConfigToPhysics(physics, cfg)",
          "summary": "Apply engine.cfg values to physics state."
        },
        {
          "name": "DEFAULT_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_CONFIG",
          "summary": "Default configuration values (can be overridden by engine.cfg)"
        },
        {
          "name": "DEFAULT_PHYSICS",
          "kind": "constant",
          "signature": "DEFAULT_PHYSICS",
          "summary": "Default physics values"
        },
        {
          "name": "DEFAULT_RENDER",
          "kind": "constant",
          "signature": "DEFAULT_RENDER",
          "summary": "Default render settings"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/AppBootstrap",
      "path": "engine/reference/core/AppBootstrap.md",
      "source": "engine/core/AppBootstrap.js",
      "import": "/engine/core/AppBootstrap.js",
      "sourceHash": "26caa446b86cd963a29244d1b953b210bd4380b714d82d35f73dfabdb7e743f6",
      "summary": "AppBootstrap.js - Application bootstrap helper Consolidates common app initialization: WebGPU check, canvas ready, config loading, ECS world, GPU init, and main loop setup.",
      "exports": [
        {
          "name": "bootstrapApp",
          "kind": "function",
          "signature": "async bootstrapApp(options)",
          "summary": "Bootstrap a complete application."
        },
        {
          "name": "createMainLoop",
          "kind": "function",
          "signature": "createMainLoop(options)",
          "summary": "Create main loop with standard update/render pattern."
        },
        {
          "name": "runApp",
          "kind": "function",
          "signature": "async runApp(options)",
          "summary": "Full app bootstrap + loop in one call."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/EngineIntegration",
      "path": "engine/reference/core/EngineIntegration.md",
      "source": "engine/core/EngineIntegration.js",
      "import": "/engine/core/EngineIntegration.js",
      "sourceHash": "dafefd085d8bbbbd623c43321f3b0c164d9f975e5a418f80f783ea6792d858ef",
      "summary": "High-performance particle emitter using SoA",
      "exports": [
        {
          "name": "SoAParticleEmitter",
          "kind": "class",
          "signature": "class SoAParticleEmitter",
          "summary": "High-performance particle emitter using SoA"
        },
        {
          "name": "RenderCommandBuilder",
          "kind": "class",
          "signature": "class RenderCommandBuilder",
          "summary": "Render command builder using object pools"
        },
        {
          "name": "initResourceManagement",
          "kind": "function",
          "signature": "async initResourceManagement(device, options = {})",
          "summary": "Initialize resource management for the game Call this during game initialization after WebGPU device is ready"
        },
        {
          "name": "frameWrapper",
          "kind": "function",
          "signature": "frameWrapper(frameCallback)",
          "summary": "Frame wrapper that handles resource management automatically Usage: ```js function gameLoop() { frameWrapper(() => { // Your game update code here updatePhysics(); updateAI(); render(); }); requestAnimationFrame(gameLoop); } ```"
        },
        {
          "name": "frameWrapperAsync",
          "kind": "function",
          "signature": "async frameWrapperAsync(frameCallback)",
          "summary": "Async frame wrapper for async game loops"
        },
        {
          "name": "submitPhysicsJob",
          "kind": "function",
          "signature": "submitPhysicsJob(callback, data = null)",
          "summary": "Submit physics job to scheduler"
        },
        {
          "name": "submitAIJob",
          "kind": "function",
          "signature": "submitAIJob(callback, data = null)",
          "summary": "Submit AI job to scheduler"
        },
        {
          "name": "submitStreamingJob",
          "kind": "function",
          "signature": "submitStreamingJob(callback, data = null)",
          "summary": "Submit streaming/loading job to scheduler"
        },
        {
          "name": "submitCleanupJob",
          "kind": "function",
          "signature": "submitCleanupJob(callback, data = null)",
          "summary": "Submit background cleanup job"
        },
        {
          "name": "PARTICLE_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_SCHEMA",
          "summary": "Schema for high-performance particle system using Structure of Arrays"
        },
        {
          "name": "TRANSFORM_SCHEMA",
          "kind": "constant",
          "signature": "TRANSFORM_SCHEMA",
          "summary": "Schema for entity transforms using Structure of Arrays"
        },
        {
          "name": "JobPriority",
          "kind": "re-export",
          "signature": "JobPriority",
          "summary": ""
        },
        {
          "name": "resources",
          "kind": "re-export",
          "signature": "resources",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/EntitySystem",
      "path": "engine/reference/core/EntitySystem.md",
      "source": "engine/core/EntitySystem.js",
      "import": "/engine/core/EntitySystem.js",
      "sourceHash": "ece4ccd358460d1d6e60a10dea2601f6588b3feea42565ed0a5a850d76aab58f",
      "summary": "EntitySystem — lightweight entity registry used by LIFE narrative systems. This is intentionally a simple in-memory map. The ECS runtime lives in the engine simulation layer; narrative modules just need a stable handle to the active entity collection they are narrating.",
      "exports": [
        {
          "name": "EntitySystem",
          "kind": "class",
          "signature": "class EntitySystem",
          "summary": "EntitySystem — lightweight entity registry used by LIFE narrative systems. This is intentionally a simple in-memory map. The ECS runtime lives in the engine simulation layer; narrative modules just need a stable handle to the active entity collection they are narrating."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/ResourceManager",
      "path": "engine/reference/core/ResourceManager.md",
      "source": "engine/core/ResourceManager.js",
      "import": "/engine/core/ResourceManager.js",
      "sourceHash": "41ccbba0784be8f88238385788432a2f5615fe8be0a512a94bd5209165ef701d",
      "summary": "ResourceManager.js - Unified High-Performance Resource Management Central facade integrating: - Host Memory (RAM): Slab Allocators, Object Pools, SoA Containers - Device Memory (GPU): Ring Buffers, Buddy Allocators, Texture Management - Task Scheduling: Job System, Worker Pools, Frame Budgeting Based on architectural specification for zero-allocation, high-throughput WebGPU applications targeting 60+ FPS.",
      "exports": [
        {
          "name": "ResourceManager",
          "kind": "class",
          "signature": "class ResourceManager",
          "summary": "Unified resource management facade"
        },
        {
          "name": "resources",
          "kind": "constant",
          "signature": "resources",
          "summary": ""
        },
        {
          "name": "JobPriority",
          "kind": "re-export",
          "signature": "JobPriority",
          "summary": ""
        },
        {
          "name": "ObjectPool",
          "kind": "re-export",
          "signature": "ObjectPool",
          "summary": ""
        },
        {
          "name": "SlabAllocator",
          "kind": "re-export",
          "signature": "SlabAllocator",
          "summary": ""
        },
        {
          "name": "SoAContainer",
          "kind": "re-export",
          "signature": "SoAContainer",
          "summary": ""
        },
        {
          "name": "hostMemory",
          "kind": "re-export",
          "signature": "hostMemory",
          "summary": ""
        },
        {
          "name": "scheduler",
          "kind": "re-export",
          "signature": "scheduler",
          "summary": ""
        },
        {
          "name": "workerTemplate",
          "kind": "re-export",
          "signature": "workerTemplate",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/compression/AnimationCompression",
      "path": "engine/reference/core/compression/AnimationCompression.md",
      "source": "engine/core/compression/AnimationCompression.js",
      "import": "/engine/core/compression/AnimationCompression.js",
      "sourceHash": "716395ca307034ab4a8d6482507de6268b7bf46ca13b032e835a86f06d499132",
      "summary": "AnimationCompression.js - Animation Data Compression Compresses skeletal animation data using: - Quaternion compression: 37.5% reduction (16 bytes → 10 bytes) - DCT temporal compression: 60-80% reduction - Delta encoding: Store only changed bones - Keyframe reduction: Remove redundant frames Typical compression: 60-80% reduction for skeletal animations",
      "exports": [
        {
          "name": "compressAnimationTrack",
          "kind": "function",
          "signature": "compressAnimationTrack(track, options = {})",
          "summary": "Compress animation track (position, rotation, or scale)"
        },
        {
          "name": "decompressAnimationTrack",
          "kind": "function",
          "signature": "decompressAnimationTrack(compressed)",
          "summary": "Decompress animation track"
        },
        {
          "name": "compressSkeletalAnimation",
          "kind": "function",
          "signature": "compressSkeletalAnimation(animation)",
          "summary": "Compress full skeletal animation"
        },
        {
          "name": "decompressSkeletalAnimation",
          "kind": "function",
          "signature": "decompressSkeletalAnimation(compressed)",
          "summary": "Decompress skeletal animation"
        },
        {
          "name": "reduceKeyframes",
          "kind": "function",
          "signature": "reduceKeyframes(track, tolerance = 0.001)",
          "summary": "Remove redundant keyframes that can be interpolated"
        },
        {
          "name": "compressAnimationBatch",
          "kind": "function",
          "signature": "compressAnimationBatch(animations)",
          "summary": "Compress multiple animations"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/compression/CompressionUtils",
      "path": "engine/reference/core/compression/CompressionUtils.md",
      "source": "engine/core/compression/CompressionUtils.js",
      "import": "/engine/core/compression/CompressionUtils.js",
      "sourceHash": "628a0483363204b7c41d8ac95b8ae6a3c27fa611eeb8c6e0bb58ab34e51d8f69",
      "summary": "CompressionUtils.js - Unified Compression Utilities Provides compression techniques for various data types: - Variable-Length Integer Encoding (VLInt) - Quantization (Float32 → Int16/Int8) - Run-Length Encoding (RLE) - Delta Compression - Octahedral Normal Encoding - Quaternion Compression Based on research from particle snapshot compression achieving 390x compression",
      "exports": [
        {
          "name": "packVLInt",
          "kind": "function",
          "signature": "packVLInt(values)",
          "summary": "Pack small integers into fewer bytes using variable-length encoding Most indices are small, so we can use 1-2 bytes instead of 4 Encoding: - 1 byte: 0xxxxxxx (0-127) - 2 bytes: 10xxxxxx xxxxxxxx (128-16,383) - 3 bytes: 11xxxxxx xxxxxxxx xxxxxxxx (16,384-4,194,303)"
        },
        {
          "name": "unpackVLInt",
          "kind": "function",
          "signature": "unpackVLInt(packed)",
          "summary": "Unpack variable-length encoded integers"
        },
        {
          "name": "quantizeFloat",
          "kind": "function",
          "signature": "quantizeFloat(value, range)",
          "summary": "Quantize float to int16 within range [-range, +range] Achieves 50% memory reduction with minimal precision loss"
        },
        {
          "name": "dequantizeFloat",
          "kind": "function",
          "signature": "dequantizeFloat(quantized, range)",
          "summary": "Dequantize int16 back to float"
        },
        {
          "name": "quantizeFloatArray",
          "kind": "function",
          "signature": "quantizeFloatArray(floats, range)",
          "summary": "Quantize array of floats to Int16Array"
        },
        {
          "name": "dequantizeFloatArray",
          "kind": "function",
          "signature": "dequantizeFloatArray(quantized, range)",
          "summary": "Dequantize Int16Array back to Float32Array"
        },
        {
          "name": "quantizeToInt8",
          "kind": "function",
          "signature": "quantizeToInt8(value, range)",
          "summary": "Quantize to int8 for even more compression (75% reduction) Use for data that doesn't need high precision (normals, colors)"
        },
        {
          "name": "dequantizeFromInt8",
          "kind": "function",
          "signature": "dequantizeFromInt8(quantized, range)",
          "summary": ""
        },
        {
          "name": "encodeOctahedralNormal",
          "kind": "function",
          "signature": "encodeOctahedralNormal(nx, ny, nz)",
          "summary": "Encode 3D unit normal to 2D octahedral coordinates Industry-standard technique used in AAA games Reference: \"A Survey of Efficient Representations for Independent Unit Vectors\""
        },
        {
          "name": "decodeOctahedralNormal",
          "kind": "function",
          "signature": "decodeOctahedralNormal(x, y)",
          "summary": "Decode octahedral coordinates back to 3D normal"
        },
        {
          "name": "encodeNormalArray",
          "kind": "function",
          "signature": "encodeNormalArray(normals)",
          "summary": "Encode array of normals (vec3) to Int16Array Input: Float32Array [nx, ny, nz, nx, ny, nz, ...] Output: Int16Array [x, y, x, y, ...] (66% smaller)"
        },
        {
          "name": "decodeNormalArray",
          "kind": "function",
          "signature": "decodeNormalArray(encoded)",
          "summary": "Decode array of normals back to Float32Array"
        },
        {
          "name": "compressQuaternion",
          "kind": "function",
          "signature": "compressQuaternion(x, y, z, w)",
          "summary": "Compress quaternion by dropping smallest component Technique: Store 3 largest components + index of dropped component Used in animation systems for skeletal rigs"
        },
        {
          "name": "decompressQuaternion",
          "kind": "function",
          "signature": "decompressQuaternion(compressed)",
          "summary": "Decompress quaternion by reconstructing dropped component"
        },
        {
          "name": "runLengthEncode",
          "kind": "function",
          "signature": "runLengthEncode(values)",
          "summary": "Run-Length Encode an array of values Perfect for voxel data with large empty regions Returns: [[value, count], [value, count], ...]"
        },
        {
          "name": "runLengthDecode",
          "kind": "function",
          "signature": "runLengthDecode(runs)",
          "summary": "Decode run-length encoded data"
        },
        {
          "name": "runLengthEncodeCompact",
          "kind": "function",
          "signature": "runLengthEncodeCompact(values)",
          "summary": "RLE with VLInt encoding for maximum compression Returns Uint8Array: [value, count, value, count, ...]"
        },
        {
          "name": "deltaEncode",
          "kind": "function",
          "signature": "deltaEncode(values)",
          "summary": "Delta encode array (store differences instead of absolute values) Great for temporal data or sorted indices"
        },
        {
          "name": "deltaDecode",
          "kind": "function",
          "signature": "deltaDecode(deltas)",
          "summary": "Decode delta-encoded array"
        },
        {
          "name": "createPalette",
          "kind": "function",
          "signature": "createPalette(values)",
          "summary": "Create palette from array of values Returns: { palette: unique values, indices: array of palette indices }"
        },
        {
          "name": "decodePalette",
          "kind": "function",
          "signature": "decodePalette(palette, indices)",
          "summary": "Decode palette-compressed data"
        },
        {
          "name": "getCompressionStats",
          "kind": "function",
          "signature": "getCompressionStats(originalSize, compressedSize)",
          "summary": "Calculate compression ratio and statistics"
        },
        {
          "name": "formatBytes",
          "kind": "function",
          "signature": "formatBytes(bytes)",
          "summary": "Format bytes for display"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/compression/HybridCompression",
      "path": "engine/reference/core/compression/HybridCompression.md",
      "source": "engine/core/compression/HybridCompression.js",
      "import": "/engine/core/compression/HybridCompression.js",
      "sourceHash": "fadbe781f99da8080fe6af45ff5c77abc761c6534caa30d17c11e7f6d558ce4b",
      "summary": "HybridCompression.js - Best of Both Worlds Intelligently combines lossless and lossy compression: - Lossy techniques for high compression (quantization, RLE, etc.) - Lossless encoding on top (LZ77 + Huffman) - Result: Near-lossless quality with near-lossy compression ratios Achieves 80-90% of lossy compression ratio with <0.001% quality loss",
      "exports": [
        {
          "name": "compressMeshHybrid",
          "kind": "function",
          "signature": "compressMeshHybrid(mesh, options = {})",
          "summary": "Compress mesh with hybrid approach"
        },
        {
          "name": "decompressMeshHybrid",
          "kind": "function",
          "signature": "decompressMeshHybrid(compressed)",
          "summary": "Decompress hybrid mesh"
        },
        {
          "name": "compressVoxelHybrid",
          "kind": "function",
          "signature": "compressVoxelHybrid(voxels, options = {})",
          "summary": "Compress voxel chunk with hybrid approach"
        },
        {
          "name": "decompressVoxelHybrid",
          "kind": "function",
          "signature": "decompressVoxelHybrid(compressed)",
          "summary": "Decompress hybrid voxel chunk"
        },
        {
          "name": "compressAnimationHybrid",
          "kind": "function",
          "signature": "compressAnimationHybrid(track, options = {})",
          "summary": "Compress animation with hybrid approach"
        },
        {
          "name": "decompressAnimationHybrid",
          "kind": "function",
          "signature": "decompressAnimationHybrid(compressed)",
          "summary": "Decompress hybrid animation"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/compression/LosslessCompression",
      "path": "engine/reference/core/compression/LosslessCompression.md",
      "source": "engine/core/compression/LosslessCompression.js",
      "import": "/engine/core/compression/LosslessCompression.js",
      "sourceHash": "ba0817cae5154179568ee947fcfbafb4ab9deb8050464fa416d32f5905948b0d",
      "summary": "LosslessCompression.js - Zero Quality Loss Compression Implements truly lossless compression using: - DEFLATE (zlib): Industry standard, 2-3x compression - LZ77 dictionary compression: Fast, 1.5-2x compression - Huffman coding: Entropy encoding - Combination with existing techniques for maximum compression All compression is 100% lossless - perfect reconstruction guaranteed",
      "exports": [
        {
          "name": "compressLZ77",
          "kind": "function",
          "signature": "compressLZ77(data)",
          "summary": "Simple LZ77 compression (basis of DEFLATE) Finds repeated sequences and replaces with back-references 100% lossless"
        },
        {
          "name": "decompressLZ77",
          "kind": "function",
          "signature": "decompressLZ77(compressed)",
          "summary": "Decompress LZ77 data"
        },
        {
          "name": "compressHuffman",
          "kind": "function",
          "signature": "compressHuffman(data)",
          "summary": "Compress data using Huffman coding 100% lossless entropy encoding"
        },
        {
          "name": "decompressHuffman",
          "kind": "function",
          "signature": "decompressHuffman(compressed)",
          "summary": "Decompress Huffman coded data"
        },
        {
          "name": "compressLossless",
          "kind": "function",
          "signature": "compressLossless(data)",
          "summary": "Compress typed array with zero quality loss Combines LZ77 + Huffman for maximum compression"
        },
        {
          "name": "decompressLossless",
          "kind": "function",
          "signature": "decompressLossless(compressed)",
          "summary": "Decompress losslessly compressed data Perfect reconstruction guaranteed"
        },
        {
          "name": "compressFloat32Lossless",
          "kind": "function",
          "signature": "compressFloat32Lossless(floats)",
          "summary": "Compress Float32Array losslessly"
        },
        {
          "name": "compressInt16Lossless",
          "kind": "function",
          "signature": "compressInt16Lossless(ints)",
          "summary": "Compress Int16Array losslessly"
        },
        {
          "name": "compressUint8Lossless",
          "kind": "function",
          "signature": "compressUint8Lossless(bytes)",
          "summary": "Compress Uint8Array losslessly"
        },
        {
          "name": "testLosslessCompression",
          "kind": "function",
          "signature": "testLosslessCompression()",
          "summary": "Test compression on sample data"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/compression/MeshCompression",
      "path": "engine/reference/core/compression/MeshCompression.md",
      "source": "engine/core/compression/MeshCompression.js",
      "import": "/engine/core/compression/MeshCompression.js",
      "sourceHash": "ec095bc43206949b25b96cecfa25b49352ba966588b141de7d2f0a665f1914bb",
      "summary": "MeshCompression.js - Mesh Data Compression Compresses mesh data using: - Position quantization (Float32 → Int16): 50% reduction - Normal octahedral encoding: 66% reduction - UV half-float encoding: 50% reduction - Index VLInt encoding: 30-50% reduction Typical compression: 70-90% reduction in mesh size",
      "exports": [
        {
          "name": "compressMesh",
          "kind": "function",
          "signature": "compressMesh(mesh, options = {})",
          "summary": "Compress mesh data"
        },
        {
          "name": "decompressMesh",
          "kind": "function",
          "signature": "decompressMesh(compressed)",
          "summary": "Decompress mesh data"
        },
        {
          "name": "compressMeshBatch",
          "kind": "function",
          "signature": "compressMeshBatch(meshes)",
          "summary": "Compress multiple meshes and combine into single buffer Useful for static scene geometry"
        },
        {
          "name": "decompressMeshBatch",
          "kind": "function",
          "signature": "decompressMeshBatch(compressedBatch)",
          "summary": "Decompress batch of meshes"
        },
        {
          "name": "compressMeshForStreaming",
          "kind": "function",
          "signature": "compressMeshForStreaming(mesh, lodLevels = [1.0, 0.5, 0.25])",
          "summary": "Compress mesh for streaming (progressive loading) Returns base LOD + detail layers"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/compression/VoxelCompression",
      "path": "engine/reference/core/compression/VoxelCompression.md",
      "source": "engine/core/compression/VoxelCompression.js",
      "import": "/engine/core/compression/VoxelCompression.js",
      "sourceHash": "c28f74b4b6711dc7259bca201c122bb3767e28c6337956e503fbafdd93cdbbab",
      "summary": "VoxelCompression.js - Voxel Data Compression Compresses voxel data using: - Run-Length Encoding (RLE): 80-95% reduction for sparse data - Octree structure: Hierarchical compression - Palette compression: Reuse common materials - Delta encoding: Store chunk changes Typical compression: 80-95% reduction for typical voxel worlds",
      "exports": [
        {
          "name": "compressVoxelChunk",
          "kind": "function",
          "signature": "compressVoxelChunk(voxels, options = {})",
          "summary": "Compress voxel chunk data"
        },
        {
          "name": "decompressVoxelChunk",
          "kind": "function",
          "signature": "decompressVoxelChunk(compressed)",
          "summary": "Decompress voxel chunk data"
        },
        {
          "name": "compressVoxelDelta",
          "kind": "function",
          "signature": "compressVoxelDelta(oldChunk, newChunk)",
          "summary": "Compress changes between two chunk states Perfect for multiplayer sync or undo/redo"
        },
        {
          "name": "applyVoxelDelta",
          "kind": "function",
          "signature": "applyVoxelDelta(chunk, delta)",
          "summary": "Apply delta to chunk"
        },
        {
          "name": "compressVoxelWorld",
          "kind": "function",
          "signature": "compressVoxelWorld(chunks)",
          "summary": "Compress entire voxel world"
        },
        {
          "name": "decompressVoxelWorld",
          "kind": "function",
          "signature": "decompressVoxelWorld(compressed)",
          "summary": "Decompress voxel world"
        },
        {
          "name": "compressVoxelChunkForStreaming",
          "kind": "function",
          "signature": "compressVoxelChunkForStreaming(voxels, size)",
          "summary": "Compress chunk for streaming (progressive loading)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/compression/index",
      "path": "engine/reference/core/compression/index.md",
      "source": "engine/core/compression/index.js",
      "import": "/engine/core/compression/index.js",
      "sourceHash": "cb474084ac63f944a6862443498f5f2df3e70eb2f30820c8380a5ecf58052fa7",
      "summary": "Compression Module - Unified Compression System Provides compression for all engine data types: - Particles: 390x compression (VLInt + Delta + Quantization + PCA/DCT) - Meshes: 70-90% reduction (Quantization + Octahedral normals + VLInt indices) - Voxels: 80-95% reduction (RLE + Octree + Palette) - Animations: 60-80% reduction (Quaternion + DCT + Keyframe reduction) All compression techniques are lossless or near-lossless with configurable quality.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/events/EventBus",
      "path": "engine/reference/core/events/EventBus.md",
      "source": "engine/core/events/EventBus.js",
      "import": "/engine/core/events/EventBus.js",
      "sourceHash": "3fd2a50cef56cc7530d39bfd5ecabd37694677879a2a9b5f12b1d4fec11ba58a",
      "summary": "",
      "exports": [
        {
          "name": "buildEventName",
          "kind": "function",
          "signature": "buildEventName(category, name)",
          "summary": ""
        },
        {
          "name": "createEventBus",
          "kind": "function",
          "signature": "createEventBus()",
          "summary": ""
        },
        {
          "name": "EventCategories",
          "kind": "constant",
          "signature": "EventCategories",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/framegraph/FrameGraph",
      "path": "engine/reference/core/framegraph/FrameGraph.md",
      "source": "engine/core/framegraph/FrameGraph.js",
      "import": "/engine/core/framegraph/FrameGraph.js",
      "sourceHash": "37b245b62ed0785be9ab2d263064eb10ef6ca308fe939af8e4086b1b0895780f",
      "summary": "",
      "exports": [
        {
          "name": "createFrameGraph",
          "kind": "function",
          "signature": "createFrameGraph()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/framepipeline/FrameContext",
      "path": "engine/reference/core/framepipeline/FrameContext.md",
      "source": "engine/core/framepipeline/FrameContext.js",
      "import": "/engine/core/framepipeline/FrameContext.js",
      "sourceHash": "14ca5f669ccff88399a5841908af7df1bdeceda31b2cd54df5abaf68351c3f3e",
      "summary": "FrameContext — Per-frame shared state passed to every pipeline stage. The engine provides a minimal base context with timing and GPU fields. Consumers (editor, game) extend it with their own fields via the overrides parameter. Usage: const ctx = createFrameContext({ dt: 0.016, currentTime: performance.now(), device: gpuDevice, camera: myCamera, editor: editorApp, scene: editorApp.scene, }); pipeline.execute(ctx);",
      "exports": [
        {
          "name": "createFrameContext",
          "kind": "function",
          "signature": "createFrameContext(overrides)",
          "summary": "Create a per-frame context object."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/framepipeline/FramePipeline",
      "path": "engine/reference/core/framepipeline/FramePipeline.md",
      "source": "engine/core/framepipeline/FramePipeline.js",
      "import": "/engine/core/framepipeline/FramePipeline.js",
      "sourceHash": "6671be18ac20a3231c14f07162db98da8415c2e9a24c1f669e868896b1adbc52",
      "summary": "FramePipeline — Generic phased stage executor. Engine-level primitive. Consumers (editor, game, tests) register their own stages via addStage(). The pipeline knows nothing about WebGPU, ECS, or any specific renderer — it just executes stages in order within named phases. Phases (run in this order by execute()): fixedStep  — 0..N per frame (physics, PBD, fixed-rate sim) update     — 1/frame (camera, matrices, lights, animation) render     — 1/frame (GPU render passes) postRender — 1/frame (composites, post-FX, GPU submit) Inspired by: Unity     — FixedUpdate / Update / LateUpdate / OnPostRender Unreal    — TG_PrePhysics → TG_PostPhysics → TG_PostUpdateWork Bevy      — Extract → Prepare → Queue → Render → Cleanup Frostbite — Frame Graph (Setup → Compile → Execute) Complements engine/core/framegraph/FrameGraph.js which handles resource dependency scheduling; this handles execution scheduling.",
      "exports": [
        {
          "name": "FramePipeline",
          "kind": "class",
          "signature": "class FramePipeline",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/framepipeline/index",
      "path": "engine/reference/core/framepipeline/index.md",
      "source": "engine/core/framepipeline/index.js",
      "import": "/engine/core/framepipeline/index.js",
      "sourceHash": "20edf11fa75e20750065e58bc432587060b595c629edc59b8bf85ddf4a50c067",
      "summary": "Frame Pipeline — Barrel exports",
      "exports": [
        {
          "name": "FramePipeline",
          "kind": "re-export",
          "signature": "FramePipeline",
          "summary": ""
        },
        {
          "name": "createFrameContext",
          "kind": "re-export",
          "signature": "createFrameContext",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/AdaptiveQualityGovernor",
      "path": "engine/reference/core/gpu/AdaptiveQualityGovernor.md",
      "source": "engine/core/gpu/AdaptiveQualityGovernor.js",
      "import": "/engine/core/gpu/AdaptiveQualityGovernor.js",
      "sourceHash": "607ee66799435b13cd72051f3f3278dfde4781b448ead2647d8b726b549efb84",
      "summary": "Canonical engine-wide adaptive quality decision maker. It emits one immutable decision per frame so downstream systems cannot independently compound degradations. Correctness requirements are intentionally absent from tiers.",
      "exports": [
        {
          "name": "AdaptiveQualityGovernor",
          "kind": "class",
          "signature": "class AdaptiveQualityGovernor",
          "summary": "Canonical engine-wide adaptive quality decision maker. It emits one immutable decision per frame so downstream systems cannot independently compound degradations. Correctness requirements are intentionally absent from tiers."
        },
        {
          "name": "createAdaptiveQualityGovernor",
          "kind": "function",
          "signature": "createAdaptiveQualityGovernor(options)",
          "summary": ""
        },
        {
          "name": "ADAPTIVE_QUALITY_TIERS",
          "kind": "constant",
          "signature": "ADAPTIVE_QUALITY_TIERS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/AsyncComputeScheduler",
      "path": "engine/reference/core/gpu/AsyncComputeScheduler.md",
      "source": "engine/core/gpu/AsyncComputeScheduler.js",
      "import": "/engine/core/gpu/AsyncComputeScheduler.js",
      "sourceHash": "8a473e7374eb1e0d079c27b1a88cdb148b708b3daa6722b6932e68461cf490a6",
      "summary": "AsyncComputeScheduler - Manages async compute work",
      "exports": [
        {
          "name": "AsyncComputeScheduler",
          "kind": "class",
          "signature": "class AsyncComputeScheduler",
          "summary": "AsyncComputeScheduler - Manages async compute work"
        },
        {
          "name": "ComputeWorkGroup",
          "kind": "class",
          "signature": "class ComputeWorkGroup",
          "summary": "ComputeWorkGroup - Helper for organizing related compute work"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/AsyncGPUWorkScheduler",
      "path": "engine/reference/core/gpu/AsyncGPUWorkScheduler.md",
      "source": "engine/core/gpu/AsyncGPUWorkScheduler.js",
      "import": "/engine/core/gpu/AsyncGPUWorkScheduler.js",
      "sourceHash": "f27454c8b211f0838d9417e7656d6f2c9d9287bb34bc8f2c93ab3dbc821c4b6c",
      "summary": "Async GPU Work Scheduler - Intelligent queue submission batching Eliminates redundant queue submissions and optimizes GPU pipeline utilization Based on WebGPU best practices for minimizing CPU-GPU sync points",
      "exports": [
        {
          "name": "AsyncGPUWorkScheduler",
          "kind": "class",
          "signature": "class AsyncGPUWorkScheduler",
          "summary": "Async GPU Work Scheduler - Intelligent queue submission batching Eliminates redundant queue submissions and optimizes GPU pipeline utilization Based on WebGPU best practices for minimizing CPU-GPU sync points"
        },
        {
          "name": "GPUFrameCoordinator",
          "kind": "class",
          "signature": "class GPUFrameCoordinator",
          "summary": "GPU Frame Coordinator - Coordinates GPU work across frame boundaries Implements triple-buffering and proper synchronization"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/BindingSignals",
      "path": "engine/reference/core/gpu/BindingSignals.md",
      "source": "engine/core/gpu/BindingSignals.js",
      "import": "/engine/core/gpu/BindingSignals.js",
      "sourceHash": "d18122e01ee9438766a060f1ea391a38304aa0be77fe75132a6142cc1b308957",
      "summary": "",
      "exports": [
        {
          "name": "ResourceSignal",
          "kind": "class",
          "signature": "class ResourceSignal",
          "summary": ""
        },
        {
          "name": "BindGroupSignals",
          "kind": "class",
          "signature": "class BindGroupSignals",
          "summary": ""
        },
        {
          "name": "createSignal",
          "kind": "function",
          "signature": "createSignal(value = null)",
          "summary": ""
        },
        {
          "name": "generateWGSLBindGroupDeclarations",
          "kind": "function",
          "signature": "generateWGSLBindGroupDeclarations(groupIndex, defs)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/BitonicSort",
      "path": "engine/reference/core/gpu/BitonicSort.md",
      "source": "engine/core/gpu/BitonicSort.js",
      "import": "/engine/core/gpu/BitonicSort.js",
      "sourceHash": "44a996852eaf804dad3e60c06f17699a9cef08ff99bf0f090888b1611c120c8a",
      "summary": "Calculate 30-bit Morton code for 3D position",
      "exports": [
        {
          "name": "BitonicSorter",
          "kind": "class",
          "signature": "class BitonicSorter",
          "summary": ""
        },
        {
          "name": "RadixSorter",
          "kind": "class",
          "signature": "class RadixSorter",
          "summary": ""
        },
        {
          "name": "encodeMorton3D",
          "kind": "function",
          "signature": "encodeMorton3D(x, y, z)",
          "summary": "Calculate 30-bit Morton code for 3D position"
        },
        {
          "name": "positionToMorton",
          "kind": "function",
          "signature": "positionToMorton(pos, boundsMin, boundsMax)",
          "summary": "Calculate Morton code from world position"
        },
        {
          "name": "bitonicSortCPU",
          "kind": "function",
          "signature": "bitonicSortCPU(keys, values)",
          "summary": "CPU bitonic sort for small arrays or fallback"
        },
        {
          "name": "SortKeyType",
          "kind": "constant",
          "signature": "SortKeyType",
          "summary": "Sort key types"
        },
        {
          "name": "MAX_ELEMENTS",
          "kind": "constant",
          "signature": "MAX_ELEMENTS",
          "summary": "Maximum elements (must be power of 2)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/BufferLayouts",
      "path": "engine/reference/core/gpu/BufferLayouts.md",
      "source": "engine/core/gpu/BufferLayouts.js",
      "import": "/engine/core/gpu/BufferLayouts.js",
      "sourceHash": "19d45e826882b9b523cef0ac28fd49d61b1e67c692da168f52575560fb8f8d26",
      "summary": "Convert float to fixed-point integer",
      "exports": [
        {
          "name": "toFixed",
          "kind": "function",
          "signature": "toFixed(value, scale = FIXED_SCALE)",
          "summary": "Convert float to fixed-point integer"
        },
        {
          "name": "fromFixed",
          "kind": "function",
          "signature": "fromFixed(fixed, scale = FIXED_SCALE)",
          "summary": "Convert fixed-point integer back to float"
        },
        {
          "name": "alignTo",
          "kind": "function",
          "signature": "alignTo(size, align)",
          "summary": "Align a size/offset to the specified boundary"
        },
        {
          "name": "paddingFor",
          "kind": "function",
          "signature": "paddingFor(size, align)",
          "summary": "Calculate padding needed to reach alignment"
        },
        {
          "name": "isAligned",
          "kind": "function",
          "signature": "isAligned(size, align)",
          "summary": "Validate that a size meets alignment requirements"
        },
        {
          "name": "getParticleBufferSizes",
          "kind": "function",
          "signature": "getParticleBufferSizes(particleCount)",
          "summary": "Calculate buffer sizes for particle system"
        },
        {
          "name": "getGridBufferSizes",
          "kind": "function",
          "signature": "getGridBufferSizes(gridX, gridY, gridZ)",
          "summary": "Calculate grid buffer size"
        },
        {
          "name": "createAlignedBuffer",
          "kind": "function",
          "signature": "createAlignedBuffer(device, size, usage, label = '')",
          "summary": "Create a WebGPU buffer with proper alignment"
        },
        {
          "name": "createBufferWithData",
          "kind": "function",
          "signature": "createBufferWithData(device, data, usage, label = '')",
          "summary": "Create a mapped buffer for initial data upload"
        },
        {
          "name": "createUniformBuffer",
          "kind": "function",
          "signature": "createUniformBuffer(device, size, label = '')",
          "summary": "Create uniform buffer with proper padding"
        },
        {
          "name": "generateWGSLStruct",
          "kind": "function",
          "signature": "generateWGSLStruct(name, layout)",
          "summary": "Generate WGSL struct definition from layout"
        },
        {
          "name": "UNIFORM_ALIGN",
          "kind": "constant",
          "signature": "UNIFORM_ALIGN",
          "summary": "Uniform buffer alignment (must be 16 bytes)"
        },
        {
          "name": "STORAGE_ALIGN",
          "kind": "constant",
          "signature": "STORAGE_ALIGN",
          "summary": "Storage buffer preferred alignment (4 bytes min, 16 for performance)"
        },
        {
          "name": "INDIRECT_ALIGN",
          "kind": "constant",
          "signature": "INDIRECT_ALIGN",
          "summary": "Indirect dispatch buffer alignment"
        },
        {
          "name": "MIN_WORKGROUP",
          "kind": "constant",
          "signature": "MIN_WORKGROUP",
          "summary": "Minimum workgroup size for good occupancy"
        },
        {
          "name": "MAX_WORKGROUP",
          "kind": "constant",
          "signature": "MAX_WORKGROUP",
          "summary": "Maximum workgroup size (WebGPU limit)"
        },
        {
          "name": "FIXED_SCALE",
          "kind": "constant",
          "signature": "FIXED_SCALE",
          "summary": "WebGPU/WGSL has no native atomicAdd for f32. Solution: Scale floats to integers, use atomicAdd on i32, then descale. FIXED_SCALE = 10000 gives us: - 4 decimal places of precision - Range: ±214,748 (i32 max / 10000) - Good for velocities, forces, densities"
        },
        {
          "name": "FIXED_SCALE_INV",
          "kind": "constant",
          "signature": "FIXED_SCALE_INV",
          "summary": ""
        },
        {
          "name": "FIXED_SCALE_HI",
          "kind": "constant",
          "signature": "FIXED_SCALE_HI",
          "summary": "High precision scale for positions (6 decimal places) Range: ±2147 units - use only for local coordinates"
        },
        {
          "name": "FIXED_SCALE_HI_INV",
          "kind": "constant",
          "signature": "FIXED_SCALE_HI_INV",
          "summary": ""
        },
        {
          "name": "TYPE_SIZES",
          "kind": "constant",
          "signature": "TYPE_SIZES",
          "summary": ""
        },
        {
          "name": "PARTICLE_LAYOUT",
          "kind": "constant",
          "signature": "PARTICLE_LAYOUT",
          "summary": "MLS-MPM Particle SoA Layout Buffer 0: Position + Mass (vec4f) - 16 bytes [x, y, z, mass] Buffer 1: Velocity + Padding (vec4f) - 16 bytes [vx, vy, vz, pad] Buffer 2: Deformation Gradient (mat3x3f) - 48 bytes Row-major 3x3 matrix for plasticity Buffer 3: Affine Momentum (mat3x3f) - 48 bytes APIC affine velocity field Total per particle: 128 bytes"
        },
        {
          "name": "GRID_CELL_LAYOUT",
          "kind": "constant",
          "signature": "GRID_CELL_LAYOUT",
          "summary": "MLS-MPM Grid Cell Layout (Fixed-Point for Atomics) Each cell stores accumulated values from P2G scatter. Uses atomic<i32> for thread-safe accumulation. Momentum: vec3 as 3x atomic<i32> - 12 bytes [mom_x, mom_y, mom_z] (fixed-point scaled) Mass: atomic<i32> - 4 bytes (fixed-point scaled) Total per cell: 16 bytes (nicely aligned)"
        },
        {
          "name": "GRID_VELOCITY_LAYOUT",
          "kind": "constant",
          "signature": "GRID_VELOCITY_LAYOUT",
          "summary": "Grid velocity output (after grid update) Standard f32 for reading in G2P"
        },
        {
          "name": "FDTD_CELL_LAYOUT",
          "kind": "constant",
          "signature": "FDTD_CELL_LAYOUT",
          "summary": "FDTD Electromagnetic Field Cell Electric Displacement D: vec3f - 12 bytes (padded to 16) Magnetic Induction B: vec3f - 12 bytes (padded to 16) Permittivity ε: f32 - 4 bytes Permeability μ: f32 - 4 bytes Padding: 8 bytes Total: 48 bytes per cell"
        },
        {
          "name": "PHASOR_RAY_LAYOUT",
          "kind": "constant",
          "signature": "PHASOR_RAY_LAYOUT",
          "summary": "Phasor Ray Layout Position: vec3f - 12 bytes (padded to 16) Direction: vec3f - 12 bytes (padded to 16) Amplitude, Frequency, Phase, Pad: vec4f - 16 bytes Total: 48 bytes per ray"
        },
        {
          "name": "INDIRECT_DISPATCH_LAYOUT",
          "kind": "constant",
          "signature": "INDIRECT_DISPATCH_LAYOUT",
          "summary": "Indirect dispatch buffer layout"
        },
        {
          "name": "INDIRECT_DRAW_LAYOUT",
          "kind": "constant",
          "signature": "INDIRECT_DRAW_LAYOUT",
          "summary": "Indirect draw buffer layout (for instanced rendering)"
        },
        {
          "name": "DIRTY_CHUNK_LAYOUT",
          "kind": "constant",
          "signature": "DIRTY_CHUNK_LAYOUT",
          "summary": "Dirty chunk entry for conditional dispatch"
        },
        {
          "name": "DIRTY_FLAGS",
          "kind": "constant",
          "signature": "DIRTY_FLAGS",
          "summary": "Dirty flags bitmask"
        },
        {
          "name": "WGSL_FIXED_POINT",
          "kind": "constant",
          "signature": "WGSL_FIXED_POINT",
          "summary": ""
        },
        {
          "name": "WGSL_GRID_INDEX",
          "kind": "constant",
          "signature": "WGSL_GRID_INDEX",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/BufferPool",
      "path": "engine/reference/core/gpu/BufferPool.md",
      "source": "engine/core/gpu/BufferPool.js",
      "import": "/engine/core/gpu/BufferPool.js",
      "sourceHash": "3b924d0fe4710b368dba52283d8dfb4262c707a006862fd09d3357d4bcc9d6af",
      "summary": "GPU Buffer Pool - Zero-allocation buffer recycling Eliminates per-frame buffer creation overhead",
      "exports": [
        {
          "name": "BufferPool",
          "kind": "class",
          "signature": "class BufferPool",
          "summary": "GPU Buffer Pool - Zero-allocation buffer recycling Eliminates per-frame buffer creation overhead"
        },
        {
          "name": "StagingBufferRing",
          "kind": "class",
          "signature": "class StagingBufferRing",
          "summary": "Ring buffer for staging data - eliminates mapAsync stalls"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/ComputeBatchSystem",
      "path": "engine/reference/core/gpu/ComputeBatchSystem.md",
      "source": "engine/core/gpu/ComputeBatchSystem.js",
      "import": "/engine/core/gpu/ComputeBatchSystem.js",
      "sourceHash": "2c9937139965ef355ab79af3105d1a87f344c326ca6f3db8ad2d313a8e121d1a",
      "summary": "Compute Batch System - Parallel GPU compute with indirect dispatch Enables dynamic workgroup sizing and batched compute operations",
      "exports": [
        {
          "name": "ComputeBatchSystem",
          "kind": "class",
          "signature": "class ComputeBatchSystem",
          "summary": "Compute Batch System - Parallel GPU compute with indirect dispatch Enables dynamic workgroup sizing and batched compute operations"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/DynamicUniformBuffer",
      "path": "engine/reference/core/gpu/DynamicUniformBuffer.md",
      "source": "engine/core/gpu/DynamicUniformBuffer.js",
      "import": "/engine/core/gpu/DynamicUniformBuffer.js",
      "sourceHash": "d480a761024c26e307d25f66178bce9dbcd0df741c3299efe22ea85358dc4c7e",
      "summary": "DynamicUniformBuffer.js - Self-sizing uniform buffer from WGSL struct Pass in your WGSL struct definition (the same string embedded in your shader) and this class handles: - Parsing field names, types, and byte offsets (with correct WGSL alignment) - Creating the GPU buffer at exactly the right size - Typed CPU-side Float32Array + Uint32Array views - Named setters: buf.set('sunDir', [0.2, -1.0, 0.1]) - Bulk setter: buf.setAll({ viewProj: mat, cameraPos: [x,y,z] }) - Single upload() call to push to GPU Usage: const frame = new DynamicUniformBuffer(device, `struct FrameUniforms { viewProj: mat4x4<f32>, cameraPos: vec3<f32>, time: f32, sunDir: vec3<f32>, sunIntensity: f32, }`, 'MyFrame'); frame.set('viewProj', viewProjMatrix); frame.set('cameraPos', [x, y, z]); frame.set('sunDir', lightManager.sunDirection); frame.set('sunIntensity', 1.85); frame.upload(); // Or bulk: frame.setAll({ viewProj: mat, cameraPos: pos, sunDir: dir, sunIntensity: 1.0 }); frame.upload(); // Use in bind group: { binding: 0, resource: { buffer: frame.buffer } }",
      "exports": [
        {
          "name": "DynamicUniformBuffer",
          "kind": "class",
          "signature": "class DynamicUniformBuffer",
          "summary": ""
        },
        {
          "name": "parseLayout",
          "kind": "re-export",
          "signature": "parseLayout",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GPUPageAllocator",
      "path": "engine/reference/core/gpu/GPUPageAllocator.md",
      "source": "engine/core/gpu/GPUPageAllocator.js",
      "import": "/engine/core/gpu/GPUPageAllocator.js",
      "sourceHash": "697688a3edb04d19960967ad36cb0c2a82f5d7111c15006c69e4c16dc787c01a",
      "summary": "GPUPageAllocator - Virtual heap for GPU memory",
      "exports": [
        {
          "name": "GPUPageAllocator",
          "kind": "class",
          "signature": "class GPUPageAllocator",
          "summary": "GPUPageAllocator - Virtual heap for GPU memory"
        },
        {
          "name": "GPU_PAGE_WGSL",
          "kind": "constant",
          "signature": "GPU_PAGE_WGSL",
          "summary": "WGSL shader helper for page indirection"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GPUProfiler",
      "path": "engine/reference/core/gpu/GPUProfiler.md",
      "source": "engine/core/gpu/GPUProfiler.js",
      "import": "/engine/core/gpu/GPUProfiler.js",
      "sourceHash": "b4b6955c96ef747e74f3462006128a5d86c6a53c784f3cdc37dc1c10817ef25c",
      "summary": "GPUProfiler - Timestamp query-based GPU profiling",
      "exports": [
        {
          "name": "GPUProfiler",
          "kind": "class",
          "signature": "class GPUProfiler",
          "summary": "GPUProfiler - Timestamp query-based GPU profiling"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GPURandom",
      "path": "engine/reference/core/gpu/GPURandom.md",
      "source": "engine/core/gpu/GPURandom.js",
      "import": "/engine/core/gpu/GPURandom.js",
      "sourceHash": "908b478d2da89d7e897263eff68390603fef7960455ca2f7b080e2df4fe4fa51",
      "summary": "RNG state wrapper for sequential random number generation",
      "exports": [
        {
          "name": "PCGRandom",
          "kind": "class",
          "signature": "class PCGRandom",
          "summary": "RNG state wrapper for sequential random number generation"
        },
        {
          "name": "DeterministicRNG",
          "kind": "class",
          "signature": "class DeterministicRNG",
          "summary": "Deterministic RNG for multiplayer synchronization. All clients with the same seed produce identical sequences. Usage: - World generation: seed with worldSeed + chunkCoords - AI decisions: seed with entityId + gameTick - Combat rolls: seed with attackerId + defenderId + gameTick - Loot drops: seed with containerId + gameTick"
        },
        {
          "name": "pcgHash",
          "kind": "function",
          "signature": "pcgHash(v)",
          "summary": "PCG hash function - high quality, fast"
        },
        {
          "name": "hash2D",
          "kind": "function",
          "signature": "hash2D(x, y)",
          "summary": "Hash 2D coordinates"
        },
        {
          "name": "hash3D",
          "kind": "function",
          "signature": "hash3D(x, y, z)",
          "summary": "Hash 3D coordinates"
        },
        {
          "name": "initRngState",
          "kind": "function",
          "signature": "initRngState(pixelX, pixelY, frame, sampleIdx = 0)",
          "summary": "Initialize RNG state for deterministic per-pixel random"
        },
        {
          "name": "accumulationWeight",
          "kind": "function",
          "signature": "accumulationWeight(frameIndex)",
          "summary": "Calculate accumulation weight for progressive rendering"
        },
        {
          "name": "accumulateColor",
          "kind": "function",
          "signature": "accumulateColor(oldColor, newColor, frameIndex)",
          "summary": "Accumulate color over frames (progressive rendering)"
        },
        {
          "name": "accumulateEMA",
          "kind": "function",
          "signature": "accumulateEMA(oldColor, newColor, alpha)",
          "summary": "Exponential moving average accumulation (real-time, non-converging)"
        },
        {
          "name": "wavelengthToRGB",
          "kind": "function",
          "signature": "wavelengthToRGB(wavelength)",
          "summary": "Convert wavelength (nm) to RGB color"
        },
        {
          "name": "spectralHeatMap",
          "kind": "function",
          "signature": "spectralHeatMap(t)",
          "summary": "Map normalized value to spectral color (violet to red)"
        },
        {
          "name": "countToSpectral",
          "kind": "function",
          "signature": "countToSpectral(count, cutoff)",
          "summary": "Map count to spectral color with cutoff"
        },
        {
          "name": "blueNoiseOffset",
          "kind": "function",
          "signature": "blueNoiseOffset(sampleIndex)",
          "summary": "Generate blue noise sample offset for a pixel Uses R2 sequence (generalized golden ratio) for low-discrepancy sampling"
        },
        {
          "name": "r2Sequence3D",
          "kind": "function",
          "signature": "r2Sequence3D(sampleIndex)",
          "summary": "R2 sequence for 3D sampling (quasi-random, low discrepancy)"
        },
        {
          "name": "halton",
          "kind": "function",
          "signature": "halton(index, base)",
          "summary": "Halton sequence for quasi-random sampling"
        },
        {
          "name": "halton2D",
          "kind": "function",
          "signature": "halton2D(index)",
          "summary": "2D Halton sequence"
        },
        {
          "name": "halton3D",
          "kind": "function",
          "signature": "halton3D(index)",
          "summary": "3D Halton sequence"
        },
        {
          "name": "GPU_RANDOM_CORE_WGSL",
          "kind": "constant",
          "signature": "GPU_RANDOM_CORE_WGSL",
          "summary": "WGSL code for PCG hash and random number generation Include this in your compute shaders for high-quality randomness"
        },
        {
          "name": "GPU_RANDOM_WGSL",
          "kind": "constant",
          "signature": "GPU_RANDOM_WGSL",
          "summary": ""
        },
        {
          "name": "TAA_JITTER_WGSL",
          "kind": "constant",
          "signature": "TAA_JITTER_WGSL",
          "summary": "WGSL snippet for jittered sampling in TAA"
        },
        {
          "name": "STRATIFIED_SAMPLE_WGSL",
          "kind": "constant",
          "signature": "STRATIFIED_SAMPLE_WGSL",
          "summary": "WGSL snippet for stratified sampling"
        },
        {
          "name": "MULTIPLAYER_RANDOM_CORE_WGSL",
          "kind": "constant",
          "signature": "MULTIPLAYER_RANDOM_CORE_WGSL",
          "summary": "WGSL code for multiplayer-deterministic random Seeds with tick + entityId for synchronized random across clients"
        },
        {
          "name": "MULTIPLAYER_RANDOM_WGSL",
          "kind": "constant",
          "signature": "MULTIPLAYER_RANDOM_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GPUTimestampProfiler",
      "path": "engine/reference/core/gpu/GPUTimestampProfiler.md",
      "source": "engine/core/gpu/GPUTimestampProfiler.js",
      "import": "/engine/core/gpu/GPUTimestampProfiler.js",
      "sourceHash": "ed814a202c2d07bdb6e5a40e45d3a14f8e398e413884e353fcd28b6befa734a9",
      "summary": "GPUTimestampProfiler - Precise GPU timing using timestamp queries. Requires the optional `timestamp-query` feature.",
      "exports": [
        {
          "name": "GPUTimestampProfiler",
          "kind": "class",
          "signature": "class GPUTimestampProfiler",
          "summary": "GPUTimestampProfiler - Precise GPU timing using timestamp queries. Requires the optional `timestamp-query` feature."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuBuffer",
      "path": "engine/reference/core/gpu/GpuBuffer.md",
      "source": "engine/core/gpu/GpuBuffer.js",
      "import": "/engine/core/gpu/GpuBuffer.js",
      "sourceHash": "313dbae3912bc9248a58cf1933dff1319ecdf33984fb79b5dc38ceb6007cb7a6",
      "summary": "",
      "exports": [
        {
          "name": "createVertexBuffer",
          "kind": "function",
          "signature": "createVertexBuffer(device, data, options = {})",
          "summary": ""
        },
        {
          "name": "createIndexBuffer",
          "kind": "function",
          "signature": "createIndexBuffer(device, data, options = {})",
          "summary": ""
        },
        {
          "name": "createUniformBuffer",
          "kind": "function",
          "signature": "createUniformBuffer(device, byteSize, options = {})",
          "summary": ""
        },
        {
          "name": "createStorageBuffer",
          "kind": "function",
          "signature": "createStorageBuffer(device, byteSizeOrData, options = {})",
          "summary": ""
        },
        {
          "name": "updateBuffer",
          "kind": "function",
          "signature": "updateBuffer(device, buffer, data, offsetBytes = 0)",
          "summary": ""
        },
        {
          "name": "destroyBuffer",
          "kind": "function",
          "signature": "destroyBuffer(buffer)",
          "summary": ""
        },
        {
          "name": "destroyBuffers",
          "kind": "function",
          "signature": "destroyBuffers(buffers)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuCanvas",
      "path": "engine/reference/core/gpu/GpuCanvas.md",
      "source": "engine/core/gpu/GpuCanvas.js",
      "import": "/engine/core/gpu/GpuCanvas.js",
      "sourceHash": "8ff31bf7c930b973d9f9136e0b16d6b1ebd52cf885265bc11887aed3c4580167",
      "summary": "",
      "exports": [
        {
          "name": "createCanvasContext",
          "kind": "function",
          "signature": "createCanvasContext(gpuDevice, canvas, options = {})",
          "summary": ""
        },
        {
          "name": "resizeCanvasContext",
          "kind": "function",
          "signature": "resizeCanvasContext(canvasContext, width, height)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuDebug",
      "path": "engine/reference/core/gpu/GpuDebug.md",
      "source": "engine/core/gpu/GpuDebug.js",
      "import": "/engine/core/gpu/GpuDebug.js",
      "sourceHash": "6219fb215a6d3e55ed67a99fba415e58e35b716aa54b6a7556e97f3de1c7f38f",
      "summary": "",
      "exports": [
        {
          "name": "labelResource",
          "kind": "function",
          "signature": "labelResource(resource, label)",
          "summary": ""
        },
        {
          "name": "withErrorScope",
          "kind": "function",
          "signature": "async withErrorScope(device, fn)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuDevice",
      "path": "engine/reference/core/gpu/GpuDevice.md",
      "source": "engine/core/gpu/GpuDevice.js",
      "import": "/engine/core/gpu/GpuDevice.js",
      "sourceHash": "58706cba83c4f116e42392712fdf1b845afe48c00076aa7d7e56e67777a07d78",
      "summary": "Detect GPU platform/browser for per-browser workarounds. WebGPU browser support (Feb 2026): Chrome/Edge 113+ — Win (D3D12), Mac (Metal), ChromeOS (Vulkan) Chrome 121+      — Android 12+ Qualcomm/ARM (Vulkan) Chrome 144+      — Linux Intel Gen12+ (Vulkan), expanding to AMD/NVIDIA See: https://developer.chrome.com/blog/new-in-webgpu-144#webgpu_on_linux Firefox 141+     — Windows (wgpu/Rust backend) Firefox 145+     — macOS ARM64 (wgpu/Rust); Linux/Android expected 2026 Safari 26+       — macOS Tahoe, iOS 26, iPadOS 26, visionOS 26 (Metal) Samsung Internet 24+ — Android (Chromium/Dawn) GPU API backends per OS (Chromium/Dawn): Windows  → D3D12     (SharedTextureMemory D3D11 swap chain bug) macOS    → Metal Linux    → Vulkan    (rest of Chromium stays on OpenGL) Android  → Vulkan    (OpenGL ES compat mode via Chrome 135+ flag) ChromeOS → Vulkan See: https://caniuse.com/webgpu https://github.com/gpuweb/gpuweb/wiki/Implementation-Status",
      "exports": [
        {
          "name": "GpuDevice",
          "kind": "class",
          "signature": "class GpuDevice",
          "summary": ""
        },
        {
          "name": "detectGpuPlatform",
          "kind": "function",
          "signature": "detectGpuPlatform()",
          "summary": "Detect GPU platform/browser for per-browser workarounds. WebGPU browser support (Feb 2026): Chrome/Edge 113+ — Win (D3D12), Mac (Metal), ChromeOS (Vulkan) Chrome 121+      — Android 12+ Qualcomm/ARM (Vulkan) Chrome 144+      — Linux Intel Gen12+ (Vulkan), expanding to AMD/NVIDIA See: https://developer.chrome.com/blog/new-in-webgpu-144#webgpu_on_linux Firefox 141+     — Windows (wgpu/Rust backend) Firefox 145+     — macOS ARM64 (wgpu/Rust); Linux/Android expected 2026 Safari 26+       — macOS Tahoe, iOS 26, iPadOS 26, visionOS 26 (Metal) Samsung Internet 24+ — Android (Chromium/Dawn) GPU API backends per OS (Chromium/Dawn): Windows  → D3D12     (SharedTextureMemory D3D11 swap chain bug) macOS    → Metal Linux    → Vulkan    (rest of Chromium stays on OpenGL) Android  → Vulkan    (OpenGL ES compat mode via Chrome 135+ flag) ChromeOS → Vulkan See: https://caniuse.com/webgpu https://github.com/gpuweb/gpuweb/wiki/Implementation-Status"
        },
        {
          "name": "getGpuDevice",
          "kind": "function",
          "signature": "async getGpuDevice(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuFormats",
      "path": "engine/reference/core/gpu/GpuFormats.md",
      "source": "engine/core/gpu/GpuFormats.js",
      "import": "/engine/core/gpu/GpuFormats.js",
      "sourceHash": "fc67b2895d5b6cdad6007edf9a0835143a20b52d0dbe2cd82832013f3216dfd9",
      "summary": "",
      "exports": [
        {
          "name": "getPreferredCanvasFormat",
          "kind": "function",
          "signature": "getPreferredCanvasFormat()",
          "summary": ""
        },
        {
          "name": "isDepthFormatSupported",
          "kind": "function",
          "signature": "isDepthFormatSupported(device, format)",
          "summary": ""
        },
        {
          "name": "DEFAULT_COLOR_FORMAT",
          "kind": "constant",
          "signature": "DEFAULT_COLOR_FORMAT",
          "summary": ""
        },
        {
          "name": "DEFAULT_DEPTH_FORMAT",
          "kind": "constant",
          "signature": "DEFAULT_DEPTH_FORMAT",
          "summary": ""
        },
        {
          "name": "DEFAULT_SAMPLE_COUNT",
          "kind": "constant",
          "signature": "DEFAULT_SAMPLE_COUNT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuFrameBudgetBroker",
      "path": "engine/reference/core/gpu/GpuFrameBudgetBroker.md",
      "source": "engine/core/gpu/GpuFrameBudgetBroker.js",
      "import": "/engine/core/gpu/GpuFrameBudgetBroker.js",
      "sourceHash": "b3e18f18f68ffefed553ffaf3f6809406e35deb02f6ce7e3e6c21fd5424e8052",
      "summary": "Dependency-safe frame admission for long compute submissions. The broker never reorders command buffers. Callers await admission, then submit immediately to the one WebGPU queue, preserving queue dependencies. Render-critical work bypasses the budget; interactive/background compute is spread across animation frames so a long producer cannot monopolize the GPU.",
      "exports": [
        {
          "name": "GpuFrameBudgetBroker",
          "kind": "class",
          "signature": "class GpuFrameBudgetBroker",
          "summary": "Dependency-safe frame admission for long compute submissions. The broker never reorders command buffers. Callers await admission, then submit immediately to the one WebGPU queue, preserving queue dependencies. Render-critical work bypasses the budget; interactive/background compute is spread across animation frames so a long producer cannot monopolize the GPU."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuInit",
      "path": "engine/reference/core/gpu/GpuInit.md",
      "source": "engine/core/gpu/GpuInit.js",
      "import": "/engine/core/gpu/GpuInit.js",
      "sourceHash": "2efab494d84c54aba649885cc8076ade0061dd98bf0d887043ef3506633ea503",
      "summary": "Initialize WebGPU and populate GPU state object.",
      "exports": [
        {
          "name": "initGpuState",
          "kind": "function",
          "signature": "async initGpuState(options)",
          "summary": "Initialize WebGPU and populate GPU state object."
        },
        {
          "name": "isWebGpuSupported",
          "kind": "function",
          "signature": "isWebGpuSupported()",
          "summary": "Check if WebGPU is supported."
        },
        {
          "name": "waitForCanvasReady",
          "kind": "function",
          "signature": "waitForCanvasReady(canvas, minSize = 1)",
          "summary": "Wait for canvas to be properly sized before GPU init."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuMetrics",
      "path": "engine/reference/core/gpu/GpuMetrics.md",
      "source": "engine/core/gpu/GpuMetrics.js",
      "import": "/engine/core/gpu/GpuMetrics.js",
      "sourceHash": "a06165ec7123351f481a0c68351e819b6a607c2561b71c9b2ebe504d15d8fb8a",
      "summary": "",
      "exports": [
        {
          "name": "recordBufferCreate",
          "kind": "function",
          "signature": "recordBufferCreate(byteSize, usageKind = \"other\")",
          "summary": ""
        },
        {
          "name": "recordTextureCreate",
          "kind": "function",
          "signature": "recordTextureCreate(width, height)",
          "summary": ""
        },
        {
          "name": "getGpuMetrics",
          "kind": "function",
          "signature": "getGpuMetrics()",
          "summary": ""
        },
        {
          "name": "resetGpuMetrics",
          "kind": "function",
          "signature": "resetGpuMetrics()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuPassGraph",
      "path": "engine/reference/core/gpu/GpuPassGraph.md",
      "source": "engine/core/gpu/GpuPassGraph.js",
      "import": "/engine/core/gpu/GpuPassGraph.js",
      "sourceHash": "794b1ee7cf21dd1fc3aaa58d833ade8ef41c95382c29ac28ffd76fc27032933b",
      "summary": "",
      "exports": [
        {
          "name": "createGpuPassGraph",
          "kind": "function",
          "signature": "createGpuPassGraph()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuRecovery",
      "path": "engine/reference/core/gpu/GpuRecovery.md",
      "source": "engine/core/gpu/GpuRecovery.js",
      "import": "/engine/core/gpu/GpuRecovery.js",
      "sourceHash": "cf0d5b10219ff6800d5d2cca480980dc91de345f7aa9ba6f45de81cf34542c40",
      "summary": "GpuRecovery.js — Automatic GPU device loss recovery (cross-browser) Handles the full lifecycle of device loss and recovery: 1. Detects device loss (unexpected crash vs intentional destroy) 2. Attempts automatic recovery with exponential backoff 3. Reconfigures canvas context with the new device 4. Fires callbacks so the app can re-upload resources 5. Shows user notification if recovery fails Based on: https://toji.dev/webgpu-best-practices/device-loss.html Browser support: Chrome 113+ (Win/Mac/ChromeOS), 121+ (Android), 144+ (Linux) Firefox 141+ (Windows), 145+ (macOS ARM64) — wgpu/Rust backend Safari 26+ (macOS Tahoe, iOS 26, iPadOS 26, visionOS 26) — Metal backend Chrome crash limits: - 1st crash: adapter available immediately - 2nd crash within 2 min: adapter blocked for that page - 3rd crash within 2 min: all pages blocked - 3-6 crashes in 5 min: GPU process stops entirely Firefox/Safari: crash limits are different/unknown — recovery still works. device.lost reason values: Chrome: 'destroyed' (intentional) or 'unknown' (crash) Firefox/Safari: may use 'destroyed' or '' — we check for 'destroyed' only",
      "exports": [
        {
          "name": "GpuRecovery",
          "kind": "class",
          "signature": "class GpuRecovery",
          "summary": ""
        },
        {
          "name": "createRecoveryOverlay",
          "kind": "function",
          "signature": "createRecoveryOverlay(container)",
          "summary": "Create a user-facing recovery notification overlay. Shows status during recovery and a \"please refresh\" message on failure."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuSampler",
      "path": "engine/reference/core/gpu/GpuSampler.md",
      "source": "engine/core/gpu/GpuSampler.js",
      "import": "/engine/core/gpu/GpuSampler.js",
      "sourceHash": "73605f0422ab8d9a75d45c40791c1aca7d3eab12d645f02069fd7016c94ca907",
      "summary": "",
      "exports": [
        {
          "name": "getDefaultSampler",
          "kind": "function",
          "signature": "getDefaultSampler(device)",
          "summary": ""
        },
        {
          "name": "getPointSampler",
          "kind": "function",
          "signature": "getPointSampler(device)",
          "summary": ""
        },
        {
          "name": "getLinearSampler",
          "kind": "function",
          "signature": "getLinearSampler(device)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuTexture",
      "path": "engine/reference/core/gpu/GpuTexture.md",
      "source": "engine/core/gpu/GpuTexture.js",
      "import": "/engine/core/gpu/GpuTexture.js",
      "sourceHash": "b5c1eb22113053159eedb812cc990a3263eaf1403e8f72006329b5daba18fbda",
      "summary": "",
      "exports": [
        {
          "name": "createColorTexture",
          "kind": "function",
          "signature": "createColorTexture(device, width, height, options = {})",
          "summary": ""
        },
        {
          "name": "createSampledTexture2D",
          "kind": "function",
          "signature": "createSampledTexture2D(device, width, height, options = {})",
          "summary": ""
        },
        {
          "name": "createDepthTexture",
          "kind": "function",
          "signature": "createDepthTexture(device, width, height, options = {})",
          "summary": ""
        },
        {
          "name": "resizeAttachmentTexture",
          "kind": "function",
          "signature": "resizeAttachmentTexture(device, handle, width, height)",
          "summary": ""
        },
        {
          "name": "destroyAttachmentHandle",
          "kind": "function",
          "signature": "destroyAttachmentHandle(handle)",
          "summary": ""
        },
        {
          "name": "destroyAttachmentHandles",
          "kind": "function",
          "signature": "destroyAttachmentHandles(handles)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuTextureLoader",
      "path": "engine/reference/core/gpu/GpuTextureLoader.md",
      "source": "engine/core/gpu/GpuTextureLoader.js",
      "import": "/engine/core/gpu/GpuTextureLoader.js",
      "sourceHash": "a591288bd19dfb6b5fada786e15b5bdb41123c6ebe85c2ecf881a69654f1523d",
      "summary": "",
      "exports": [
        {
          "name": "loadTextureFromUrl",
          "kind": "function",
          "signature": "async loadTextureFromUrl(device, url, options = {})",
          "summary": ""
        },
        {
          "name": "createTextureFromKtx2Data",
          "kind": "function",
          "signature": "createTextureFromKtx2Data(device, data, options = {})",
          "summary": ""
        },
        {
          "name": "createTextureFromKtx2DataWithDecoder",
          "kind": "function",
          "signature": "async createTextureFromKtx2DataWithDecoder(device, data, options = {})",
          "summary": ""
        },
        {
          "name": "loadKtx2TextureFromUrl",
          "kind": "function",
          "signature": "async loadKtx2TextureFromUrl(device, url, options = {})",
          "summary": ""
        },
        {
          "name": "inspectKtx2TextureData",
          "kind": "function",
          "signature": "inspectKtx2TextureData(data, options = {})",
          "summary": ""
        },
        {
          "name": "inspectKtx2TextureFromUrl",
          "kind": "function",
          "signature": "async inspectKtx2TextureFromUrl(url, options = {})",
          "summary": ""
        },
        {
          "name": "createTextureFromImage",
          "kind": "function",
          "signature": "async createTextureFromImage(device, image, options = {})",
          "summary": ""
        },
        {
          "name": "createTextureFromImageBitmap",
          "kind": "function",
          "signature": "async createTextureFromImageBitmap(device, bitmap, options = {})",
          "summary": ""
        },
        {
          "name": "isKtx2Container",
          "kind": "re-export",
          "signature": "isKtx2Container",
          "summary": ""
        },
        {
          "name": "ktx2DirectUploadPlan",
          "kind": "re-export",
          "signature": "ktx2DirectUploadPlan",
          "summary": ""
        },
        {
          "name": "ktx2PayloadPlan",
          "kind": "re-export",
          "signature": "ktx2PayloadPlan",
          "summary": ""
        },
        {
          "name": "parseKtx2Container",
          "kind": "re-export",
          "signature": "parseKtx2Container",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/GpuTransfer",
      "path": "engine/reference/core/gpu/GpuTransfer.md",
      "source": "engine/core/gpu/GpuTransfer.js",
      "import": "/engine/core/gpu/GpuTransfer.js",
      "sourceHash": "8ce32513131cf737809434d1537f33706dd6e71c37964f49ab2e72ba24a22dac",
      "summary": "Upload data to a GPU buffer via a transient staging buffer. Useful for large or streaming uploads when you want explicit control over copy operations rather than relying solely on queue.writeBuffer.",
      "exports": [
        {
          "name": "uploadBufferWithStaging",
          "kind": "function",
          "signature": "async uploadBufferWithStaging(device, dstBuffer, data, dstOffsetBytes = 0, label = \"gpu_staging_upload\")",
          "summary": "Upload data to a GPU buffer via a transient staging buffer. Useful for large or streaming uploads when you want explicit control over copy operations rather than relying solely on queue.writeBuffer."
        },
        {
          "name": "readBufferToUint8Array",
          "kind": "function",
          "signature": "async readBufferToUint8Array(device, srcBuffer, byteOffset, byteLength, label = \"gpu_readback_buffer\")",
          "summary": "Read back the contents of a GPU buffer into a Uint8Array. Intended for debugging and tooling, not per-frame critical paths."
        },
        {
          "name": "readTexture2D",
          "kind": "function",
          "signature": "async readTexture2D(device, srcTexture, width, height, { bytesPerPixel, mipLevel = 0, label = \"gpu_readback_texture2d\", })",
          "summary": "Read a 2D texture into a buffer for debugging. Caller must provide bytesPerPixel for the chosen format. Returns an object with the raw data and layout information."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/IndirectDispatchGen",
      "path": "engine/reference/core/gpu/IndirectDispatchGen.md",
      "source": "engine/core/gpu/IndirectDispatchGen.js",
      "import": "/engine/core/gpu/IndirectDispatchGen.js",
      "sourceHash": "48b677f2436385b4b5a8d9ed900757b5367e51c7a6aa54a3763dac0ca29131ce",
      "summary": "IndirectDispatchGen.js - GPU-Driven Indirect Dispatch Generation Problem: CPU deciding which chunks to process creates a bottleneck. The GPU knows best which chunks need work (from dirty flags, visibility, etc.) but standard dispatch requires CPU to specify workgroup counts. Solution: GPU-side stream compaction + indirect dispatch. 1. GPU scans all chunks, compacts active ones into a list 2. GPU writes workgroup counts to indirect buffer 3. CPU issues dispatchWorkgroupsIndirect() - no readback needed Key Technique: Hierarchical atomics for efficient compaction - Each workgroup uses local atomic to count active items - Leader thread reserves global block via global atomic - Threads scatter their items to reserved slots Performance: Eliminates CPU-GPU sync for conditional dispatch",
      "exports": [
        {
          "name": "IndirectDispatchGen",
          "kind": "class",
          "signature": "class IndirectDispatchGen",
          "summary": ""
        },
        {
          "name": "MultiPassDispatchGen",
          "kind": "class",
          "signature": "class MultiPassDispatchGen",
          "summary": "Generates multiple indirect dispatches for different job types (e.g., separate geometry, lighting, physics passes)"
        },
        {
          "name": "GENERATOR_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "GENERATOR_WORKGROUP_SIZE",
          "summary": "Workgroup size for generator shader"
        },
        {
          "name": "MAX_JOBS",
          "kind": "constant",
          "signature": "MAX_JOBS",
          "summary": "Maximum jobs that can be generated per dispatch"
        },
        {
          "name": "INDIRECT_BUFFER_SIZE",
          "kind": "constant",
          "signature": "INDIRECT_BUFFER_SIZE",
          "summary": "Indirect dispatch buffer size (3 × u32 = 12 bytes)"
        },
        {
          "name": "DISPATCH_GEN_SHADER",
          "kind": "re-export",
          "signature": "DISPATCH_GEN_SHADER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/Ktx2Container",
      "path": "engine/reference/core/gpu/Ktx2Container.md",
      "source": "engine/core/gpu/Ktx2Container.js",
      "import": "/engine/core/gpu/Ktx2Container.js",
      "sourceHash": "ae6fa50bb93d4dc7e1ddc397664a4ed30351be82f21c81a1819ad34a25cd7014",
      "summary": "",
      "exports": [
        {
          "name": "ktx2VkFormatInfo",
          "kind": "function",
          "signature": "ktx2VkFormatInfo(vkFormat = 0, supportedFeatures = null)",
          "summary": ""
        },
        {
          "name": "isKtx2Container",
          "kind": "function",
          "signature": "isKtx2Container(data)",
          "summary": ""
        },
        {
          "name": "parseKtx2Container",
          "kind": "function",
          "signature": "parseKtx2Container(data, options = {})",
          "summary": ""
        },
        {
          "name": "ktx2PayloadPlan",
          "kind": "function",
          "signature": "ktx2PayloadPlan(containerOrData, options = {})",
          "summary": ""
        },
        {
          "name": "getKtx2SectionPayloadView",
          "kind": "function",
          "signature": "getKtx2SectionPayloadView(data, section = 'sgd')",
          "summary": ""
        },
        {
          "name": "createKtx2PayloadDecodeRequest",
          "kind": "function",
          "signature": "createKtx2PayloadDecodeRequest(data, options = {})",
          "summary": ""
        },
        {
          "name": "ktx2DirectUploadPlan",
          "kind": "function",
          "signature": "ktx2DirectUploadPlan(containerOrData, options = {})",
          "summary": ""
        },
        {
          "name": "getKtx2LevelPayloadView",
          "kind": "function",
          "signature": "getKtx2LevelPayloadView(data, level = 0)",
          "summary": ""
        },
        {
          "name": "KTX2_IDENTIFIER",
          "kind": "constant",
          "signature": "KTX2_IDENTIFIER",
          "summary": ""
        },
        {
          "name": "KTX2_IDENTIFIER_BYTE_LENGTH",
          "kind": "constant",
          "signature": "KTX2_IDENTIFIER_BYTE_LENGTH",
          "summary": ""
        },
        {
          "name": "KTX2_HEADER_BYTE_LENGTH",
          "kind": "constant",
          "signature": "KTX2_HEADER_BYTE_LENGTH",
          "summary": ""
        },
        {
          "name": "KTX2_LEVEL_INDEX_ENTRY_BYTE_LENGTH",
          "kind": "constant",
          "signature": "KTX2_LEVEL_INDEX_ENTRY_BYTE_LENGTH",
          "summary": ""
        },
        {
          "name": "KTX2_VK_FORMAT_TO_WEBGPU_FORMAT",
          "kind": "constant",
          "signature": "KTX2_VK_FORMAT_TO_WEBGPU_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/MappedBufferWriter",
      "path": "engine/reference/core/gpu/MappedBufferWriter.md",
      "source": "engine/core/gpu/MappedBufferWriter.js",
      "import": "/engine/core/gpu/MappedBufferWriter.js",
      "sourceHash": "c21a3ede69827ffa5b424d221d3855a615c0e97e50b2402ee9bff535c1eb7142",
      "summary": "Mapped Buffer Writer - Eliminates double-copy overhead from writeBuffer() Based on WebGPU optimization best practices from webgpufundamentals.org Saves one CPU→GPU copy per upload (10-20% faster uploads)",
      "exports": [
        {
          "name": "MappedBufferWriter",
          "kind": "class",
          "signature": "class MappedBufferWriter",
          "summary": "Mapped Buffer Writer - Eliminates double-copy overhead from writeBuffer() Based on WebGPU optimization best practices from webgpufundamentals.org Saves one CPU→GPU copy per upload (10-20% faster uploads)"
        },
        {
          "name": "UniformBufferWriter",
          "kind": "class",
          "signature": "class UniformBufferWriter extends MappedBufferWriter",
          "summary": "Uniform Buffer Writer - Optimized for frequent uniform updates"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/OptimizationIntegration",
      "path": "engine/reference/core/gpu/OptimizationIntegration.md",
      "source": "engine/core/gpu/OptimizationIntegration.js",
      "import": "/engine/core/gpu/OptimizationIntegration.js",
      "sourceHash": "5d9b1b3e9fd40eabb6fe4d27ffc729cf7b5493267ffdf481cc0ab586088ef951",
      "summary": "Enhanced GPU Device wrapper with all optimizations",
      "exports": [
        {
          "name": "OptimizedGPUDevice",
          "kind": "class",
          "signature": "class OptimizedGPUDevice",
          "summary": "Enhanced GPU Device wrapper with all optimizations"
        },
        {
          "name": "OptimizationHelpers",
          "kind": "constant",
          "signature": "OptimizationHelpers",
          "summary": "Quick optimization helper functions"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/PipelineCache",
      "path": "engine/reference/core/gpu/PipelineCache.md",
      "source": "engine/core/gpu/PipelineCache.js",
      "import": "/engine/core/gpu/PipelineCache.js",
      "sourceHash": "d1ddc20b76a3057be56c416d02faa049c33e9e9acdc3550fcc0cabd06900b7e8",
      "summary": "Next-gen pipeline cache with IndexedDB persistence and background compilation Eliminates ALL pipeline creation stalls",
      "exports": [
        {
          "name": "PipelineCache",
          "kind": "class",
          "signature": "class PipelineCache",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/ProgressiveWorkBudget",
      "path": "engine/reference/core/gpu/ProgressiveWorkBudget.md",
      "source": "engine/core/gpu/ProgressiveWorkBudget.js",
      "import": "/engine/core/gpu/ProgressiveWorkBudget.js",
      "sourceHash": "c7dd8b379b6e4617f44e4df0a0c654da3fa75686a6e6e54c29297c9d206167d7",
      "summary": "Plans optional refinement from measured spare GPU time. It never delays the host frame, submits work, or changes correctness-critical work.",
      "exports": [
        {
          "name": "planProgressiveWorkBudget",
          "kind": "function",
          "signature": "planProgressiveWorkBudget(options = {})",
          "summary": "Plans optional refinement from measured spare GPU time. It never delays the host frame, submits work, or changes correctness-critical work."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/ShaderCompilationQueue",
      "path": "engine/reference/core/gpu/ShaderCompilationQueue.md",
      "source": "engine/core/gpu/ShaderCompilationQueue.js",
      "import": "/engine/core/gpu/ShaderCompilationQueue.js",
      "sourceHash": "5c8069a91d1a4d3d6d6344d42cf7258c540bb7c9cde10c16c96148d389d50167",
      "summary": "Async Shader Compilation Queue - Priority-based background compilation Eliminates frame stalls from shader compilation",
      "exports": [
        {
          "name": "ShaderCompilationQueue",
          "kind": "class",
          "signature": "class ShaderCompilationQueue",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/SimulationProfiler",
      "path": "engine/reference/core/gpu/SimulationProfiler.md",
      "source": "engine/core/gpu/SimulationProfiler.js",
      "import": "/engine/core/gpu/SimulationProfiler.js",
      "sourceHash": "dcbf2fcf7d0b8a70114ebe3eae40251f47347215d0473c94d2d38bf9c56982c3",
      "summary": "SimulationProfiler.js - GPU Timestamp Profiling for Simulation Systems Provides detailed GPU timing information for: - Voxel collision passes - Rope physics passes - Rope rendering passes - Particle simulation passes Uses WebGPU timestamp queries for accurate GPU-side timing.",
      "exports": [
        {
          "name": "SimulationProfiler",
          "kind": "class",
          "signature": "class SimulationProfiler",
          "summary": "SimulationProfiler.js - GPU Timestamp Profiling for Simulation Systems Provides detailed GPU timing information for: - Voxel collision passes - Rope physics passes - Rope rendering passes - Particle simulation passes Uses WebGPU timestamp queries for accurate GPU-side timing."
        },
        {
          "name": "profiledComputePass",
          "kind": "function",
          "signature": "profiledComputePass(profiler, encoder, name, fn)",
          "summary": "Profiled compute pass helper Wraps a compute pass with automatic start/end timestamps"
        },
        {
          "name": "createSimulationProfiler",
          "kind": "function",
          "signature": "createSimulationProfiler(device, options = {})",
          "summary": "Create a simulation profiler instance"
        },
        {
          "name": "ProfileSections",
          "kind": "constant",
          "signature": "ProfileSections",
          "summary": "Pre-defined section names for consistency"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/SparsePageRuntime",
      "path": "engine/reference/core/gpu/SparsePageRuntime.md",
      "source": "engine/core/gpu/SparsePageRuntime.js",
      "import": "/engine/core/gpu/SparsePageRuntime.js",
      "sourceHash": "df9dc014eb7805029e9fe763f82a50599b263b8899bf77d228d3c03222e5e5ed",
      "summary": "Device-independent, revisioned sparse residency contract shared by field, voxel-derived, and texture pages. A commit is atomic: validation, fallback closure, slot allocation, and eviction all finish before publication.",
      "exports": [
        {
          "name": "SparsePageRuntime",
          "kind": "class",
          "signature": "class SparsePageRuntime",
          "summary": "Device-independent, revisioned sparse residency contract shared by field, voxel-derived, and texture pages. A commit is atomic: validation, fallback closure, slot allocation, and eviction all finish before publication."
        },
        {
          "name": "createSparsePageRuntime",
          "kind": "function",
          "signature": "createSparsePageRuntime(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/TextureAtlasManager",
      "path": "engine/reference/core/gpu/TextureAtlasManager.md",
      "source": "engine/core/gpu/TextureAtlasManager.js",
      "import": "/engine/core/gpu/TextureAtlasManager.js",
      "sourceHash": "96c8cf8e4a119a3bd0b5a8bab49b193a1705c07f4eda90bf0e345a51f6cbaedd",
      "summary": "Texture Atlas Manager - Dynamic texture packing for GPU memory optimization Reduces texture bindings and improves cache coherency",
      "exports": [
        {
          "name": "TextureAtlasManager",
          "kind": "class",
          "signature": "class TextureAtlasManager",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUBindGroupManager",
      "path": "engine/reference/core/gpu/VGPUBindGroupManager.md",
      "source": "engine/core/gpu/VGPUBindGroupManager.js",
      "import": "/engine/core/gpu/VGPUBindGroupManager.js",
      "sourceHash": "c55720c4fc050d332925223f8b146a6a2c2e8039d38d8d2b7fad6f149c139c80",
      "summary": "Automatic Bind Group Manager - Material system that auto-generates bind groups from shader",
      "exports": [
        {
          "name": "VGPUBindGroupManager",
          "kind": "class",
          "signature": "class VGPUBindGroupManager",
          "summary": ""
        },
        {
          "name": "Material",
          "kind": "re-export",
          "signature": "Material",
          "summary": ""
        },
        {
          "name": "MaterialInstance",
          "kind": "re-export",
          "signature": "MaterialInstance",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUBindless",
      "path": "engine/reference/core/gpu/VGPUBindless.md",
      "source": "engine/core/gpu/VGPUBindless.js",
      "import": "/engine/core/gpu/VGPUBindless.js",
      "sourceHash": "1ae773b0280c56738d933803ba45a4cd259f4a15818a440bbadb2bb06898246c",
      "summary": "Bindless Preparation - Storage buffer texture arrays for bindless-style rendering",
      "exports": [
        {
          "name": "VGPUBindless",
          "kind": "class",
          "signature": "class VGPUBindless",
          "summary": "Bindless Preparation - Storage buffer texture arrays for bindless-style rendering"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUComputeUtils",
      "path": "engine/reference/core/gpu/VGPUComputeUtils.md",
      "source": "engine/core/gpu/VGPUComputeUtils.js",
      "import": "/engine/core/gpu/VGPUComputeUtils.js",
      "sourceHash": "c6e51af81a42a61d9f4a35249d8760e5c55f35ef3ac3d7d53c7ee6857c7358be",
      "summary": "",
      "exports": [
        {
          "name": "VGPUComputeUtils",
          "kind": "class",
          "signature": "class VGPUComputeUtils",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUDebugDraw",
      "path": "engine/reference/core/gpu/VGPUDebugDraw.md",
      "source": "engine/core/gpu/VGPUDebugDraw.js",
      "import": "/engine/core/gpu/VGPUDebugDraw.js",
      "sourceHash": "11dd7c16baf945e8e03e015abc08d37f7e76e70a3c0448cd5f5ebbaa2435460e",
      "summary": "Debug Draw System with dynamic buffer sizing",
      "exports": [
        {
          "name": "VGPUDebugDraw",
          "kind": "class",
          "signature": "class VGPUDebugDraw",
          "summary": "Debug Draw System with dynamic buffer sizing"
        },
        {
          "name": "DebugDrawScope",
          "kind": "class",
          "signature": "class DebugDrawScope",
          "summary": "Scoped debug drawing (auto-clears when scope ends)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUHiZCulling",
      "path": "engine/reference/core/gpu/VGPUHiZCulling.md",
      "source": "engine/core/gpu/VGPUHiZCulling.js",
      "import": "/engine/core/gpu/VGPUHiZCulling.js",
      "sourceHash": "78300f44cf651ac13925a48bd6a060e4937ed09c4dc276c7930aaace1f32309e",
      "summary": "Hierarchical-Z Occlusion Culling System",
      "exports": [
        {
          "name": "VGPUHiZCulling",
          "kind": "class",
          "signature": "class VGPUHiZCulling",
          "summary": "Hierarchical-Z Occlusion Culling System"
        },
        {
          "name": "BoundingBoxBuilder",
          "kind": "class",
          "signature": "class BoundingBoxBuilder",
          "summary": "Helper to build bounding box data for HiZ culling Grows dynamically - no fixed maximum."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUIndirectRenderer",
      "path": "engine/reference/core/gpu/VGPUIndirectRenderer.md",
      "source": "engine/core/gpu/VGPUIndirectRenderer.js",
      "import": "/engine/core/gpu/VGPUIndirectRenderer.js",
      "sourceHash": "5dd5842eca6133aeb6ae3aef45349e4aba0d2b61f07ab2d1f3bd8e2ff0de254d",
      "summary": "GPU-driven indirect renderer with dynamic buffer sizing",
      "exports": [
        {
          "name": "VGPUIndirectRenderer",
          "kind": "class",
          "signature": "class VGPUIndirectRenderer",
          "summary": "GPU-driven indirect renderer with dynamic buffer sizing"
        },
        {
          "name": "IndirectInstanceBuilder",
          "kind": "class",
          "signature": "class IndirectInstanceBuilder",
          "summary": "Helper to build instance data for indirect rendering Grows dynamically - no fixed maximum."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUMemoryTracker",
      "path": "engine/reference/core/gpu/VGPUMemoryTracker.md",
      "source": "engine/core/gpu/VGPUMemoryTracker.js",
      "import": "/engine/core/gpu/VGPUMemoryTracker.js",
      "sourceHash": "cc75b6e20f25b6f2e45b43adf1a436ce7134576802e8bfdc2174c292f6e4f4ac",
      "summary": "Memory Budget Tracker - Track GPU memory usage, warn on budget exceeded Also provides GPU memory probing to detect available VRAM",
      "exports": [
        {
          "name": "VGPUMemoryTracker",
          "kind": "class",
          "signature": "class VGPUMemoryTracker",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUMultiQueue",
      "path": "engine/reference/core/gpu/VGPUMultiQueue.md",
      "source": "engine/core/gpu/VGPUMultiQueue.js",
      "import": "/engine/core/gpu/VGPUMultiQueue.js",
      "sourceHash": "1236e07d34f92cf2972a5fb1173dbb86368bed794c58d20f88728eee6ddd0b9d",
      "summary": "Multi-Queue Abstraction - Separate graphics/compute/transfer queues when available",
      "exports": [
        {
          "name": "VGPUMultiQueue",
          "kind": "class",
          "signature": "class VGPUMultiQueue",
          "summary": "Multi-Queue Abstraction - Separate graphics/compute/transfer queues when available"
        },
        {
          "name": "Fence",
          "kind": "re-export",
          "signature": "Fence",
          "summary": ""
        },
        {
          "name": "VirtualQueue",
          "kind": "re-export",
          "signature": "VirtualQueue",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUQualityScaler",
      "path": "engine/reference/core/gpu/VGPUQualityScaler.md",
      "source": "engine/core/gpu/VGPUQualityScaler.js",
      "import": "/engine/core/gpu/VGPUQualityScaler.js",
      "sourceHash": "bd8cf911359fb1ca7ba1862ab3935b1eb2b44b2db6b62859328821ece190d4d9",
      "summary": "Quality Scaler - Dynamic resolution/quality based on frame time budget",
      "exports": [
        {
          "name": "VGPUQualityScaler",
          "kind": "class",
          "signature": "class VGPUQualityScaler",
          "summary": "Quality Scaler - Dynamic resolution/quality based on frame time budget"
        },
        {
          "name": "VGPUDynamicViewport",
          "kind": "class",
          "signature": "class VGPUDynamicViewport",
          "summary": "Viewport manager for dynamic resolution"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUReadbackQueue",
      "path": "engine/reference/core/gpu/VGPUReadbackQueue.md",
      "source": "engine/core/gpu/VGPUReadbackQueue.js",
      "import": "/engine/core/gpu/VGPUReadbackQueue.js",
      "sourceHash": "aab2a2bab5fd119a18b0a0280c3717b083b9f251bdc53fc52e03544f7a55b3d9",
      "summary": "GPU Readback Queue - Async buffer/texture reads with callbacks Batches staging buffers for efficient GPU→CPU data transfer",
      "exports": [
        {
          "name": "VGPUReadbackQueue",
          "kind": "class",
          "signature": "class VGPUReadbackQueue",
          "summary": "GPU Readback Queue - Async buffer/texture reads with callbacks Batches staging buffers for efficient GPU→CPU data transfer"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPURenderGraph",
      "path": "engine/reference/core/gpu/VGPURenderGraph.md",
      "source": "engine/core/gpu/VGPURenderGraph.js",
      "import": "/engine/core/gpu/VGPURenderGraph.js",
      "sourceHash": "ac3ff76ee3d753c2cc9776168e878aa56c3cc16d251ad1a065bd33b24c1dd705",
      "summary": "Main Render Graph class",
      "exports": [
        {
          "name": "VGPURenderGraph",
          "kind": "class",
          "signature": "class VGPURenderGraph",
          "summary": "Main Render Graph class"
        },
        {
          "name": "RenderGraphBuilder",
          "kind": "class",
          "signature": "class RenderGraphBuilder",
          "summary": "Builder pattern for ergonomic graph construction"
        },
        {
          "name": "ResourceType",
          "kind": "re-export",
          "signature": "ResourceType",
          "summary": ""
        },
        {
          "name": "ResourceUsage",
          "kind": "re-export",
          "signature": "ResourceUsage",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPURenderStats",
      "path": "engine/reference/core/gpu/VGPURenderStats.md",
      "source": "engine/core/gpu/VGPURenderStats.js",
      "import": "/engine/core/gpu/VGPURenderStats.js",
      "sourceHash": "73e39092b9cecc5946d7549933058cea8449e1da5898f9319d1662d9950daf1a",
      "summary": "Render Statistics - Draw call counts, triangle counts, state changes per frame",
      "exports": [
        {
          "name": "VGPURenderStats",
          "kind": "class",
          "signature": "class VGPURenderStats",
          "summary": "Render Statistics - Draw call counts, triangle counts, state changes per frame"
        },
        {
          "name": "VGPUStatsOverlay",
          "kind": "class",
          "signature": "class VGPUStatsOverlay",
          "summary": "Stats overlay for debug display"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUResourceBarriers",
      "path": "engine/reference/core/gpu/VGPUResourceBarriers.md",
      "source": "engine/core/gpu/VGPUResourceBarriers.js",
      "import": "/engine/core/gpu/VGPUResourceBarriers.js",
      "sourceHash": "006c740913fe633194877c94a762081f97a0e0c8404e4262fa8a848ab2dd734c",
      "summary": "Resource Barriers Helper - Explicit sync points for complex resource dependencies",
      "exports": [
        {
          "name": "VGPUResourceBarriers",
          "kind": "class",
          "signature": "class VGPUResourceBarriers",
          "summary": "Resource Barriers Helper - Explicit sync points for complex resource dependencies"
        },
        {
          "name": "BarrierScope",
          "kind": "re-export",
          "signature": "BarrierScope",
          "summary": ""
        },
        {
          "name": "DependencyGraph",
          "kind": "re-export",
          "signature": "DependencyGraph",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUShaderReflection",
      "path": "engine/reference/core/gpu/VGPUShaderReflection.md",
      "source": "engine/core/gpu/VGPUShaderReflection.js",
      "import": "/engine/core/gpu/VGPUShaderReflection.js",
      "sourceHash": "ef8a1d5393c2c53eb3a1fd184712797f531c9fdaed094e9f4dd9c49609498f60",
      "summary": "Shader Reflection - Parse WGSL to extract bindings, uniforms, entry points",
      "exports": [
        {
          "name": "VGPUShaderReflection",
          "kind": "class",
          "signature": "class VGPUShaderReflection",
          "summary": ""
        },
        {
          "name": "getShaderReflection",
          "kind": "function",
          "signature": "getShaderReflection()",
          "summary": ""
        },
        {
          "name": "getStructBufferSize",
          "kind": "function",
          "signature": "getStructBufferSize(shaderSource, structName)",
          "summary": "Get the required buffer size for a uniform struct in a shader. Automatically calculates correct WGSL alignment."
        },
        {
          "name": "getUniformBufferSizes",
          "kind": "function",
          "signature": "getUniformBufferSizes(shaderSource)",
          "summary": "Get buffer sizes for all uniform bindings in a shader."
        },
        {
          "name": "createAutoSizedUniformBuffer",
          "kind": "function",
          "signature": "createAutoSizedUniformBuffer(device, shaderSource, structName, options = {})",
          "summary": "Create a uniform buffer with automatically calculated size from shader struct."
        },
        {
          "name": "validateBufferSize",
          "kind": "function",
          "signature": "validateBufferSize(buffer, shaderSource, structName)",
          "summary": "Validate that a buffer meets the minimum size requirement for a shader struct."
        },
        {
          "name": "debugShaderStructs",
          "kind": "function",
          "signature": "debugShaderStructs(shaderSource)",
          "summary": "Get all struct sizes in a shader for debugging."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUStreamingManager",
      "path": "engine/reference/core/gpu/VGPUStreamingManager.md",
      "source": "engine/core/gpu/VGPUStreamingManager.js",
      "import": "/engine/core/gpu/VGPUStreamingManager.js",
      "sourceHash": "5cbbe5d645480ab8375408193b2ec698d982673d3c2cdd73435a3d093c7fe32a",
      "summary": "VGPUStreamingManager - Progressive resource loading and streaming Features: - Priority-based loading queue with distance/importance weighting - Async texture streaming with mip-level progression - Mesh LOD streaming - Memory budget management - Placeholder resources while loading - Automatic eviction of unused resources Usage: const streaming = new VGPUStreamingManager(vgpu); await streaming.init({ memoryBudget: 512 * 1024 * 1024 }); const textureHandle = streaming.requestTexture('path/to/texture.png', { priority: 1.0 }); const texture = streaming.getTexture(textureHandle); // Returns placeholder until loaded",
      "exports": [
        {
          "name": "VGPUStreamingManager",
          "kind": "class",
          "signature": "class VGPUStreamingManager",
          "summary": "Main Streaming Manager"
        },
        {
          "name": "ResourceState",
          "kind": "re-export",
          "signature": "ResourceState",
          "summary": ""
        },
        {
          "name": "StreamingResourceType",
          "kind": "re-export",
          "signature": "StreamingResourceType",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUTextureAtlas",
      "path": "engine/reference/core/gpu/VGPUTextureAtlas.md",
      "source": "engine/core/gpu/VGPUTextureAtlas.js",
      "import": "/engine/core/gpu/VGPUTextureAtlas.js",
      "sourceHash": "6cb4a83a55030f717a5fd6db0b458bc80ab5cce0c65be27f3f9855c9b19d6137",
      "summary": "Texture Atlas Manager - Dynamic packing for sprites/UI, automatic UV remapping",
      "exports": [
        {
          "name": "VGPUTextureAtlas",
          "kind": "class",
          "signature": "class VGPUTextureAtlas",
          "summary": ""
        },
        {
          "name": "VGPUSpriteBatch",
          "kind": "class",
          "signature": "class VGPUSpriteBatch",
          "summary": "Sprite batch renderer using texture atlas"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VGPUTimelineSemaphores",
      "path": "engine/reference/core/gpu/VGPUTimelineSemaphores.md",
      "source": "engine/core/gpu/VGPUTimelineSemaphores.js",
      "import": "/engine/core/gpu/VGPUTimelineSemaphores.js",
      "sourceHash": "c7ed6d169100d0b7de0cb05e390cef499a85cbbbe8d612292cf8628aff3478ce",
      "summary": "GPU Timeline Semaphores - Advanced sync for multi-engine scenarios",
      "exports": [
        {
          "name": "VGPUTimelineSemaphores",
          "kind": "class",
          "signature": "class VGPUTimelineSemaphores",
          "summary": "GPU Timeline Semaphores - Advanced sync for multi-engine scenarios"
        },
        {
          "name": "FrameSync",
          "kind": "re-export",
          "signature": "FrameSync",
          "summary": ""
        },
        {
          "name": "TimelineSemaphore",
          "kind": "re-export",
          "signature": "TimelineSemaphore",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/VirtualGPU",
      "path": "engine/reference/core/gpu/VirtualGPU.md",
      "source": "engine/core/gpu/VirtualGPU.js",
      "import": "/engine/core/gpu/VirtualGPU.js",
      "sourceHash": "37c1b85b9586f8dc13965cae9b60dcc024385c0c1cf556031d3c655780c9e6fc",
      "summary": "Get or create the global vGPU instance",
      "exports": [
        {
          "name": "VirtualGPU",
          "kind": "class",
          "signature": "class VirtualGPU",
          "summary": ""
        },
        {
          "name": "getVGPU",
          "kind": "function",
          "signature": "async getVGPU(options)",
          "summary": "Get or create the global vGPU instance"
        },
        {
          "name": "vgpu",
          "kind": "function",
          "signature": "vgpu()",
          "summary": "Get existing vGPU instance (throws if not initialized)"
        },
        {
          "name": "initVGPU",
          "kind": "function",
          "signature": "initVGPU(deviceOrOptions)",
          "summary": "Initialize vGPU from existing GpuDevice or raw GPUDevice"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/WGSLPreprocessor",
      "path": "engine/reference/core/gpu/WGSLPreprocessor.md",
      "source": "engine/core/gpu/WGSLPreprocessor.js",
      "import": "/engine/core/gpu/WGSLPreprocessor.js",
      "sourceHash": "a73890cb5fb480ba49cd17a638d2c17d2b5d113e35e881b789e86ce8eb04ff80",
      "summary": "WGSL Preprocessor - #include, #define, #ifdef support for shader modularity",
      "exports": [
        {
          "name": "WGSLPreprocessor",
          "kind": "class",
          "signature": "class WGSLPreprocessor",
          "summary": "WGSL Preprocessor - #include, #define, #ifdef support for shader modularity"
        },
        {
          "name": "createPreprocessor",
          "kind": "function",
          "signature": "createPreprocessor()",
          "summary": "Create a preprocessor with common includes registered"
        },
        {
          "name": "WGSL_COMMON_INCLUDES",
          "kind": "constant",
          "signature": "WGSL_COMMON_INCLUDES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/WGSLStructLayout",
      "path": "engine/reference/core/gpu/WGSLStructLayout.md",
      "source": "engine/core/gpu/WGSLStructLayout.js",
      "import": "/engine/core/gpu/WGSLStructLayout.js",
      "sourceHash": "0e14c335298bcfbb253f8aa74f15f6df8d1655db19ff761390d530ee8ba3218d",
      "summary": "WGSLStructLayout.js - Unified WGSL/JS Struct Layout Generator Parses WGSL struct definitions and generates: - Correct buffer sizes with WebGPU alignment - JS field offset maps for TypedArray access - Accessor helper classes for reading/writing struct data This ensures WGSL and JS stay perfectly in sync - define once in WGSL, use the generated layout in JS. Usage: const layout = parseWGSLStruct(` struct Params { dt: f32, particleCount: u32, roomHalfSize: f32, gravityY: f32, } `); // layout.size = 16 (bytes) // layout.fields = { dt: {offset: 0, size: 4}, particleCount: {offset: 4, size: 4}, ... } const accessor = createStructAccessor(layout); const data = new Float32Array(layout.size / 4); accessor.set(data, 'dt', 0.016); accessor.set(data, 'particleCount', 1000); // auto-converts to u32",
      "exports": [
        {
          "name": "parseWGSLStruct",
          "kind": "function",
          "signature": "parseWGSLStruct(wgslCode)",
          "summary": "Parse a WGSL struct definition and compute field layout"
        },
        {
          "name": "createStructAccessor",
          "kind": "function",
          "signature": "createStructAccessor(layout)",
          "summary": "Create an accessor object for reading/writing struct fields"
        },
        {
          "name": "defineStruct",
          "kind": "function",
          "signature": "defineStruct(wgslCode)",
          "summary": "Define a struct layout from WGSL and return both layout and accessor"
        },
        {
          "name": "generateJSLayout",
          "kind": "function",
          "signature": "generateJSLayout(wgslCode)",
          "summary": "Generate JS object literal layout definition from WGSL struct Useful for documentation or code generation"
        },
        {
          "name": "validateBuffer",
          "kind": "function",
          "signature": "validateBuffer(buffer, layout, expectedCount = 1)",
          "summary": "Validate that a buffer matches the expected struct layout"
        },
        {
          "name": "CommonStructs",
          "kind": "constant",
          "signature": "CommonStructs",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/WGSLStructSize",
      "path": "engine/reference/core/gpu/WGSLStructSize.md",
      "source": "engine/core/gpu/WGSLStructSize.js",
      "import": "/engine/core/gpu/WGSLStructSize.js",
      "sourceHash": "b86f28d6704d47e18eee8ca293eded6f54d1f4ca910e7741af0511d95a830702",
      "summary": "Calculate the total size of a WGSL struct with proper alignment",
      "exports": [
        {
          "name": "calcWGSLStructSize",
          "kind": "function",
          "signature": "calcWGSLStructSize(structCode)",
          "summary": "Calculate the total size of a WGSL struct with proper alignment"
        },
        {
          "name": "createUniformBuffer",
          "kind": "function",
          "signature": "createUniformBuffer(device, structCode, label = 'Uniform Buffer')",
          "summary": "Create a uniform buffer with automatically calculated size"
        },
        {
          "name": "createStorageBuffer",
          "kind": "function",
          "signature": "createStorageBuffer(device, structCode, count = 1, label = 'Storage Buffer')",
          "summary": "Create a storage buffer with automatically calculated size"
        },
        {
          "name": "getFloat32ArraySize",
          "kind": "function",
          "signature": "getFloat32ArraySize(structCode)",
          "summary": "Get the Float32Array size needed to fill a struct buffer"
        },
        {
          "name": "validateBufferSize",
          "kind": "function",
          "signature": "validateBufferSize(bufferSize, structCode, label = '')",
          "summary": "Validate a buffer size against a struct definition"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/WebGpuCanvasBootstrap",
      "path": "engine/reference/core/gpu/WebGpuCanvasBootstrap.md",
      "source": "engine/core/gpu/WebGpuCanvasBootstrap.js",
      "import": "/engine/core/gpu/WebGpuCanvasBootstrap.js",
      "sourceHash": "05fe3979d4be29b14c1e11618623921e93f9533a2f8d2d734f7c1d6602997015",
      "summary": "",
      "exports": [
        {
          "name": "initWebGpuCanvas",
          "kind": "function",
          "signature": "async initWebGpuCanvas(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/gpu/index",
      "path": "engine/reference/core/gpu/index.md",
      "source": "engine/core/gpu/index.js",
      "import": "/engine/core/gpu/index.js",
      "sourceHash": "7376b9126fa2e3dcd6330edd2e5d335a40b345463c3180452ba2575be8741fc7",
      "summary": "engine/core/gpu/index.js - GPU Utilities Barrel Export",
      "exports": [
        {
          "name": "ADAPTIVE_QUALITY_TIERS",
          "kind": "re-export",
          "signature": "ADAPTIVE_QUALITY_TIERS",
          "summary": ""
        },
        {
          "name": "AdaptiveQualityGovernor",
          "kind": "re-export",
          "signature": "AdaptiveQualityGovernor",
          "summary": ""
        },
        {
          "name": "AsyncComputeScheduler",
          "kind": "re-export",
          "signature": "AsyncComputeScheduler",
          "summary": ""
        },
        {
          "name": "BindGroupSignals",
          "kind": "re-export",
          "signature": "BindGroupSignals",
          "summary": ""
        },
        {
          "name": "BitonicSorter",
          "kind": "re-export",
          "signature": "BitonicSorter",
          "summary": ""
        },
        {
          "name": "BoundingBoxBuilder",
          "kind": "re-export",
          "signature": "BoundingBoxBuilder",
          "summary": ""
        },
        {
          "name": "DIRTY_CHUNK_LAYOUT",
          "kind": "re-export",
          "signature": "DIRTY_CHUNK_LAYOUT",
          "summary": ""
        },
        {
          "name": "DIRTY_FLAGS",
          "kind": "re-export",
          "signature": "DIRTY_FLAGS",
          "summary": ""
        },
        {
          "name": "DebugDrawScope",
          "kind": "re-export",
          "signature": "DebugDrawScope",
          "summary": ""
        },
        {
          "name": "DeterministicRNG",
          "kind": "re-export",
          "signature": "DeterministicRNG",
          "summary": ""
        },
        {
          "name": "DynamicUniformBuffer",
          "kind": "re-export",
          "signature": "DynamicUniformBuffer",
          "summary": ""
        },
        {
          "name": "FDTD_CELL_LAYOUT",
          "kind": "re-export",
          "signature": "FDTD_CELL_LAYOUT",
          "summary": ""
        },
        {
          "name": "FIXED_SCALE",
          "kind": "re-export",
          "signature": "FIXED_SCALE",
          "summary": ""
        },
        {
          "name": "FIXED_SCALE_INV",
          "kind": "re-export",
          "signature": "FIXED_SCALE_INV",
          "summary": ""
        },
        {
          "name": "GENERATOR_WORKGROUP_SIZE",
          "kind": "re-export",
          "signature": "GENERATOR_WORKGROUP_SIZE",
          "summary": ""
        },
        {
          "name": "GPUPageAllocator",
          "kind": "re-export",
          "signature": "GPUPageAllocator",
          "summary": ""
        },
        {
          "name": "GPUProfiler",
          "kind": "re-export",
          "signature": "GPUProfiler",
          "summary": ""
        },
        {
          "name": "GPU_PAGE_WGSL",
          "kind": "re-export",
          "signature": "GPU_PAGE_WGSL",
          "summary": ""
        },
        {
          "name": "GPU_RANDOM_WGSL",
          "kind": "re-export",
          "signature": "GPU_RANDOM_WGSL",
          "summary": ""
        },
        {
          "name": "GRID_CELL_LAYOUT",
          "kind": "re-export",
          "signature": "GRID_CELL_LAYOUT",
          "summary": ""
        },
        {
          "name": "GRID_VELOCITY_LAYOUT",
          "kind": "re-export",
          "signature": "GRID_VELOCITY_LAYOUT",
          "summary": ""
        },
        {
          "name": "GpuFrameBudgetBroker",
          "kind": "re-export",
          "signature": "GpuFrameBudgetBroker",
          "summary": ""
        },
        {
          "name": "INDIRECT_ALIGN",
          "kind": "re-export",
          "signature": "INDIRECT_ALIGN",
          "summary": ""
        },
        {
          "name": "INDIRECT_BUFFER_SIZE",
          "kind": "re-export",
          "signature": "INDIRECT_BUFFER_SIZE",
          "summary": ""
        },
        {
          "name": "IndirectDispatchGen",
          "kind": "re-export",
          "signature": "IndirectDispatchGen",
          "summary": ""
        },
        {
          "name": "IndirectInstanceBuilder",
          "kind": "re-export",
          "signature": "IndirectInstanceBuilder",
          "summary": ""
        },
        {
          "name": "MAX_JOBS",
          "kind": "re-export",
          "signature": "MAX_JOBS",
          "summary": ""
        },
        {
          "name": "MULTIPLAYER_RANDOM_WGSL",
          "kind": "re-export",
          "signature": "MULTIPLAYER_RANDOM_WGSL",
          "summary": ""
        },
        {
          "name": "MultiPassDispatchGen",
          "kind": "re-export",
          "signature": "MultiPassDispatchGen",
          "summary": ""
        },
        {
          "name": "PARTICLE_LAYOUT",
          "kind": "re-export",
          "signature": "PARTICLE_LAYOUT",
          "summary": ""
        },
        {
          "name": "PCGRandom",
          "kind": "re-export",
          "signature": "PCGRandom",
          "summary": ""
        },
        {
          "name": "RadixSorter",
          "kind": "re-export",
          "signature": "RadixSorter",
          "summary": ""
        },
        {
          "name": "RenderGraphBuilder",
          "kind": "re-export",
          "signature": "RenderGraphBuilder",
          "summary": ""
        },
        {
          "name": "ResourceSignal",
          "kind": "re-export",
          "signature": "ResourceSignal",
          "summary": ""
        },
        {
          "name": "ResourceState",
          "kind": "re-export",
          "signature": "ResourceState",
          "summary": ""
        },
        {
          "name": "ResourceType",
          "kind": "re-export",
          "signature": "ResourceType",
          "summary": ""
        },
        {
          "name": "ResourceUsage",
          "kind": "re-export",
          "signature": "ResourceUsage",
          "summary": ""
        },
        {
          "name": "SORT_MAX_ELEMENTS",
          "kind": "re-export",
          "signature": "SORT_MAX_ELEMENTS",
          "summary": ""
        },
        {
          "name": "STORAGE_ALIGN",
          "kind": "re-export",
          "signature": "STORAGE_ALIGN",
          "summary": ""
        },
        {
          "name": "STRATIFIED_SAMPLE_WGSL",
          "kind": "re-export",
          "signature": "STRATIFIED_SAMPLE_WGSL",
          "summary": ""
        },
        {
          "name": "SortKeyType",
          "kind": "re-export",
          "signature": "SortKeyType",
          "summary": ""
        },
        {
          "name": "SparsePageRuntime",
          "kind": "re-export",
          "signature": "SparsePageRuntime",
          "summary": ""
        },
        {
          "name": "StreamingResourceType",
          "kind": "re-export",
          "signature": "StreamingResourceType",
          "summary": ""
        },
        {
          "name": "TAA_JITTER_WGSL",
          "kind": "re-export",
          "signature": "TAA_JITTER_WGSL",
          "summary": ""
        },
        {
          "name": "TYPE_SIZES",
          "kind": "re-export",
          "signature": "TYPE_SIZES",
          "summary": ""
        },
        {
          "name": "UNIFORM_ALIGN",
          "kind": "re-export",
          "signature": "UNIFORM_ALIGN",
          "summary": ""
        },
        {
          "name": "VGPUDebugDraw",
          "kind": "re-export",
          "signature": "VGPUDebugDraw",
          "summary": ""
        },
        {
          "name": "VGPUHiZCulling",
          "kind": "re-export",
          "signature": "VGPUHiZCulling",
          "summary": ""
        },
        {
          "name": "VGPUIndirectRenderer",
          "kind": "re-export",
          "signature": "VGPUIndirectRenderer",
          "summary": ""
        },
        {
          "name": "VGPURenderGraph",
          "kind": "re-export",
          "signature": "VGPURenderGraph",
          "summary": ""
        },
        {
          "name": "VGPUStreamingManager",
          "kind": "re-export",
          "signature": "VGPUStreamingManager",
          "summary": ""
        },
        {
          "name": "VirtualGPU",
          "kind": "re-export",
          "signature": "VirtualGPU",
          "summary": ""
        },
        {
          "name": "WGSL_FIXED_POINT",
          "kind": "re-export",
          "signature": "WGSL_FIXED_POINT",
          "summary": ""
        },
        {
          "name": "WGSL_GRID_INDEX",
          "kind": "re-export",
          "signature": "WGSL_GRID_INDEX",
          "summary": ""
        },
        {
          "name": "accumulateColor",
          "kind": "re-export",
          "signature": "accumulateColor",
          "summary": ""
        },
        {
          "name": "accumulateEMA",
          "kind": "re-export",
          "signature": "accumulateEMA",
          "summary": ""
        },
        {
          "name": "accumulationWeight",
          "kind": "re-export",
          "signature": "accumulationWeight",
          "summary": ""
        },
        {
          "name": "alignTo",
          "kind": "re-export",
          "signature": "alignTo",
          "summary": ""
        },
        {
          "name": "bitonicSortCPU",
          "kind": "re-export",
          "signature": "bitonicSortCPU",
          "summary": ""
        },
        {
          "name": "blueNoiseOffset",
          "kind": "re-export",
          "signature": "blueNoiseOffset",
          "summary": ""
        },
        {
          "name": "calcWGSLStructSize",
          "kind": "re-export",
          "signature": "calcWGSLStructSize",
          "summary": ""
        },
        {
          "name": "countToSpectral",
          "kind": "re-export",
          "signature": "countToSpectral",
          "summary": ""
        },
        {
          "name": "createAdaptiveQualityGovernor",
          "kind": "re-export",
          "signature": "createAdaptiveQualityGovernor",
          "summary": ""
        },
        {
          "name": "createAlignedBuffer",
          "kind": "re-export",
          "signature": "createAlignedBuffer",
          "summary": ""
        },
        {
          "name": "createBufferWithData",
          "kind": "re-export",
          "signature": "createBufferWithData",
          "summary": ""
        },
        {
          "name": "createGpuPassGraph",
          "kind": "re-export",
          "signature": "createGpuPassGraph",
          "summary": ""
        },
        {
          "name": "createSignal",
          "kind": "re-export",
          "signature": "createSignal",
          "summary": ""
        },
        {
          "name": "createSparsePageRuntime",
          "kind": "re-export",
          "signature": "createSparsePageRuntime",
          "summary": ""
        },
        {
          "name": "createUniformBuffer",
          "kind": "re-export",
          "signature": "createUniformBuffer",
          "summary": ""
        },
        {
          "name": "fromFixed",
          "kind": "re-export",
          "signature": "fromFixed",
          "summary": ""
        },
        {
          "name": "generateWGSLBindGroupDeclarations",
          "kind": "re-export",
          "signature": "generateWGSLBindGroupDeclarations",
          "summary": ""
        },
        {
          "name": "getFloat32ArraySize",
          "kind": "re-export",
          "signature": "getFloat32ArraySize",
          "summary": ""
        },
        {
          "name": "getGridBufferSizes",
          "kind": "re-export",
          "signature": "getGridBufferSizes",
          "summary": ""
        },
        {
          "name": "getParticleBufferSizes",
          "kind": "re-export",
          "signature": "getParticleBufferSizes",
          "summary": ""
        },
        {
          "name": "getVGPU",
          "kind": "re-export",
          "signature": "getVGPU",
          "summary": ""
        },
        {
          "name": "halton",
          "kind": "re-export",
          "signature": "halton",
          "summary": ""
        },
        {
          "name": "halton2D",
          "kind": "re-export",
          "signature": "halton2D",
          "summary": ""
        },
        {
          "name": "halton3D",
          "kind": "re-export",
          "signature": "halton3D",
          "summary": ""
        },
        {
          "name": "hash2D",
          "kind": "re-export",
          "signature": "hash2D",
          "summary": ""
        },
        {
          "name": "hash3D",
          "kind": "re-export",
          "signature": "hash3D",
          "summary": ""
        },
        {
          "name": "initRngState",
          "kind": "re-export",
          "signature": "initRngState",
          "summary": ""
        },
        {
          "name": "initVGPU",
          "kind": "re-export",
          "signature": "initVGPU",
          "summary": ""
        },
        {
          "name": "isAligned",
          "kind": "re-export",
          "signature": "isAligned",
          "summary": ""
        },
        {
          "name": "paddingFor",
          "kind": "re-export",
          "signature": "paddingFor",
          "summary": ""
        },
        {
          "name": "pcgHash",
          "kind": "re-export",
          "signature": "pcgHash",
          "summary": ""
        },
        {
          "name": "planProgressiveWorkBudget",
          "kind": "re-export",
          "signature": "planProgressiveWorkBudget",
          "summary": ""
        },
        {
          "name": "positionToMorton",
          "kind": "re-export",
          "signature": "positionToMorton",
          "summary": ""
        },
        {
          "name": "r2Sequence3D",
          "kind": "re-export",
          "signature": "r2Sequence3D",
          "summary": ""
        },
        {
          "name": "spectralHeatMap",
          "kind": "re-export",
          "signature": "spectralHeatMap",
          "summary": ""
        },
        {
          "name": "toFixed",
          "kind": "re-export",
          "signature": "toFixed",
          "summary": ""
        },
        {
          "name": "vgpu",
          "kind": "re-export",
          "signature": "vgpu",
          "summary": ""
        },
        {
          "name": "wavelengthToRGB",
          "kind": "re-export",
          "signature": "wavelengthToRGB",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/index",
      "path": "engine/reference/core/index.md",
      "source": "engine/core/index.js",
      "import": "/engine/core/index.js",
      "sourceHash": "371173bcf5b053196040163686ae1c75d9e64f4088377d4400a9c909d8d1beff",
      "summary": "",
      "exports": [
        {
          "name": "BindGroupCache",
          "kind": "re-export",
          "signature": "BindGroupCache",
          "summary": ""
        },
        {
          "name": "BuddyAllocator",
          "kind": "re-export",
          "signature": "BuddyAllocator",
          "summary": ""
        },
        {
          "name": "FramePipeline",
          "kind": "re-export",
          "signature": "FramePipeline",
          "summary": ""
        },
        {
          "name": "GPUMemoryManager",
          "kind": "re-export",
          "signature": "GPUMemoryManager",
          "summary": ""
        },
        {
          "name": "HostMemoryManager",
          "kind": "re-export",
          "signature": "HostMemoryManager",
          "summary": ""
        },
        {
          "name": "Job",
          "kind": "re-export",
          "signature": "Job",
          "summary": ""
        },
        {
          "name": "JobPriority",
          "kind": "re-export",
          "signature": "JobPriority",
          "summary": ""
        },
        {
          "name": "ObjectPool",
          "kind": "re-export",
          "signature": "ObjectPool",
          "summary": ""
        },
        {
          "name": "ResourceManager",
          "kind": "re-export",
          "signature": "ResourceManager",
          "summary": ""
        },
        {
          "name": "RingBuffer",
          "kind": "re-export",
          "signature": "RingBuffer",
          "summary": ""
        },
        {
          "name": "SlabAllocator",
          "kind": "re-export",
          "signature": "SlabAllocator",
          "summary": ""
        },
        {
          "name": "SoAContainer",
          "kind": "re-export",
          "signature": "SoAContainer",
          "summary": ""
        },
        {
          "name": "StagingBufferPool",
          "kind": "re-export",
          "signature": "StagingBufferPool",
          "summary": ""
        },
        {
          "name": "TaskScheduler",
          "kind": "re-export",
          "signature": "TaskScheduler",
          "summary": ""
        },
        {
          "name": "TextureManager",
          "kind": "re-export",
          "signature": "TextureManager",
          "summary": ""
        },
        {
          "name": "WorkerPool",
          "kind": "re-export",
          "signature": "WorkerPool",
          "summary": ""
        },
        {
          "name": "createCommonPools",
          "kind": "re-export",
          "signature": "createCommonPools",
          "summary": ""
        },
        {
          "name": "createFrameContext",
          "kind": "re-export",
          "signature": "createFrameContext",
          "summary": ""
        },
        {
          "name": "getGPUMemoryManager",
          "kind": "re-export",
          "signature": "getGPUMemoryManager",
          "summary": ""
        },
        {
          "name": "hostMemory",
          "kind": "re-export",
          "signature": "hostMemory",
          "summary": ""
        },
        {
          "name": "resources",
          "kind": "re-export",
          "signature": "resources",
          "summary": ""
        },
        {
          "name": "scheduler",
          "kind": "re-export",
          "signature": "scheduler",
          "summary": ""
        },
        {
          "name": "workerTemplate",
          "kind": "re-export",
          "signature": "workerTemplate",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/AnimationTimeMath",
      "path": "engine/reference/core/math/AnimationTimeMath.md",
      "source": "engine/core/math/AnimationTimeMath.js",
      "import": "/engine/core/math/AnimationTimeMath.js",
      "sourceHash": "f832a959925b1cafcf0c53acbf17d38f9297ce6a1f40d75c2af4f5935609ce99",
      "summary": "AnimationTimeMath.js - pure animation timing, keyframe, and sampler reports.",
      "exports": [
        {
          "name": "animationActiveDuration",
          "kind": "function",
          "signature": "animationActiveDuration(iterationDuration, iterationCount = 1)",
          "summary": ""
        },
        {
          "name": "animationWrapTime",
          "kind": "function",
          "signature": "animationWrapTime(time, duration, options = {})",
          "summary": ""
        },
        {
          "name": "animationFrameWrap",
          "kind": "function",
          "signature": "animationFrameWrap(frame, frameCount)",
          "summary": ""
        },
        {
          "name": "animationPlaybackRateReport",
          "kind": "function",
          "signature": "animationPlaybackRateReport(options = {})",
          "summary": ""
        },
        {
          "name": "animationPlaybackStateReport",
          "kind": "function",
          "signature": "animationPlaybackStateReport(value = {}, options = {})",
          "summary": "Validate and normalize the serializable state of one animation player."
        },
        {
          "name": "animationTimeScaleReport",
          "kind": "function",
          "signature": "animationTimeScaleReport(time, options = {})",
          "summary": ""
        },
        {
          "name": "animationTimelineOffsetReport",
          "kind": "function",
          "signature": "animationTimelineOffsetReport(options = {})",
          "summary": ""
        },
        {
          "name": "animationOpenUsdLayerOffsetReport",
          "kind": "function",
          "signature": "animationOpenUsdLayerOffsetReport(timeCode, options = {})",
          "summary": ""
        },
        {
          "name": "animationOpenUsdTimeSampleBracket",
          "kind": "function",
          "signature": "animationOpenUsdTimeSampleBracket(times, timeCode, options = {})",
          "summary": ""
        },
        {
          "name": "animationOpenUsdSampleValue",
          "kind": "function",
          "signature": "animationOpenUsdSampleValue(times, values, timeCode, options = {})",
          "summary": ""
        },
        {
          "name": "animationTimingReport",
          "kind": "function",
          "signature": "animationTimingReport(options = {})",
          "summary": ""
        },
        {
          "name": "animationKeyframeBracket",
          "kind": "function",
          "signature": "animationKeyframeBracket(times, time, options = {})",
          "summary": ""
        },
        {
          "name": "animationSampleScalar",
          "kind": "function",
          "signature": "animationSampleScalar(a, b, t)",
          "summary": ""
        },
        {
          "name": "animationSampleVector",
          "kind": "function",
          "signature": "animationSampleVector(a, b, t)",
          "summary": ""
        },
        {
          "name": "animationSampleQuaternion",
          "kind": "function",
          "signature": "animationSampleQuaternion(a, b, t)",
          "summary": ""
        },
        {
          "name": "animationCubicSplineSample",
          "kind": "function",
          "signature": "animationCubicSplineSample(v0, outTangent0, v1, inTangent1, t, duration = 1, options = {})",
          "summary": ""
        },
        {
          "name": "animationSampleChannel",
          "kind": "function",
          "signature": "animationSampleChannel(times, values, time, options = {})",
          "summary": ""
        },
        {
          "name": "animationSampleChannelInto",
          "kind": "function",
          "signature": "animationSampleChannelInto(times, values, time, out, outOffset = 0, options = {})",
          "summary": ""
        },
        {
          "name": "animationClipSampleTimeReport",
          "kind": "function",
          "signature": "animationClipSampleTimeReport(time, options = {})",
          "summary": ""
        },
        {
          "name": "animationKeyframeReductionReport",
          "kind": "function",
          "signature": "animationKeyframeReductionReport(times, values, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/AudioAutomationMath",
      "path": "engine/reference/core/math/AudioAutomationMath.md",
      "source": "engine/core/math/AudioAutomationMath.js",
      "import": "/engine/core/math/AudioAutomationMath.js",
      "sourceHash": "2180d143c162f2d2ca957618fa5177c9f7d66d039e60104cc8441e0ed0b0a54b",
      "summary": "AudioAutomationMath.js - pure AudioParam automation, envelope, and biquad helper math.",
      "exports": [
        {
          "name": "audioAutomationLinearRampValue",
          "kind": "function",
          "signature": "audioAutomationLinearRampValue(startValue, endValue, startTime, endTime, time)",
          "summary": ""
        },
        {
          "name": "audioAutomationExponentialRampValue",
          "kind": "function",
          "signature": "audioAutomationExponentialRampValue(startValue, endValue, startTime, endTime, time)",
          "summary": ""
        },
        {
          "name": "audioAutomationSetTargetValue",
          "kind": "function",
          "signature": "audioAutomationSetTargetValue(initialValue, targetValue, startTime, timeConstant, time)",
          "summary": ""
        },
        {
          "name": "audioAutomationValueCurveAtTime",
          "kind": "function",
          "signature": "audioAutomationValueCurveAtTime(curve, startTime, duration, time, options = {})",
          "summary": ""
        },
        {
          "name": "audioAdsrEnvelopeValue",
          "kind": "function",
          "signature": "audioAdsrEnvelopeValue(time, options = {})",
          "summary": ""
        },
        {
          "name": "audioAdsrEnvelopeReport",
          "kind": "function",
          "signature": "audioAdsrEnvelopeReport(options = {})",
          "summary": ""
        },
        {
          "name": "audioBiquadComputedFrequency",
          "kind": "function",
          "signature": "audioBiquadComputedFrequency(frequency = 350, detune = 0, sampleRate = 48000)",
          "summary": ""
        },
        {
          "name": "audioBiquadCoefficients",
          "kind": "function",
          "signature": "audioBiquadCoefficients(type = 'lowpass', options = {})",
          "summary": ""
        },
        {
          "name": "audioBiquadFrequencyResponse",
          "kind": "function",
          "signature": "audioBiquadFrequencyResponse(coefficients, frequencyHz, sampleRate = coefficients?.sampleRate ?? 48000)",
          "summary": ""
        },
        {
          "name": "AUDIO_BIQUAD_TYPES",
          "kind": "constant",
          "signature": "AUDIO_BIQUAD_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/AudioMath",
      "path": "engine/reference/core/math/AudioMath.md",
      "source": "engine/core/math/AudioMath.js",
      "import": "/engine/core/math/AudioMath.js",
      "sourceHash": "a17546b34afcfb4f4976ab0db8c10f71051ceab0f2e3d38b74ee960d6810e8fd",
      "summary": "AudioMath.js - pure PCM/audio-domain math helpers.",
      "exports": [
        {
          "name": "audioClipSample",
          "kind": "function",
          "signature": "audioClipSample(sample, limit = 1)",
          "summary": ""
        },
        {
          "name": "audioSoftClipSample",
          "kind": "function",
          "signature": "audioSoftClipSample(sample, drive = 1)",
          "summary": ""
        },
        {
          "name": "audioClipSignal",
          "kind": "function",
          "signature": "audioClipSignal(signal, limit = 1)",
          "summary": ""
        },
        {
          "name": "audioSoftClipSignal",
          "kind": "function",
          "signature": "audioSoftClipSignal(signal, drive = 1)",
          "summary": ""
        },
        {
          "name": "audioApplyGain",
          "kind": "function",
          "signature": "audioApplyGain(signal, gain = 1, options = {})",
          "summary": ""
        },
        {
          "name": "audioMix",
          "kind": "function",
          "signature": "audioMix(signals, options = {})",
          "summary": ""
        },
        {
          "name": "audioNormalize",
          "kind": "function",
          "signature": "audioNormalize(signal, targetPeak = 1)",
          "summary": ""
        },
        {
          "name": "audioStereoToMono",
          "kind": "function",
          "signature": "audioStereoToMono(left, right)",
          "summary": ""
        },
        {
          "name": "audioMonoToStereo",
          "kind": "function",
          "signature": "audioMonoToStereo(mono)",
          "summary": ""
        },
        {
          "name": "audioEqualPowerPanGains",
          "kind": "function",
          "signature": "audioEqualPowerPanGains(pan)",
          "summary": ""
        },
        {
          "name": "audioEqualPowerPanMono",
          "kind": "function",
          "signature": "audioEqualPowerPanMono(mono, pan)",
          "summary": ""
        },
        {
          "name": "audioWaveformPeaks",
          "kind": "function",
          "signature": "audioWaveformPeaks(signal, bucketCount)",
          "summary": ""
        },
        {
          "name": "audioWindowedRmsReport",
          "kind": "function",
          "signature": "audioWindowedRmsReport(signal, windowSize, hopSize = windowSize)",
          "summary": ""
        },
        {
          "name": "audioSilenceReport",
          "kind": "function",
          "signature": "audioSilenceReport(signal, options = {})",
          "summary": ""
        },
        {
          "name": "audioNoiseFloorReport",
          "kind": "function",
          "signature": "audioNoiseFloorReport(signal, options = {})",
          "summary": ""
        },
        {
          "name": "audioTransientReport",
          "kind": "function",
          "signature": "audioTransientReport(signal, options = {})",
          "summary": ""
        },
        {
          "name": "audioSpectralEntropyReport",
          "kind": "function",
          "signature": "audioSpectralEntropyReport(spectrum, options = {})",
          "summary": ""
        },
        {
          "name": "audioAnalyserByteToDb",
          "kind": "function",
          "signature": "audioAnalyserByteToDb(byteValue, minDb = DEFAULT_AUDIO_MIN_DB, maxDb = DEFAULT_AUDIO_MAX_DB)",
          "summary": ""
        },
        {
          "name": "audioDecibelsToAnalyserByte",
          "kind": "function",
          "signature": "audioDecibelsToAnalyserByte(db, minDb = DEFAULT_AUDIO_MIN_DB, maxDb = DEFAULT_AUDIO_MAX_DB)",
          "summary": ""
        },
        {
          "name": "DEFAULT_AUDIO_MIN_DB",
          "kind": "constant",
          "signature": "DEFAULT_AUDIO_MIN_DB",
          "summary": ""
        },
        {
          "name": "DEFAULT_AUDIO_MAX_DB",
          "kind": "constant",
          "signature": "DEFAULT_AUDIO_MAX_DB",
          "summary": ""
        },
        {
          "name": "audioDbToGain",
          "kind": "constant",
          "signature": "audioDbToGain",
          "summary": ""
        },
        {
          "name": "audioGainToDb",
          "kind": "constant",
          "signature": "audioGainToDb",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/BVHAccel",
      "path": "engine/reference/core/math/BVHAccel.md",
      "source": "engine/core/math/BVHAccel.js",
      "import": "/engine/core/math/BVHAccel.js",
      "sourceHash": "ce7ac8ba39b13f6b3d544e2652474a673b9d028ab3cee1cfa8b17789623e8ed3",
      "summary": "BVH Node - 32 bytes aligned for GPU If triCount == 0: internal node, leftChild_Or_FirstTri = left child index If triCount > 0: leaf node, leftChild_Or_FirstTri = first triangle index",
      "exports": [
        {
          "name": "BVHNode",
          "kind": "class",
          "signature": "class BVHNode",
          "summary": "BVH Node - 32 bytes aligned for GPU If triCount == 0: internal node, leftChild_Or_FirstTri = left child index If triCount > 0: leaf node, leftChild_Or_FirstTri = first triangle index"
        },
        {
          "name": "BVHBuilder",
          "kind": "class",
          "signature": "class BVHBuilder",
          "summary": "Build BVH from triangle mesh Uses Surface Area Heuristic for optimal splits"
        },
        {
          "name": "rayTriangleIntersect",
          "kind": "function",
          "signature": "rayTriangleIntersect(origin, dir, tri, tMax = INF_T)",
          "summary": "Möller-Trumbore ray-triangle intersection"
        },
        {
          "name": "traverseBVH",
          "kind": "function",
          "signature": "traverseBVH(origin, dir, nodes, triIndices, triangles)",
          "summary": "Traverse BVH and find closest intersection"
        },
        {
          "name": "serializeBVHForGPU",
          "kind": "function",
          "signature": "serializeBVHForGPU(bvh)",
          "summary": "Serialize BVH for GPU buffer upload"
        },
        {
          "name": "createRaycastMesh",
          "kind": "function",
          "signature": "createRaycastMesh(vertices, indices)",
          "summary": "Create raycastable mesh from vertices and indices"
        },
        {
          "name": "INF_T",
          "kind": "constant",
          "signature": "INF_T",
          "summary": ""
        },
        {
          "name": "EPSILON",
          "kind": "constant",
          "signature": "EPSILON",
          "summary": ""
        },
        {
          "name": "BVH_TRAVERSAL_WGSL",
          "kind": "constant",
          "signature": "BVH_TRAVERSAL_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/BenchmarkMath",
      "path": "engine/reference/core/math/BenchmarkMath.md",
      "source": "engine/core/math/BenchmarkMath.js",
      "import": "/engine/core/math/BenchmarkMath.js",
      "sourceHash": "71835a52054d2eb8f0a7ad760ea75fd81cf04e8dfca3747d1d0134d1346c466b",
      "summary": "BenchmarkMath.js - reusable benchmark rate, memory, compression, and cost estimates.",
      "exports": [
        {
          "name": "operationsPerSecond",
          "kind": "function",
          "signature": "operationsPerSecond(operationCount, durationMs)",
          "summary": ""
        },
        {
          "name": "throughputReport",
          "kind": "function",
          "signature": "throughputReport(options = {})",
          "summary": ""
        },
        {
          "name": "durationReport",
          "kind": "function",
          "signature": "durationReport(startMs, endMs, options = {})",
          "summary": ""
        },
        {
          "name": "memoryEstimateReport",
          "kind": "function",
          "signature": "memoryEstimateReport(options = {})",
          "summary": ""
        },
        {
          "name": "compressionRatioReport",
          "kind": "function",
          "signature": "compressionRatioReport(options = {})",
          "summary": ""
        },
        {
          "name": "computeCostEstimateReport",
          "kind": "function",
          "signature": "computeCostEstimateReport(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/BezierCurves",
      "path": "engine/reference/core/math/BezierCurves.md",
      "source": "engine/core/math/BezierCurves.js",
      "import": "/engine/core/math/BezierCurves.js",
      "sourceHash": "f313c11cad44234d99de62d109c5c7bf2e94e88ccf406739bfbd96dd291de745",
      "summary": "Cubic Bezier curve defined by 4 control points",
      "exports": [
        {
          "name": "CubicBezier",
          "kind": "class",
          "signature": "class CubicBezier",
          "summary": "Cubic Bezier curve defined by 4 control points"
        },
        {
          "name": "QuadraticBezier",
          "kind": "class",
          "signature": "class QuadraticBezier",
          "summary": ""
        },
        {
          "name": "BezierSpline",
          "kind": "class",
          "signature": "class BezierSpline",
          "summary": ""
        },
        {
          "name": "straightLine",
          "kind": "function",
          "signature": "straightLine(start, end, radius = 1.0)",
          "summary": "Create a straight line as a degenerate Bezier"
        },
        {
          "name": "arc",
          "kind": "function",
          "signature": "arc(center, radius, startAngle, endAngle, tubeRadius = 1.0)",
          "summary": "Create an arc approximation using Bezier"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/BezierDistance",
      "path": "engine/reference/core/math/BezierDistance.md",
      "source": "engine/core/math/BezierDistance.js",
      "import": "/engine/core/math/BezierDistance.js",
      "sourceHash": "9d687fb013a8670b8fac68bdd8d7aa0e362ea521a812329963184b6423785ba1",
      "summary": "GPU-accelerated Bezier distance field computation",
      "exports": [
        {
          "name": "BezierDistanceCompute",
          "kind": "class",
          "signature": "class BezierDistanceCompute",
          "summary": "GPU-accelerated Bezier distance field computation"
        },
        {
          "name": "sdCapsule",
          "kind": "function",
          "signature": "sdCapsule(p, a, b, r)",
          "summary": "Signed distance to a capsule (line segment with radius)"
        },
        {
          "name": "capsuleClosestT",
          "kind": "function",
          "signature": "capsuleClosestT(p, a, b)",
          "summary": "Find closest point parameter on capsule"
        },
        {
          "name": "bezierDistanceCapsule",
          "kind": "function",
          "signature": "bezierDistanceCapsule(p, curve, segments = 16)",
          "summary": "Distance to Bezier using capsule chain approximation Fast but may miss fine details for highly curved sections"
        },
        {
          "name": "bezierDistanceBatch",
          "kind": "function",
          "signature": "bezierDistanceBatch(points, curve, segments = 16)",
          "summary": "Batch distance query for multiple points"
        },
        {
          "name": "bezierClosestNewton",
          "kind": "function",
          "signature": "bezierClosestNewton(p, curve, initialT = 0.5, iterations = 8)",
          "summary": "Find closest point on Bezier using Newton-Raphson iteration Minimizes |B(t) - p|² by finding roots of d/dt|B(t)-p|²"
        },
        {
          "name": "bezierDistanceHybrid",
          "kind": "function",
          "signature": "bezierDistanceHybrid(p, curve, capsuleSegments = 8, newtonIterations = 4)",
          "summary": "Hybrid: Capsule for initial guess, Newton for refinement Best balance of speed and accuracy"
        },
        {
          "name": "multiCurveDistance",
          "kind": "function",
          "signature": "multiCurveDistance(p, curves, segments = 16)",
          "summary": "Distance to multiple Bezier curves (smooth union)"
        },
        {
          "name": "smin",
          "kind": "function",
          "signature": "smin(a, b, k = 0.1)",
          "summary": "Smooth minimum of two distances (for blending)"
        },
        {
          "name": "multiCurveDistanceSmooth",
          "kind": "function",
          "signature": "multiCurveDistanceSmooth(p, curves, smoothness = 0.5)",
          "summary": "Distance to curves with smooth blending"
        },
        {
          "name": "curvesToGPUBuffer",
          "kind": "function",
          "signature": "curvesToGPUBuffer(curves)",
          "summary": "Prepare curve data for GPU upload Format: 4 vec4s per curve = 64 bytes [p0.xyz, 0] [p1.xyz, 0] [p2.xyz, 0] [p3.xyz, radius]"
        },
        {
          "name": "curvesToSegments",
          "kind": "function",
          "signature": "curvesToSegments(curves, segmentsPerCurve = 8)",
          "summary": "Pre-sample curves into line segments for GPU More efficient for many queries"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/BlendMath",
      "path": "engine/reference/core/math/BlendMath.md",
      "source": "engine/core/math/BlendMath.js",
      "import": "/engine/core/math/BlendMath.js",
      "sourceHash": "11427b5dae84171d713a8312a3ea4d9ff43ad17d54f488fee99c09a0512f4de0",
      "summary": "",
      "exports": [
        {
          "name": "straightRgba",
          "kind": "function",
          "signature": "straightRgba(color, opacity = 1)",
          "summary": ""
        },
        {
          "name": "premultiplyAlpha",
          "kind": "function",
          "signature": "premultiplyAlpha(color, opacity = 1)",
          "summary": ""
        },
        {
          "name": "unpremultiplyAlpha",
          "kind": "function",
          "signature": "unpremultiplyAlpha(color)",
          "summary": ""
        },
        {
          "name": "alphaBlend",
          "kind": "function",
          "signature": "alphaBlend(backdrop, source, opacity = 1)",
          "summary": ""
        },
        {
          "name": "premultipliedAlphaBlend",
          "kind": "function",
          "signature": "premultipliedAlphaBlend(backdrop, source, opacity = 1)",
          "summary": ""
        },
        {
          "name": "blendModeChannel",
          "kind": "function",
          "signature": "blendModeChannel(backdrop, source, mode = 'normal')",
          "summary": ""
        },
        {
          "name": "blendRgb",
          "kind": "function",
          "signature": "blendRgb(backdrop, source, mode = 'normal')",
          "summary": ""
        },
        {
          "name": "blendCompositeStraight",
          "kind": "function",
          "signature": "blendCompositeStraight(backdrop, source, mode = 'normal', opacity = 1)",
          "summary": ""
        },
        {
          "name": "coverageAlpha",
          "kind": "function",
          "signature": "coverageAlpha(coveredSamples, sampleCount = 1)",
          "summary": ""
        },
        {
          "name": "alphaToCoverage",
          "kind": "function",
          "signature": "alphaToCoverage(alpha, sampleCount = 1)",
          "summary": ""
        },
        {
          "name": "bayer4Threshold",
          "kind": "function",
          "signature": "bayer4Threshold(x, y)",
          "summary": ""
        },
        {
          "name": "ditherAlpha",
          "kind": "function",
          "signature": "ditherAlpha(alpha, x = 0, y = 0, frame = 0)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/BufferMath",
      "path": "engine/reference/core/math/BufferMath.md",
      "source": "engine/core/math/BufferMath.js",
      "import": "/engine/core/math/BufferMath.js",
      "sourceHash": "2e1f83b62de63783544ca42ddd3786ebbc731d646436cb3880a37e8275fa3fce",
      "summary": "BufferMath.js - reusable byte views, endian-safe DataView reads/writes, UTF-8 helpers, and cursors.",
      "exports": [
        {
          "name": "BufferCursor",
          "kind": "class",
          "signature": "class BufferCursor",
          "summary": ""
        },
        {
          "name": "bufferLittleEndian",
          "kind": "function",
          "signature": "bufferLittleEndian(endian = DEFAULT_ENDIAN)",
          "summary": ""
        },
        {
          "name": "bufferEndianName",
          "kind": "function",
          "signature": "bufferEndianName(endian = DEFAULT_ENDIAN)",
          "summary": ""
        },
        {
          "name": "bufferValueByteSize",
          "kind": "function",
          "signature": "bufferValueByteSize(type)",
          "summary": ""
        },
        {
          "name": "bufferByteView",
          "kind": "function",
          "signature": "bufferByteView(data)",
          "summary": ""
        },
        {
          "name": "bufferDataView",
          "kind": "function",
          "signature": "bufferDataView(data)",
          "summary": ""
        },
        {
          "name": "bufferRangeReport",
          "kind": "function",
          "signature": "bufferRangeReport(data, byteOffset = 0, byteLength = 0, options = {})",
          "summary": ""
        },
        {
          "name": "bufferRead",
          "kind": "function",
          "signature": "bufferRead(data, type, byteOffset, options = {})",
          "summary": ""
        },
        {
          "name": "bufferWrite",
          "kind": "function",
          "signature": "bufferWrite(data, type, byteOffset, value, options = {})",
          "summary": ""
        },
        {
          "name": "encodeUtf8",
          "kind": "function",
          "signature": "encodeUtf8(text)",
          "summary": ""
        },
        {
          "name": "decodeUtf8",
          "kind": "function",
          "signature": "decodeUtf8(data, options = {})",
          "summary": ""
        },
        {
          "name": "bufferReadUtf8",
          "kind": "function",
          "signature": "bufferReadUtf8(data, byteOffset, byteLength, options = {})",
          "summary": ""
        },
        {
          "name": "bufferWriteUtf8",
          "kind": "function",
          "signature": "bufferWriteUtf8(data, byteOffset, text, options = {})",
          "summary": ""
        },
        {
          "name": "concatBufferBytes",
          "kind": "function",
          "signature": "concatBufferBytes(chunks)",
          "summary": ""
        },
        {
          "name": "createBufferCursor",
          "kind": "function",
          "signature": "createBufferCursor(dataOrByteLength, options = {})",
          "summary": ""
        },
        {
          "name": "bufferCursorReport",
          "kind": "function",
          "signature": "bufferCursorReport(cursor)",
          "summary": ""
        },
        {
          "name": "BUFFER_ENDIAN",
          "kind": "constant",
          "signature": "BUFFER_ENDIAN",
          "summary": ""
        },
        {
          "name": "BUFFER_VALUE_TYPES",
          "kind": "constant",
          "signature": "BUFFER_VALUE_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/ChannelMath",
      "path": "engine/reference/core/math/ChannelMath.md",
      "source": "engine/core/math/ChannelMath.js",
      "import": "/engine/core/math/ChannelMath.js",
      "sourceHash": "f6a21c73ac703462ee56a70bf08cc494ddb51c6d7a233cf64442cfff135fa230",
      "summary": "ChannelMath.js - reusable channel geometry, spacing, hopset, and planning reports.",
      "exports": [
        {
          "name": "channelRangeReport",
          "kind": "function",
          "signature": "channelRangeReport(centerHz, bandwidthHz)",
          "summary": ""
        },
        {
          "name": "channelCenterFromIndex",
          "kind": "function",
          "signature": "channelCenterFromIndex(index, options = {})",
          "summary": ""
        },
        {
          "name": "channelIndexFromCenterReport",
          "kind": "function",
          "signature": "channelIndexFromCenterReport(centerHz, options = {})",
          "summary": ""
        },
        {
          "name": "wifi24ChannelCenterHz",
          "kind": "function",
          "signature": "wifi24ChannelCenterHz(channelNumber)",
          "summary": ""
        },
        {
          "name": "wifi24ChannelReport",
          "kind": "function",
          "signature": "wifi24ChannelReport(channelNumber, options = {})",
          "summary": ""
        },
        {
          "name": "channelBandMembershipReport",
          "kind": "function",
          "signature": "channelBandMembershipReport(channel, bands = [], options = {})",
          "summary": ""
        },
        {
          "name": "channelGuardBandReport",
          "kind": "function",
          "signature": "channelGuardBandReport(aChannel, bChannel, options = {})",
          "summary": ""
        },
        {
          "name": "channelHopsetReport",
          "kind": "function",
          "signature": "channelHopsetReport(channels = [], options = {})",
          "summary": ""
        },
        {
          "name": "channelInterferenceReport",
          "kind": "function",
          "signature": "channelInterferenceReport(candidateChannel, interferers = [], options = {})",
          "summary": ""
        },
        {
          "name": "channelPlanReport",
          "kind": "function",
          "signature": "channelPlanReport(candidates = [], interferers = [], options = {})",
          "summary": ""
        },
        {
          "name": "CHANNEL_DEFAULT_BASE_INDEX",
          "kind": "constant",
          "signature": "CHANNEL_DEFAULT_BASE_INDEX",
          "summary": ""
        },
        {
          "name": "CHANNEL_DEFAULT_BASE_CENTER_HZ",
          "kind": "constant",
          "signature": "CHANNEL_DEFAULT_BASE_CENTER_HZ",
          "summary": ""
        },
        {
          "name": "CHANNEL_DEFAULT_SPACING_HZ",
          "kind": "constant",
          "signature": "CHANNEL_DEFAULT_SPACING_HZ",
          "summary": ""
        },
        {
          "name": "CHANNEL_DEFAULT_BANDWIDTH_HZ",
          "kind": "constant",
          "signature": "CHANNEL_DEFAULT_BANDWIDTH_HZ",
          "summary": ""
        },
        {
          "name": "CHANNEL_DEFAULT_COCHANNEL_OVERLAP_RATIO",
          "kind": "constant",
          "signature": "CHANNEL_DEFAULT_COCHANNEL_OVERLAP_RATIO",
          "summary": ""
        },
        {
          "name": "CHANNEL_DEFAULT_REQUIRED_HOP_SPACING_HZ",
          "kind": "constant",
          "signature": "CHANNEL_DEFAULT_REQUIRED_HOP_SPACING_HZ",
          "summary": ""
        },
        {
          "name": "CHANNEL_DEFAULT_PLAN_WEIGHTS",
          "kind": "constant",
          "signature": "CHANNEL_DEFAULT_PLAN_WEIGHTS",
          "summary": ""
        },
        {
          "name": "WIFI_24_GHZ_CHANNEL_14_CENTER_HZ",
          "kind": "constant",
          "signature": "WIFI_24_GHZ_CHANNEL_14_CENTER_HZ",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/ChecksumMath",
      "path": "engine/reference/core/math/ChecksumMath.md",
      "source": "engine/core/math/ChecksumMath.js",
      "import": "/engine/core/math/ChecksumMath.js",
      "sourceHash": "f0f1a47c29c8e023a9fafb34f4d1beae6903a90c9eaebc55f1e2a000f79e6ba3",
      "summary": "ChecksumMath.js - reusable byte checksums, non-crypto hashes, rolling hashes, and digest wrappers.",
      "exports": [
        {
          "name": "checksumByteView",
          "kind": "function",
          "signature": "checksumByteView(data)",
          "summary": ""
        },
        {
          "name": "checksumHex32",
          "kind": "function",
          "signature": "checksumHex32(value)",
          "summary": ""
        },
        {
          "name": "checksumHex64",
          "kind": "function",
          "signature": "checksumHex64(value)",
          "summary": ""
        },
        {
          "name": "hexTailUint32",
          "kind": "function",
          "signature": "hexTailUint32(hex, fallback = 0)",
          "summary": ""
        },
        {
          "name": "legacySha1Hex",
          "kind": "function",
          "signature": "legacySha1Hex(data)",
          "summary": ""
        },
        {
          "name": "crc32",
          "kind": "function",
          "signature": "crc32(data, previousCrc = 0)",
          "summary": ""
        },
        {
          "name": "adler32",
          "kind": "function",
          "signature": "adler32(data, previousAdler = 1)",
          "summary": ""
        },
        {
          "name": "fnv1a32",
          "kind": "function",
          "signature": "fnv1a32(data, seed = FNV1A32_OFFSET_BASIS)",
          "summary": ""
        },
        {
          "name": "fnv1a64",
          "kind": "function",
          "signature": "fnv1a64(data, seed = FNV1A64_OFFSET_BASIS)",
          "summary": ""
        },
        {
          "name": "fnv1aStringCodeUnit32",
          "kind": "function",
          "signature": "fnv1aStringCodeUnit32(data, options = {})",
          "summary": ""
        },
        {
          "name": "fnv1aStringCodePointHead32",
          "kind": "function",
          "signature": "fnv1aStringCodePointHead32(data, options = {})",
          "summary": ""
        },
        {
          "name": "fnv1aLowByteString32",
          "kind": "function",
          "signature": "fnv1aLowByteString32(data, options = {})",
          "summary": ""
        },
        {
          "name": "fnv1aTaggedFloat32Sequence32",
          "kind": "function",
          "signature": "fnv1aTaggedFloat32Sequence32(values, options = {})",
          "summary": ""
        },
        {
          "name": "fnv1aTaggedUint32Sequence32",
          "kind": "function",
          "signature": "fnv1aTaggedUint32Sequence32(values, options = {})",
          "summary": ""
        },
        {
          "name": "legacyAvalancheUint32Hash32",
          "kind": "function",
          "signature": "legacyAvalancheUint32Hash32(value)",
          "summary": ""
        },
        {
          "name": "legacyAvalancheMixUint32Hash32",
          "kind": "function",
          "signature": "legacyAvalancheMixUint32Hash32(hash, value, multiplier = 0x9e3779b1)",
          "summary": ""
        },
        {
          "name": "fnv1aUint32Sequence32",
          "kind": "function",
          "signature": "fnv1aUint32Sequence32(values, options = {})",
          "summary": ""
        },
        {
          "name": "fnv1aInt32Sequence32",
          "kind": "function",
          "signature": "fnv1aInt32Sequence32(values, options = {})",
          "summary": ""
        },
        {
          "name": "xxHash32",
          "kind": "function",
          "signature": "xxHash32(data, seed = 0)",
          "summary": ""
        },
        {
          "name": "legacyFnv1aByteSequenceHash32",
          "kind": "function",
          "signature": "legacyFnv1aByteSequenceHash32(data, options = {})",
          "summary": ""
        },
        {
          "name": "legacyFnv1aNumberSequenceHash32",
          "kind": "function",
          "signature": "legacyFnv1aNumberSequenceHash32(values, seed = FNV1A32_OFFSET_BASIS)",
          "summary": ""
        },
        {
          "name": "legacyFnv1aStringHash32",
          "kind": "function",
          "signature": "legacyFnv1aStringHash32(data, seed = FNV1A32_OFFSET_BASIS)",
          "summary": ""
        },
        {
          "name": "legacyDjb2XorStringHash32",
          "kind": "function",
          "signature": "legacyDjb2XorStringHash32(data, seed = 5381)",
          "summary": ""
        },
        {
          "name": "legacyUnsignedStringHash31",
          "kind": "function",
          "signature": "legacyUnsignedStringHash31(data, seed = 0)",
          "summary": ""
        },
        {
          "name": "legacyStringHash32",
          "kind": "function",
          "signature": "legacyStringHash32(data)",
          "summary": ""
        },
        {
          "name": "legacyScaledNumberSequenceHash32",
          "kind": "function",
          "signature": "legacyScaledNumberSequenceHash32(values, options = {})",
          "summary": ""
        },
        {
          "name": "bufferHash",
          "kind": "function",
          "signature": "bufferHash(data, algorithm = CHECKSUM_ALGORITHMS.crc32)",
          "summary": ""
        },
        {
          "name": "checksumReport",
          "kind": "function",
          "signature": "checksumReport(data)",
          "summary": ""
        },
        {
          "name": "checksumBlockReport",
          "kind": "function",
          "signature": "checksumBlockReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "rollingHash32",
          "kind": "function",
          "signature": "rollingHash32(data, windowSize, options = {})",
          "summary": ""
        },
        {
          "name": "bufferCompare",
          "kind": "function",
          "signature": "bufferCompare(left, right)",
          "summary": ""
        },
        {
          "name": "contentHashBytes",
          "kind": "function",
          "signature": "async contentHashBytes(data, algorithm = CHECKSUM_ALGORITHMS.sha256)",
          "summary": ""
        },
        {
          "name": "contentHashHex",
          "kind": "function",
          "signature": "async contentHashHex(data, algorithm = CHECKSUM_ALGORITHMS.sha256)",
          "summary": ""
        },
        {
          "name": "FNV1A32_OFFSET_BASIS",
          "kind": "constant",
          "signature": "FNV1A32_OFFSET_BASIS",
          "summary": ""
        },
        {
          "name": "CHECKSUM_ALGORITHMS",
          "kind": "constant",
          "signature": "CHECKSUM_ALGORITHMS",
          "summary": ""
        },
        {
          "name": "CHECKSUM_KNOWN_VECTORS",
          "kind": "constant",
          "signature": "CHECKSUM_KNOWN_VECTORS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/CompressionMath",
      "path": "engine/reference/core/math/CompressionMath.md",
      "source": "engine/core/math/CompressionMath.js",
      "import": "/engine/core/math/CompressionMath.js",
      "sourceHash": "a771d1ef8e49a69425a2c4852e136c7fa7991c39d9ab5e38b8f8e4035ed6c42b",
      "summary": "CompressionMath.js - pure compression primitive reports and planning helpers.",
      "exports": [
        {
          "name": "compressionZigZagEncode",
          "kind": "function",
          "signature": "compressionZigZagEncode(value)",
          "summary": ""
        },
        {
          "name": "compressionZigZagDecode",
          "kind": "function",
          "signature": "compressionZigZagDecode(encoded)",
          "summary": ""
        },
        {
          "name": "compressionRunLengthReport",
          "kind": "function",
          "signature": "compressionRunLengthReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "compressionDeltaReport",
          "kind": "function",
          "signature": "compressionDeltaReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "compressionPaletteReport",
          "kind": "function",
          "signature": "compressionPaletteReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "compressionVarintReport",
          "kind": "function",
          "signature": "compressionVarintReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "compressionEntropyPlan",
          "kind": "function",
          "signature": "compressionEntropyPlan(data, options = {})",
          "summary": ""
        },
        {
          "name": "compressionLz77WindowReport",
          "kind": "function",
          "signature": "compressionLz77WindowReport(options = {})",
          "summary": ""
        },
        {
          "name": "compressionHuffmanLengthReport",
          "kind": "function",
          "signature": "compressionHuffmanLengthReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "compressionRangeModelReport",
          "kind": "function",
          "signature": "compressionRangeModelReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "compressionDictionaryMatchReport",
          "kind": "function",
          "signature": "compressionDictionaryMatchReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "compressionPrimitivePlan",
          "kind": "function",
          "signature": "compressionPrimitivePlan(values, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/CongestionMath",
      "path": "engine/reference/core/math/CongestionMath.md",
      "source": "engine/core/math/CongestionMath.js",
      "import": "/engine/core/math/CongestionMath.js",
      "sourceHash": "d58a15d5319512dbf62f81290b809345cfdb9c47734301a3b02ddf638f7bcf98",
      "summary": "CongestionMath.js - reusable congestion-window, pacing, Reno, QUIC, and CUBIC report helpers.",
      "exports": [
        {
          "name": "bandwidthDelayProductBytes",
          "kind": "function",
          "signature": "bandwidthDelayProductBytes(options = {})",
          "summary": ""
        },
        {
          "name": "congestionWindowLimitReport",
          "kind": "function",
          "signature": "congestionWindowLimitReport(options = {})",
          "summary": ""
        },
        {
          "name": "quicInitialCongestionWindowBytes",
          "kind": "function",
          "signature": "quicInitialCongestionWindowBytes(maxDatagramBytes = CONGESTION_DEFAULT_MAX_DATAGRAM_BYTES)",
          "summary": ""
        },
        {
          "name": "quicMinimumCongestionWindowBytes",
          "kind": "function",
          "signature": "quicMinimumCongestionWindowBytes(maxDatagramBytes = CONGESTION_DEFAULT_MAX_DATAGRAM_BYTES)",
          "summary": ""
        },
        {
          "name": "renoSlowStartThresholdBytes",
          "kind": "function",
          "signature": "renoSlowStartThresholdBytes(options = {})",
          "summary": ""
        },
        {
          "name": "renoSlowStartIncreaseBytes",
          "kind": "function",
          "signature": "renoSlowStartIncreaseBytes(acknowledgedBytes, smssBytes = CONGESTION_DEFAULT_MAX_DATAGRAM_BYTES)",
          "summary": ""
        },
        {
          "name": "renoCongestionAvoidanceIncreaseBytes",
          "kind": "function",
          "signature": "renoCongestionAvoidanceIncreaseBytes(congestionWindowBytes, smssBytes = CONGESTION_DEFAULT_MAX_DATAGRAM_BYTES)",
          "summary": ""
        },
        {
          "name": "renoAckWindowUpdateReport",
          "kind": "function",
          "signature": "renoAckWindowUpdateReport(options = {})",
          "summary": ""
        },
        {
          "name": "congestionLossResponseReport",
          "kind": "function",
          "signature": "congestionLossResponseReport(options = {})",
          "summary": ""
        },
        {
          "name": "persistentCongestionDurationMs",
          "kind": "function",
          "signature": "persistentCongestionDurationMs(options = {})",
          "summary": ""
        },
        {
          "name": "persistentCongestionReport",
          "kind": "function",
          "signature": "persistentCongestionReport(options = {})",
          "summary": ""
        },
        {
          "name": "congestionPacingRateBps",
          "kind": "function",
          "signature": "congestionPacingRateBps(options = {})",
          "summary": ""
        },
        {
          "name": "cubicKSeconds",
          "kind": "function",
          "signature": "cubicKSeconds(options = {})",
          "summary": ""
        },
        {
          "name": "cubicWindowSegments",
          "kind": "function",
          "signature": "cubicWindowSegments(options = {})",
          "summary": ""
        },
        {
          "name": "cubicRenoFriendlyAlpha",
          "kind": "function",
          "signature": "cubicRenoFriendlyAlpha(beta = CONGESTION_CUBIC_BETA)",
          "summary": ""
        },
        {
          "name": "cubicRenoEstimateReport",
          "kind": "function",
          "signature": "cubicRenoEstimateReport(options = {})",
          "summary": ""
        },
        {
          "name": "cubicTargetWindowReport",
          "kind": "function",
          "signature": "cubicTargetWindowReport(options = {})",
          "summary": ""
        },
        {
          "name": "cubicLossResponseReport",
          "kind": "function",
          "signature": "cubicLossResponseReport(options = {})",
          "summary": ""
        },
        {
          "name": "CONGESTION_DEFAULT_MAX_DATAGRAM_BYTES",
          "kind": "constant",
          "signature": "CONGESTION_DEFAULT_MAX_DATAGRAM_BYTES",
          "summary": ""
        },
        {
          "name": "CONGESTION_RENO_DECREASE_FACTOR",
          "kind": "constant",
          "signature": "CONGESTION_RENO_DECREASE_FACTOR",
          "summary": ""
        },
        {
          "name": "CONGESTION_RENO_MIN_WINDOW_SEGMENTS",
          "kind": "constant",
          "signature": "CONGESTION_RENO_MIN_WINDOW_SEGMENTS",
          "summary": ""
        },
        {
          "name": "CONGESTION_QUIC_INITIAL_PACKET_COUNT",
          "kind": "constant",
          "signature": "CONGESTION_QUIC_INITIAL_PACKET_COUNT",
          "summary": ""
        },
        {
          "name": "CONGESTION_QUIC_MIN_WINDOW_PACKET_COUNT",
          "kind": "constant",
          "signature": "CONGESTION_QUIC_MIN_WINDOW_PACKET_COUNT",
          "summary": ""
        },
        {
          "name": "CONGESTION_QUIC_INITIAL_WINDOW_MIN_BYTES",
          "kind": "constant",
          "signature": "CONGESTION_QUIC_INITIAL_WINDOW_MIN_BYTES",
          "summary": ""
        },
        {
          "name": "CONGESTION_PERSISTENT_THRESHOLD",
          "kind": "constant",
          "signature": "CONGESTION_PERSISTENT_THRESHOLD",
          "summary": ""
        },
        {
          "name": "CONGESTION_DEFAULT_CLOCK_GRANULARITY_MS",
          "kind": "constant",
          "signature": "CONGESTION_DEFAULT_CLOCK_GRANULARITY_MS",
          "summary": ""
        },
        {
          "name": "CONGESTION_CUBIC_BETA",
          "kind": "constant",
          "signature": "CONGESTION_CUBIC_BETA",
          "summary": ""
        },
        {
          "name": "CONGESTION_CUBIC_C",
          "kind": "constant",
          "signature": "CONGESTION_CUBIC_C",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/ConstraintMath",
      "path": "engine/reference/core/math/ConstraintMath.md",
      "source": "engine/core/math/ConstraintMath.js",
      "import": "/engine/core/math/ConstraintMath.js",
      "sourceHash": "e4ec0cf4757fd0ab3124f7d8fc4bd76f591ca89897dae341916fae814c333240",
      "summary": "ConstraintMath.js - pure joint limit, drive, spring, and projection reports.",
      "exports": [
        {
          "name": "constraintNormalizeAngle",
          "kind": "function",
          "signature": "constraintNormalizeAngle(angle, options = {})",
          "summary": ""
        },
        {
          "name": "constraintAngularLimitReport",
          "kind": "function",
          "signature": "constraintAngularLimitReport(angle, lowerLimit, upperLimit, options = {})",
          "summary": ""
        },
        {
          "name": "constraintAxisStateReport",
          "kind": "function",
          "signature": "constraintAxisStateReport(value, options = {})",
          "summary": ""
        },
        {
          "name": "constraintConeLimitReport",
          "kind": "function",
          "signature": "constraintConeLimitReport(swingY, swingZ, limitY, limitZ, options = {})",
          "summary": ""
        },
        {
          "name": "constraintSwingTwistLimitReport",
          "kind": "function",
          "signature": "constraintSwingTwistLimitReport(rotation, twistAxis = [1, 0, 0], options = {})",
          "summary": ""
        },
        {
          "name": "constraintSpringDamperCoefficients",
          "kind": "function",
          "signature": "constraintSpringDamperCoefficients(options = {})",
          "summary": ""
        },
        {
          "name": "constraintMotorTargetErrorReport",
          "kind": "function",
          "signature": "constraintMotorTargetErrorReport(current, target, options = {})",
          "summary": ""
        },
        {
          "name": "constraintJointProjectionErrorReport",
          "kind": "function",
          "signature": "constraintJointProjectionErrorReport(frameA = {}, frameB = {}, options = {})",
          "summary": ""
        },
        {
          "name": "constraintComplianceStiffnessReport",
          "kind": "function",
          "signature": "constraintComplianceStiffnessReport(options = {})",
          "summary": ""
        },
        {
          "name": "constraintDriveEnvelopeReport",
          "kind": "function",
          "signature": "constraintDriveEnvelopeReport(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/DOMGeometryMath",
      "path": "engine/reference/core/math/DOMGeometryMath.md",
      "source": "engine/core/math/DOMGeometryMath.js",
      "import": "/engine/core/math/DOMGeometryMath.js",
      "sourceHash": "405da373597c057c28b34bfcb44286c26a8b8a64f95f008b3590b18d494f680e",
      "summary": "DOMGeometryMath.js - DOMPoint, DOMRect, DOMMatrix, and canvas coordinate helpers.",
      "exports": [
        {
          "name": "domPointToVec2",
          "kind": "function",
          "signature": "domPointToVec2(point, options = {})",
          "summary": ""
        },
        {
          "name": "domPointToVec4",
          "kind": "function",
          "signature": "domPointToVec4(point, options = {})",
          "summary": ""
        },
        {
          "name": "domRectNormalize",
          "kind": "function",
          "signature": "domRectNormalize(rect = {}, options = {})",
          "summary": ""
        },
        {
          "name": "domMatrix2DFromInit",
          "kind": "function",
          "signature": "domMatrix2DFromInit(init = {})",
          "summary": ""
        },
        {
          "name": "domMatrixToColumnMajor4",
          "kind": "function",
          "signature": "domMatrixToColumnMajor4(init = {})",
          "summary": ""
        },
        {
          "name": "columnMajor4ToDomMatrix",
          "kind": "function",
          "signature": "columnMajor4ToDomMatrix(matrix = IDENTITY_COLUMN_MAJOR_4)",
          "summary": ""
        },
        {
          "name": "domMatrixTransformPoint",
          "kind": "function",
          "signature": "domMatrixTransformPoint(point, matrixInit = IDENTITY_COLUMN_MAJOR_4)",
          "summary": ""
        },
        {
          "name": "domRectTransformBounds",
          "kind": "function",
          "signature": "domRectTransformBounds(rect, matrixInit = IDENTITY_COLUMN_MAJOR_4, options = {})",
          "summary": ""
        },
        {
          "name": "domQuadBoundsReport",
          "kind": "function",
          "signature": "domQuadBoundsReport(quad = {}, options = {})",
          "summary": ""
        },
        {
          "name": "domQuadTransformBounds",
          "kind": "function",
          "signature": "domQuadTransformBounds(quad = {}, matrixInit = IDENTITY_COLUMN_MAJOR_4, options = {})",
          "summary": ""
        },
        {
          "name": "domMatrixInverse2DReport",
          "kind": "function",
          "signature": "domMatrixInverse2DReport(matrixInit = IDENTITY_COLUMN_MAJOR_4)",
          "summary": ""
        },
        {
          "name": "canvasBackingStoreReport",
          "kind": "function",
          "signature": "canvasBackingStoreReport(cssWidth, cssHeight, devicePixelRatio = 1, options = {})",
          "summary": ""
        },
        {
          "name": "domScrollCoordinateReport",
          "kind": "function",
          "signature": "domScrollCoordinateReport(point = {}, viewport = {}, options = {})",
          "summary": ""
        },
        {
          "name": "canvasPointerCssPoint",
          "kind": "function",
          "signature": "canvasPointerCssPoint(event = {}, rect = {}, options = {})",
          "summary": ""
        },
        {
          "name": "canvasPointerWorldPoint",
          "kind": "function",
          "signature": "canvasPointerWorldPoint(event = {}, rect = {}, matrixInit = IDENTITY_COLUMN_MAJOR_4, options = {})",
          "summary": ""
        },
        {
          "name": "canvasPointerDevicePoint",
          "kind": "function",
          "signature": "canvasPointerDevicePoint(event = {}, rect = {}, canvasOrScale = {}, options = {})",
          "summary": ""
        },
        {
          "name": "domGeometryInteropReport",
          "kind": "function",
          "signature": "domGeometryInteropReport(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/EngineMath",
      "path": "engine/reference/core/math/EngineMath.md",
      "source": "engine/core/math/EngineMath.js",
      "import": "/engine/core/math/EngineMath.js",
      "sourceHash": "2a73f494ca99e24c8fa1c70f29978dd5ba79f575eef13add0c5bfe55cbf9af1e",
      "summary": "EngineMath - basic 3D vector and matrix helpers shared across engine and tests Pure math, no rendering or platform side effects.",
      "exports": [
        {
          "name": "quatRotateVec3",
          "kind": "function",
          "signature": "quatRotateVec3(v, q)",
          "summary": ""
        },
        {
          "name": "quatConjugate",
          "kind": "function",
          "signature": "quatConjugate(q)",
          "summary": ""
        },
        {
          "name": "quatNormalize",
          "kind": "function",
          "signature": "quatNormalize(q)",
          "summary": ""
        },
        {
          "name": "quatMultiply",
          "kind": "function",
          "signature": "quatMultiply(a, b)",
          "summary": ""
        },
        {
          "name": "quatInverse",
          "kind": "function",
          "signature": "quatInverse(q)",
          "summary": ""
        },
        {
          "name": "mat4Identity",
          "kind": "function",
          "signature": "mat4Identity()",
          "summary": ""
        },
        {
          "name": "mat4Multiply",
          "kind": "function",
          "signature": "mat4Multiply(a, b, out)",
          "summary": ""
        },
        {
          "name": "mat4Translate",
          "kind": "function",
          "signature": "mat4Translate(m, x, y, z)",
          "summary": ""
        },
        {
          "name": "mat4Scale",
          "kind": "function",
          "signature": "mat4Scale(m, sx, sy, sz)",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveRad",
          "kind": "function",
          "signature": "mat4PerspectiveRad(fovRad, aspect, near, far)",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveRadWebGPU",
          "kind": "function",
          "signature": "mat4PerspectiveRadWebGPU(fovRad, aspect, near, far)",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveDeg",
          "kind": "function",
          "signature": "mat4PerspectiveDeg(fovDeg, aspect, near, far)",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveDegWebGPU",
          "kind": "function",
          "signature": "mat4PerspectiveDegWebGPU(fovDeg, aspect, near, far)",
          "summary": ""
        },
        {
          "name": "mat4Orthographic",
          "kind": "function",
          "signature": "mat4Orthographic(left, right, bottom, top, near, far)",
          "summary": ""
        },
        {
          "name": "mat4OrthographicWebGPU",
          "kind": "function",
          "signature": "mat4OrthographicWebGPU(left, right, bottom, top, near, far)",
          "summary": ""
        },
        {
          "name": "mat4LookAt",
          "kind": "function",
          "signature": "mat4LookAt(eye, center, up)",
          "summary": ""
        },
        {
          "name": "mat4Inverse",
          "kind": "function",
          "signature": "mat4Inverse(m, out)",
          "summary": ""
        },
        {
          "name": "mat4FromRotationTranslation",
          "kind": "function",
          "signature": "mat4FromRotationTranslation(q, t)",
          "summary": ""
        },
        {
          "name": "vec3",
          "kind": "re-export",
          "signature": "vec3",
          "summary": ""
        },
        {
          "name": "vec3Add",
          "kind": "re-export",
          "signature": "vec3Add",
          "summary": ""
        },
        {
          "name": "vec3Cross",
          "kind": "re-export",
          "signature": "vec3Cross",
          "summary": ""
        },
        {
          "name": "vec3Dot",
          "kind": "re-export",
          "signature": "vec3Dot",
          "summary": ""
        },
        {
          "name": "vec3Length",
          "kind": "re-export",
          "signature": "vec3Length",
          "summary": ""
        },
        {
          "name": "vec3LengthSq",
          "kind": "re-export",
          "signature": "vec3LengthSq",
          "summary": ""
        },
        {
          "name": "vec3Lerp",
          "kind": "re-export",
          "signature": "vec3Lerp",
          "summary": ""
        },
        {
          "name": "vec3Normalize",
          "kind": "re-export",
          "signature": "vec3Normalize",
          "summary": ""
        },
        {
          "name": "vec3Scale",
          "kind": "re-export",
          "signature": "vec3Scale",
          "summary": ""
        },
        {
          "name": "vec3Sub",
          "kind": "re-export",
          "signature": "vec3Sub",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/FilterMath",
      "path": "engine/reference/core/math/FilterMath.md",
      "source": "engine/core/math/FilterMath.js",
      "import": "/engine/core/math/FilterMath.js",
      "sourceHash": "27ff1ab18a8e38148b0794ff2b8a5de0daa9447f9ca67b80ecc3b2b8daf53d8c",
      "summary": "FilterMath.js - reusable filter kernel, signal FIR, and CPU RGBA convolution helpers.",
      "exports": [
        {
          "name": "filterKernelReport",
          "kind": "function",
          "signature": "filterKernelReport(kernel, options = {})",
          "summary": ""
        },
        {
          "name": "normalizeFilterKernel",
          "kind": "function",
          "signature": "normalizeFilterKernel(kernel, targetSum = 1, options = {})",
          "summary": ""
        },
        {
          "name": "boxFilterKernel1D",
          "kind": "function",
          "signature": "boxFilterKernel1D(radius = 1, options = {})",
          "summary": ""
        },
        {
          "name": "gaussianFilterKernel1D",
          "kind": "function",
          "signature": "gaussianFilterKernel1D(radius = 1, sigma = null)",
          "summary": ""
        },
        {
          "name": "gaussianFilterKernel2D",
          "kind": "function",
          "signature": "gaussianFilterKernel2D(radius = 1, sigma = null)",
          "summary": ""
        },
        {
          "name": "filterKernelPreset",
          "kind": "function",
          "signature": "filterKernelPreset(name)",
          "summary": ""
        },
        {
          "name": "filterSignalFIR",
          "kind": "function",
          "signature": "filterSignalFIR(signal, kernel, options = {})",
          "summary": ""
        },
        {
          "name": "filterSignalMedian",
          "kind": "function",
          "signature": "filterSignalMedian(signal, windowSize = 3)",
          "summary": ""
        },
        {
          "name": "filterSignalTemporalSmooth",
          "kind": "function",
          "signature": "filterSignalTemporalSmooth(signal, alpha = 0.5)",
          "summary": ""
        },
        {
          "name": "filterSignalNoiseReduce",
          "kind": "function",
          "signature": "filterSignalNoiseReduce(signal, options = {})",
          "summary": ""
        },
        {
          "name": "filterImageConvolutionRgba",
          "kind": "function",
          "signature": "filterImageConvolutionRgba(image, kernelSpec, options = {})",
          "summary": ""
        },
        {
          "name": "filterImageMorphologyRgba",
          "kind": "function",
          "signature": "filterImageMorphologyRgba(image, operator = 'dilate', radius = 1, options = {})",
          "summary": ""
        },
        {
          "name": "filterImageDilateRgba",
          "kind": "function",
          "signature": "filterImageDilateRgba(image, radius = 1, options = {})",
          "summary": ""
        },
        {
          "name": "filterImageErodeRgba",
          "kind": "function",
          "signature": "filterImageErodeRgba(image, radius = 1, options = {})",
          "summary": ""
        },
        {
          "name": "FILTER_IMAGE_EDGE_MODES",
          "kind": "constant",
          "signature": "FILTER_IMAGE_EDGE_MODES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/FormatMath",
      "path": "engine/reference/core/math/FormatMath.md",
      "source": "engine/core/math/FormatMath.js",
      "import": "/engine/core/math/FormatMath.js",
      "sourceHash": "10e004f8205995967fb4bc2336bfb8e499e0b7b1b30f7c4495fbe722199e87cd",
      "summary": "FormatMath.js - reusable signatures, MIME helpers, SemVer, text ranges, token cursors, and chunk tables.",
      "exports": [
        {
          "name": "TokenCursor",
          "kind": "class",
          "signature": "class TokenCursor",
          "summary": ""
        },
        {
          "name": "byteSignature",
          "kind": "function",
          "signature": "byteSignature(data, options = {})",
          "summary": ""
        },
        {
          "name": "hexToBytes",
          "kind": "function",
          "signature": "hexToBytes(hex, options = {})",
          "summary": ""
        },
        {
          "name": "magicNumberDetect",
          "kind": "function",
          "signature": "magicNumberDetect(data, options = {})",
          "summary": ""
        },
        {
          "name": "formatExtensionFromPath",
          "kind": "function",
          "signature": "formatExtensionFromPath(pathOrExtension)",
          "summary": ""
        },
        {
          "name": "formatMimeFromExtension",
          "kind": "function",
          "signature": "formatMimeFromExtension(pathOrExtension, fallback = DEFAULT_MIME_TYPE)",
          "summary": ""
        },
        {
          "name": "parseMimeType",
          "kind": "function",
          "signature": "parseMimeType(input)",
          "summary": ""
        },
        {
          "name": "mimeTypeGroupReport",
          "kind": "function",
          "signature": "mimeTypeGroupReport(input)",
          "summary": ""
        },
        {
          "name": "formatMimeSniff",
          "kind": "function",
          "signature": "formatMimeSniff(data, options = {})",
          "summary": ""
        },
        {
          "name": "formatAcceptListReport",
          "kind": "function",
          "signature": "formatAcceptListReport(accept)",
          "summary": ""
        },
        {
          "name": "formatAcceptMatchReport",
          "kind": "function",
          "signature": "formatAcceptMatchReport(file, accept, options = {})",
          "summary": ""
        },
        {
          "name": "formatAcceptHeaderReport",
          "kind": "function",
          "signature": "formatAcceptHeaderReport(acceptHeader, offeredMimeTypes, options = {})",
          "summary": ""
        },
        {
          "name": "parseSemanticVersion",
          "kind": "function",
          "signature": "parseSemanticVersion(version)",
          "summary": ""
        },
        {
          "name": "semanticVersionCompare",
          "kind": "function",
          "signature": "semanticVersionCompare(leftVersion, rightVersion)",
          "summary": ""
        },
        {
          "name": "semanticVersionRangeReport",
          "kind": "function",
          "signature": "semanticVersionRangeReport(version, range = '*')",
          "summary": ""
        },
        {
          "name": "formatCompatibilityReport",
          "kind": "function",
          "signature": "formatCompatibilityReport(candidate, requirements = {}, options = {})",
          "summary": ""
        },
        {
          "name": "versionCompare",
          "kind": "function",
          "signature": "versionCompare(leftVersion, rightVersion)",
          "summary": ""
        },
        {
          "name": "lineColumnMap",
          "kind": "function",
          "signature": "lineColumnMap(text)",
          "summary": ""
        },
        {
          "name": "lineColumnAt",
          "kind": "function",
          "signature": "lineColumnAt(mapOrText, index)",
          "summary": ""
        },
        {
          "name": "lineColumnToIndex",
          "kind": "function",
          "signature": "lineColumnToIndex(mapOrText, line, column)",
          "summary": ""
        },
        {
          "name": "rangeSpan",
          "kind": "function",
          "signature": "rangeSpan(start, end, options = {})",
          "summary": ""
        },
        {
          "name": "chunkTableParse",
          "kind": "function",
          "signature": "chunkTableParse(data, options = {})",
          "summary": ""
        },
        {
          "name": "createTokenCursor",
          "kind": "function",
          "signature": "createTokenCursor(text, options = {})",
          "summary": ""
        },
        {
          "name": "FORMAT_EXTENSION_MIME_TYPES",
          "kind": "constant",
          "signature": "FORMAT_EXTENSION_MIME_TYPES",
          "summary": ""
        },
        {
          "name": "MAGIC_NUMBER_SIGNATURES",
          "kind": "constant",
          "signature": "MAGIC_NUMBER_SIGNATURES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/FrameMath",
      "path": "engine/reference/core/math/FrameMath.md",
      "source": "engine/core/math/FrameMath.js",
      "import": "/engine/core/math/FrameMath.js",
      "sourceHash": "b13c853f61ca50f618225929d6f4649b611eae58c41e4e7eb1e68e6a2dabc923",
      "summary": "FrameMath.js - pure ImageData-like frame and temporal media math helpers.",
      "exports": [
        {
          "name": "frameDataReport",
          "kind": "function",
          "signature": "frameDataReport(frame, options = {})",
          "summary": ""
        },
        {
          "name": "frameDifferenceReport",
          "kind": "function",
          "signature": "frameDifferenceReport(referenceFrame, candidateFrame, options = {})",
          "summary": ""
        },
        {
          "name": "frameMotionMagnitudeMap",
          "kind": "function",
          "signature": "frameMotionMagnitudeMap(referenceFrame, candidateFrame, options = {})",
          "summary": ""
        },
        {
          "name": "frameResidualImage",
          "kind": "function",
          "signature": "frameResidualImage(referenceFrame, candidateFrame, options = {})",
          "summary": ""
        },
        {
          "name": "frameAverageReport",
          "kind": "function",
          "signature": "frameAverageReport(frame, options = {})",
          "summary": ""
        },
        {
          "name": "frameSceneChangeReport",
          "kind": "function",
          "signature": "frameSceneChangeReport(referenceFrame, candidateFrame, options = {})",
          "summary": ""
        },
        {
          "name": "frameKeyframeScoreReport",
          "kind": "function",
          "signature": "frameKeyframeScoreReport(referenceFrame, candidateFrame, options = {})",
          "summary": ""
        },
        {
          "name": "frameSequenceDifferenceReport",
          "kind": "function",
          "signature": "frameSequenceDifferenceReport(frames, options = {})",
          "summary": ""
        },
        {
          "name": "runtimeFrameDeltaSeconds",
          "kind": "function",
          "signature": "runtimeFrameDeltaSeconds(timestampMs, previousTimestampMs, maxDeltaSeconds = 0.1)",
          "summary": ""
        },
        {
          "name": "runtimeMonotonicClockStep",
          "kind": "function",
          "signature": "runtimeMonotonicClockStep(timestampMs, previousTimestampMs = 0)",
          "summary": ""
        },
        {
          "name": "frameRateFromDurations",
          "kind": "function",
          "signature": "frameRateFromDurations(durationsSeconds)",
          "summary": ""
        },
        {
          "name": "frameTimingReport",
          "kind": "function",
          "signature": "frameTimingReport(frames, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/ImageMath",
      "path": "engine/reference/core/math/ImageMath.md",
      "source": "engine/core/math/ImageMath.js",
      "import": "/engine/core/math/ImageMath.js",
      "sourceHash": "207282ec98e1bb10425bba85c716479118e92e7304a2c0fb7222fee0bfe9acaf",
      "summary": "ImageMath.js - deterministic RGBA/ImageData pixel helpers. These helpers intentionally operate on ImageData-like objects or raw RGBA array data. They do not construct browser ImageData, canvas, bitmap, or GPU resources, so they remain safe for workers and deterministic tests.",
      "exports": [
        {
          "name": "imageDataReport",
          "kind": "function",
          "signature": "imageDataReport(image, options = {})",
          "summary": ""
        },
        {
          "name": "imagePixelOffset",
          "kind": "function",
          "signature": "imagePixelOffset(width, x, y, options = {})",
          "summary": ""
        },
        {
          "name": "imageReadPixel",
          "kind": "function",
          "signature": "imageReadPixel(image, x, y, options = {})",
          "summary": ""
        },
        {
          "name": "imageWritePixel",
          "kind": "function",
          "signature": "imageWritePixel(image, x, y, rgba, options = {})",
          "summary": ""
        },
        {
          "name": "imageSampleNearest",
          "kind": "function",
          "signature": "imageSampleNearest(image, x, y, options = {})",
          "summary": ""
        },
        {
          "name": "imageSampleBilinear",
          "kind": "function",
          "signature": "imageSampleBilinear(image, x, y, options = {})",
          "summary": ""
        },
        {
          "name": "imageCopyRect",
          "kind": "function",
          "signature": "imageCopyRect(image, rect = {}, options = {})",
          "summary": ""
        },
        {
          "name": "imageFlipX",
          "kind": "function",
          "signature": "imageFlipX(image, options = {})",
          "summary": ""
        },
        {
          "name": "imageFlipY",
          "kind": "function",
          "signature": "imageFlipY(image, options = {})",
          "summary": ""
        },
        {
          "name": "imageSwizzleRgba",
          "kind": "function",
          "signature": "imageSwizzleRgba(image, order = [0, 1, 2, 3], options = {})",
          "summary": ""
        },
        {
          "name": "imagePremultiplyAlpha",
          "kind": "function",
          "signature": "imagePremultiplyAlpha(image, options = {})",
          "summary": ""
        },
        {
          "name": "imageUnpremultiplyAlpha",
          "kind": "function",
          "signature": "imageUnpremultiplyAlpha(image, options = {})",
          "summary": ""
        },
        {
          "name": "imageHistogramReport",
          "kind": "function",
          "signature": "imageHistogramReport(image, options = {})",
          "summary": ""
        },
        {
          "name": "imageAverageColor",
          "kind": "function",
          "signature": "imageAverageColor(image, options = {})",
          "summary": ""
        },
        {
          "name": "imageLuminanceMap",
          "kind": "function",
          "signature": "imageLuminanceMap(image, options = {})",
          "summary": ""
        },
        {
          "name": "imageEdgeMap",
          "kind": "function",
          "signature": "imageEdgeMap(image, options = {})",
          "summary": ""
        },
        {
          "name": "IMAGE_CHANNEL_COUNT_RGBA",
          "kind": "constant",
          "signature": "IMAGE_CHANNEL_COUNT_RGBA",
          "summary": ""
        },
        {
          "name": "IMAGE_LUMA_REC709_BYTE_WEIGHTS",
          "kind": "constant",
          "signature": "IMAGE_LUMA_REC709_BYTE_WEIGHTS",
          "summary": ""
        },
        {
          "name": "IMAGE_EDGE_MODES",
          "kind": "constant",
          "signature": "IMAGE_EDGE_MODES",
          "summary": ""
        },
        {
          "name": "IMAGE_CHANNEL_INDEX",
          "kind": "constant",
          "signature": "IMAGE_CHANNEL_INDEX",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/InputSignalMath",
      "path": "engine/reference/core/math/InputSignalMath.md",
      "source": "engine/core/math/InputSignalMath.js",
      "import": "/engine/core/math/InputSignalMath.js",
      "sourceHash": "a44ea7e3a58ebec46c181cd7f0a67355e280ad3748840bd75399867593efe1fe",
      "summary": "InputSignalMath.js - pure pointer/stylus sample shaping, smoothing, and prediction helpers.",
      "exports": [
        {
          "name": "inputAxisRemapReport",
          "kind": "function",
          "signature": "inputAxisRemapReport(axis, options = {})",
          "summary": ""
        },
        {
          "name": "inputRadialDeadzoneReport",
          "kind": "function",
          "signature": "inputRadialDeadzoneReport(axes, options = {})",
          "summary": ""
        },
        {
          "name": "inputPressureCurve",
          "kind": "function",
          "signature": "inputPressureCurve(pressure, options = {})",
          "summary": ""
        },
        {
          "name": "inputPressureReport",
          "kind": "function",
          "signature": "inputPressureReport(samples, options = {})",
          "summary": ""
        },
        {
          "name": "pointerTiltToAltitudeAzimuth",
          "kind": "function",
          "signature": "pointerTiltToAltitudeAzimuth(tiltX = 0, tiltY = 0)",
          "summary": ""
        },
        {
          "name": "pointerAltitudeAzimuthToTilt",
          "kind": "function",
          "signature": "pointerAltitudeAzimuthToTilt(altitudeAngle = HALF_PI, azimuthAngle = 0)",
          "summary": ""
        },
        {
          "name": "inputSampleVelocityReport",
          "kind": "function",
          "signature": "inputSampleVelocityReport(samples, options = {})",
          "summary": ""
        },
        {
          "name": "smoothInputSamples",
          "kind": "function",
          "signature": "smoothInputSamples(samples, options = {})",
          "summary": ""
        },
        {
          "name": "predictInputSample",
          "kind": "function",
          "signature": "predictInputSample(samples, lookaheadMs = 16.6666666667, options = {})",
          "summary": ""
        },
        {
          "name": "blendInputSamples",
          "kind": "function",
          "signature": "blendInputSamples(leftSample, rightSample, amount = 0.5, options = {})",
          "summary": ""
        },
        {
          "name": "inputStrokeStabilizationReport",
          "kind": "function",
          "signature": "inputStrokeStabilizationReport(samples, options = {})",
          "summary": ""
        },
        {
          "name": "INPUT_SIGNAL_LIMITS",
          "kind": "constant",
          "signature": "INPUT_SIGNAL_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/JitterMath",
      "path": "engine/reference/core/math/JitterMath.md",
      "source": "engine/core/math/JitterMath.js",
      "import": "/engine/core/math/JitterMath.js",
      "sourceHash": "08fd171a30e601d401e76ef5f68f2915b900f6129ad7a0f7fdd06d5467c24bea",
      "summary": "JitterMath.js - packet delay variation, RTP/WebRTC jitter, and adaptive buffer reports.",
      "exports": [
        {
          "name": "jitterQualityScore",
          "kind": "function",
          "signature": "jitterQualityScore(jitterMs, options = {})",
          "summary": ""
        },
        {
          "name": "packetDelayVariationMs",
          "kind": "function",
          "signature": "packetDelayVariationMs(firstDelayMs, secondDelayMs)",
          "summary": ""
        },
        {
          "name": "packetDelayVariationReport",
          "kind": "function",
          "signature": "packetDelayVariationReport(samplesMs = [], options = {})",
          "summary": ""
        },
        {
          "name": "rtpJitterUpdateReport",
          "kind": "function",
          "signature": "rtpJitterUpdateReport(previous = null, packet = {}, options = {})",
          "summary": ""
        },
        {
          "name": "rtpJitterReport",
          "kind": "function",
          "signature": "rtpJitterReport(packets = [], options = {})",
          "summary": ""
        },
        {
          "name": "adaptiveJitterEstimateUpdate",
          "kind": "function",
          "signature": "adaptiveJitterEstimateUpdate(previous = {}, intervalMs, options = {})",
          "summary": ""
        },
        {
          "name": "adaptiveJitterBufferReport",
          "kind": "function",
          "signature": "adaptiveJitterBufferReport(options = {})",
          "summary": ""
        },
        {
          "name": "peerRttJitterReport",
          "kind": "function",
          "signature": "peerRttJitterReport(rttSamplesMs = [], options = {})",
          "summary": ""
        },
        {
          "name": "webRtcJitterBufferReport",
          "kind": "function",
          "signature": "webRtcJitterBufferReport(stats = {}, options = {})",
          "summary": ""
        },
        {
          "name": "interFrameDelayVariationReport",
          "kind": "function",
          "signature": "interFrameDelayVariationReport(stats = {})",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_EMA_ALPHA",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_EMA_ALPHA",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_TARGET_MS",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_TARGET_MS",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_MAX_MS",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_MAX_MS",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_BUFFER_MULTIPLIER",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_BUFFER_MULTIPLIER",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_MIN_BUFFER_DELAY_MS",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_MIN_BUFFER_DELAY_MS",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_MAX_BUFFER_DELAY_MS",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_MAX_BUFFER_DELAY_MS",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_SPIKE_FACTOR",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_SPIKE_FACTOR",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_RECOVER_RATE_MS",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_RECOVER_RATE_MS",
          "summary": ""
        },
        {
          "name": "JITTER_DEFAULT_RECOVER_AFTER_FRAMES",
          "kind": "constant",
          "signature": "JITTER_DEFAULT_RECOVER_AFTER_FRAMES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/LineToVoxel",
      "path": "engine/reference/core/math/LineToVoxel.md",
      "source": "engine/core/math/LineToVoxel.js",
      "import": "/engine/core/math/LineToVoxel.js",
      "sourceHash": "4ae367194401868c657d628e1031b7f27275d154487c59c2f0b776f399b9479d",
      "summary": "Node in a line network (branch point or endpoint)",
      "exports": [
        {
          "name": "NetworkNode",
          "kind": "class",
          "signature": "class NetworkNode",
          "summary": "Node in a line network (branch point or endpoint)"
        },
        {
          "name": "NetworkEdge",
          "kind": "class",
          "signature": "class NetworkEdge",
          "summary": "Edge connecting two nodes"
        },
        {
          "name": "LineNetwork",
          "kind": "class",
          "signature": "class LineNetwork",
          "summary": "Network of connected curves for voxelization"
        },
        {
          "name": "LineToVoxelizer",
          "kind": "class",
          "signature": "class LineToVoxelizer",
          "summary": "Convert line network to voxel density field"
        },
        {
          "name": "GPULineVoxelizer",
          "kind": "class",
          "signature": "class GPULineVoxelizer",
          "summary": "GPU-accelerated line network voxelizer"
        },
        {
          "name": "generateTree",
          "kind": "function",
          "signature": "generateTree(options = {})",
          "summary": "Generate a simple tree structure"
        },
        {
          "name": "generateRoots",
          "kind": "function",
          "signature": "generateRoots(options = {})",
          "summary": "Generate root system"
        },
        {
          "name": "generateTunnel",
          "kind": "function",
          "signature": "generateTunnel(options = {})",
          "summary": "Generate cave/tunnel network"
        },
        {
          "name": "DEFAULT_RESOLUTION",
          "kind": "constant",
          "signature": "DEFAULT_RESOLUTION",
          "summary": "Default voxel resolution"
        },
        {
          "name": "DEFAULT_BLEND_RADIUS",
          "kind": "constant",
          "signature": "DEFAULT_BLEND_RADIUS",
          "summary": "Blend radius for smooth junctions"
        },
        {
          "name": "Materials",
          "kind": "constant",
          "signature": "Materials",
          "summary": "Material IDs"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/LossyCompressionMath",
      "path": "engine/reference/core/math/LossyCompressionMath.md",
      "source": "engine/core/math/LossyCompressionMath.js",
      "import": "/engine/core/math/LossyCompressionMath.js",
      "sourceHash": "d5e6176ebb6916a7d8d4f864fa428124a36755e58bdbbee88221c1bf1f1fedba",
      "summary": "LossyCompressionMath.js - pure transform, quantization, and reconstruction reports.",
      "exports": [
        {
          "name": "lossyDct1D",
          "kind": "function",
          "signature": "lossyDct1D(values)",
          "summary": ""
        },
        {
          "name": "lossyIdct1D",
          "kind": "function",
          "signature": "lossyIdct1D(coefficients)",
          "summary": ""
        },
        {
          "name": "lossyDct2D",
          "kind": "function",
          "signature": "lossyDct2D(values, options = {})",
          "summary": ""
        },
        {
          "name": "lossyIdct2D",
          "kind": "function",
          "signature": "lossyIdct2D(coefficients, options = {})",
          "summary": ""
        },
        {
          "name": "lossyZigZagIndices",
          "kind": "function",
          "signature": "lossyZigZagIndices(width = DEFAULT_BLOCK_WIDTH, height = DEFAULT_BLOCK_HEIGHT)",
          "summary": ""
        },
        {
          "name": "lossyQuantizeCoefficients",
          "kind": "function",
          "signature": "lossyQuantizeCoefficients(coefficients, quantization = 1)",
          "summary": ""
        },
        {
          "name": "lossyScalarQuantizationReport",
          "kind": "function",
          "signature": "lossyScalarQuantizationReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "lossyResidualReport",
          "kind": "function",
          "signature": "lossyResidualReport(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "lossyBlockDctReport",
          "kind": "function",
          "signature": "lossyBlockDctReport(values, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathBits",
      "path": "engine/reference/core/math/MathBits.md",
      "source": "engine/core/math/MathBits.js",
      "import": "/engine/core/math/MathBits.js",
      "sourceHash": "50d03877b0c40a9289c5d5a82ad5aeeb0443977590077e22226783f601002f52",
      "summary": "MathBits.js - Bit manipulation, Morton codes, Hilbert curves, hash functions Critical for voxel systems, spatial indexing, and procedural generation",
      "exports": [
        {
          "name": "floorPowerOfTwo",
          "kind": "function",
          "signature": "floorPowerOfTwo(x)",
          "summary": ""
        },
        {
          "name": "nextPowerOf2",
          "kind": "function",
          "signature": "nextPowerOf2(x)",
          "summary": ""
        },
        {
          "name": "prevPowerOf2",
          "kind": "function",
          "signature": "prevPowerOf2(x)",
          "summary": ""
        },
        {
          "name": "popCount",
          "kind": "function",
          "signature": "popCount(x)",
          "summary": ""
        },
        {
          "name": "reverseBits",
          "kind": "function",
          "signature": "reverseBits(x)",
          "summary": ""
        },
        {
          "name": "ctz",
          "kind": "function",
          "signature": "ctz(x)",
          "summary": ""
        },
        {
          "name": "morton2DEncode",
          "kind": "function",
          "signature": "morton2DEncode(x, y)",
          "summary": ""
        },
        {
          "name": "morton2DDecode",
          "kind": "function",
          "signature": "morton2DDecode(m)",
          "summary": ""
        },
        {
          "name": "morton3DEncode",
          "kind": "function",
          "signature": "morton3DEncode(x, y, z)",
          "summary": ""
        },
        {
          "name": "morton3DDecode",
          "kind": "function",
          "signature": "morton3DDecode(m)",
          "summary": ""
        },
        {
          "name": "morton2DIncX",
          "kind": "function",
          "signature": "morton2DIncX(m)",
          "summary": ""
        },
        {
          "name": "morton2DIncY",
          "kind": "function",
          "signature": "morton2DIncY(m)",
          "summary": ""
        },
        {
          "name": "morton3DIncX",
          "kind": "function",
          "signature": "morton3DIncX(m)",
          "summary": ""
        },
        {
          "name": "morton3DIncY",
          "kind": "function",
          "signature": "morton3DIncY(m)",
          "summary": ""
        },
        {
          "name": "morton3DIncZ",
          "kind": "function",
          "signature": "morton3DIncZ(m)",
          "summary": ""
        },
        {
          "name": "hilbert2DEncode",
          "kind": "function",
          "signature": "hilbert2DEncode(n, x, y)",
          "summary": ""
        },
        {
          "name": "hilbert2DDecode",
          "kind": "function",
          "signature": "hilbert2DDecode(n, d)",
          "summary": ""
        },
        {
          "name": "hash1D",
          "kind": "function",
          "signature": "hash1D(n)",
          "summary": ""
        },
        {
          "name": "hash2D",
          "kind": "function",
          "signature": "hash2D(x, y)",
          "summary": ""
        },
        {
          "name": "hash3D",
          "kind": "function",
          "signature": "hash3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "hash4D",
          "kind": "function",
          "signature": "hash4D(x, y, z, w)",
          "summary": ""
        },
        {
          "name": "legacyStructureHash3D",
          "kind": "function",
          "signature": "legacyStructureHash3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "legacyWorldGeneratorHash3D",
          "kind": "function",
          "signature": "legacyWorldGeneratorHash3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "legacyStructureSeededHash3D",
          "kind": "function",
          "signature": "legacyStructureSeededHash3D(x, y, z, seed)",
          "summary": ""
        },
        {
          "name": "legacyStructureChunkSeed3D",
          "kind": "function",
          "signature": "legacyStructureChunkSeed3D(cx, cy, cz, seed = 0)",
          "summary": ""
        },
        {
          "name": "legacyStructurePositionSeed3D",
          "kind": "function",
          "signature": "legacyStructurePositionSeed3D(x, y, z, seed = 0)",
          "summary": ""
        },
        {
          "name": "legacyPrimeCoordinateXorHash3D",
          "kind": "function",
          "signature": "legacyPrimeCoordinateXorHash3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "legacyPrimeCoordinateAbsXorBucket3D",
          "kind": "function",
          "signature": "legacyPrimeCoordinateAbsXorBucket3D(x, y, z, tableSize)",
          "summary": ""
        },
        {
          "name": "legacyPrimeCoordinateU32XorBucket3D",
          "kind": "function",
          "signature": "legacyPrimeCoordinateU32XorBucket3D(x, y, z, tableSize)",
          "summary": ""
        },
        {
          "name": "legacyPrimeCoordinateSignedAddAbsBucket3D",
          "kind": "function",
          "signature": "legacyPrimeCoordinateSignedAddAbsBucket3D(x, y, z, tableSize)",
          "summary": ""
        },
        {
          "name": "legacyPrimeAxisHash32",
          "kind": "function",
          "signature": "legacyPrimeAxisHash32(value, axis = 'x', modulo = 0)",
          "summary": ""
        },
        {
          "name": "legacyWindTurbulenceAxisHash32",
          "kind": "function",
          "signature": "legacyWindTurbulenceAxisHash32(timeHash, axis)",
          "summary": ""
        },
        {
          "name": "legacyPrimeCoordinateXorSeed2D",
          "kind": "function",
          "signature": "legacyPrimeCoordinateXorSeed2D(x, z)",
          "summary": ""
        },
        {
          "name": "legacyPrimeCoordinateAdditiveSeed3D",
          "kind": "function",
          "signature": "legacyPrimeCoordinateAdditiveSeed3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "legacyDualRngPositionHash3D",
          "kind": "function",
          "signature": "legacyDualRngPositionHash3D(x, y, z, seed = 0)",
          "summary": ""
        },
        {
          "name": "legacySeedCharWeightedXorHash32",
          "kind": "function",
          "signature": "legacySeedCharWeightedXorHash32(seed, charCode, seedMultiplier, charMultiplier)",
          "summary": ""
        },
        {
          "name": "legacySeedCharXorHash32",
          "kind": "function",
          "signature": "legacySeedCharXorHash32(seed, charCode)",
          "summary": ""
        },
        {
          "name": "legacySeedCharEffectXorHash32",
          "kind": "function",
          "signature": "legacySeedCharEffectXorHash32(seed, charCode)",
          "summary": ""
        },
        {
          "name": "legacyGoldenRatioMul32",
          "kind": "function",
          "signature": "legacyGoldenRatioMul32(value)",
          "summary": ""
        },
        {
          "name": "legacyGoldenRatioChunkSeed32",
          "kind": "function",
          "signature": "legacyGoldenRatioChunkSeed32(seedBase, chunkIndex)",
          "summary": ""
        },
        {
          "name": "legacyMeshParticleSeed32",
          "kind": "function",
          "signature": "legacyMeshParticleSeed32(seedBase, triIndex, particleIndex)",
          "summary": ""
        },
        {
          "name": "legacyPcgAdvanceState32",
          "kind": "function",
          "signature": "legacyPcgAdvanceState32(state)",
          "summary": ""
        },
        {
          "name": "legacyPcgOutput32",
          "kind": "function",
          "signature": "legacyPcgOutput32(state)",
          "summary": ""
        },
        {
          "name": "legacyPcgHash32",
          "kind": "function",
          "signature": "legacyPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyPathTracingPcgHash32",
          "kind": "function",
          "signature": "legacyPathTracingPcgHash32(input)",
          "summary": ""
        },
        {
          "name": "legacyPbrMaterialsPcgHash32",
          "kind": "function",
          "signature": "legacyPbrMaterialsPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyFluidWaterPcgHash32",
          "kind": "function",
          "signature": "legacyFluidWaterPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyMagicEffectsPcgHash32",
          "kind": "function",
          "signature": "legacyMagicEffectsPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyPhaseVFXPcgHash32",
          "kind": "function",
          "signature": "legacyPhaseVFXPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyPathtracingGIPcgHash32",
          "kind": "function",
          "signature": "legacyPathtracingGIPcgHash32(input)",
          "summary": ""
        },
        {
          "name": "legacyPathtracingGIRandomFloat01Step",
          "kind": "function",
          "signature": "legacyPathtracingGIRandomFloat01Step(state)",
          "summary": ""
        },
        {
          "name": "legacyWorld3DPreviewPcgHash32",
          "kind": "function",
          "signature": "legacyWorld3DPreviewPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyAuroraPcgHash32",
          "kind": "function",
          "signature": "legacyAuroraPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyCelestialStarsPcgHash32",
          "kind": "function",
          "signature": "legacyCelestialStarsPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyUnderwaterPcgHash32",
          "kind": "function",
          "signature": "legacyUnderwaterPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyVoronoiRuntimePcgHash32",
          "kind": "function",
          "signature": "legacyVoronoiRuntimePcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyProceduralTreeRuntimePcgHash32",
          "kind": "function",
          "signature": "legacyProceduralTreeRuntimePcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyMeshToParticlesPcgHash32",
          "kind": "function",
          "signature": "legacyMeshToParticlesPcgHash32(input)",
          "summary": ""
        },
        {
          "name": "legacyMeshToParticlesRandomFloat01Step",
          "kind": "function",
          "signature": "legacyMeshToParticlesRandomFloat01Step(state)",
          "summary": ""
        },
        {
          "name": "legacyParticleRuntimeSdfPcgHash32",
          "kind": "function",
          "signature": "legacyParticleRuntimeSdfPcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyParticleRuntimePcgHash32",
          "kind": "function",
          "signature": "legacyParticleRuntimePcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyParticleRuntimeRandomFloat01Step",
          "kind": "function",
          "signature": "legacyParticleRuntimeRandomFloat01Step(state)",
          "summary": ""
        },
        {
          "name": "legacyRayTracingRandomFloat01Step",
          "kind": "function",
          "signature": "legacyRayTracingRandomFloat01Step(state)",
          "summary": ""
        },
        {
          "name": "legacyPcgRandomFloat01Step",
          "kind": "function",
          "signature": "legacyPcgRandomFloat01Step(state)",
          "summary": ""
        },
        {
          "name": "legacyPcgHashStepRandomFloat01Step",
          "kind": "function",
          "signature": "legacyPcgHashStepRandomFloat01Step(state)",
          "summary": ""
        },
        {
          "name": "legacyPcgPixelFrameHash2D",
          "kind": "function",
          "signature": "legacyPcgPixelFrameHash2D(x, y, frameIndex, salt = 0)",
          "summary": ""
        },
        {
          "name": "legacyPcgPixelFrameRandom24Float01",
          "kind": "function",
          "signature": "legacyPcgPixelFrameRandom24Float01(x, y, frameIndex, salt = 0)",
          "summary": ""
        },
        {
          "name": "legacyRestirTemporalHash2Float01",
          "kind": "function",
          "signature": "legacyRestirTemporalHash2Float01(x, y, frameIndex)",
          "summary": ""
        },
        {
          "name": "legacyRestirSpatialHash2Float01",
          "kind": "function",
          "signature": "legacyRestirSpatialHash2Float01(x, y, frameIndex)",
          "summary": ""
        },
        {
          "name": "legacyPcgCloudJitterHash2D",
          "kind": "function",
          "signature": "legacyPcgCloudJitterHash2D(xBits, yBits)",
          "summary": ""
        },
        {
          "name": "legacyVolumetricCloudsJitterPcgHash2D",
          "kind": "function",
          "signature": "legacyVolumetricCloudsJitterPcgHash2D(xBits, yBits)",
          "summary": ""
        },
        {
          "name": "legacyPcgSsrJitterHash2D",
          "kind": "function",
          "signature": "legacyPcgSsrJitterHash2D(xBits, yBits)",
          "summary": ""
        },
        {
          "name": "legacySsrJitterPcgHash2D",
          "kind": "function",
          "signature": "legacySsrJitterPcgHash2D(xBits, yBits)",
          "summary": ""
        },
        {
          "name": "legacyPcgSparkleHash3D",
          "kind": "function",
          "signature": "legacyPcgSparkleHash3D(xBits, yBits, zBits)",
          "summary": ""
        },
        {
          "name": "legacyCustomParticleSparklePcgHash3D",
          "kind": "function",
          "signature": "legacyCustomParticleSparklePcgHash3D(xBits, yBits, zBits)",
          "summary": ""
        },
        {
          "name": "legacyMarchingCubesMaterialPcgHash2D",
          "kind": "function",
          "signature": "legacyMarchingCubesMaterialPcgHash2D(xBits, zBits)",
          "summary": ""
        },
        {
          "name": "legacyParticleVertexQualityPcgHash2D",
          "kind": "function",
          "signature": "legacyParticleVertexQualityPcgHash2D(instanceIndex, centerXBits)",
          "summary": ""
        },
        {
          "name": "legacyParticleVertexQualityRandomFloat01",
          "kind": "function",
          "signature": "legacyParticleVertexQualityRandomFloat01(instanceIndex, centerXBits)",
          "summary": ""
        },
        {
          "name": "legacyStandaloneRuntimePcgHash32",
          "kind": "function",
          "signature": "legacyStandaloneRuntimePcgHash32(value)",
          "summary": ""
        },
        {
          "name": "legacyStandaloneRuntimePcgFloat01",
          "kind": "function",
          "signature": "legacyStandaloneRuntimePcgFloat01(value)",
          "summary": ""
        },
        {
          "name": "legacyStandaloneRuntimePcgHashStepRandomFloat01Step",
          "kind": "function",
          "signature": "legacyStandaloneRuntimePcgHashStepRandomFloat01Step(state)",
          "summary": ""
        },
        {
          "name": "legacyDeterministicRngTickSeed32",
          "kind": "function",
          "signature": "legacyDeterministicRngTickSeed32(worldSeed, tick)",
          "summary": ""
        },
        {
          "name": "legacyDeterministicRngEntitySeed32",
          "kind": "function",
          "signature": "legacyDeterministicRngEntitySeed32(worldSeed, entityId, tick)",
          "summary": ""
        },
        {
          "name": "legacyDeterministicRngPositionSeed32",
          "kind": "function",
          "signature": "legacyDeterministicRngPositionSeed32(worldSeed, x, y, z)",
          "summary": ""
        },
        {
          "name": "legacyDeterministicRngInteractionSeed32",
          "kind": "function",
          "signature": "legacyDeterministicRngInteractionSeed32(worldSeed, entityA, entityB, tick)",
          "summary": ""
        },
        {
          "name": "xxHash32",
          "kind": "function",
          "signature": "xxHash32(seed, data)",
          "summary": ""
        },
        {
          "name": "pcgHash",
          "kind": "function",
          "signature": "pcgHash(state)",
          "summary": ""
        },
        {
          "name": "spatialKey2D",
          "kind": "function",
          "signature": "spatialKey2D(x, y)",
          "summary": ""
        },
        {
          "name": "spatialUnkey2D",
          "kind": "function",
          "signature": "spatialUnkey2D(key)",
          "summary": ""
        },
        {
          "name": "spatialKey3D",
          "kind": "function",
          "signature": "spatialKey3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "spatialUnkey3D",
          "kind": "function",
          "signature": "spatialUnkey3D(key)",
          "summary": ""
        },
        {
          "name": "packUnorm",
          "kind": "function",
          "signature": "packUnorm(value, bits)",
          "summary": ""
        },
        {
          "name": "unpackUnorm",
          "kind": "function",
          "signature": "unpackUnorm(packed, bits)",
          "summary": ""
        },
        {
          "name": "packSnorm",
          "kind": "function",
          "signature": "packSnorm(value, bits)",
          "summary": ""
        },
        {
          "name": "unpackSnorm",
          "kind": "function",
          "signature": "unpackSnorm(packed, bits)",
          "summary": ""
        },
        {
          "name": "packRGB565",
          "kind": "function",
          "signature": "packRGB565(r, g, b)",
          "summary": ""
        },
        {
          "name": "unpackRGB565",
          "kind": "function",
          "signature": "unpackRGB565(packed)",
          "summary": ""
        },
        {
          "name": "packRGBA4444",
          "kind": "function",
          "signature": "packRGBA4444(r, g, b, a)",
          "summary": ""
        },
        {
          "name": "unpackRGBA4444",
          "kind": "function",
          "signature": "unpackRGBA4444(packed)",
          "summary": ""
        },
        {
          "name": "isPowerOf2",
          "kind": "function",
          "signature": "isPowerOf2(x)",
          "summary": ""
        },
        {
          "name": "log2Int",
          "kind": "function",
          "signature": "log2Int(x)",
          "summary": ""
        },
        {
          "name": "ceilLog2",
          "kind": "function",
          "signature": "ceilLog2(x)",
          "summary": ""
        },
        {
          "name": "clz",
          "kind": "function",
          "signature": "clz(x)",
          "summary": ""
        },
        {
          "name": "ffs",
          "kind": "function",
          "signature": "ffs(x)",
          "summary": ""
        },
        {
          "name": "byteSwap16",
          "kind": "function",
          "signature": "byteSwap16(x)",
          "summary": ""
        },
        {
          "name": "byteSwap32",
          "kind": "function",
          "signature": "byteSwap32(x)",
          "summary": ""
        },
        {
          "name": "rotateLeft",
          "kind": "function",
          "signature": "rotateLeft(x, n)",
          "summary": ""
        },
        {
          "name": "rotateRight",
          "kind": "function",
          "signature": "rotateRight(x, n)",
          "summary": ""
        },
        {
          "name": "hashFloat1D",
          "kind": "function",
          "signature": "hashFloat1D(n)",
          "summary": ""
        },
        {
          "name": "hashFloat2D",
          "kind": "function",
          "signature": "hashFloat2D(x, y)",
          "summary": ""
        },
        {
          "name": "hashFloat3D",
          "kind": "function",
          "signature": "hashFloat3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "spatialKeyString2D",
          "kind": "function",
          "signature": "spatialKeyString2D(x, y)",
          "summary": ""
        },
        {
          "name": "spatialKeyString3D",
          "kind": "function",
          "signature": "spatialKeyString3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "pack2x16",
          "kind": "function",
          "signature": "pack2x16(a, b)",
          "summary": ""
        },
        {
          "name": "unpack2x16",
          "kind": "function",
          "signature": "unpack2x16(packed)",
          "summary": ""
        },
        {
          "name": "pack4x8",
          "kind": "function",
          "signature": "pack4x8(a, b, c, d)",
          "summary": ""
        },
        {
          "name": "unpack4x8",
          "kind": "function",
          "signature": "unpack4x8(packed)",
          "summary": ""
        },
        {
          "name": "LEGACY_PRIME_COORDINATE_U32_XOR_BUCKET3D_WGSL",
          "kind": "constant",
          "signature": "LEGACY_PRIME_COORDINATE_U32_XOR_BUCKET3D_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_PRIME_COORDINATE_SIGNED_ADD_ABS_BUCKET3D_WGSL",
          "kind": "constant",
          "signature": "LEGACY_PRIME_COORDINATE_SIGNED_ADD_ABS_BUCKET3D_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_MESH_PARTICLE_SEED_WGSL",
          "kind": "constant",
          "signature": "LEGACY_MESH_PARTICLE_SEED_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_PCG32_WGSL",
          "kind": "constant",
          "signature": "LEGACY_PCG32_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_PARTICLE_VERTEX_QUALITY_PCG_WGSL",
          "kind": "constant",
          "signature": "LEGACY_PARTICLE_VERTEX_QUALITY_PCG_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_STANDALONE_RUNTIME_PCG_WGSL",
          "kind": "constant",
          "signature": "LEGACY_STANDALONE_RUNTIME_PCG_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_RENDER_RUNTIME_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "LEGACY_RENDER_RUNTIME_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_WORLD_GENERATION_RUNTIME_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "LEGACY_WORLD_GENERATION_RUNTIME_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "MESH_TO_PARTICLES_RUNTIME_PCG_WGSL",
          "kind": "constant",
          "signature": "MESH_TO_PARTICLES_RUNTIME_PCG_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_PARTICLE_RUNTIME_PCG_WGSL",
          "kind": "constant",
          "signature": "LEGACY_PARTICLE_RUNTIME_PCG_WGSL",
          "summary": ""
        },
        {
          "name": "PBR_MATERIALS_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "PBR_MATERIALS_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "FLUID_WATER_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "FLUID_WATER_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "MAGIC_EFFECTS_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "MAGIC_EFFECTS_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "PHASE_VFX_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "PHASE_VFX_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "PATH_TRACING_GI_PCG_WGSL",
          "kind": "constant",
          "signature": "PATH_TRACING_GI_PCG_WGSL",
          "summary": ""
        },
        {
          "name": "RAY_TRACING_RANDOM_FLOAT_WGSL",
          "kind": "constant",
          "signature": "RAY_TRACING_RANDOM_FLOAT_WGSL",
          "summary": ""
        },
        {
          "name": "LEGACY_DETERMINISTIC_RNG_SEED32_WGSL",
          "kind": "constant",
          "signature": "LEGACY_DETERMINISTIC_RNG_SEED32_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathColor",
      "path": "engine/reference/core/math/MathColor.md",
      "source": "engine/core/math/MathColor.js",
      "import": "/engine/core/math/MathColor.js",
      "sourceHash": "bf522bdf31790488e62f46ccf2871f3574668250eaa7d6b3414e9ba1e17e2e56",
      "summary": "MathColor.js - Color spaces and conversions RGB, HSL, HSV, LAB, LCH, OKLAB, OKLCH, hex, blend modes, gradients, palettes",
      "exports": [
        {
          "name": "colorSpaceMetadata",
          "kind": "function",
          "signature": "colorSpaceMetadata(colorSpace = 'srgb')",
          "summary": ""
        },
        {
          "name": "srgbChannelToLinear",
          "kind": "function",
          "signature": "srgbChannelToLinear(value)",
          "summary": ""
        },
        {
          "name": "linearChannelToSrgb",
          "kind": "function",
          "signature": "linearChannelToSrgb(value)",
          "summary": ""
        },
        {
          "name": "srgbToLinearRgb",
          "kind": "function",
          "signature": "srgbToLinearRgb(color)",
          "summary": ""
        },
        {
          "name": "linearRgbToSrgb",
          "kind": "function",
          "signature": "linearRgbToSrgb(color)",
          "summary": ""
        },
        {
          "name": "linearRgbLuminance",
          "kind": "function",
          "signature": "linearRgbLuminance(color, coefficients = COLOR_LUMA_REC709)",
          "summary": ""
        },
        {
          "name": "relativeLuminance",
          "kind": "function",
          "signature": "relativeLuminance(color)",
          "summary": ""
        },
        {
          "name": "contrastRatio",
          "kind": "function",
          "signature": "contrastRatio(a, b)",
          "summary": ""
        },
        {
          "name": "rgbToYuv",
          "kind": "function",
          "signature": "rgbToYuv(color)",
          "summary": ""
        },
        {
          "name": "yuvToRgb",
          "kind": "function",
          "signature": "yuvToRgb(color)",
          "summary": ""
        },
        {
          "name": "rgbToYCbCr",
          "kind": "function",
          "signature": "rgbToYCbCr(color)",
          "summary": ""
        },
        {
          "name": "yCbCrToRgb",
          "kind": "function",
          "signature": "yCbCrToRgb(color)",
          "summary": ""
        },
        {
          "name": "toneMapReinhard",
          "kind": "function",
          "signature": "toneMapReinhard(color)",
          "summary": ""
        },
        {
          "name": "toneMapReinhardExtended",
          "kind": "function",
          "signature": "toneMapReinhardExtended(color, whitePoint = 1)",
          "summary": ""
        },
        {
          "name": "toneMapACES",
          "kind": "function",
          "signature": "toneMapACES(color)",
          "summary": ""
        },
        {
          "name": "colorExposure",
          "kind": "function",
          "signature": "colorExposure(color, exposure = 1)",
          "summary": ""
        },
        {
          "name": "colorContrastAdjust",
          "kind": "function",
          "signature": "colorContrastAdjust(color, amount = 1, pivot = 0.5)",
          "summary": ""
        },
        {
          "name": "colorSaturationAdjust",
          "kind": "function",
          "signature": "colorSaturationAdjust(color, amount = 1, coefficients = COLOR_LUMA_REC709)",
          "summary": ""
        },
        {
          "name": "colorGamutReport",
          "kind": "function",
          "signature": "colorGamutReport(color, options = {})",
          "summary": ""
        },
        {
          "name": "colorHdrMetadataReport",
          "kind": "function",
          "signature": "colorHdrMetadataReport(options = {})",
          "summary": ""
        },
        {
          "name": "colorDisplayTransformReport",
          "kind": "function",
          "signature": "colorDisplayTransformReport(color, options = {})",
          "summary": ""
        },
        {
          "name": "colorDisplayCapabilityReport",
          "kind": "function",
          "signature": "colorDisplayCapabilityReport(observed = {}, options = {})",
          "summary": ""
        },
        {
          "name": "canvasColorSettingsReport",
          "kind": "function",
          "signature": "canvasColorSettingsReport(settings = {}, observedAttributes = null)",
          "summary": ""
        },
        {
          "name": "canvasPixelReadbackReport",
          "kind": "function",
          "signature": "canvasPixelReadbackReport(settings = {}, observedReadback = {}, options = {})",
          "summary": ""
        },
        {
          "name": "canvasPixelReadbackCapabilityReport",
          "kind": "function",
          "signature": "canvasPixelReadbackCapabilityReport(cases = [], options = {})",
          "summary": ""
        },
        {
          "name": "canvasPixelReadbackPrecisionReport",
          "kind": "function",
          "signature": "canvasPixelReadbackPrecisionReport(cases = [], options = {})",
          "summary": ""
        },
        {
          "name": "cssRelativeColorReport",
          "kind": "function",
          "signature": "cssRelativeColorReport(value, options = {})",
          "summary": ""
        },
        {
          "name": "cssNamedColorReport",
          "kind": "function",
          "signature": "cssNamedColorReport(value)",
          "summary": ""
        },
        {
          "name": "cssSystemColorReport",
          "kind": "function",
          "signature": "cssSystemColorReport(value, options = {})",
          "summary": ""
        },
        {
          "name": "cssSystemColorResolutionReport",
          "kind": "function",
          "signature": "cssSystemColorResolutionReport(systemColors = {}, options = {})",
          "summary": ""
        },
        {
          "name": "cssColorParseReport",
          "kind": "function",
          "signature": "cssColorParseReport(value, options = {})",
          "summary": ""
        },
        {
          "name": "colorContrastChoiceReport",
          "kind": "function",
          "signature": "colorContrastChoiceReport(background, candidates = [[0, 0, 0], [1, 1, 1]], options = {})",
          "summary": ""
        },
        {
          "name": "cssLightDarkColorReport",
          "kind": "function",
          "signature": "cssLightDarkColorReport(lightColor, darkColor, options = {})",
          "summary": ""
        },
        {
          "name": "rgbContrast",
          "kind": "function",
          "signature": "rgbContrast(c, amount)",
          "summary": ""
        },
        {
          "name": "rgbSaturateAmount",
          "kind": "function",
          "signature": "rgbSaturateAmount(c, amount)",
          "summary": ""
        },
        {
          "name": "rgbBrighten",
          "kind": "function",
          "signature": "rgbBrighten(c, amount)",
          "summary": ""
        },
        {
          "name": "hexToRgb",
          "kind": "function",
          "signature": "hexToRgb(hex)",
          "summary": ""
        },
        {
          "name": "rgbToHex",
          "kind": "function",
          "signature": "rgbToHex(c)",
          "summary": ""
        },
        {
          "name": "byteRgbToHex",
          "kind": "function",
          "signature": "byteRgbToHex(r, g, b)",
          "summary": ""
        },
        {
          "name": "hexToRgba",
          "kind": "function",
          "signature": "hexToRgba(hex)",
          "summary": ""
        },
        {
          "name": "rgbaToHex",
          "kind": "function",
          "signature": "rgbaToHex(c)",
          "summary": ""
        },
        {
          "name": "intToRgb",
          "kind": "function",
          "signature": "intToRgb(int)",
          "summary": ""
        },
        {
          "name": "rgbToInt",
          "kind": "function",
          "signature": "rgbToInt(c)",
          "summary": ""
        },
        {
          "name": "rgbToHsl",
          "kind": "function",
          "signature": "rgbToHsl(c)",
          "summary": ""
        },
        {
          "name": "hslToRgb",
          "kind": "function",
          "signature": "hslToRgb(c)",
          "summary": ""
        },
        {
          "name": "rgbToHsv",
          "kind": "function",
          "signature": "rgbToHsv(c)",
          "summary": ""
        },
        {
          "name": "hsvToRgb",
          "kind": "function",
          "signature": "hsvToRgb(c)",
          "summary": ""
        },
        {
          "name": "rgbToXyz",
          "kind": "function",
          "signature": "rgbToXyz(c)",
          "summary": ""
        },
        {
          "name": "xyzD65ToD50",
          "kind": "function",
          "signature": "xyzD65ToD50(xyz)",
          "summary": ""
        },
        {
          "name": "xyzD50ToD65",
          "kind": "function",
          "signature": "xyzD50ToD65(xyz)",
          "summary": ""
        },
        {
          "name": "xyzToRgb",
          "kind": "function",
          "signature": "xyzToRgb(c)",
          "summary": ""
        },
        {
          "name": "xyzToLab",
          "kind": "function",
          "signature": "xyzToLab(c)",
          "summary": ""
        },
        {
          "name": "labToXyz",
          "kind": "function",
          "signature": "labToXyz(c)",
          "summary": ""
        },
        {
          "name": "labDistance",
          "kind": "function",
          "signature": "labDistance(a, b)",
          "summary": ""
        },
        {
          "name": "labToLch",
          "kind": "function",
          "signature": "labToLch(c)",
          "summary": ""
        },
        {
          "name": "lchToLab",
          "kind": "function",
          "signature": "lchToLab(c)",
          "summary": ""
        },
        {
          "name": "rgbToOklab",
          "kind": "function",
          "signature": "rgbToOklab(c)",
          "summary": ""
        },
        {
          "name": "oklabToRgb",
          "kind": "function",
          "signature": "oklabToRgb(c)",
          "summary": ""
        },
        {
          "name": "oklabToOklch",
          "kind": "function",
          "signature": "oklabToOklch(c)",
          "summary": ""
        },
        {
          "name": "oklchToOklab",
          "kind": "function",
          "signature": "oklchToOklab(c)",
          "summary": ""
        },
        {
          "name": "rgbLerpOklab",
          "kind": "function",
          "signature": "rgbLerpOklab(a, b, t)",
          "summary": ""
        },
        {
          "name": "kelvinToRgb",
          "kind": "function",
          "signature": "kelvinToRgb(kelvin)",
          "summary": ""
        },
        {
          "name": "blendSoftLight",
          "kind": "function",
          "signature": "blendSoftLight(base, blend)",
          "summary": ""
        },
        {
          "name": "blendHardLight",
          "kind": "function",
          "signature": "blendHardLight(base, blend)",
          "summary": ""
        },
        {
          "name": "blendColorDodge",
          "kind": "function",
          "signature": "blendColorDodge(base, blend)",
          "summary": ""
        },
        {
          "name": "blendColorBurn",
          "kind": "function",
          "signature": "blendColorBurn(base, blend)",
          "summary": ""
        },
        {
          "name": "gradientLinear",
          "kind": "function",
          "signature": "gradientLinear(stops, t)",
          "summary": ""
        },
        {
          "name": "gradientOklab",
          "kind": "function",
          "signature": "gradientOklab(stops, t)",
          "summary": ""
        },
        {
          "name": "paletteAnalogous",
          "kind": "function",
          "signature": "paletteAnalogous(baseHue, count = 5, spread = 30)",
          "summary": ""
        },
        {
          "name": "paletteComplementary",
          "kind": "function",
          "signature": "paletteComplementary(baseHue)",
          "summary": ""
        },
        {
          "name": "paletteTriadic",
          "kind": "function",
          "signature": "paletteTriadic(baseHue)",
          "summary": ""
        },
        {
          "name": "paletteSplitComplementary",
          "kind": "function",
          "signature": "paletteSplitComplementary(baseHue, spread = 30)",
          "summary": ""
        },
        {
          "name": "paletteTetradic",
          "kind": "function",
          "signature": "paletteTetradic(baseHue)",
          "summary": ""
        },
        {
          "name": "paletteMonochromatic",
          "kind": "function",
          "signature": "paletteMonochromatic(baseHue, count = 5)",
          "summary": ""
        },
        {
          "name": "rgb",
          "kind": "function",
          "signature": "rgb(r, g, b)",
          "summary": ""
        },
        {
          "name": "rgba",
          "kind": "function",
          "signature": "rgba(r, g, b, a = 1)",
          "summary": ""
        },
        {
          "name": "rgbClone",
          "kind": "function",
          "signature": "rgbClone(c)",
          "summary": ""
        },
        {
          "name": "rgbAdd",
          "kind": "function",
          "signature": "rgbAdd(a, b)",
          "summary": ""
        },
        {
          "name": "rgbSub",
          "kind": "function",
          "signature": "rgbSub(a, b)",
          "summary": ""
        },
        {
          "name": "rgbMul",
          "kind": "function",
          "signature": "rgbMul(a, b)",
          "summary": ""
        },
        {
          "name": "rgbScale",
          "kind": "function",
          "signature": "rgbScale(c, s)",
          "summary": ""
        },
        {
          "name": "rgbLerp",
          "kind": "function",
          "signature": "rgbLerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "rgbClamp",
          "kind": "function",
          "signature": "rgbClamp(c)",
          "summary": ""
        },
        {
          "name": "rgbLuminance",
          "kind": "function",
          "signature": "rgbLuminance(c)",
          "summary": ""
        },
        {
          "name": "rgbBrightness",
          "kind": "function",
          "signature": "rgbBrightness(c)",
          "summary": ""
        },
        {
          "name": "rgbMax",
          "kind": "function",
          "signature": "rgbMax(c)",
          "summary": ""
        },
        {
          "name": "rgbMin",
          "kind": "function",
          "signature": "rgbMin(c)",
          "summary": ""
        },
        {
          "name": "rgbInvert",
          "kind": "function",
          "signature": "rgbInvert(c)",
          "summary": ""
        },
        {
          "name": "rgbGrayscale",
          "kind": "function",
          "signature": "rgbGrayscale(c)",
          "summary": ""
        },
        {
          "name": "hslLerp",
          "kind": "function",
          "signature": "hslLerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "rgbToLab",
          "kind": "function",
          "signature": "rgbToLab(c)",
          "summary": ""
        },
        {
          "name": "labToRgb",
          "kind": "function",
          "signature": "labToRgb(c)",
          "summary": ""
        },
        {
          "name": "rgbDistance",
          "kind": "function",
          "signature": "rgbDistance(a, b)",
          "summary": ""
        },
        {
          "name": "rgbToLch",
          "kind": "function",
          "signature": "rgbToLch(c)",
          "summary": ""
        },
        {
          "name": "lchToRgb",
          "kind": "function",
          "signature": "lchToRgb(c)",
          "summary": ""
        },
        {
          "name": "rgbToOklch",
          "kind": "function",
          "signature": "rgbToOklch(c)",
          "summary": ""
        },
        {
          "name": "oklchToRgb",
          "kind": "function",
          "signature": "oklchToRgb(c)",
          "summary": ""
        },
        {
          "name": "blendNormal",
          "kind": "function",
          "signature": "blendNormal(base, blend)",
          "summary": ""
        },
        {
          "name": "blendMultiply",
          "kind": "function",
          "signature": "blendMultiply(base, blend)",
          "summary": ""
        },
        {
          "name": "blendScreen",
          "kind": "function",
          "signature": "blendScreen(base, blend)",
          "summary": ""
        },
        {
          "name": "blendOverlay",
          "kind": "function",
          "signature": "blendOverlay(base, blend)",
          "summary": ""
        },
        {
          "name": "blendDarken",
          "kind": "function",
          "signature": "blendDarken(base, blend)",
          "summary": ""
        },
        {
          "name": "blendLighten",
          "kind": "function",
          "signature": "blendLighten(base, blend)",
          "summary": ""
        },
        {
          "name": "blendDifference",
          "kind": "function",
          "signature": "blendDifference(base, blend)",
          "summary": ""
        },
        {
          "name": "blendExclusion",
          "kind": "function",
          "signature": "blendExclusion(base, blend)",
          "summary": ""
        },
        {
          "name": "blendAdd",
          "kind": "function",
          "signature": "blendAdd(base, blend)",
          "summary": ""
        },
        {
          "name": "blendSubtract",
          "kind": "function",
          "signature": "blendSubtract(base, blend)",
          "summary": ""
        },
        {
          "name": "COLOR_LUMA_REC709",
          "kind": "constant",
          "signature": "COLOR_LUMA_REC709",
          "summary": ""
        },
        {
          "name": "COLOR_LUMA_REC601",
          "kind": "constant",
          "signature": "COLOR_LUMA_REC601",
          "summary": ""
        },
        {
          "name": "COLOR_LUMA_REC2020",
          "kind": "constant",
          "signature": "COLOR_LUMA_REC2020",
          "summary": ""
        },
        {
          "name": "COLOR_SPACE_METADATA",
          "kind": "constant",
          "signature": "COLOR_SPACE_METADATA",
          "summary": ""
        },
        {
          "name": "CSS_NAMED_COLORS",
          "kind": "constant",
          "signature": "CSS_NAMED_COLORS",
          "summary": ""
        },
        {
          "name": "CSS_SYSTEM_COLOR_KEYWORDS",
          "kind": "constant",
          "signature": "CSS_SYSTEM_COLOR_KEYWORDS",
          "summary": ""
        },
        {
          "name": "CSS_DEPRECATED_SYSTEM_COLOR_MAP",
          "kind": "constant",
          "signature": "CSS_DEPRECATED_SYSTEM_COLOR_MAP",
          "summary": ""
        },
        {
          "name": "CANVAS_PREDEFINED_COLOR_SPACES",
          "kind": "constant",
          "signature": "CANVAS_PREDEFINED_COLOR_SPACES",
          "summary": ""
        },
        {
          "name": "CANVAS_COLOR_TYPES",
          "kind": "constant",
          "signature": "CANVAS_COLOR_TYPES",
          "summary": ""
        },
        {
          "name": "CANVAS_IMAGE_DATA_COLOR_SPACES",
          "kind": "constant",
          "signature": "CANVAS_IMAGE_DATA_COLOR_SPACES",
          "summary": ""
        },
        {
          "name": "CANVAS_IMAGE_DATA_PIXEL_FORMATS",
          "kind": "constant",
          "signature": "CANVAS_IMAGE_DATA_PIXEL_FORMATS",
          "summary": ""
        },
        {
          "name": "DISPLAY_COLOR_GAMUT_MEDIA_VALUES",
          "kind": "constant",
          "signature": "DISPLAY_COLOR_GAMUT_MEDIA_VALUES",
          "summary": ""
        },
        {
          "name": "DISPLAY_DYNAMIC_RANGE_MEDIA_VALUES",
          "kind": "constant",
          "signature": "DISPLAY_DYNAMIC_RANGE_MEDIA_VALUES",
          "summary": ""
        },
        {
          "name": "COLOR_WHITE",
          "kind": "constant",
          "signature": "COLOR_WHITE",
          "summary": ""
        },
        {
          "name": "COLOR_BLACK",
          "kind": "constant",
          "signature": "COLOR_BLACK",
          "summary": ""
        },
        {
          "name": "COLOR_RED",
          "kind": "constant",
          "signature": "COLOR_RED",
          "summary": ""
        },
        {
          "name": "COLOR_GREEN",
          "kind": "constant",
          "signature": "COLOR_GREEN",
          "summary": ""
        },
        {
          "name": "COLOR_BLUE",
          "kind": "constant",
          "signature": "COLOR_BLUE",
          "summary": ""
        },
        {
          "name": "COLOR_YELLOW",
          "kind": "constant",
          "signature": "COLOR_YELLOW",
          "summary": ""
        },
        {
          "name": "COLOR_CYAN",
          "kind": "constant",
          "signature": "COLOR_CYAN",
          "summary": ""
        },
        {
          "name": "COLOR_MAGENTA",
          "kind": "constant",
          "signature": "COLOR_MAGENTA",
          "summary": ""
        },
        {
          "name": "COLOR_ORANGE",
          "kind": "constant",
          "signature": "COLOR_ORANGE",
          "summary": ""
        },
        {
          "name": "COLOR_PURPLE",
          "kind": "constant",
          "signature": "COLOR_PURPLE",
          "summary": ""
        },
        {
          "name": "COLOR_GRAY",
          "kind": "constant",
          "signature": "COLOR_GRAY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathConstants",
      "path": "engine/reference/core/math/MathConstants.md",
      "source": "engine/core/math/MathConstants.js",
      "import": "/engine/core/math/MathConstants.js",
      "sourceHash": "1b371cf20b8eb32d54c6d20454fc7f09dc12375b90025c7433cfb5b92c8643e8",
      "summary": "",
      "exports": [
        {
          "name": "PI",
          "kind": "constant",
          "signature": "PI",
          "summary": ""
        },
        {
          "name": "TAU",
          "kind": "constant",
          "signature": "TAU",
          "summary": ""
        },
        {
          "name": "HALF_PI",
          "kind": "constant",
          "signature": "HALF_PI",
          "summary": ""
        },
        {
          "name": "QUARTER_PI",
          "kind": "constant",
          "signature": "QUARTER_PI",
          "summary": ""
        },
        {
          "name": "DEG2RAD",
          "kind": "constant",
          "signature": "DEG2RAD",
          "summary": ""
        },
        {
          "name": "RAD2DEG",
          "kind": "constant",
          "signature": "RAD2DEG",
          "summary": ""
        },
        {
          "name": "EPSILON",
          "kind": "constant",
          "signature": "EPSILON",
          "summary": ""
        },
        {
          "name": "PHI",
          "kind": "constant",
          "signature": "PHI",
          "summary": ""
        },
        {
          "name": "SQRT2",
          "kind": "constant",
          "signature": "SQRT2",
          "summary": ""
        },
        {
          "name": "SQRT3",
          "kind": "constant",
          "signature": "SQRT3",
          "summary": ""
        },
        {
          "name": "SQRT5",
          "kind": "constant",
          "signature": "SQRT5",
          "summary": ""
        },
        {
          "name": "INV_SQRT2",
          "kind": "constant",
          "signature": "INV_SQRT2",
          "summary": ""
        },
        {
          "name": "INV_SQRT3",
          "kind": "constant",
          "signature": "INV_SQRT3",
          "summary": ""
        },
        {
          "name": "E",
          "kind": "constant",
          "signature": "E",
          "summary": ""
        },
        {
          "name": "LN2",
          "kind": "constant",
          "signature": "LN2",
          "summary": ""
        },
        {
          "name": "LN10",
          "kind": "constant",
          "signature": "LN10",
          "summary": ""
        },
        {
          "name": "LOG2E",
          "kind": "constant",
          "signature": "LOG2E",
          "summary": ""
        },
        {
          "name": "LOG10E",
          "kind": "constant",
          "signature": "LOG10E",
          "summary": ""
        },
        {
          "name": "SPEED_OF_LIGHT",
          "kind": "constant",
          "signature": "SPEED_OF_LIGHT",
          "summary": ""
        },
        {
          "name": "PLANCK",
          "kind": "constant",
          "signature": "PLANCK",
          "summary": ""
        },
        {
          "name": "BOLTZMANN",
          "kind": "constant",
          "signature": "BOLTZMANN",
          "summary": ""
        },
        {
          "name": "AVOGADRO",
          "kind": "constant",
          "signature": "AVOGADRO",
          "summary": ""
        },
        {
          "name": "GRAVITATIONAL",
          "kind": "constant",
          "signature": "GRAVITATIONAL",
          "summary": ""
        },
        {
          "name": "EARTH_GRAVITY",
          "kind": "constant",
          "signature": "EARTH_GRAVITY",
          "summary": ""
        },
        {
          "name": "EARTH_RADIUS",
          "kind": "constant",
          "signature": "EARTH_RADIUS",
          "summary": ""
        },
        {
          "name": "EARTH_MASS",
          "kind": "constant",
          "signature": "EARTH_MASS",
          "summary": ""
        },
        {
          "name": "STEFAN_BOLTZMANN",
          "kind": "constant",
          "signature": "STEFAN_BOLTZMANN",
          "summary": ""
        },
        {
          "name": "VACUUM_PERMITTIVITY",
          "kind": "constant",
          "signature": "VACUUM_PERMITTIVITY",
          "summary": ""
        },
        {
          "name": "VACUUM_PERMEABILITY",
          "kind": "constant",
          "signature": "VACUUM_PERMEABILITY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathDualQuat",
      "path": "engine/reference/core/math/MathDualQuat.md",
      "source": "engine/core/math/MathDualQuat.js",
      "import": "/engine/core/math/MathDualQuat.js",
      "sourceHash": "df9af00af6769c29b4352b65a64db88653958ef7ebbe3f4d671388e5845e2ec7",
      "summary": "MathDualQuat.js - Dual Quaternion operations for skinning & rigid body interpolation Dual quaternion = [real_x, real_y, real_z, real_w, dual_x, dual_y, dual_z, dual_w] Real part = rotation quaternion, Dual part encodes translation Used for: DQS (Dual Quaternion Skinning), rigid body interpolation, screw motion",
      "exports": [
        {
          "name": "dqFromRotationTranslation",
          "kind": "function",
          "signature": "dqFromRotationTranslation(q, t)",
          "summary": ""
        },
        {
          "name": "dqFromMat4",
          "kind": "function",
          "signature": "dqFromMat4(m)",
          "summary": ""
        },
        {
          "name": "dqGetTranslation",
          "kind": "function",
          "signature": "dqGetTranslation(dq)",
          "summary": ""
        },
        {
          "name": "dqToMat4",
          "kind": "function",
          "signature": "dqToMat4(dq)",
          "summary": ""
        },
        {
          "name": "dqMultiply",
          "kind": "function",
          "signature": "dqMultiply(a, b)",
          "summary": ""
        },
        {
          "name": "dqConjugate",
          "kind": "function",
          "signature": "dqConjugate(dq)",
          "summary": ""
        },
        {
          "name": "dqNormalize",
          "kind": "function",
          "signature": "dqNormalize(dq)",
          "summary": ""
        },
        {
          "name": "dqInverse",
          "kind": "function",
          "signature": "dqInverse(dq)",
          "summary": ""
        },
        {
          "name": "dqLerp",
          "kind": "function",
          "signature": "dqLerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "dqSclerp",
          "kind": "function",
          "signature": "dqSclerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "dqTransformPoint",
          "kind": "function",
          "signature": "dqTransformPoint(dq, point)",
          "summary": ""
        },
        {
          "name": "dqTransformVec3",
          "kind": "function",
          "signature": "dqTransformVec3(dq, vec)",
          "summary": ""
        },
        {
          "name": "dqEquals",
          "kind": "function",
          "signature": "dqEquals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "dqCreate",
          "kind": "function",
          "signature": "dqCreate(rx, ry, rz, rw, dx, dy, dz, dw)",
          "summary": ""
        },
        {
          "name": "dqIdentity",
          "kind": "function",
          "signature": "dqIdentity()",
          "summary": ""
        },
        {
          "name": "dqClone",
          "kind": "function",
          "signature": "dqClone(dq)",
          "summary": ""
        },
        {
          "name": "dqCopy",
          "kind": "function",
          "signature": "dqCopy(out, dq)",
          "summary": ""
        },
        {
          "name": "dqGetRotation",
          "kind": "function",
          "signature": "dqGetRotation(dq)",
          "summary": ""
        },
        {
          "name": "dqAdd",
          "kind": "function",
          "signature": "dqAdd(a, b)",
          "summary": ""
        },
        {
          "name": "dqScale",
          "kind": "function",
          "signature": "dqScale(dq, s)",
          "summary": ""
        },
        {
          "name": "dqDot",
          "kind": "function",
          "signature": "dqDot(a, b)",
          "summary": ""
        },
        {
          "name": "dqLength",
          "kind": "function",
          "signature": "dqLength(dq)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathEasing",
      "path": "engine/reference/core/math/MathEasing.md",
      "source": "engine/core/math/MathEasing.js",
      "import": "/engine/core/math/MathEasing.js",
      "sourceHash": "674a42a676226f51a26f38166050fc380aafafbdfefa9a84a7856160883ee486",
      "summary": "MathEasing.js - Easing functions, Bezier curves, splines For animation, UI transitions, and procedural motion",
      "exports": [
        {
          "name": "easeOutBounce",
          "kind": "function",
          "signature": "easeOutBounce(t)",
          "summary": ""
        },
        {
          "name": "easeSpring",
          "kind": "function",
          "signature": "easeSpring(t, mass = 1, stiffness = 100, damping = 10)",
          "summary": ""
        },
        {
          "name": "easeSpringSimple",
          "kind": "function",
          "signature": "easeSpringSimple(t, bounces = 3, decay = 0.4)",
          "summary": ""
        },
        {
          "name": "cssCubicBezierValue",
          "kind": "function",
          "signature": "cssCubicBezierValue(x1, y1, x2, y2, progress)",
          "summary": ""
        },
        {
          "name": "cssStepEasing",
          "kind": "function",
          "signature": "cssStepEasing(progress, steps = 1, position = 'end', options = {})",
          "summary": ""
        },
        {
          "name": "cssEasingParseReport",
          "kind": "function",
          "signature": "cssEasingParseReport(easing)",
          "summary": ""
        },
        {
          "name": "cssEasingReport",
          "kind": "function",
          "signature": "cssEasingReport(easing, progress, options = {})",
          "summary": ""
        },
        {
          "name": "cssEasingValue",
          "kind": "function",
          "signature": "cssEasingValue(easing, progress, options = {})",
          "summary": ""
        },
        {
          "name": "cubicBezierEasing",
          "kind": "function",
          "signature": "cubicBezierEasing(x1, y1, x2, y2)",
          "summary": ""
        },
        {
          "name": "catmullRom",
          "kind": "function",
          "signature": "catmullRom(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "catmullRomSpline",
          "kind": "function",
          "signature": "catmullRomSpline(points, t, closed = false)",
          "summary": ""
        },
        {
          "name": "hermite",
          "kind": "function",
          "signature": "hermite(p0, m0, p1, m1, t)",
          "summary": ""
        },
        {
          "name": "bspline",
          "kind": "function",
          "signature": "bspline(points, t, degree = 3)",
          "summary": ""
        },
        {
          "name": "computeArcLengthTable",
          "kind": "function",
          "signature": "computeArcLengthTable(curveFn, segments = 100)",
          "summary": ""
        },
        {
          "name": "getUniformT",
          "kind": "function",
          "signature": "getUniformT(arcTable, u)",
          "summary": ""
        },
        {
          "name": "easeLinear",
          "kind": "function",
          "signature": "easeLinear(t)",
          "summary": ""
        },
        {
          "name": "easeInQuad",
          "kind": "function",
          "signature": "easeInQuad(t)",
          "summary": ""
        },
        {
          "name": "easeOutQuad",
          "kind": "function",
          "signature": "easeOutQuad(t)",
          "summary": ""
        },
        {
          "name": "easeInOutQuad",
          "kind": "function",
          "signature": "easeInOutQuad(t)",
          "summary": ""
        },
        {
          "name": "easeInCubic",
          "kind": "function",
          "signature": "easeInCubic(t)",
          "summary": ""
        },
        {
          "name": "easeOutCubic",
          "kind": "function",
          "signature": "easeOutCubic(t)",
          "summary": ""
        },
        {
          "name": "easeInOutCubic",
          "kind": "function",
          "signature": "easeInOutCubic(t)",
          "summary": ""
        },
        {
          "name": "easeInQuart",
          "kind": "function",
          "signature": "easeInQuart(t)",
          "summary": ""
        },
        {
          "name": "easeOutQuart",
          "kind": "function",
          "signature": "easeOutQuart(t)",
          "summary": ""
        },
        {
          "name": "easeInOutQuart",
          "kind": "function",
          "signature": "easeInOutQuart(t)",
          "summary": ""
        },
        {
          "name": "easeInQuint",
          "kind": "function",
          "signature": "easeInQuint(t)",
          "summary": ""
        },
        {
          "name": "easeOutQuint",
          "kind": "function",
          "signature": "easeOutQuint(t)",
          "summary": ""
        },
        {
          "name": "easeInOutQuint",
          "kind": "function",
          "signature": "easeInOutQuint(t)",
          "summary": ""
        },
        {
          "name": "easeInSine",
          "kind": "function",
          "signature": "easeInSine(t)",
          "summary": ""
        },
        {
          "name": "easeOutSine",
          "kind": "function",
          "signature": "easeOutSine(t)",
          "summary": ""
        },
        {
          "name": "easeInOutSine",
          "kind": "function",
          "signature": "easeInOutSine(t)",
          "summary": ""
        },
        {
          "name": "easeInExpo",
          "kind": "function",
          "signature": "easeInExpo(t)",
          "summary": ""
        },
        {
          "name": "easeOutExpo",
          "kind": "function",
          "signature": "easeOutExpo(t)",
          "summary": ""
        },
        {
          "name": "easeInOutExpo",
          "kind": "function",
          "signature": "easeInOutExpo(t)",
          "summary": ""
        },
        {
          "name": "easeInCirc",
          "kind": "function",
          "signature": "easeInCirc(t)",
          "summary": ""
        },
        {
          "name": "easeOutCirc",
          "kind": "function",
          "signature": "easeOutCirc(t)",
          "summary": ""
        },
        {
          "name": "easeInOutCirc",
          "kind": "function",
          "signature": "easeInOutCirc(t)",
          "summary": ""
        },
        {
          "name": "easeInElastic",
          "kind": "function",
          "signature": "easeInElastic(t)",
          "summary": ""
        },
        {
          "name": "easeOutElastic",
          "kind": "function",
          "signature": "easeOutElastic(t)",
          "summary": ""
        },
        {
          "name": "easeInOutElastic",
          "kind": "function",
          "signature": "easeInOutElastic(t)",
          "summary": ""
        },
        {
          "name": "easeInBack",
          "kind": "function",
          "signature": "easeInBack(t)",
          "summary": ""
        },
        {
          "name": "easeOutBack",
          "kind": "function",
          "signature": "easeOutBack(t)",
          "summary": ""
        },
        {
          "name": "easeInOutBack",
          "kind": "function",
          "signature": "easeInOutBack(t)",
          "summary": ""
        },
        {
          "name": "easeInBounce",
          "kind": "function",
          "signature": "easeInBounce(t)",
          "summary": ""
        },
        {
          "name": "easeInOutBounce",
          "kind": "function",
          "signature": "easeInOutBounce(t)",
          "summary": ""
        },
        {
          "name": "easeInPow",
          "kind": "function",
          "signature": "easeInPow(t, p)",
          "summary": ""
        },
        {
          "name": "easeOutPow",
          "kind": "function",
          "signature": "easeOutPow(t, p)",
          "summary": ""
        },
        {
          "name": "easeInOutPow",
          "kind": "function",
          "signature": "easeInOutPow(t, p)",
          "summary": ""
        },
        {
          "name": "bezier2",
          "kind": "function",
          "signature": "bezier2(p0, p1, p2, t)",
          "summary": ""
        },
        {
          "name": "bezier2Vec2",
          "kind": "function",
          "signature": "bezier2Vec2(p0, p1, p2, t)",
          "summary": ""
        },
        {
          "name": "bezier2Vec3",
          "kind": "function",
          "signature": "bezier2Vec3(p0, p1, p2, t)",
          "summary": ""
        },
        {
          "name": "bezier3",
          "kind": "function",
          "signature": "bezier3(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "bezier3Vec2",
          "kind": "function",
          "signature": "bezier3Vec2(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "bezier3Vec3",
          "kind": "function",
          "signature": "bezier3Vec3(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "bezier3Derivative",
          "kind": "function",
          "signature": "bezier3Derivative(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "bezier3DerivativeVec3",
          "kind": "function",
          "signature": "bezier3DerivativeVec3(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "catmullRomVec3",
          "kind": "function",
          "signature": "catmullRomVec3(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "hermiteVec3",
          "kind": "function",
          "signature": "hermiteVec3(p0, m0, p1, m1, t)",
          "summary": ""
        },
        {
          "name": "getEasing",
          "kind": "function",
          "signature": "getEasing(name)",
          "summary": ""
        },
        {
          "name": "CSS_CUBIC_BEZIER_PRESETS",
          "kind": "constant",
          "signature": "CSS_CUBIC_BEZIER_PRESETS",
          "summary": ""
        },
        {
          "name": "CSS_STEP_POSITION_ALIASES",
          "kind": "constant",
          "signature": "CSS_STEP_POSITION_ALIASES",
          "summary": ""
        },
        {
          "name": "cssEase",
          "kind": "constant",
          "signature": "cssEase",
          "summary": ""
        },
        {
          "name": "cssEaseIn",
          "kind": "constant",
          "signature": "cssEaseIn",
          "summary": ""
        },
        {
          "name": "cssEaseOut",
          "kind": "constant",
          "signature": "cssEaseOut",
          "summary": ""
        },
        {
          "name": "cssEaseInOut",
          "kind": "constant",
          "signature": "cssEaseInOut",
          "summary": ""
        },
        {
          "name": "EASING_FUNCTIONS",
          "kind": "constant",
          "signature": "EASING_FUNCTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathEntropy",
      "path": "engine/reference/core/math/MathEntropy.md",
      "source": "engine/core/math/MathEntropy.js",
      "import": "/engine/core/math/MathEntropy.js",
      "sourceHash": "1093fca7d250da419d9f5a23d9a8b4cc5ecc425c66c2db8699746f563a0402be",
      "summary": "MathEntropy.js - histograms, entropy reports, and distribution diagnostics.",
      "exports": [
        {
          "name": "byteFrequencyHistogram",
          "kind": "function",
          "signature": "byteFrequencyHistogram(data, histogram = new Uint32Array(256)",
          "summary": ""
        },
        {
          "name": "symbolFrequencyHistogram",
          "kind": "function",
          "signature": "symbolFrequencyHistogram(values, symbolCount, histogram = new Uint32Array(symbolCount)",
          "summary": ""
        },
        {
          "name": "histogramSampleCount",
          "kind": "function",
          "signature": "histogramSampleCount(histogram)",
          "summary": ""
        },
        {
          "name": "histogramUniqueCount",
          "kind": "function",
          "signature": "histogramUniqueCount(histogram)",
          "summary": ""
        },
        {
          "name": "probabilityTableFromHistogram",
          "kind": "function",
          "signature": "probabilityTableFromHistogram(histogram, sampleCount = histogramSampleCount(histogram)",
          "summary": ""
        },
        {
          "name": "shannonEntropyFromHistogram",
          "kind": "function",
          "signature": "shannonEntropyFromHistogram(histogram, options = {})",
          "summary": ""
        },
        {
          "name": "minEntropyFromHistogram",
          "kind": "function",
          "signature": "minEntropyFromHistogram(histogram, options = {})",
          "summary": ""
        },
        {
          "name": "maxEntropyForSymbolCount",
          "kind": "function",
          "signature": "maxEntropyForSymbolCount(symbolCount, options = {})",
          "summary": ""
        },
        {
          "name": "collisionProbabilityFromHistogram",
          "kind": "function",
          "signature": "collisionProbabilityFromHistogram(histogram)",
          "summary": ""
        },
        {
          "name": "klDivergence",
          "kind": "function",
          "signature": "klDivergence(pDistribution, qDistribution, options = {})",
          "summary": ""
        },
        {
          "name": "crossEntropy",
          "kind": "function",
          "signature": "crossEntropy(pDistribution, qDistribution, options = {})",
          "summary": ""
        },
        {
          "name": "mutualInformationFromJointHistogram",
          "kind": "function",
          "signature": "mutualInformationFromJointHistogram(jointHistogram, xSymbolCount, ySymbolCount, options = {})",
          "summary": ""
        },
        {
          "name": "conditionalEntropyFromJointHistogram",
          "kind": "function",
          "signature": "conditionalEntropyFromJointHistogram(jointHistogram, xSymbolCount, ySymbolCount, options = {})",
          "summary": ""
        },
        {
          "name": "jointEntropyReport",
          "kind": "function",
          "signature": "jointEntropyReport(jointHistogram, xSymbolCount, ySymbolCount, options = {})",
          "summary": ""
        },
        {
          "name": "bitRunReport",
          "kind": "function",
          "signature": "bitRunReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "monobitRatio",
          "kind": "function",
          "signature": "monobitRatio(data, options = {})",
          "summary": ""
        },
        {
          "name": "byteDistributionReport",
          "kind": "function",
          "signature": "byteDistributionReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "collisionCount",
          "kind": "function",
          "signature": "collisionCount(data, options = {})",
          "summary": ""
        },
        {
          "name": "serialCorrelation",
          "kind": "function",
          "signature": "serialCorrelation(data, options = {})",
          "summary": ""
        },
        {
          "name": "repetitionCount",
          "kind": "function",
          "signature": "repetitionCount(data, options = {})",
          "summary": ""
        },
        {
          "name": "adaptiveProportionReport",
          "kind": "function",
          "signature": "adaptiveProportionReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "minEntropyThresholdReport",
          "kind": "function",
          "signature": "minEntropyThresholdReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "predictabilityScore",
          "kind": "function",
          "signature": "predictabilityScore(data, options = {})",
          "summary": ""
        },
        {
          "name": "randomnessHealthReport",
          "kind": "function",
          "signature": "randomnessHealthReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "entropyWindowReport",
          "kind": "function",
          "signature": "entropyWindowReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "streamingEntropyHealthReport",
          "kind": "function",
          "signature": "streamingEntropyHealthReport(data, options = {})",
          "summary": ""
        },
        {
          "name": "entropyCompressionEstimate",
          "kind": "function",
          "signature": "entropyCompressionEstimate(sampleCount, entropyBitsPerSymbol, options = {})",
          "summary": ""
        },
        {
          "name": "histogramEntropyReport",
          "kind": "function",
          "signature": "histogramEntropyReport(histogram, options = {})",
          "summary": ""
        },
        {
          "name": "entropyReport",
          "kind": "function",
          "signature": "entropyReport(data, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathGeometry",
      "path": "engine/reference/core/math/MathGeometry.md",
      "source": "engine/core/math/MathGeometry.js",
      "import": "/engine/core/math/MathGeometry.js",
      "sourceHash": "3447aa0239f0544f050b756c7bee5354e4c07651e918d0120d22330e129325c3",
      "summary": "Convert a local AABB and entity TRS into a conservative world-space sphere. Rotation moves the scaled local center but does not change the sphere radius.",
      "exports": [
        {
          "name": "sdfBox3D",
          "kind": "function",
          "signature": "sdfBox3D(p, b)",
          "summary": ""
        },
        {
          "name": "sdfCylinder",
          "kind": "function",
          "signature": "sdfCylinder(p, h, r)",
          "summary": ""
        },
        {
          "name": "sdfCapsule",
          "kind": "function",
          "signature": "sdfCapsule(p, a, b, r)",
          "summary": ""
        },
        {
          "name": "sdfTorus",
          "kind": "function",
          "signature": "sdfTorus(p, R, r)",
          "summary": ""
        },
        {
          "name": "sdfCone",
          "kind": "function",
          "signature": "sdfCone(p, angle, h)",
          "summary": ""
        },
        {
          "name": "pointInTriangle2D",
          "kind": "function",
          "signature": "pointInTriangle2D(p, a, b, c)",
          "summary": ""
        },
        {
          "name": "lineLineIntersection",
          "kind": "function",
          "signature": "lineLineIntersection(p1, p2, p3, p4)",
          "summary": ""
        },
        {
          "name": "sphereAABB",
          "kind": "function",
          "signature": "sphereAABB(center, radius, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "raySphere",
          "kind": "function",
          "signature": "raySphere(rayOrigin, rayDir, center, radius)",
          "summary": ""
        },
        {
          "name": "rayAABB",
          "kind": "function",
          "signature": "rayAABB(rayOrigin, rayDir, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "rayPlane",
          "kind": "function",
          "signature": "rayPlane(rayOrigin, rayDir, planeNormal, planeD)",
          "summary": ""
        },
        {
          "name": "rayTriangle",
          "kind": "function",
          "signature": "rayTriangle(rayOrigin, rayDir, v0, v1, v2)",
          "summary": ""
        },
        {
          "name": "aabbFromPoints",
          "kind": "function",
          "signature": "aabbFromPoints(points)",
          "summary": ""
        },
        {
          "name": "transformedAabbBoundingSphereReport",
          "kind": "function",
          "signature": "transformedAabbBoundingSphereReport(localMin, localMax, position, rotation, scale)",
          "summary": "Convert a local AABB and entity TRS into a conservative world-space sphere. Rotation moves the scaled local center but does not change the sphere radius."
        },
        {
          "name": "aabbSurfaceArea",
          "kind": "function",
          "signature": "aabbSurfaceArea(aabb)",
          "summary": ""
        },
        {
          "name": "aabbVolume",
          "kind": "function",
          "signature": "aabbVolume(aabb)",
          "summary": ""
        },
        {
          "name": "boundingSphereFromPoints",
          "kind": "function",
          "signature": "boundingSphereFromPoints(points)",
          "summary": ""
        },
        {
          "name": "frustumFromMatrix",
          "kind": "function",
          "signature": "frustumFromMatrix(m)",
          "summary": ""
        },
        {
          "name": "frustumNormalizePlanes",
          "kind": "function",
          "signature": "frustumNormalizePlanes(frustum)",
          "summary": ""
        },
        {
          "name": "frustumContainsSphere",
          "kind": "function",
          "signature": "frustumContainsSphere(frustum, center, radius)",
          "summary": ""
        },
        {
          "name": "frustumContainsAABB",
          "kind": "function",
          "signature": "frustumContainsAABB(frustum, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "frustumTestAABB",
          "kind": "function",
          "signature": "frustumTestAABB(frustum, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "triangleBarycentric",
          "kind": "function",
          "signature": "triangleBarycentric(p, a, b, c)",
          "summary": ""
        },
        {
          "name": "triangleClosestPoint",
          "kind": "function",
          "signature": "triangleClosestPoint(p, a, b, c)",
          "summary": ""
        },
        {
          "name": "closestPointOnSegment",
          "kind": "function",
          "signature": "closestPointOnSegment(p, a, b)",
          "summary": ""
        },
        {
          "name": "closestPointOnAABB",
          "kind": "function",
          "signature": "closestPointOnAABB(p, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "closestPointOnSphere",
          "kind": "function",
          "signature": "closestPointOnSphere(p, center, radius)",
          "summary": ""
        },
        {
          "name": "sdfCircle",
          "kind": "function",
          "signature": "sdfCircle(p, r)",
          "summary": ""
        },
        {
          "name": "sdfBox2D",
          "kind": "function",
          "signature": "sdfBox2D(p, b)",
          "summary": ""
        },
        {
          "name": "sdfSegment2D",
          "kind": "function",
          "signature": "sdfSegment2D(p, a, b)",
          "summary": ""
        },
        {
          "name": "sdfRoundedBox2D",
          "kind": "function",
          "signature": "sdfRoundedBox2D(p, b, r)",
          "summary": ""
        },
        {
          "name": "sdfSphere",
          "kind": "function",
          "signature": "sdfSphere(p, r)",
          "summary": ""
        },
        {
          "name": "sdfRoundBox",
          "kind": "function",
          "signature": "sdfRoundBox(p, b, r)",
          "summary": ""
        },
        {
          "name": "sdfPlane",
          "kind": "function",
          "signature": "sdfPlane(p, n, d)",
          "summary": ""
        },
        {
          "name": "sdfUnion",
          "kind": "function",
          "signature": "sdfUnion(d1, d2)",
          "summary": ""
        },
        {
          "name": "sdfSubtract",
          "kind": "function",
          "signature": "sdfSubtract(d1, d2)",
          "summary": ""
        },
        {
          "name": "sdfIntersect",
          "kind": "function",
          "signature": "sdfIntersect(d1, d2)",
          "summary": ""
        },
        {
          "name": "sdfSmoothUnion",
          "kind": "function",
          "signature": "sdfSmoothUnion(d1, d2, k)",
          "summary": ""
        },
        {
          "name": "sdfSmoothSubtract",
          "kind": "function",
          "signature": "sdfSmoothSubtract(d1, d2, k)",
          "summary": ""
        },
        {
          "name": "sdfSmoothIntersect",
          "kind": "function",
          "signature": "sdfSmoothIntersect(d1, d2, k)",
          "summary": ""
        },
        {
          "name": "sdfRound",
          "kind": "function",
          "signature": "sdfRound(d, r)",
          "summary": ""
        },
        {
          "name": "sdfOnion",
          "kind": "function",
          "signature": "sdfOnion(d, r)",
          "summary": ""
        },
        {
          "name": "pointInCircle",
          "kind": "function",
          "signature": "pointInCircle(point, center, radius)",
          "summary": ""
        },
        {
          "name": "pointInRect",
          "kind": "function",
          "signature": "pointInRect(point, rectMin, rectMax)",
          "summary": ""
        },
        {
          "name": "circleCircle",
          "kind": "function",
          "signature": "circleCircle(c1, r1, c2, r2)",
          "summary": ""
        },
        {
          "name": "rectRect",
          "kind": "function",
          "signature": "rectRect(min1, max1, min2, max2)",
          "summary": ""
        },
        {
          "name": "pointInSphere",
          "kind": "function",
          "signature": "pointInSphere(point, center, radius)",
          "summary": ""
        },
        {
          "name": "pointInAABB",
          "kind": "function",
          "signature": "pointInAABB(point, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "sphereSphere",
          "kind": "function",
          "signature": "sphereSphere(c1, r1, c2, r2)",
          "summary": ""
        },
        {
          "name": "aabbAABB",
          "kind": "function",
          "signature": "aabbAABB(min1, max1, min2, max2)",
          "summary": ""
        },
        {
          "name": "aabbCenter",
          "kind": "function",
          "signature": "aabbCenter(aabb)",
          "summary": ""
        },
        {
          "name": "aabbSize",
          "kind": "function",
          "signature": "aabbSize(aabb)",
          "summary": ""
        },
        {
          "name": "aabbHalfSize",
          "kind": "function",
          "signature": "aabbHalfSize(aabb)",
          "summary": ""
        },
        {
          "name": "aabbExpand",
          "kind": "function",
          "signature": "aabbExpand(aabb, point)",
          "summary": ""
        },
        {
          "name": "aabbMerge",
          "kind": "function",
          "signature": "aabbMerge(a, b)",
          "summary": ""
        },
        {
          "name": "aabbGrow",
          "kind": "function",
          "signature": "aabbGrow(aabb, amount)",
          "summary": ""
        },
        {
          "name": "triangleNormal",
          "kind": "function",
          "signature": "triangleNormal(a, b, c)",
          "summary": ""
        },
        {
          "name": "triangleArea",
          "kind": "function",
          "signature": "triangleArea(a, b, c)",
          "summary": ""
        },
        {
          "name": "distancePointToSegment",
          "kind": "function",
          "signature": "distancePointToSegment(p, a, b)",
          "summary": ""
        },
        {
          "name": "distancePointToAABB",
          "kind": "function",
          "signature": "distancePointToAABB(p, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "distancePointToSphere",
          "kind": "function",
          "signature": "distancePointToSphere(p, center, radius)",
          "summary": ""
        },
        {
          "name": "distancePointToPlane",
          "kind": "function",
          "signature": "distancePointToPlane(p, normal, d)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathGrid",
      "path": "engine/reference/core/math/MathGrid.md",
      "source": "engine/core/math/MathGrid.js",
      "import": "/engine/core/math/MathGrid.js",
      "sourceHash": "a1372facbdf75474064883083aedb349dbe7c050ef37ac15d88f42e4f8a3537d",
      "summary": "MathGrid.js - CPU-side 3D grid sampling and discrete differential operators Consolidates: FluidSimWorld.js inline trilinear, SDFCollision trilinear, WindSimulation grid sample Houdini VEX volumesample / Niagara grid sampling parity",
      "exports": [
        {
          "name": "bilinearSample",
          "kind": "function",
          "signature": "bilinearSample(grid, width, height, u, v)",
          "summary": "Bilinear interpolation on a 2D scalar grid"
        },
        {
          "name": "bilinearSampleVec3",
          "kind": "function",
          "signature": "bilinearSampleVec3(grid, width, height, u, v)",
          "summary": "Bilinear interpolation on a 2D vector grid (3-component, interleaved)"
        },
        {
          "name": "trilinearSample",
          "kind": "function",
          "signature": "trilinearSample(grid, width, height, depth, u, v, w)",
          "summary": "Trilinear interpolation on a 3D scalar grid"
        },
        {
          "name": "trilinearSampleVec3",
          "kind": "function",
          "signature": "trilinearSampleVec3(grid, width, height, depth, u, v, w)",
          "summary": "Trilinear interpolation on a 3D vector grid (3-component, interleaved) Matches FluidSimWorld.js sampleVelocityTrilinear GPU implementation"
        },
        {
          "name": "trilinearSampleVec4",
          "kind": "function",
          "signature": "trilinearSampleVec4(grid, width, height, depth, u, v, w)",
          "summary": "Trilinear interpolation on a 3D grid stored as vec4 (4-component, e.g. velocity + spin)"
        },
        {
          "name": "gridGradient",
          "kind": "function",
          "signature": "gridGradient(grid, width, height, depth, x, y, z, cellSize = 1)",
          "summary": "Discrete gradient of a scalar field (central differences)"
        },
        {
          "name": "gridDivergence",
          "kind": "function",
          "signature": "gridDivergence(grid, width, height, depth, x, y, z, cellSize = 1)",
          "summary": "Discrete divergence of a vector field (central differences)"
        },
        {
          "name": "gridCurl",
          "kind": "function",
          "signature": "gridCurl(grid, width, height, depth, x, y, z, cellSize = 1)",
          "summary": "Discrete curl of a vector field (central differences)"
        },
        {
          "name": "gridLaplacian",
          "kind": "function",
          "signature": "gridLaplacian(grid, width, height, depth, x, y, z, cellSize = 1)",
          "summary": "Discrete Laplacian of a scalar field (6-point stencil)"
        },
        {
          "name": "gridLaplacianVec3",
          "kind": "function",
          "signature": "gridLaplacianVec3(grid, width, height, depth, x, y, z, cellSize = 1)",
          "summary": "Discrete Laplacian of a vector field (per-component, 6-point stencil)"
        },
        {
          "name": "advectScalar",
          "kind": "function",
          "signature": "advectScalar(scalarField, velocityField, out, width, height, depth, dt, cellSize = 1)",
          "summary": "Semi-Lagrangian advection of a scalar field through a velocity field"
        },
        {
          "name": "advectVelocity",
          "kind": "function",
          "signature": "advectVelocity(velocityField, out, width, height, depth, dt, cellSize = 1)",
          "summary": "Semi-Lagrangian advection of a vector field through itself (self-advection)"
        },
        {
          "name": "gridCreateScalar",
          "kind": "function",
          "signature": "gridCreateScalar(width, height, depth)",
          "summary": "Create a zero-filled scalar grid"
        },
        {
          "name": "gridCreateVec3",
          "kind": "function",
          "signature": "gridCreateVec3(width, height, depth)",
          "summary": "Create a zero-filled vec3 grid"
        },
        {
          "name": "gridCreateVec4",
          "kind": "function",
          "signature": "gridCreateVec4(width, height, depth)",
          "summary": "Create a zero-filled vec4 grid"
        },
        {
          "name": "worldToGrid",
          "kind": "function",
          "signature": "worldToGrid(worldPos, gridOrigin, cellSize)",
          "summary": "World position to grid coordinate"
        },
        {
          "name": "gridToWorld",
          "kind": "function",
          "signature": "gridToWorld(gridPos, gridOrigin, cellSize)",
          "summary": "Grid coordinate to world position"
        },
        {
          "name": "gridSampleScalarWorld",
          "kind": "function",
          "signature": "gridSampleScalarWorld(grid, width, height, depth, worldPos, gridOrigin, cellSize)",
          "summary": "Sample scalar field at world position"
        },
        {
          "name": "gridSampleVec3World",
          "kind": "function",
          "signature": "gridSampleVec3World(grid, width, height, depth, worldPos, gridOrigin, cellSize)",
          "summary": "Sample vector field at world position"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathLine3",
      "path": "engine/reference/core/math/MathLine3.md",
      "source": "engine/core/math/MathLine3.js",
      "import": "/engine/core/math/MathLine3.js",
      "sourceHash": "ebd9ddb78be098b32746aebe7cf0f381e5f9186731bc29deb3467a46ef625269",
      "summary": "MathLine3.js - Line segment operations (Three.js Line3 parity) Segment represented as { a: [x,y,z], b: [x,y,z] } Consolidates: MathGeometry.closestPointOnSegment, ViewportRaycasting.raySegmentDistance, PBDRagdoll.capsuleCollision segment-segment math",
      "exports": [
        {
          "name": "segmentFromPointDir",
          "kind": "function",
          "signature": "segmentFromPointDir(origin, direction, length)",
          "summary": ""
        },
        {
          "name": "segmentClosestPointToPoint",
          "kind": "function",
          "signature": "segmentClosestPointToPoint(seg, point)",
          "summary": ""
        },
        {
          "name": "segmentDistanceToPoint",
          "kind": "function",
          "signature": "segmentDistanceToPoint(seg, point)",
          "summary": ""
        },
        {
          "name": "segmentDistanceSqToPoint",
          "kind": "function",
          "signature": "segmentDistanceSqToPoint(seg, point)",
          "summary": ""
        },
        {
          "name": "segmentClosestPointToSegment",
          "kind": "function",
          "signature": "segmentClosestPointToSegment(seg1, seg2)",
          "summary": ""
        },
        {
          "name": "segmentDistanceToSegment",
          "kind": "function",
          "signature": "segmentDistanceToSegment(seg1, seg2)",
          "summary": ""
        },
        {
          "name": "segmentDistanceSqToSegment",
          "kind": "function",
          "signature": "segmentDistanceSqToSegment(seg1, seg2)",
          "summary": ""
        },
        {
          "name": "segmentClosestPointToRay",
          "kind": "function",
          "signature": "segmentClosestPointToRay(seg, rayOrigin, rayDir)",
          "summary": ""
        },
        {
          "name": "segmentDistanceToRay",
          "kind": "function",
          "signature": "segmentDistanceToRay(seg, rayOrigin, rayDir)",
          "summary": ""
        },
        {
          "name": "segmentEquals",
          "kind": "function",
          "signature": "segmentEquals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "segmentCreate",
          "kind": "function",
          "signature": "segmentCreate(a, b)",
          "summary": ""
        },
        {
          "name": "segmentClone",
          "kind": "function",
          "signature": "segmentClone(seg)",
          "summary": ""
        },
        {
          "name": "segmentAt",
          "kind": "function",
          "signature": "segmentAt(seg, t)",
          "summary": ""
        },
        {
          "name": "segmentCenter",
          "kind": "function",
          "signature": "segmentCenter(seg)",
          "summary": ""
        },
        {
          "name": "segmentDelta",
          "kind": "function",
          "signature": "segmentDelta(seg)",
          "summary": ""
        },
        {
          "name": "segmentDirection",
          "kind": "function",
          "signature": "segmentDirection(seg)",
          "summary": ""
        },
        {
          "name": "segmentLength",
          "kind": "function",
          "signature": "segmentLength(seg)",
          "summary": ""
        },
        {
          "name": "segmentLengthSq",
          "kind": "function",
          "signature": "segmentLengthSq(seg)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathMat",
      "path": "engine/reference/core/math/MathMat.md",
      "source": "engine/core/math/MathMat.js",
      "import": "/engine/core/math/MathMat.js",
      "sourceHash": "3bee84ea3c421ed624acc2c8a8732bec5115459a0c9e02ec57b38e5cfc5f7fc5",
      "summary": "",
      "exports": [
        {
          "name": "mat2Inverse",
          "kind": "function",
          "signature": "mat2Inverse(m)",
          "summary": ""
        },
        {
          "name": "mat3Multiply",
          "kind": "function",
          "signature": "mat3Multiply(a, b)",
          "summary": ""
        },
        {
          "name": "mat3Inverse",
          "kind": "function",
          "signature": "mat3Inverse(m)",
          "summary": ""
        },
        {
          "name": "mat3NormalFromMat4",
          "kind": "function",
          "signature": "mat3NormalFromMat4(m)",
          "summary": ""
        },
        {
          "name": "mat3FromQuat",
          "kind": "function",
          "signature": "mat3FromQuat(q)",
          "summary": ""
        },
        {
          "name": "mat4Determinant",
          "kind": "function",
          "signature": "mat4Determinant(m)",
          "summary": ""
        },
        {
          "name": "mat4MultiplyMany",
          "kind": "function",
          "signature": "mat4MultiplyMany(...matrices)",
          "summary": ""
        },
        {
          "name": "mat4MultiplyInto",
          "kind": "function",
          "signature": "mat4MultiplyInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "mat4FromRotationAxis",
          "kind": "function",
          "signature": "mat4FromRotationAxis(axis, angle)",
          "summary": ""
        },
        {
          "name": "mat4FromQuat",
          "kind": "function",
          "signature": "mat4FromQuat(q)",
          "summary": ""
        },
        {
          "name": "mat4FromRotationTranslationScale",
          "kind": "function",
          "signature": "mat4FromRotationTranslationScale(q, t, s)",
          "summary": ""
        },
        {
          "name": "mat4Decompose",
          "kind": "function",
          "signature": "mat4Decompose(m)",
          "summary": ""
        },
        {
          "name": "mat4TransformPoint",
          "kind": "function",
          "signature": "mat4TransformPoint(m, v)",
          "summary": ""
        },
        {
          "name": "mat4Lerp",
          "kind": "function",
          "signature": "mat4Lerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "mat4Equals",
          "kind": "function",
          "signature": "mat4Equals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "mat4IsIdentity",
          "kind": "function",
          "signature": "mat4IsIdentity(m, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "mat4Frustum",
          "kind": "function",
          "signature": "mat4Frustum(left, right, bottom, top, near, far)",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveInfinite",
          "kind": "function",
          "signature": "mat4PerspectiveInfinite(fov, aspect, near)",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveReverseZ",
          "kind": "function",
          "signature": "mat4PerspectiveReverseZ(fov, aspect, near, far)",
          "summary": ""
        },
        {
          "name": "mat4TargetTo",
          "kind": "function",
          "signature": "mat4TargetTo(eye, target, up)",
          "summary": ""
        },
        {
          "name": "mat4Rotate",
          "kind": "function",
          "signature": "mat4Rotate(m, axis, angle)",
          "summary": ""
        },
        {
          "name": "mat4InverseTranspose",
          "kind": "function",
          "signature": "mat4InverseTranspose(m)",
          "summary": ""
        },
        {
          "name": "mat2Identity",
          "kind": "function",
          "signature": "mat2Identity()",
          "summary": ""
        },
        {
          "name": "mat2",
          "kind": "function",
          "signature": "mat2(a, b, c, d)",
          "summary": ""
        },
        {
          "name": "mat2Clone",
          "kind": "function",
          "signature": "mat2Clone(m)",
          "summary": ""
        },
        {
          "name": "mat2Copy",
          "kind": "function",
          "signature": "mat2Copy(out, m)",
          "summary": ""
        },
        {
          "name": "mat2Multiply",
          "kind": "function",
          "signature": "mat2Multiply(a, b)",
          "summary": ""
        },
        {
          "name": "mat2Determinant",
          "kind": "function",
          "signature": "mat2Determinant(m)",
          "summary": ""
        },
        {
          "name": "mat2Transpose",
          "kind": "function",
          "signature": "mat2Transpose(m)",
          "summary": ""
        },
        {
          "name": "mat2FromRotation",
          "kind": "function",
          "signature": "mat2FromRotation(angle)",
          "summary": ""
        },
        {
          "name": "mat2FromScale",
          "kind": "function",
          "signature": "mat2FromScale(sx, sy)",
          "summary": ""
        },
        {
          "name": "mat2TransformVec2",
          "kind": "function",
          "signature": "mat2TransformVec2(m, v)",
          "summary": ""
        },
        {
          "name": "mat3Identity",
          "kind": "function",
          "signature": "mat3Identity()",
          "summary": ""
        },
        {
          "name": "mat3Clone",
          "kind": "function",
          "signature": "mat3Clone(m)",
          "summary": ""
        },
        {
          "name": "mat3Copy",
          "kind": "function",
          "signature": "mat3Copy(out, m)",
          "summary": ""
        },
        {
          "name": "mat3FromMat4",
          "kind": "function",
          "signature": "mat3FromMat4(m)",
          "summary": ""
        },
        {
          "name": "mat3Determinant",
          "kind": "function",
          "signature": "mat3Determinant(m)",
          "summary": ""
        },
        {
          "name": "mat3Transpose",
          "kind": "function",
          "signature": "mat3Transpose(m)",
          "summary": ""
        },
        {
          "name": "mat3FromRotationX",
          "kind": "function",
          "signature": "mat3FromRotationX(angle)",
          "summary": ""
        },
        {
          "name": "mat3FromRotationY",
          "kind": "function",
          "signature": "mat3FromRotationY(angle)",
          "summary": ""
        },
        {
          "name": "mat3FromRotationZ",
          "kind": "function",
          "signature": "mat3FromRotationZ(angle)",
          "summary": ""
        },
        {
          "name": "mat3TransformVec3",
          "kind": "function",
          "signature": "mat3TransformVec3(m, v)",
          "summary": ""
        },
        {
          "name": "mat3FromTranslation2D",
          "kind": "function",
          "signature": "mat3FromTranslation2D(x, y)",
          "summary": ""
        },
        {
          "name": "mat3FromScale2D",
          "kind": "function",
          "signature": "mat3FromScale2D(sx, sy)",
          "summary": ""
        },
        {
          "name": "mat3FromRotation2D",
          "kind": "function",
          "signature": "mat3FromRotation2D(angle)",
          "summary": ""
        },
        {
          "name": "mat4Clone",
          "kind": "function",
          "signature": "mat4Clone(m)",
          "summary": ""
        },
        {
          "name": "mat4Copy",
          "kind": "function",
          "signature": "mat4Copy(out, m)",
          "summary": ""
        },
        {
          "name": "mat4Transpose",
          "kind": "function",
          "signature": "mat4Transpose(m)",
          "summary": ""
        },
        {
          "name": "mat4FromTranslation",
          "kind": "function",
          "signature": "mat4FromTranslation(x, y, z)",
          "summary": ""
        },
        {
          "name": "mat4FromTranslationVec3",
          "kind": "function",
          "signature": "mat4FromTranslationVec3(v)",
          "summary": ""
        },
        {
          "name": "mat4FromScale",
          "kind": "function",
          "signature": "mat4FromScale(sx, sy, sz)",
          "summary": ""
        },
        {
          "name": "mat4FromScaleVec3",
          "kind": "function",
          "signature": "mat4FromScaleVec3(v)",
          "summary": ""
        },
        {
          "name": "mat4FromScaleUniform",
          "kind": "function",
          "signature": "mat4FromScaleUniform(s)",
          "summary": ""
        },
        {
          "name": "mat4FromRotationX",
          "kind": "function",
          "signature": "mat4FromRotationX(angle)",
          "summary": ""
        },
        {
          "name": "mat4FromRotationY",
          "kind": "function",
          "signature": "mat4FromRotationY(angle)",
          "summary": ""
        },
        {
          "name": "mat4FromRotationZ",
          "kind": "function",
          "signature": "mat4FromRotationZ(angle)",
          "summary": ""
        },
        {
          "name": "mat4GetTranslation",
          "kind": "function",
          "signature": "mat4GetTranslation(m)",
          "summary": ""
        },
        {
          "name": "mat4GetScale",
          "kind": "function",
          "signature": "mat4GetScale(m)",
          "summary": ""
        },
        {
          "name": "mat4GetForward",
          "kind": "function",
          "signature": "mat4GetForward(m)",
          "summary": ""
        },
        {
          "name": "mat4GetRight",
          "kind": "function",
          "signature": "mat4GetRight(m)",
          "summary": ""
        },
        {
          "name": "mat4GetUp",
          "kind": "function",
          "signature": "mat4GetUp(m)",
          "summary": ""
        },
        {
          "name": "mat4GetBack",
          "kind": "function",
          "signature": "mat4GetBack(m)",
          "summary": ""
        },
        {
          "name": "mat4TransformDirection",
          "kind": "function",
          "signature": "mat4TransformDirection(m, v)",
          "summary": ""
        },
        {
          "name": "mat4Compose",
          "kind": "constant",
          "signature": "mat4Compose",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathNoise",
      "path": "engine/reference/core/math/MathNoise.md",
      "source": "engine/core/math/MathNoise.js",
      "import": "/engine/core/math/MathNoise.js",
      "sourceHash": "2c282d01d95785f2af564995916b9e360b03c076c0e0c0b1679791bb8b7156ae",
      "summary": "",
      "exports": [
        {
          "name": "perlin1D",
          "kind": "function",
          "signature": "perlin1D(x)",
          "summary": ""
        },
        {
          "name": "perlin2D",
          "kind": "function",
          "signature": "perlin2D(x, y)",
          "summary": ""
        },
        {
          "name": "perlin3D",
          "kind": "function",
          "signature": "perlin3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "simplex2D",
          "kind": "function",
          "signature": "simplex2D(x, y)",
          "summary": ""
        },
        {
          "name": "simplex3D",
          "kind": "function",
          "signature": "simplex3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "valueNoise2D",
          "kind": "function",
          "signature": "valueNoise2D(x, y)",
          "summary": ""
        },
        {
          "name": "valueNoise3D",
          "kind": "function",
          "signature": "valueNoise3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "shaderHash2D",
          "kind": "function",
          "signature": "shaderHash2D(x, y)",
          "summary": ""
        },
        {
          "name": "shaderNoise2D",
          "kind": "function",
          "signature": "shaderNoise2D(x, y)",
          "summary": ""
        },
        {
          "name": "shaderFbm2D",
          "kind": "function",
          "signature": "shaderFbm2D(x, y)",
          "summary": ""
        },
        {
          "name": "shaderHash3D",
          "kind": "function",
          "signature": "shaderHash3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "shaderNoise3D",
          "kind": "function",
          "signature": "shaderNoise3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "shaderFbm3D",
          "kind": "function",
          "signature": "shaderFbm3D(x, y, z, octaves = 4)",
          "summary": ""
        },
        {
          "name": "shaderFbm3DRotated",
          "kind": "function",
          "signature": "shaderFbm3DRotated(x, y, z, octaves = 4)",
          "summary": ""
        },
        {
          "name": "voronoi2D",
          "kind": "function",
          "signature": "voronoi2D(x, y)",
          "summary": ""
        },
        {
          "name": "voronoi3D",
          "kind": "function",
          "signature": "voronoi3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "fbm2D",
          "kind": "function",
          "signature": "fbm2D(x, y, octaves = 6, lacunarity = 2, gain = 0.5, noiseFn = perlin2D)",
          "summary": ""
        },
        {
          "name": "fbm3D",
          "kind": "function",
          "signature": "fbm3D(x, y, z, octaves = 6, lacunarity = 2, gain = 0.5, noiseFn = perlin3D)",
          "summary": ""
        },
        {
          "name": "ridged2D",
          "kind": "function",
          "signature": "ridged2D(x, y, octaves = 6, lacunarity = 2, gain = 0.5, offset = 1, noiseFn = perlin2D)",
          "summary": ""
        },
        {
          "name": "ridged3D",
          "kind": "function",
          "signature": "ridged3D(x, y, z, octaves = 6, lacunarity = 2, gain = 0.5, offset = 1, noiseFn = perlin3D)",
          "summary": ""
        },
        {
          "name": "warpedNoise2D",
          "kind": "function",
          "signature": "warpedNoise2D(x, y, warpStrength = 0.5, noiseFn = perlin2D)",
          "summary": ""
        },
        {
          "name": "warpedNoise3D",
          "kind": "function",
          "signature": "warpedNoise3D(x, y, z, warpStrength = 0.5, noiseFn = perlin3D)",
          "summary": ""
        },
        {
          "name": "curlNoise2D",
          "kind": "function",
          "signature": "curlNoise2D(x, y, epsilon = 0.0001, noiseFn = perlin2D)",
          "summary": ""
        },
        {
          "name": "curlNoise3D",
          "kind": "function",
          "signature": "curlNoise3D(x, y, z, epsilon = 0.0001, noiseFn = perlin3D)",
          "summary": ""
        },
        {
          "name": "turbulence2D",
          "kind": "function",
          "signature": "turbulence2D(x, y, octaves = 6, lacunarity = 2, gain = 0.5, noiseFn = perlin2D)",
          "summary": ""
        },
        {
          "name": "turbulence3D",
          "kind": "function",
          "signature": "turbulence3D(x, y, z, octaves = 6, lacunarity = 2, gain = 0.5, noiseFn = perlin3D)",
          "summary": ""
        },
        {
          "name": "billow2D",
          "kind": "function",
          "signature": "billow2D(x, y, octaves = 6, lacunarity = 2, gain = 0.5, noiseFn = perlin2D)",
          "summary": ""
        },
        {
          "name": "billow3D",
          "kind": "function",
          "signature": "billow3D(x, y, z, octaves = 6, lacunarity = 2, gain = 0.5, noiseFn = perlin3D)",
          "summary": ""
        },
        {
          "name": "createSeededNoise",
          "kind": "function",
          "signature": "createSeededNoise(seed)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathOscillator",
      "path": "engine/reference/core/math/MathOscillator.md",
      "source": "engine/core/math/MathOscillator.js",
      "import": "/engine/core/math/MathOscillator.js",
      "sourceHash": "5dd6809f37d3d2c2808dde7bf95f86b2eb0730c967111b350eb76509e8bf8004",
      "summary": "Kuramoto order parameter (complex form). Computes collective synchronization r·e^(iψ) of N coupled phases. r ≈ 0 = chaos/dissonance; r ≈ 1 = perfect lockstep. Real-world: power-grid frequency lock, neural firing synchrony, firefly flashing, cardiac pacemakers, crowd footsteps (Millennium Bridge wobble).",
      "exports": [
        {
          "name": "normalizePhase",
          "kind": "function",
          "signature": "normalizePhase(phase)",
          "summary": ""
        },
        {
          "name": "cyclesToRadians",
          "kind": "function",
          "signature": "cyclesToRadians(cycles)",
          "summary": ""
        },
        {
          "name": "radiansToCycles",
          "kind": "function",
          "signature": "radiansToCycles(radians)",
          "summary": ""
        },
        {
          "name": "phaseFromTime",
          "kind": "function",
          "signature": "phaseFromTime(frequency, time, phase = 0)",
          "summary": ""
        },
        {
          "name": "advancePhase",
          "kind": "function",
          "signature": "advancePhase(phase, frequency, dt)",
          "summary": ""
        },
        {
          "name": "createOscillator",
          "kind": "function",
          "signature": "createOscillator(config = {})",
          "summary": ""
        },
        {
          "name": "oscillatorCycle",
          "kind": "function",
          "signature": "oscillatorCycle(phase)",
          "summary": ""
        },
        {
          "name": "sampleWave",
          "kind": "function",
          "signature": "sampleWave(shape, phase, dutyCycle = 0.5)",
          "summary": ""
        },
        {
          "name": "sampleOscillatorAtPhase",
          "kind": "function",
          "signature": "sampleOscillatorAtPhase(oscillator, phase)",
          "summary": ""
        },
        {
          "name": "sampleOscillator",
          "kind": "function",
          "signature": "sampleOscillator(oscillator, time)",
          "summary": ""
        },
        {
          "name": "sampleOscillatorArray",
          "kind": "function",
          "signature": "sampleOscillatorArray(oscillators, time, out = [])",
          "summary": ""
        },
        {
          "name": "beatFrequency",
          "kind": "function",
          "signature": "beatFrequency(a, b)",
          "summary": ""
        },
        {
          "name": "resonanceWeight",
          "kind": "function",
          "signature": "resonanceWeight(a, b, bandwidth = 1)",
          "summary": ""
        },
        {
          "name": "applyAmplitudeModulation",
          "kind": "function",
          "signature": "applyAmplitudeModulation(sampleValue, modulatorValue, amount = 1, bipolar = false)",
          "summary": ""
        },
        {
          "name": "applyPhaseModulation",
          "kind": "function",
          "signature": "applyPhaseModulation(phase, modulatorValue, amount = 1)",
          "summary": ""
        },
        {
          "name": "waveInterference",
          "kind": "function",
          "signature": "waveInterference(a, b)",
          "summary": ""
        },
        {
          "name": "ringModulate",
          "kind": "function",
          "signature": "ringModulate(a, b)",
          "summary": ""
        },
        {
          "name": "sampleAmplitudeModulated",
          "kind": "function",
          "signature": "sampleAmplitudeModulated(carrier, modulator, time, amount = 1, bipolar = false)",
          "summary": ""
        },
        {
          "name": "samplePhaseModulated",
          "kind": "function",
          "signature": "samplePhaseModulated(carrier, modulator, time, amount = 1)",
          "summary": ""
        },
        {
          "name": "sampleRingModulated",
          "kind": "function",
          "signature": "sampleRingModulated(a, b, time)",
          "summary": ""
        },
        {
          "name": "phaseCoherence",
          "kind": "function",
          "signature": "phaseCoherence(phases)",
          "summary": ""
        },
        {
          "name": "stepKuramotoPhases",
          "kind": "function",
          "signature": "stepKuramotoPhases(phases, naturalFrequencies, dt, coupling = 0.5, weights = null, out = null)",
          "summary": ""
        },
        {
          "name": "stepCoupledOscillators",
          "kind": "function",
          "signature": "stepCoupledOscillators(oscillators, dt, coupling = 0.5, weights = null)",
          "summary": ""
        },
        {
          "name": "kuramotoOrderParameterComplex",
          "kind": "function",
          "signature": "kuramotoOrderParameterComplex(phases)",
          "summary": "Kuramoto order parameter (complex form). Computes collective synchronization r·e^(iψ) of N coupled phases. r ≈ 0 = chaos/dissonance; r ≈ 1 = perfect lockstep. Real-world: power-grid frequency lock, neural firing synchrony, firefly flashing, cardiac pacemakers, crowd footsteps (Millennium Bridge wobble)."
        },
        {
          "name": "kuramotoOrderParameter",
          "kind": "function",
          "signature": "kuramotoOrderParameter(phases)",
          "summary": "Scalar synchronization metric r = |<e^(iθ)>|. Game uses: swarm AI cohesion, rhythm-combat sync signals, magic ritual progress bars, ambient life pulse coherence."
        },
        {
          "name": "stepKuramotoDriven",
          "kind": "function",
          "signature": "stepKuramotoDriven(phases, naturalFrequencies, dt, t, coupling = 0.5, driveFrequency = 1, driveStrength = 0, weights = null, out = null)",
          "summary": "Euler step for driven Kuramoto model. dθᵢ/dt = 2π·ωᵢ + (K/N)Σⱼsin(θⱼ−θᵢ) + λ·sin(2π·f_drive·t − θᵢ) The λ term is an external forcing function (e.g. Schumann resonance 7.83 Hz, a metronome, a planetary frequency, a bassline tempo). Applications: procedural music harmony, NPC swarm coordination, breathing/ idle animation sync, climate zone oscillations, magic aura pulse coupling."
        },
        {
          "name": "stepKuramotoMeanFieldDriven",
          "kind": "function",
          "signature": "stepKuramotoMeanFieldDriven(phases, naturalFrequencies, dt, t, coupling = 0.5, driveFrequency = 1, driveStrength = 0, out = null, order = null,)",
          "summary": "Exact O(N) Euler step for the globally coupled, driven Kuramoto model. For uniform all-to-all coupling, the pair sum is exactly reducible through Z = <exp(iθ)> = re + i·im: (K/N) Σⱼ sin(θⱼ-θᵢ) = K (im·cos θᵢ - re·sin θᵢ) This is mathematically equivalent to `stepKuramotoDriven(..., weights=null)` while avoiding its O(N²) pair loop. `order` may be supplied when the caller already computed the current order parameter for telemetry."
        },
        {
          "name": "createOscillatorBank",
          "kind": "function",
          "signature": "createOscillatorBank(count, factory = null)",
          "summary": ""
        },
        {
          "name": "OSCILLATOR_SHAPES",
          "kind": "constant",
          "signature": "OSCILLATOR_SHAPES",
          "summary": ""
        },
        {
          "name": "DEFAULT_OSCILLATOR",
          "kind": "constant",
          "signature": "DEFAULT_OSCILLATOR",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathPacking",
      "path": "engine/reference/core/math/MathPacking.md",
      "source": "engine/core/math/MathPacking.js",
      "import": "/engine/core/math/MathPacking.js",
      "sourceHash": "15a1f71a21fd94ce62c6da4baeb4a8a7772bbbd9041aa536c7b6feebb5ac7b48",
      "summary": "MathPacking.js - GPU data packing utilities Half-float, SNORM/UNORM, RGB9E5, R11G11B10F Consolidates: World3DPreviewRenderer._floatToHalf, MeshCompression.quantizeUVs",
      "exports": [
        {
          "name": "floatToHalf",
          "kind": "function",
          "signature": "floatToHalf(val)",
          "summary": ""
        },
        {
          "name": "halfToFloat",
          "kind": "function",
          "signature": "halfToFloat(h)",
          "summary": ""
        },
        {
          "name": "floatArrayToHalf",
          "kind": "function",
          "signature": "floatArrayToHalf(arr)",
          "summary": ""
        },
        {
          "name": "halfArrayToFloat",
          "kind": "function",
          "signature": "halfArrayToFloat(arr)",
          "summary": ""
        },
        {
          "name": "packUNORM8Array",
          "kind": "function",
          "signature": "packUNORM8Array(arr)",
          "summary": ""
        },
        {
          "name": "unpackUNORM8Array",
          "kind": "function",
          "signature": "unpackUNORM8Array(arr)",
          "summary": ""
        },
        {
          "name": "packUNORM16Array",
          "kind": "function",
          "signature": "packUNORM16Array(arr)",
          "summary": ""
        },
        {
          "name": "unpackUNORM16Array",
          "kind": "function",
          "signature": "unpackUNORM16Array(arr)",
          "summary": ""
        },
        {
          "name": "packSignedRangeUNORMBits",
          "kind": "function",
          "signature": "packSignedRangeUNORMBits(value, range, bitDepth = 16, fallback = 0)",
          "summary": ""
        },
        {
          "name": "unpackSignedRangeUNORMBits",
          "kind": "function",
          "signature": "unpackSignedRangeUNORMBits(packed, range, bitDepth = 16, fallback = 0)",
          "summary": ""
        },
        {
          "name": "packSignedRangeUNORM16",
          "kind": "function",
          "signature": "packSignedRangeUNORM16(value, range, fallback = 0)",
          "summary": ""
        },
        {
          "name": "unpackSignedRangeUNORM16",
          "kind": "function",
          "signature": "unpackSignedRangeUNORM16(packed, range, fallback = 0)",
          "summary": ""
        },
        {
          "name": "packSignedRangeSNORMBits",
          "kind": "function",
          "signature": "packSignedRangeSNORMBits(value, range, bitDepth = 16, fallback = 0)",
          "summary": ""
        },
        {
          "name": "unpackSignedRangeSNORMBits",
          "kind": "function",
          "signature": "unpackSignedRangeSNORMBits(packed, range, bitDepth = 16, fallback = 0)",
          "summary": ""
        },
        {
          "name": "packSignedRangeSNORM16",
          "kind": "function",
          "signature": "packSignedRangeSNORM16(value, range, fallback = 0)",
          "summary": ""
        },
        {
          "name": "unpackSignedRangeSNORM16",
          "kind": "function",
          "signature": "unpackSignedRangeSNORM16(packed, range, fallback = 0)",
          "summary": ""
        },
        {
          "name": "packUint8x4",
          "kind": "function",
          "signature": "packUint8x4(x, y, z, w)",
          "summary": ""
        },
        {
          "name": "unpackUint8x4",
          "kind": "function",
          "signature": "unpackUint8x4(packed)",
          "summary": ""
        },
        {
          "name": "packUNORM8x4",
          "kind": "function",
          "signature": "packUNORM8x4(x, y, z, w)",
          "summary": ""
        },
        {
          "name": "unpackUNORM8x4",
          "kind": "function",
          "signature": "unpackUNORM8x4(packed)",
          "summary": ""
        },
        {
          "name": "packSNORM8x4",
          "kind": "function",
          "signature": "packSNORM8x4(x, y, z, w)",
          "summary": ""
        },
        {
          "name": "unpackSNORM8x4",
          "kind": "function",
          "signature": "unpackSNORM8x4(packed)",
          "summary": ""
        },
        {
          "name": "packUNORM16x2",
          "kind": "function",
          "signature": "packUNORM16x2(x, y)",
          "summary": ""
        },
        {
          "name": "unpackUNORM16x2",
          "kind": "function",
          "signature": "unpackUNORM16x2(packed)",
          "summary": ""
        },
        {
          "name": "packSNORM16x2",
          "kind": "function",
          "signature": "packSNORM16x2(x, y)",
          "summary": ""
        },
        {
          "name": "unpackSNORM16x2",
          "kind": "function",
          "signature": "unpackSNORM16x2(packed)",
          "summary": ""
        },
        {
          "name": "packTransformTRS10",
          "kind": "function",
          "signature": "packTransformTRS10(transform = {}, options = {})",
          "summary": ""
        },
        {
          "name": "unpackTransformTRS10",
          "kind": "function",
          "signature": "unpackTransformTRS10(packed, options = {})",
          "summary": ""
        },
        {
          "name": "packParticlePositionAge",
          "kind": "function",
          "signature": "packParticlePositionAge(x, y, z, age, options = {})",
          "summary": ""
        },
        {
          "name": "unpackParticlePositionAge",
          "kind": "function",
          "signature": "unpackParticlePositionAge(packed, options = {})",
          "summary": ""
        },
        {
          "name": "packParticleVelocityLifetime",
          "kind": "function",
          "signature": "packParticleVelocityLifetime(vx, vy, vz, lifetime, options = {})",
          "summary": ""
        },
        {
          "name": "unpackParticleVelocityLifetime",
          "kind": "function",
          "signature": "unpackParticleVelocityLifetime(packed, options = {})",
          "summary": ""
        },
        {
          "name": "packORM8",
          "kind": "function",
          "signature": "packORM8(occlusion = 1, roughness = 1, metallic = 0, alpha = 1)",
          "summary": ""
        },
        {
          "name": "unpackORM8",
          "kind": "function",
          "signature": "unpackORM8(packed)",
          "summary": ""
        },
        {
          "name": "packPBRMaterialParams8",
          "kind": "function",
          "signature": "packPBRMaterialParams8(metallic = 0, roughness = 1, normalScale = 1, alphaCutoff = 0)",
          "summary": ""
        },
        {
          "name": "unpackPBRMaterialParams8",
          "kind": "function",
          "signature": "unpackPBRMaterialParams8(packed)",
          "summary": ""
        },
        {
          "name": "normalizeVoxelMaterialUniforms",
          "kind": "function",
          "signature": "normalizeVoxelMaterialUniforms(params = {})",
          "summary": ""
        },
        {
          "name": "packVoxelMaterialUniforms",
          "kind": "function",
          "signature": "packVoxelMaterialUniforms(params = {}, out = new Float32Array(VOXEL_MATERIAL_UNIFORM_FLOATS)",
          "summary": ""
        },
        {
          "name": "packRGB9E5",
          "kind": "function",
          "signature": "packRGB9E5(r, g, b)",
          "summary": ""
        },
        {
          "name": "unpackRGB9E5",
          "kind": "function",
          "signature": "unpackRGB9E5(v)",
          "summary": ""
        },
        {
          "name": "packR11G11B10F",
          "kind": "function",
          "signature": "packR11G11B10F(r, g, b)",
          "summary": ""
        },
        {
          "name": "unpackR11G11B10F",
          "kind": "function",
          "signature": "unpackR11G11B10F(v)",
          "summary": ""
        },
        {
          "name": "packOctNormal",
          "kind": "function",
          "signature": "packOctNormal(nx, ny, nz)",
          "summary": ""
        },
        {
          "name": "unpackOctNormal",
          "kind": "function",
          "signature": "unpackOctNormal(packed)",
          "summary": ""
        },
        {
          "name": "packQuatSmallestThree",
          "kind": "function",
          "signature": "packQuatSmallestThree(x, y, z, w)",
          "summary": ""
        },
        {
          "name": "unpackQuatSmallestThree",
          "kind": "function",
          "signature": "unpackQuatSmallestThree(packed)",
          "summary": ""
        },
        {
          "name": "packUNORM8",
          "kind": "function",
          "signature": "packUNORM8(f)",
          "summary": ""
        },
        {
          "name": "unpackUNORM8",
          "kind": "function",
          "signature": "unpackUNORM8(u)",
          "summary": ""
        },
        {
          "name": "packUNORM16",
          "kind": "function",
          "signature": "packUNORM16(f)",
          "summary": ""
        },
        {
          "name": "unpackUNORM16",
          "kind": "function",
          "signature": "unpackUNORM16(u)",
          "summary": ""
        },
        {
          "name": "packSNORM8",
          "kind": "function",
          "signature": "packSNORM8(f)",
          "summary": ""
        },
        {
          "name": "unpackSNORM8",
          "kind": "function",
          "signature": "unpackSNORM8(s)",
          "summary": ""
        },
        {
          "name": "packSNORM16",
          "kind": "function",
          "signature": "packSNORM16(f)",
          "summary": ""
        },
        {
          "name": "unpackSNORM16",
          "kind": "function",
          "signature": "unpackSNORM16(s)",
          "summary": ""
        },
        {
          "name": "TRANSFORM_PACKED_TRS_LENGTH",
          "kind": "constant",
          "signature": "TRANSFORM_PACKED_TRS_LENGTH",
          "summary": ""
        },
        {
          "name": "DEFAULT_TRANSFORM_PACKING_SCALES",
          "kind": "constant",
          "signature": "DEFAULT_TRANSFORM_PACKING_SCALES",
          "summary": ""
        },
        {
          "name": "PARTICLE_STATE_PACKED_VEC4_LENGTH",
          "kind": "constant",
          "signature": "PARTICLE_STATE_PACKED_VEC4_LENGTH",
          "summary": ""
        },
        {
          "name": "DEFAULT_PARTICLE_PACKING_RANGES",
          "kind": "constant",
          "signature": "DEFAULT_PARTICLE_PACKING_RANGES",
          "summary": ""
        },
        {
          "name": "VOXEL_MATERIAL_UNIFORM_FLOATS",
          "kind": "constant",
          "signature": "VOXEL_MATERIAL_UNIFORM_FLOATS",
          "summary": ""
        },
        {
          "name": "DEFAULT_VOXEL_MATERIAL_UNIFORMS",
          "kind": "constant",
          "signature": "DEFAULT_VOXEL_MATERIAL_UNIFORMS",
          "summary": ""
        },
        {
          "name": "packVec2UNORM16",
          "kind": "constant",
          "signature": "packVec2UNORM16",
          "summary": ""
        },
        {
          "name": "unpackVec2UNORM16",
          "kind": "constant",
          "signature": "unpackVec2UNORM16",
          "summary": ""
        },
        {
          "name": "packVec2SNORM16",
          "kind": "constant",
          "signature": "packVec2SNORM16",
          "summary": ""
        },
        {
          "name": "unpackVec2SNORM16",
          "kind": "constant",
          "signature": "unpackVec2SNORM16",
          "summary": ""
        },
        {
          "name": "packTransform",
          "kind": "constant",
          "signature": "packTransform",
          "summary": ""
        },
        {
          "name": "unpackTransform",
          "kind": "constant",
          "signature": "unpackTransform",
          "summary": ""
        },
        {
          "name": "packParticlePosition",
          "kind": "constant",
          "signature": "packParticlePosition",
          "summary": ""
        },
        {
          "name": "unpackParticlePosition",
          "kind": "constant",
          "signature": "unpackParticlePosition",
          "summary": ""
        },
        {
          "name": "packParticleVelocity",
          "kind": "constant",
          "signature": "packParticleVelocity",
          "summary": ""
        },
        {
          "name": "unpackParticleVelocity",
          "kind": "constant",
          "signature": "unpackParticleVelocity",
          "summary": ""
        },
        {
          "name": "packMaterialORM8",
          "kind": "constant",
          "signature": "packMaterialORM8",
          "summary": ""
        },
        {
          "name": "unpackMaterialORM8",
          "kind": "constant",
          "signature": "unpackMaterialORM8",
          "summary": ""
        },
        {
          "name": "packMaterialParams8",
          "kind": "constant",
          "signature": "packMaterialParams8",
          "summary": ""
        },
        {
          "name": "unpackMaterialParams8",
          "kind": "constant",
          "signature": "unpackMaterialParams8",
          "summary": ""
        },
        {
          "name": "packQuaternionSmallestThree",
          "kind": "constant",
          "signature": "packQuaternionSmallestThree",
          "summary": ""
        },
        {
          "name": "unpackQuaternionSmallestThree",
          "kind": "constant",
          "signature": "unpackQuaternionSmallestThree",
          "summary": ""
        },
        {
          "name": "packQuat",
          "kind": "constant",
          "signature": "packQuat",
          "summary": ""
        },
        {
          "name": "unpackQuat",
          "kind": "constant",
          "signature": "unpackQuat",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathPhysics",
      "path": "engine/reference/core/math/MathPhysics.md",
      "source": "engine/core/math/MathPhysics.js",
      "import": "/engine/core/math/MathPhysics.js",
      "sourceHash": "ffe6509ae9d4a0f51ba4a7171ef15843c19cc7c7a36184b8bd538d2e198e3782",
      "summary": "",
      "exports": [
        {
          "name": "linearMotion",
          "kind": "function",
          "signature": "linearMotion(position, velocity, acceleration, dt)",
          "summary": ""
        },
        {
          "name": "eulerIntegrate",
          "kind": "function",
          "signature": "eulerIntegrate(position, velocity, acceleration, dt)",
          "summary": ""
        },
        {
          "name": "semiImplicitEuler",
          "kind": "function",
          "signature": "semiImplicitEuler(position, velocity, acceleration, dt)",
          "summary": ""
        },
        {
          "name": "projectileMotion",
          "kind": "function",
          "signature": "projectileMotion(position, velocity, gravity, dt)",
          "summary": ""
        },
        {
          "name": "projectilePosition",
          "kind": "function",
          "signature": "projectilePosition(start, velocity, gravity, t)",
          "summary": ""
        },
        {
          "name": "projectileTimeToApex",
          "kind": "function",
          "signature": "projectileTimeToApex(velocityY, gravity)",
          "summary": ""
        },
        {
          "name": "projectileMaxHeight",
          "kind": "function",
          "signature": "projectileMaxHeight(startY, velocityY, gravity)",
          "summary": ""
        },
        {
          "name": "projectileRange",
          "kind": "function",
          "signature": "projectileRange(speed, angle, gravity)",
          "summary": ""
        },
        {
          "name": "projectileLaunchAngle",
          "kind": "function",
          "signature": "projectileLaunchAngle(range, speed, gravity)",
          "summary": ""
        },
        {
          "name": "projectileVelocityToTarget",
          "kind": "function",
          "signature": "projectileVelocityToTarget(start, target, gravity, preferHighArc = false)",
          "summary": ""
        },
        {
          "name": "pointVelocityFromAngular",
          "kind": "function",
          "signature": "pointVelocityFromAngular(angularVelocity, centerOfRotation, point)",
          "summary": ""
        },
        {
          "name": "totalPointVelocity",
          "kind": "function",
          "signature": "totalPointVelocity(linearVelocity, angularVelocity, centerOfMass, point)",
          "summary": ""
        },
        {
          "name": "gravitationalForce",
          "kind": "function",
          "signature": "gravitationalForce(m1, m2, p1, p2, G = 6.674e-11)",
          "summary": ""
        },
        {
          "name": "springForce",
          "kind": "function",
          "signature": "springForce(position, anchor, restLength, stiffness)",
          "summary": ""
        },
        {
          "name": "dampedSpringForce",
          "kind": "function",
          "signature": "dampedSpringForce(position, velocity, anchor, restLength, stiffness, damping)",
          "summary": ""
        },
        {
          "name": "dragForce",
          "kind": "function",
          "signature": "dragForce(velocity, dragCoefficient, area, fluidDensity = 1.225)",
          "summary": ""
        },
        {
          "name": "linearDragForce",
          "kind": "function",
          "signature": "linearDragForce(velocity, dragCoefficient)",
          "summary": ""
        },
        {
          "name": "frictionForce",
          "kind": "function",
          "signature": "frictionForce(velocity, normalForce, frictionCoefficient)",
          "summary": ""
        },
        {
          "name": "buoyancyForce",
          "kind": "function",
          "signature": "buoyancyForce(submergedVolume, fluidDensity, gravity = 9.81)",
          "summary": ""
        },
        {
          "name": "torqueFromForce",
          "kind": "function",
          "signature": "torqueFromForce(force, point, centerOfMass)",
          "summary": ""
        },
        {
          "name": "angularAccelerationFromTorque",
          "kind": "function",
          "signature": "angularAccelerationFromTorque(torque, inertia)",
          "summary": ""
        },
        {
          "name": "elasticCollision",
          "kind": "function",
          "signature": "elasticCollision(m1, v1, m2, v2)",
          "summary": ""
        },
        {
          "name": "inelasticCollision",
          "kind": "function",
          "signature": "inelasticCollision(m1, v1, m2, v2, restitution = 0.5)",
          "summary": ""
        },
        {
          "name": "sphereCollisionResponse",
          "kind": "function",
          "signature": "sphereCollisionResponse(p1, v1, m1, r1, p2, v2, m2, r2, restitution = 0.8)",
          "summary": ""
        },
        {
          "name": "planeCollisionResponse",
          "kind": "function",
          "signature": "planeCollisionResponse(velocity, normal, restitution = 0.8)",
          "summary": ""
        },
        {
          "name": "collisionResponseWithFriction",
          "kind": "function",
          "signature": "collisionResponseWithFriction(velocity, normal, restitution, friction)",
          "summary": ""
        },
        {
          "name": "distanceConstraint",
          "kind": "function",
          "signature": "distanceConstraint(p1, p2, targetDistance, stiffness = 1)",
          "summary": ""
        },
        {
          "name": "distanceConstraintMass",
          "kind": "function",
          "signature": "distanceConstraintMass(p1, m1, p2, m2, targetDistance, stiffness = 1)",
          "summary": ""
        },
        {
          "name": "pointConstraint",
          "kind": "function",
          "signature": "pointConstraint(position, target, stiffness = 1)",
          "summary": ""
        },
        {
          "name": "angleConstraint",
          "kind": "function",
          "signature": "angleConstraint(p1, p2, p3, targetAngle, stiffness = 1)",
          "summary": ""
        },
        {
          "name": "collisionConstraint",
          "kind": "function",
          "signature": "collisionConstraint(p1, r1, p2, r2)",
          "summary": ""
        },
        {
          "name": "verletIntegrate",
          "kind": "function",
          "signature": "verletIntegrate(current, previous, acceleration, dt)",
          "summary": ""
        },
        {
          "name": "verletIntegrateDamped",
          "kind": "function",
          "signature": "verletIntegrateDamped(current, previous, acceleration, dt, damping = 0.99)",
          "summary": ""
        },
        {
          "name": "verletVelocity",
          "kind": "function",
          "signature": "verletVelocity(current, previous, dt)",
          "summary": ""
        },
        {
          "name": "parallelAxisTheorem",
          "kind": "function",
          "signature": "parallelAxisTheorem(inertia, mass, offset)",
          "summary": ""
        },
        {
          "name": "totalMechanicalEnergy",
          "kind": "function",
          "signature": "totalMechanicalEnergy(mass, velocity, height, g = 9.81)",
          "summary": ""
        },
        {
          "name": "rk2Integrate",
          "kind": "function",
          "signature": "rk2Integrate(position, velocity, accelerationFn, t, dt)",
          "summary": ""
        },
        {
          "name": "rk4Integrate",
          "kind": "function",
          "signature": "rk4Integrate(position, velocity, accelerationFn, t, dt)",
          "summary": ""
        },
        {
          "name": "rk4AdaptiveStep",
          "kind": "function",
          "signature": "rk4AdaptiveStep(position, velocity, accelerationFn, t, dt)",
          "summary": ""
        },
        {
          "name": "pointAttractorForce",
          "kind": "function",
          "signature": "pointAttractorForce(position, attractorPos, strength, falloffRadius = 1)",
          "summary": ""
        },
        {
          "name": "pointAttractorForceInvSq",
          "kind": "function",
          "signature": "pointAttractorForceInvSq(position, attractorPos, strength, minDist = 0.1)",
          "summary": ""
        },
        {
          "name": "vortexFieldForce",
          "kind": "function",
          "signature": "vortexFieldForce(position, vortexPos, vortexAxis, strength, radius = 1)",
          "summary": ""
        },
        {
          "name": "orbitForce",
          "kind": "function",
          "signature": "orbitForce(position, centerPos, orbitSpeed, upAxis = [0, 1, 0])",
          "summary": ""
        },
        {
          "name": "windForce",
          "kind": "function",
          "signature": "windForce(velocity, windVelocity, sensitivity = 0.1)",
          "summary": ""
        },
        {
          "name": "sphereSphereTimeOfImpact",
          "kind": "function",
          "signature": "sphereSphereTimeOfImpact(p1, v1, r1, p2, r2)",
          "summary": ""
        },
        {
          "name": "sphereSphereMovingTOI",
          "kind": "function",
          "signature": "sphereSphereMovingTOI(p1, v1, r1, p2, v2, r2)",
          "summary": ""
        },
        {
          "name": "spherePlaneTimeOfImpact",
          "kind": "function",
          "signature": "spherePlaneTimeOfImpact(center, velocity, radius, planeNormal, planeD)",
          "summary": ""
        },
        {
          "name": "sphereAABBTimeOfImpact",
          "kind": "function",
          "signature": "sphereAABBTimeOfImpact(center, velocity, radius, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "clampVelocity",
          "kind": "function",
          "signature": "clampVelocity(velocity, maxSpeed)",
          "summary": ""
        },
        {
          "name": "applyDrag",
          "kind": "function",
          "signature": "applyDrag(velocity, drag, dt)",
          "summary": ""
        },
        {
          "name": "separateSpheres",
          "kind": "function",
          "signature": "separateSpheres(p1, r1, p2, r2)",
          "summary": ""
        },
        {
          "name": "forceFromAcceleration",
          "kind": "function",
          "signature": "forceFromAcceleration(mass, acceleration)",
          "summary": ""
        },
        {
          "name": "accelerationFromForce",
          "kind": "function",
          "signature": "accelerationFromForce(mass, force)",
          "summary": ""
        },
        {
          "name": "inertiaBox",
          "kind": "function",
          "signature": "inertiaBox(mass, width, height, depth)",
          "summary": ""
        },
        {
          "name": "inertiaSphere",
          "kind": "function",
          "signature": "inertiaSphere(mass, radius)",
          "summary": ""
        },
        {
          "name": "inertiaHollowSphere",
          "kind": "function",
          "signature": "inertiaHollowSphere(mass, radius)",
          "summary": ""
        },
        {
          "name": "inertiaCylinder",
          "kind": "function",
          "signature": "inertiaCylinder(mass, radius, height)",
          "summary": ""
        },
        {
          "name": "inertiaCapsule",
          "kind": "function",
          "signature": "inertiaCapsule(mass, radius, height)",
          "summary": ""
        },
        {
          "name": "inertiaCone",
          "kind": "function",
          "signature": "inertiaCone(mass, radius, height)",
          "summary": ""
        },
        {
          "name": "kineticEnergy",
          "kind": "function",
          "signature": "kineticEnergy(mass, velocity)",
          "summary": ""
        },
        {
          "name": "potentialEnergyGravity",
          "kind": "function",
          "signature": "potentialEnergyGravity(mass, height, g = 9.81)",
          "summary": ""
        },
        {
          "name": "springPotentialEnergy",
          "kind": "function",
          "signature": "springPotentialEnergy(stiffness, displacement)",
          "summary": ""
        },
        {
          "name": "rotationalKineticEnergy",
          "kind": "function",
          "signature": "rotationalKineticEnergy(inertia, angularVelocity)",
          "summary": ""
        },
        {
          "name": "linearMomentum",
          "kind": "function",
          "signature": "linearMomentum(mass, velocity)",
          "summary": ""
        },
        {
          "name": "angularMomentum",
          "kind": "function",
          "signature": "angularMomentum(inertia, angularVelocity)",
          "summary": ""
        },
        {
          "name": "inertiaSolidSphere",
          "kind": "constant",
          "signature": "inertiaSolidSphere",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathPlane",
      "path": "engine/reference/core/math/MathPlane.md",
      "source": "engine/core/math/MathPlane.js",
      "import": "/engine/core/math/MathPlane.js",
      "sourceHash": "1c2d7a5d7b16b3de485f79fa9fe7fa64deeb61db2287730a47ed4c5c1ed1f69f",
      "summary": "MathPlane.js - Plane operations (Three.js/Godot/Unity parity) Plane represented as [nx, ny, nz, d] where nx*x + ny*y + nz*z + d = 0 Consolidates: MeshCutter.Plane, MathGeometry.rayPlane, MathGeometry.sdfPlane",
      "exports": [
        {
          "name": "planeFromPointNormal",
          "kind": "function",
          "signature": "planeFromPointNormal(point, normal)",
          "summary": ""
        },
        {
          "name": "planeFromPoints",
          "kind": "function",
          "signature": "planeFromPoints(a, b, c)",
          "summary": ""
        },
        {
          "name": "planeNormalize",
          "kind": "function",
          "signature": "planeNormalize(p)",
          "summary": ""
        },
        {
          "name": "planeClassifyPoint",
          "kind": "function",
          "signature": "planeClassifyPoint(plane, point, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "planeProjectPoint",
          "kind": "function",
          "signature": "planeProjectPoint(plane, point)",
          "summary": ""
        },
        {
          "name": "planeIntersectRay",
          "kind": "function",
          "signature": "planeIntersectRay(plane, rayOrigin, rayDir)",
          "summary": ""
        },
        {
          "name": "planeIntersectSegment",
          "kind": "function",
          "signature": "planeIntersectSegment(plane, p1, p2)",
          "summary": ""
        },
        {
          "name": "planeIntersectPlane",
          "kind": "function",
          "signature": "planeIntersectPlane(p1, p2)",
          "summary": ""
        },
        {
          "name": "planeIntersectThreePlanes",
          "kind": "function",
          "signature": "planeIntersectThreePlanes(p1, p2, p3)",
          "summary": ""
        },
        {
          "name": "planeTransformMat4",
          "kind": "function",
          "signature": "planeTransformMat4(plane, m)",
          "summary": ""
        },
        {
          "name": "planeEquals",
          "kind": "function",
          "signature": "planeEquals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "planeCreate",
          "kind": "function",
          "signature": "planeCreate(nx, ny, nz, d)",
          "summary": ""
        },
        {
          "name": "planeClone",
          "kind": "function",
          "signature": "planeClone(p)",
          "summary": ""
        },
        {
          "name": "planeGetNormal",
          "kind": "function",
          "signature": "planeGetNormal(p)",
          "summary": ""
        },
        {
          "name": "planeDistanceToPoint",
          "kind": "function",
          "signature": "planeDistanceToPoint(plane, point)",
          "summary": ""
        },
        {
          "name": "planeAbsDistanceToPoint",
          "kind": "function",
          "signature": "planeAbsDistanceToPoint(plane, point)",
          "summary": ""
        },
        {
          "name": "planeNegate",
          "kind": "function",
          "signature": "planeNegate(p)",
          "summary": ""
        },
        {
          "name": "planeCoplanarPoint",
          "kind": "function",
          "signature": "planeCoplanarPoint(plane)",
          "summary": ""
        },
        {
          "name": "planeClosestPoint",
          "kind": "constant",
          "signature": "planeClosestPoint",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathPolynomial",
      "path": "engine/reference/core/math/MathPolynomial.md",
      "source": "engine/core/math/MathPolynomial.js",
      "import": "/engine/core/math/MathPolynomial.js",
      "sourceHash": "327bec1221f20c6ac6f248261c06b405ff80b55bff365762d4dddd9b37517036",
      "summary": "MathPolynomial.js - Polynomial root solvers and evaluation Consolidates: AIAiming.js inline quadratic, SpeculativeContacts.js quadratic CCD Standard in game math libraries for intersection tests, predictive aim, CCD",
      "exports": [
        {
          "name": "polyEval",
          "kind": "function",
          "signature": "polyEval(coeffs, x)",
          "summary": "Evaluate polynomial using Horner's method: coeffs[0]*x^n + coeffs[1]*x^(n-1) + ... + coeffs[n]"
        },
        {
          "name": "polyDerivative",
          "kind": "function",
          "signature": "polyDerivative(coeffs)",
          "summary": "Derivative coefficients: returns new array of degree n-1"
        },
        {
          "name": "polyEvalWithDerivative",
          "kind": "function",
          "signature": "polyEvalWithDerivative(coeffs, x)",
          "summary": "Evaluate polynomial and its derivative simultaneously (Horner's)"
        },
        {
          "name": "solveLinear",
          "kind": "function",
          "signature": "solveLinear(a, b)",
          "summary": ""
        },
        {
          "name": "solveQuadratic",
          "kind": "function",
          "signature": "solveQuadratic(a, b, c)",
          "summary": ""
        },
        {
          "name": "solveQuadraticPositive",
          "kind": "function",
          "signature": "solveQuadraticPositive(a, b, c)",
          "summary": "Smallest positive root of quadratic, or null"
        },
        {
          "name": "solveCubic",
          "kind": "function",
          "signature": "solveCubic(a, b, c, d)",
          "summary": ""
        },
        {
          "name": "solveQuartic",
          "kind": "function",
          "signature": "solveQuartic(a, b, c, d, e)",
          "summary": ""
        },
        {
          "name": "polyNewtonRoot",
          "kind": "function",
          "signature": "polyNewtonRoot(coeffs, guess, maxIter = 20, tolerance = EPSILON)",
          "summary": ""
        },
        {
          "name": "polyRealRoots",
          "kind": "function",
          "signature": "polyRealRoots(coeffs, lo = -1000, hi = 1000, tolerance = 1e-10)",
          "summary": "Find all real roots of an arbitrary polynomial using Sturm chain + bisection"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathPrecision",
      "path": "engine/reference/core/math/MathPrecision.md",
      "source": "engine/core/math/MathPrecision.js",
      "import": "/engine/core/math/MathPrecision.js",
      "sourceHash": "171c56c863ce3de7ac014d549f7faa9ec0d89367cb2e57e5095eb8f997ea51e4",
      "summary": "MathPrecision.js - numeric tolerance and world-scale split-double helpers. Pure math helpers for tests, serialization policy, and CPU/GPU coordinate packing.",
      "exports": [
        {
          "name": "absoluteError",
          "kind": "function",
          "signature": "absoluteError(actual, expected)",
          "summary": ""
        },
        {
          "name": "relativeError",
          "kind": "function",
          "signature": "relativeError(actual, expected)",
          "summary": ""
        },
        {
          "name": "numberWithinTolerance",
          "kind": "function",
          "signature": "numberWithinTolerance(actual, expected, absoluteTolerance = DEFAULT_ABSOLUTE_TOLERANCE, relativeTolerance = DEFAULT_RELATIVE_TOLERANCE)",
          "summary": ""
        },
        {
          "name": "maxAbsError",
          "kind": "function",
          "signature": "maxAbsError(actual, expected)",
          "summary": ""
        },
        {
          "name": "vecWithinTolerance",
          "kind": "function",
          "signature": "vecWithinTolerance(actual, expected, absoluteTolerance = DEFAULT_ABSOLUTE_TOLERANCE, relativeTolerance = DEFAULT_RELATIVE_TOLERANCE)",
          "summary": ""
        },
        {
          "name": "splitFloat64ToFloat32",
          "kind": "function",
          "signature": "splitFloat64ToFloat32(value)",
          "summary": ""
        },
        {
          "name": "joinFloat32Split",
          "kind": "function",
          "signature": "joinFloat32Split(split)",
          "summary": ""
        },
        {
          "name": "splitVec3Float64ToFloat32",
          "kind": "function",
          "signature": "splitVec3Float64ToFloat32(value)",
          "summary": ""
        },
        {
          "name": "joinVec3Float32Split",
          "kind": "function",
          "signature": "joinVec3Float32Split(split)",
          "summary": ""
        },
        {
          "name": "serializeFloat32Split",
          "kind": "function",
          "signature": "serializeFloat32Split(split)",
          "summary": ""
        },
        {
          "name": "deserializeFloat32Split",
          "kind": "function",
          "signature": "deserializeFloat32Split(payload)",
          "summary": ""
        },
        {
          "name": "serializeVec3Float32Split",
          "kind": "function",
          "signature": "serializeVec3Float32Split(split)",
          "summary": ""
        },
        {
          "name": "deserializeVec3Float32Split",
          "kind": "function",
          "signature": "deserializeVec3Float32Split(payload)",
          "summary": ""
        },
        {
          "name": "jsonRoundTrip",
          "kind": "function",
          "signature": "jsonRoundTrip(value)",
          "summary": ""
        },
        {
          "name": "DEFAULT_ABSOLUTE_TOLERANCE",
          "kind": "constant",
          "signature": "DEFAULT_ABSOLUTE_TOLERANCE",
          "summary": ""
        },
        {
          "name": "DEFAULT_RELATIVE_TOLERANCE",
          "kind": "constant",
          "signature": "DEFAULT_RELATIVE_TOLERANCE",
          "summary": ""
        },
        {
          "name": "DEFAULT_WORLD_SPLIT_TOLERANCE",
          "kind": "constant",
          "signature": "DEFAULT_WORLD_SPLIT_TOLERANCE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathQuality",
      "path": "engine/reference/core/math/MathQuality.md",
      "source": "engine/core/math/MathQuality.js",
      "import": "/engine/core/math/MathQuality.js",
      "sourceHash": "e42d489bbc963759ffe50078c27420ab9b5688dbdf807b1d05475d2827a4abc7",
      "summary": "MathQuality.js - reusable error, quality, signal, and size metrics.",
      "exports": [
        {
          "name": "pairwiseErrorStats",
          "kind": "function",
          "signature": "pairwiseErrorStats(reference, candidate)",
          "summary": ""
        },
        {
          "name": "meanSquaredError",
          "kind": "function",
          "signature": "meanSquaredError(reference, candidate)",
          "summary": ""
        },
        {
          "name": "rootMeanSquaredError",
          "kind": "function",
          "signature": "rootMeanSquaredError(reference, candidate)",
          "summary": ""
        },
        {
          "name": "meanAbsoluteError",
          "kind": "function",
          "signature": "meanAbsoluteError(reference, candidate)",
          "summary": ""
        },
        {
          "name": "averageError",
          "kind": "function",
          "signature": "averageError(reference, candidate)",
          "summary": ""
        },
        {
          "name": "peakAbsoluteError",
          "kind": "function",
          "signature": "peakAbsoluteError(reference, candidate)",
          "summary": ""
        },
        {
          "name": "signalToNoiseRatio",
          "kind": "function",
          "signature": "signalToNoiseRatio(reference, candidate)",
          "summary": ""
        },
        {
          "name": "peakSignalToNoiseRatio",
          "kind": "function",
          "signature": "peakSignalToNoiseRatio(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "structuralSimilarityLite",
          "kind": "function",
          "signature": "structuralSimilarityLite(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "windowedStructuralSimilarity",
          "kind": "function",
          "signature": "windowedStructuralSimilarity(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "channelQualityReport",
          "kind": "function",
          "signature": "channelQualityReport(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "imageQualityReport",
          "kind": "function",
          "signature": "imageQualityReport(referenceImage, candidateImage, options = {})",
          "summary": ""
        },
        {
          "name": "histogramDifference",
          "kind": "function",
          "signature": "histogramDifference(referenceHistogram, candidateHistogram, options = {})",
          "summary": ""
        },
        {
          "name": "audioRmsError",
          "kind": "function",
          "signature": "audioRmsError(reference, candidate)",
          "summary": ""
        },
        {
          "name": "frameDifference",
          "kind": "function",
          "signature": "frameDifference(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "perceptualErrorScore",
          "kind": "function",
          "signature": "perceptualErrorScore(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "qualityMetricsReport",
          "kind": "function",
          "signature": "qualityMetricsReport(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "qualitySizeScore",
          "kind": "function",
          "signature": "qualitySizeScore({ quality = 1, byteSize = 0, referenceByteSize = 0, byteBudget = Infinity, budgetBytes = byteBudget, qualityWeight = 0.7, sizeWeight = 0.3, budgetWeight, } = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathQuat",
      "path": "engine/reference/core/math/MathQuat.md",
      "source": "engine/core/math/MathQuat.js",
      "import": "/engine/core/math/MathQuat.js",
      "sourceHash": "7d66b103c26c9f2592447a7b5f611db40b60e568db9efabf6956e124f3ca2fdc",
      "summary": "MathQuat.js - Extended Quaternion operations [x, y, z, w] Supplements the basic quat ops in EngineMath.js with advanced features Depends on: MathConstants.js, MathScalar.js",
      "exports": [
        {
          "name": "quatFromAxisAngle",
          "kind": "function",
          "signature": "quatFromAxisAngle(axis, angle)",
          "summary": ""
        },
        {
          "name": "quatFromEuler",
          "kind": "function",
          "signature": "quatFromEuler(x, y, z, order = 'XYZ')",
          "summary": ""
        },
        {
          "name": "quatToEuler",
          "kind": "function",
          "signature": "quatToEuler(q, order = 'XYZ')",
          "summary": ""
        },
        {
          "name": "quatFromRotationMatrix",
          "kind": "function",
          "signature": "quatFromRotationMatrix(m)",
          "summary": ""
        },
        {
          "name": "quatFromVectors",
          "kind": "function",
          "signature": "quatFromVectors(from, to)",
          "summary": ""
        },
        {
          "name": "quatLookAt",
          "kind": "function",
          "signature": "quatLookAt(direction, up = [0, 1, 0])",
          "summary": ""
        },
        {
          "name": "quatMultiply",
          "kind": "function",
          "signature": "quatMultiply(a, b)",
          "summary": ""
        },
        {
          "name": "quatInverse",
          "kind": "function",
          "signature": "quatInverse(q)",
          "summary": ""
        },
        {
          "name": "quatNormalize",
          "kind": "function",
          "signature": "quatNormalize(q)",
          "summary": ""
        },
        {
          "name": "quatRotateVec3",
          "kind": "function",
          "signature": "quatRotateVec3(v, q)",
          "summary": ""
        },
        {
          "name": "quatSlerp",
          "kind": "function",
          "signature": "quatSlerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "quatGetAxis",
          "kind": "function",
          "signature": "quatGetAxis(q)",
          "summary": ""
        },
        {
          "name": "quatEquals",
          "kind": "function",
          "signature": "quatEquals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "quatRandom",
          "kind": "function",
          "signature": "quatRandom()",
          "summary": ""
        },
        {
          "name": "quatExp",
          "kind": "function",
          "signature": "quatExp(q)",
          "summary": ""
        },
        {
          "name": "quatLog",
          "kind": "function",
          "signature": "quatLog(q)",
          "summary": ""
        },
        {
          "name": "quatRotateTowards",
          "kind": "function",
          "signature": "quatRotateTowards(from, to, maxRadiansDelta)",
          "summary": ""
        },
        {
          "name": "quatSlerpUnclamped",
          "kind": "function",
          "signature": "quatSlerpUnclamped(a, b, t)",
          "summary": ""
        },
        {
          "name": "quatToAxisAngle",
          "kind": "function",
          "signature": "quatToAxisAngle(q)",
          "summary": ""
        },
        {
          "name": "quatSwingTwist",
          "kind": "function",
          "signature": "quatSwingTwist(q, twistAxis)",
          "summary": ""
        },
        {
          "name": "quatIntegrateAngularVelocity",
          "kind": "function",
          "signature": "quatIntegrateAngularVelocity(q, angularVel, dt)",
          "summary": ""
        },
        {
          "name": "quat",
          "kind": "function",
          "signature": "quat(x = 0, y = 0, z = 0, w = 1)",
          "summary": ""
        },
        {
          "name": "quatIdentity",
          "kind": "function",
          "signature": "quatIdentity()",
          "summary": ""
        },
        {
          "name": "quatClone",
          "kind": "function",
          "signature": "quatClone(q)",
          "summary": ""
        },
        {
          "name": "quatCopy",
          "kind": "function",
          "signature": "quatCopy(out, q)",
          "summary": ""
        },
        {
          "name": "quatSet",
          "kind": "function",
          "signature": "quatSet(out, x, y, z, w)",
          "summary": ""
        },
        {
          "name": "quatFromEulerDeg",
          "kind": "function",
          "signature": "quatFromEulerDeg(x, y, z, order = 'XYZ')",
          "summary": ""
        },
        {
          "name": "quatToEulerDeg",
          "kind": "function",
          "signature": "quatToEulerDeg(q, order = 'XYZ')",
          "summary": ""
        },
        {
          "name": "quatAdd",
          "kind": "function",
          "signature": "quatAdd(a, b)",
          "summary": ""
        },
        {
          "name": "quatScale",
          "kind": "function",
          "signature": "quatScale(q, s)",
          "summary": ""
        },
        {
          "name": "quatConjugate",
          "kind": "function",
          "signature": "quatConjugate(q)",
          "summary": ""
        },
        {
          "name": "quatNegate",
          "kind": "function",
          "signature": "quatNegate(q)",
          "summary": ""
        },
        {
          "name": "quatLength",
          "kind": "function",
          "signature": "quatLength(q)",
          "summary": ""
        },
        {
          "name": "quatLengthSq",
          "kind": "function",
          "signature": "quatLengthSq(q)",
          "summary": ""
        },
        {
          "name": "quatDot",
          "kind": "function",
          "signature": "quatDot(a, b)",
          "summary": ""
        },
        {
          "name": "quatLerp",
          "kind": "function",
          "signature": "quatLerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "quatSquad",
          "kind": "function",
          "signature": "quatSquad(q0, q1, q2, q3, t)",
          "summary": ""
        },
        {
          "name": "quatGetAngle",
          "kind": "function",
          "signature": "quatGetAngle(q)",
          "summary": ""
        },
        {
          "name": "quatAngleBetween",
          "kind": "function",
          "signature": "quatAngleBetween(a, b)",
          "summary": ""
        },
        {
          "name": "quatPow",
          "kind": "function",
          "signature": "quatPow(q, n)",
          "summary": ""
        },
        {
          "name": "quatRotateX",
          "kind": "function",
          "signature": "quatRotateX(q, angle)",
          "summary": ""
        },
        {
          "name": "quatRotateY",
          "kind": "function",
          "signature": "quatRotateY(q, angle)",
          "summary": ""
        },
        {
          "name": "quatRotateZ",
          "kind": "function",
          "signature": "quatRotateZ(q, angle)",
          "summary": ""
        },
        {
          "name": "quatForward",
          "kind": "function",
          "signature": "quatForward(q)",
          "summary": ""
        },
        {
          "name": "quatRight",
          "kind": "function",
          "signature": "quatRight(q)",
          "summary": ""
        },
        {
          "name": "quatUp",
          "kind": "function",
          "signature": "quatUp(q)",
          "summary": ""
        },
        {
          "name": "quatBack",
          "kind": "function",
          "signature": "quatBack(q)",
          "summary": ""
        },
        {
          "name": "quatToString",
          "kind": "function",
          "signature": "quatToString(q, precision = 3)",
          "summary": ""
        },
        {
          "name": "quatDifference",
          "kind": "function",
          "signature": "quatDifference(from, to)",
          "summary": ""
        },
        {
          "name": "quatIsIdentity",
          "kind": "function",
          "signature": "quatIsIdentity(q, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "quatIsNormalized",
          "kind": "function",
          "signature": "quatIsNormalized(q, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "quatIsFinite",
          "kind": "function",
          "signature": "quatIsFinite(q)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathRandom",
      "path": "engine/reference/core/math/MathRandom.md",
      "source": "engine/core/math/MathRandom.js",
      "import": "/engine/core/math/MathRandom.js",
      "sourceHash": "f3d5da266df1fc28792ba0dfb828c52a17ed95309427f4791c0a8538d8b7f88b",
      "summary": "",
      "exports": [
        {
          "name": "mulberry32",
          "kind": "function",
          "signature": "mulberry32(seed)",
          "summary": ""
        },
        {
          "name": "splitmix32",
          "kind": "function",
          "signature": "splitmix32(seed)",
          "summary": ""
        },
        {
          "name": "xorshift128",
          "kind": "function",
          "signature": "xorshift128(seed)",
          "summary": ""
        },
        {
          "name": "pcg32",
          "kind": "function",
          "signature": "pcg32(seed)",
          "summary": ""
        },
        {
          "name": "legacyLcgAdvanceState32",
          "kind": "function",
          "signature": "legacyLcgAdvanceState32(state)",
          "summary": ""
        },
        {
          "name": "legacyLcgStateToFloat01",
          "kind": "function",
          "signature": "legacyLcgStateToFloat01(state)",
          "summary": ""
        },
        {
          "name": "setRandomSeed",
          "kind": "function",
          "signature": "setRandomSeed(seed)",
          "summary": ""
        },
        {
          "name": "resetRandomSeed",
          "kind": "function",
          "signature": "resetRandomSeed()",
          "summary": ""
        },
        {
          "name": "random",
          "kind": "function",
          "signature": "random()",
          "summary": ""
        },
        {
          "name": "randomRange",
          "kind": "function",
          "signature": "randomRange(min, max)",
          "summary": ""
        },
        {
          "name": "randomInt",
          "kind": "function",
          "signature": "randomInt(min, max)",
          "summary": ""
        },
        {
          "name": "randomBool",
          "kind": "function",
          "signature": "randomBool(probability = 0.5)",
          "summary": ""
        },
        {
          "name": "randomSign",
          "kind": "function",
          "signature": "randomSign()",
          "summary": ""
        },
        {
          "name": "uniformDistribution",
          "kind": "function",
          "signature": "uniformDistribution(min = 0, max = 1, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "normalDistribution",
          "kind": "function",
          "signature": "normalDistribution(mean = 0, stdDev = 1, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "exponentialDistribution",
          "kind": "function",
          "signature": "exponentialDistribution(lambda = 1, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "poissonDistribution",
          "kind": "function",
          "signature": "poissonDistribution(lambda, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "binomialDistribution",
          "kind": "function",
          "signature": "binomialDistribution(n, p, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "triangularDistribution",
          "kind": "function",
          "signature": "triangularDistribution(min, max, mode, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "gammaDistribution",
          "kind": "function",
          "signature": "gammaDistribution(shape, scale = 1, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "betaDistribution",
          "kind": "function",
          "signature": "betaDistribution(alpha, beta, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "logNormalDistribution",
          "kind": "function",
          "signature": "logNormalDistribution(mean = 0, stdDev = 1, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "cauchyDistribution",
          "kind": "function",
          "signature": "cauchyDistribution(x0 = 0, gamma = 1, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "paretoDistribution",
          "kind": "function",
          "signature": "paretoDistribution(alpha, xMin = 1, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "weightedRandom",
          "kind": "function",
          "signature": "weightedRandom(weights, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomElement",
          "kind": "function",
          "signature": "randomElement(array, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "shuffle",
          "kind": "function",
          "signature": "shuffle(array, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "shuffleInPlace",
          "kind": "function",
          "signature": "shuffleInPlace(array, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "sample",
          "kind": "function",
          "signature": "sample(array, n, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "sampleWithReplacement",
          "kind": "function",
          "signature": "sampleWithReplacement(array, n, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "reservoirSample",
          "kind": "function",
          "signature": "reservoirSample(stream, k, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomOnCircle",
          "kind": "function",
          "signature": "randomOnCircle(rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomInCircle",
          "kind": "function",
          "signature": "randomInCircle(rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomOnSphere",
          "kind": "function",
          "signature": "randomOnSphere(rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomInSphere",
          "kind": "function",
          "signature": "randomInSphere(rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomOnHemisphereCosine",
          "kind": "function",
          "signature": "randomOnHemisphereCosine(normal, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomInTriangle",
          "kind": "function",
          "signature": "randomInTriangle(v0, v1, v2, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "randomInCone",
          "kind": "function",
          "signature": "randomInCone(direction, halfAngle, rng = defaultRng)",
          "summary": ""
        },
        {
          "name": "haltonSequence",
          "kind": "function",
          "signature": "haltonSequence(index, base)",
          "summary": ""
        },
        {
          "name": "halton2D",
          "kind": "function",
          "signature": "halton2D(index)",
          "summary": ""
        },
        {
          "name": "halton3D",
          "kind": "function",
          "signature": "halton3D(index)",
          "summary": ""
        },
        {
          "name": "r2Sequence",
          "kind": "function",
          "signature": "r2Sequence(index)",
          "summary": ""
        },
        {
          "name": "r3Sequence",
          "kind": "function",
          "signature": "r3Sequence(index)",
          "summary": ""
        },
        {
          "name": "fibonacciSphere",
          "kind": "function",
          "signature": "fibonacciSphere(index, total, rotation = 0)",
          "summary": ""
        },
        {
          "name": "fibonacciSpherePoints",
          "kind": "function",
          "signature": "fibonacciSpherePoints(count, rotation = 0)",
          "summary": ""
        },
        {
          "name": "fibonacciDisk",
          "kind": "function",
          "signature": "fibonacciDisk(index, total)",
          "summary": ""
        },
        {
          "name": "poissonDiskSampling",
          "kind": "function",
          "signature": "poissonDiskSampling(width, height, minDist, maxAttempts = 30, rng = defaultRng)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathRay",
      "path": "engine/reference/core/math/MathRay.md",
      "source": "engine/core/math/MathRay.js",
      "import": "/engine/core/math/MathRay.js",
      "sourceHash": "a0b16be55a80a0a3dcdf4662c1aa6699c9246e5f4e560f08823afa5f16f599bf",
      "summary": "MathRay.js - Ray operations (Three.js/Unity parity) Ray represented as { origin: [x,y,z], direction: [x,y,z] } Consolidates: AIAiming.createRay, MathGeometry.ray*, ScreenRayCaster, Viewport.getPickRay",
      "exports": [
        {
          "name": "rayCreate",
          "kind": "function",
          "signature": "rayCreate(origin, direction)",
          "summary": ""
        },
        {
          "name": "rayFromPoints",
          "kind": "function",
          "signature": "rayFromPoints(a, b)",
          "summary": ""
        },
        {
          "name": "rayFromScreen",
          "kind": "function",
          "signature": "rayFromScreen(ndcX, ndcY, invViewProj)",
          "summary": ""
        },
        {
          "name": "rayClosestPointToPoint",
          "kind": "function",
          "signature": "rayClosestPointToPoint(ray, point)",
          "summary": ""
        },
        {
          "name": "rayDistanceToPoint",
          "kind": "function",
          "signature": "rayDistanceToPoint(ray, point)",
          "summary": ""
        },
        {
          "name": "rayDistanceSqToPoint",
          "kind": "function",
          "signature": "rayDistanceSqToPoint(ray, point)",
          "summary": ""
        },
        {
          "name": "rayClosestPointToRay",
          "kind": "function",
          "signature": "rayClosestPointToRay(ray1, ray2)",
          "summary": ""
        },
        {
          "name": "rayIntersectSphere",
          "kind": "function",
          "signature": "rayIntersectSphere(ray, center, radius)",
          "summary": ""
        },
        {
          "name": "rayIntersectAABB",
          "kind": "function",
          "signature": "rayIntersectAABB(ray, aabbMin, aabbMax)",
          "summary": ""
        },
        {
          "name": "rayIntersectPlane",
          "kind": "function",
          "signature": "rayIntersectPlane(ray, planeNormal, planeD)",
          "summary": ""
        },
        {
          "name": "rayIntersectTriangle",
          "kind": "function",
          "signature": "rayIntersectTriangle(ray, v0, v1, v2)",
          "summary": ""
        },
        {
          "name": "rayIntersectCapsule",
          "kind": "function",
          "signature": "rayIntersectCapsule(ray, capA, capB, radius)",
          "summary": ""
        },
        {
          "name": "rayIntersectOBB",
          "kind": "function",
          "signature": "rayIntersectOBB(ray, boxCenter, boxAxes, halfExtents)",
          "summary": ""
        },
        {
          "name": "rayTransformMat4",
          "kind": "function",
          "signature": "rayTransformMat4(ray, m)",
          "summary": ""
        },
        {
          "name": "rayEquals",
          "kind": "function",
          "signature": "rayEquals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "rayClone",
          "kind": "function",
          "signature": "rayClone(ray)",
          "summary": ""
        },
        {
          "name": "rayAt",
          "kind": "function",
          "signature": "rayAt(ray, t)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathRect2",
      "path": "engine/reference/core/math/MathRect2.md",
      "source": "engine/core/math/MathRect2.js",
      "import": "/engine/core/math/MathRect2.js",
      "sourceHash": "8cafe94a869030fcb56117b72ecee863ceec080928137f3858f9def6bb05ea8d",
      "summary": "MathRect2.js - 2D Axis-Aligned Bounding Box / Rectangle (Godot Rect2 / Three.js Box2 parity) Rect represented as { minX, minY, maxX, maxY } Consolidates: MathGeometry.pointInRect/rectRect, workflow-canvas bounding box logic",
      "exports": [
        {
          "name": "rect2FromPoints",
          "kind": "function",
          "signature": "rect2FromPoints(points)",
          "summary": ""
        },
        {
          "name": "rect2Intersection",
          "kind": "function",
          "signature": "rect2Intersection(a, b)",
          "summary": ""
        },
        {
          "name": "rect2DistanceToPoint",
          "kind": "function",
          "signature": "rect2DistanceToPoint(r, x, y)",
          "summary": ""
        },
        {
          "name": "rect2ApproxEquals",
          "kind": "function",
          "signature": "rect2ApproxEquals(a, b, eps = 1e-6)",
          "summary": ""
        },
        {
          "name": "rect2Create",
          "kind": "function",
          "signature": "rect2Create(minX, minY, maxX, maxY)",
          "summary": ""
        },
        {
          "name": "rect2FromCenterSize",
          "kind": "function",
          "signature": "rect2FromCenterSize(cx, cy, w, h)",
          "summary": ""
        },
        {
          "name": "rect2FromPositionSize",
          "kind": "function",
          "signature": "rect2FromPositionSize(x, y, w, h)",
          "summary": ""
        },
        {
          "name": "rect2Zero",
          "kind": "function",
          "signature": "rect2Zero()",
          "summary": ""
        },
        {
          "name": "rect2Clone",
          "kind": "function",
          "signature": "rect2Clone(r)",
          "summary": ""
        },
        {
          "name": "rect2Copy",
          "kind": "function",
          "signature": "rect2Copy(out, r)",
          "summary": ""
        },
        {
          "name": "rect2CenterX",
          "kind": "function",
          "signature": "rect2CenterX(r)",
          "summary": ""
        },
        {
          "name": "rect2CenterY",
          "kind": "function",
          "signature": "rect2CenterY(r)",
          "summary": ""
        },
        {
          "name": "rect2Center",
          "kind": "function",
          "signature": "rect2Center(r)",
          "summary": ""
        },
        {
          "name": "rect2Width",
          "kind": "function",
          "signature": "rect2Width(r)",
          "summary": ""
        },
        {
          "name": "rect2Height",
          "kind": "function",
          "signature": "rect2Height(r)",
          "summary": ""
        },
        {
          "name": "rect2Size",
          "kind": "function",
          "signature": "rect2Size(r)",
          "summary": ""
        },
        {
          "name": "rect2Area",
          "kind": "function",
          "signature": "rect2Area(r)",
          "summary": ""
        },
        {
          "name": "rect2Perimeter",
          "kind": "function",
          "signature": "rect2Perimeter(r)",
          "summary": ""
        },
        {
          "name": "rect2AspectRatio",
          "kind": "function",
          "signature": "rect2AspectRatio(r)",
          "summary": ""
        },
        {
          "name": "rect2IsEmpty",
          "kind": "function",
          "signature": "rect2IsEmpty(r)",
          "summary": ""
        },
        {
          "name": "rect2IsFinite",
          "kind": "function",
          "signature": "rect2IsFinite(r)",
          "summary": ""
        },
        {
          "name": "rect2ContainsPoint",
          "kind": "function",
          "signature": "rect2ContainsPoint(r, x, y)",
          "summary": ""
        },
        {
          "name": "rect2ContainsPointV",
          "kind": "function",
          "signature": "rect2ContainsPointV(r, p)",
          "summary": ""
        },
        {
          "name": "rect2ContainsRect",
          "kind": "function",
          "signature": "rect2ContainsRect(outer, inner)",
          "summary": ""
        },
        {
          "name": "rect2IntersectsRect",
          "kind": "function",
          "signature": "rect2IntersectsRect(a, b)",
          "summary": ""
        },
        {
          "name": "rect2ExpandPoint",
          "kind": "function",
          "signature": "rect2ExpandPoint(r, x, y)",
          "summary": ""
        },
        {
          "name": "rect2ExpandPointV",
          "kind": "function",
          "signature": "rect2ExpandPointV(r, p)",
          "summary": ""
        },
        {
          "name": "rect2Merge",
          "kind": "function",
          "signature": "rect2Merge(a, b)",
          "summary": ""
        },
        {
          "name": "rect2Grow",
          "kind": "function",
          "signature": "rect2Grow(r, amount)",
          "summary": ""
        },
        {
          "name": "rect2GrowV",
          "kind": "function",
          "signature": "rect2GrowV(r, ax, ay)",
          "summary": ""
        },
        {
          "name": "rect2Translate",
          "kind": "function",
          "signature": "rect2Translate(r, dx, dy)",
          "summary": ""
        },
        {
          "name": "rect2Scale",
          "kind": "function",
          "signature": "rect2Scale(r, sx, sy)",
          "summary": ""
        },
        {
          "name": "rect2ClampPoint",
          "kind": "function",
          "signature": "rect2ClampPoint(r, x, y)",
          "summary": ""
        },
        {
          "name": "rect2ClampPointV",
          "kind": "function",
          "signature": "rect2ClampPointV(r, p)",
          "summary": ""
        },
        {
          "name": "rect2DistanceToPointV",
          "kind": "function",
          "signature": "rect2DistanceToPointV(r, p)",
          "summary": ""
        },
        {
          "name": "rect2GetCorners",
          "kind": "function",
          "signature": "rect2GetCorners(r)",
          "summary": ""
        },
        {
          "name": "rect2Equals",
          "kind": "function",
          "signature": "rect2Equals(a, b)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathRegistry",
      "path": "engine/reference/core/math/MathRegistry.md",
      "source": "engine/core/math/MathRegistry.js",
      "import": "/engine/core/math/MathRegistry.js",
      "sourceHash": "70cc7da442d55244e41ebd27559ebd4f87abf6e1d2f53b19eebafd5fcff20f5b",
      "summary": "MathRegistry.js - inspectable metadata for stable MathEngine modules and functions.",
      "exports": [
        {
          "name": "mathRegistryEntries",
          "kind": "function",
          "signature": "mathRegistryEntries(filters = {})",
          "summary": ""
        },
        {
          "name": "mathRegistryById",
          "kind": "function",
          "signature": "mathRegistryById(id, registry = MATH_REGISTRY)",
          "summary": ""
        },
        {
          "name": "mathRegistryFunctionsForModule",
          "kind": "function",
          "signature": "mathRegistryFunctionsForModule(moduleId, registry = MATH_REGISTRY)",
          "summary": ""
        },
        {
          "name": "mathRegistryReport",
          "kind": "function",
          "signature": "mathRegistryReport(registry = MATH_REGISTRY)",
          "summary": ""
        },
        {
          "name": "mathRegistryManifest",
          "kind": "function",
          "signature": "mathRegistryManifest(registry = MATH_REGISTRY)",
          "summary": ""
        },
        {
          "name": "MATH_REGISTRY_VERSION",
          "kind": "constant",
          "signature": "MATH_REGISTRY_VERSION",
          "summary": ""
        },
        {
          "name": "MATH_MODULE_REGISTRY",
          "kind": "constant",
          "signature": "MATH_MODULE_REGISTRY",
          "summary": ""
        },
        {
          "name": "MATH_FUNCTION_REGISTRY",
          "kind": "constant",
          "signature": "MATH_FUNCTION_REGISTRY",
          "summary": ""
        },
        {
          "name": "MATH_REGISTRY",
          "kind": "constant",
          "signature": "MATH_REGISTRY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathRootAlgebra",
      "path": "engine/reference/core/math/MathRootAlgebra.md",
      "source": "engine/core/math/MathRootAlgebra.js",
      "import": "/engine/core/math/MathRootAlgebra.js",
      "sourceHash": "90be5128918d85c1130a3c7484c8c7e4c07d5cffb9aee9efbe8ad9eb2f5e8f40",
      "summary": "Compile the reducer into immutable bilinear and square execution plans. Experimental encoders never enter this path: callers may require the exact algebraic laws their optimized kernel depends on before code is generated.",
      "exports": [
        {
          "name": "rootAlgebraMask",
          "kind": "function",
          "signature": "rootAlgebraMask(n)",
          "summary": ""
        },
        {
          "name": "rootAlgebraDimension",
          "kind": "function",
          "signature": "rootAlgebraDimension(n)",
          "summary": ""
        },
        {
          "name": "rootAlgebraGeneratorName",
          "kind": "function",
          "signature": "rootAlgebraGeneratorName(index)",
          "summary": ""
        },
        {
          "name": "rootAlgebraBasisName",
          "kind": "function",
          "signature": "rootAlgebraBasisName(mask, n = 4)",
          "summary": ""
        },
        {
          "name": "rootAlgebraFormatElement",
          "kind": "function",
          "signature": "rootAlgebraFormatElement(element, n = 4)",
          "summary": ""
        },
        {
          "name": "rootAlgebraSquare",
          "kind": "function",
          "signature": "rootAlgebraSquare(n, basisMask)",
          "summary": ""
        },
        {
          "name": "rootAlgebraMultiply",
          "kind": "function",
          "signature": "rootAlgebraMultiply(n, leftMask, rightMask)",
          "summary": ""
        },
        {
          "name": "rootAlgebraTraceMultiply",
          "kind": "function",
          "signature": "rootAlgebraTraceMultiply(n, leftMask, rightMask)",
          "summary": ""
        },
        {
          "name": "rootAlgebraReverseMaskBits",
          "kind": "function",
          "signature": "rootAlgebraReverseMaskBits(mask, n)",
          "summary": ""
        },
        {
          "name": "rootAlgebraEncodedMultiply",
          "kind": "function",
          "signature": "rootAlgebraEncodedMultiply(n, leftMask, rightMask, options = {})",
          "summary": ""
        },
        {
          "name": "rootAlgebraEncodedTrace",
          "kind": "function",
          "signature": "rootAlgebraEncodedTrace(n, leftMask, rightMask, options = {})",
          "summary": ""
        },
        {
          "name": "rootAlgebraGenerateTable",
          "kind": "function",
          "signature": "rootAlgebraGenerateTable(n, multiply = rootAlgebraMultiply)",
          "summary": ""
        },
        {
          "name": "rootAlgebraCompileExecutionPlan",
          "kind": "function",
          "signature": "rootAlgebraCompileExecutionPlan(n, options = {})",
          "summary": "Compile the reducer into immutable bilinear and square execution plans. Experimental encoders never enter this path: callers may require the exact algebraic laws their optimized kernel depends on before code is generated."
        },
        {
          "name": "rootAlgebraEvaluateExecutionPlan",
          "kind": "function",
          "signature": "rootAlgebraEvaluateExecutionPlan(plan, left, right = null)",
          "summary": ""
        },
        {
          "name": "rootAlgebraExecutionPlanWGSL",
          "kind": "function",
          "signature": "rootAlgebraExecutionPlanWGSL(plan, options = {})",
          "summary": "Generate a branch-free WGSL product or square directly from a validated plan."
        },
        {
          "name": "rootAlgebraValidate",
          "kind": "function",
          "signature": "rootAlgebraValidate(n, options = {})",
          "summary": ""
        },
        {
          "name": "rootAlgebraPropertyReport",
          "kind": "function",
          "signature": "rootAlgebraPropertyReport(n, options = {})",
          "summary": ""
        },
        {
          "name": "rootAlgebraFindSimpleZeroDivisors",
          "kind": "function",
          "signature": "rootAlgebraFindSimpleZeroDivisors(n, options = {})",
          "summary": ""
        },
        {
          "name": "rootAlgebraSearchEncodedMultipliers",
          "kind": "function",
          "signature": "rootAlgebraSearchEncodedMultipliers(n, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathScalar",
      "path": "engine/reference/core/math/MathScalar.md",
      "source": "engine/core/math/MathScalar.js",
      "import": "/engine/core/math/MathScalar.js",
      "sourceHash": "01cd45a10273c367320358870046b7bb519bc5c841ccfd46b339a731afbb7a10",
      "summary": "MathScalar.js - Scalar utility functions Depends on: MathConstants.js",
      "exports": [
        {
          "name": "nearlyEqual",
          "kind": "function",
          "signature": "nearlyEqual(a, b, absEps = EPSILON, relEps = EPSILON)",
          "summary": ""
        },
        {
          "name": "safeDiv",
          "kind": "function",
          "signature": "safeDiv(numerator, denominator, fallback = 0)",
          "summary": ""
        },
        {
          "name": "gcd",
          "kind": "function",
          "signature": "gcd(a, b)",
          "summary": ""
        },
        {
          "name": "lcm",
          "kind": "function",
          "signature": "lcm(a, b)",
          "summary": ""
        },
        {
          "name": "normalizeRange",
          "kind": "function",
          "signature": "normalizeRange(min, max)",
          "summary": ""
        },
        {
          "name": "clampRange",
          "kind": "function",
          "signature": "clampRange(value, min, max)",
          "summary": ""
        },
        {
          "name": "rangeContains",
          "kind": "function",
          "signature": "rangeContains(value, min, max, inclusive = true)",
          "summary": ""
        },
        {
          "name": "rangeOverlap",
          "kind": "function",
          "signature": "rangeOverlap(aMin, aMax, bMin, bMax, inclusive = true)",
          "summary": ""
        },
        {
          "name": "rangeIntersection",
          "kind": "function",
          "signature": "rangeIntersection(aMin, aMax, bMin, bMax)",
          "summary": ""
        },
        {
          "name": "rangeUnion",
          "kind": "function",
          "signature": "rangeUnion(aMin, aMax, bMin, bMax)",
          "summary": ""
        },
        {
          "name": "splitRange",
          "kind": "function",
          "signature": "splitRange(min, max, segments)",
          "summary": ""
        },
        {
          "name": "degToRad",
          "kind": "function",
          "signature": "degToRad(deg)",
          "summary": ""
        },
        {
          "name": "radToDeg",
          "kind": "function",
          "signature": "radToDeg(rad)",
          "summary": ""
        },
        {
          "name": "clamp",
          "kind": "function",
          "signature": "clamp(x, min, max)",
          "summary": ""
        },
        {
          "name": "saturate",
          "kind": "function",
          "signature": "saturate(x)",
          "summary": ""
        },
        {
          "name": "lerp",
          "kind": "function",
          "signature": "lerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "inverseLerp",
          "kind": "function",
          "signature": "inverseLerp(a, b, x)",
          "summary": ""
        },
        {
          "name": "remap",
          "kind": "function",
          "signature": "remap(x, inMin, inMax, outMin, outMax)",
          "summary": ""
        },
        {
          "name": "remapClamped",
          "kind": "function",
          "signature": "remapClamped(x, inMin, inMax, outMin, outMax)",
          "summary": ""
        },
        {
          "name": "smoothstep",
          "kind": "function",
          "signature": "smoothstep(e0, e1, x)",
          "summary": ""
        },
        {
          "name": "smootherstep",
          "kind": "function",
          "signature": "smootherstep(e0, e1, x)",
          "summary": ""
        },
        {
          "name": "step",
          "kind": "function",
          "signature": "step(edge, x)",
          "summary": ""
        },
        {
          "name": "pulse",
          "kind": "function",
          "signature": "pulse(a, b, x)",
          "summary": ""
        },
        {
          "name": "fract",
          "kind": "function",
          "signature": "fract(x)",
          "summary": ""
        },
        {
          "name": "mod",
          "kind": "function",
          "signature": "mod(x, y)",
          "summary": ""
        },
        {
          "name": "wrap",
          "kind": "function",
          "signature": "wrap(x, min, max)",
          "summary": ""
        },
        {
          "name": "sign",
          "kind": "function",
          "signature": "sign(x)",
          "summary": ""
        },
        {
          "name": "signNonZero",
          "kind": "function",
          "signature": "signNonZero(x)",
          "summary": ""
        },
        {
          "name": "approxEqual",
          "kind": "function",
          "signature": "approxEqual(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "approxZero",
          "kind": "function",
          "signature": "approxZero(x, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "isFiniteNumber",
          "kind": "function",
          "signature": "isFiniteNumber(value)",
          "summary": ""
        },
        {
          "name": "finiteNumber",
          "kind": "function",
          "signature": "finiteNumber(value, fallback = 0)",
          "summary": ""
        },
        {
          "name": "snap",
          "kind": "function",
          "signature": "snap(x, grid)",
          "summary": ""
        },
        {
          "name": "snapFloor",
          "kind": "function",
          "signature": "snapFloor(x, grid)",
          "summary": ""
        },
        {
          "name": "snapCeil",
          "kind": "function",
          "signature": "snapCeil(x, grid)",
          "summary": ""
        },
        {
          "name": "roundTo",
          "kind": "function",
          "signature": "roundTo(x, stepSize = 1)",
          "summary": ""
        },
        {
          "name": "floorTo",
          "kind": "function",
          "signature": "floorTo(x, stepSize = 1)",
          "summary": ""
        },
        {
          "name": "ceilTo",
          "kind": "function",
          "signature": "ceilTo(x, stepSize = 1)",
          "summary": ""
        },
        {
          "name": "wrapAngle",
          "kind": "function",
          "signature": "wrapAngle(angle)",
          "summary": ""
        },
        {
          "name": "wrapAnglePositive",
          "kind": "function",
          "signature": "wrapAnglePositive(angle)",
          "summary": ""
        },
        {
          "name": "angleDiff",
          "kind": "function",
          "signature": "angleDiff(a, b)",
          "summary": ""
        },
        {
          "name": "lerpAngle",
          "kind": "function",
          "signature": "lerpAngle(a, b, t)",
          "summary": ""
        },
        {
          "name": "angleBetween",
          "kind": "function",
          "signature": "angleBetween(a, b)",
          "summary": ""
        },
        {
          "name": "min3",
          "kind": "function",
          "signature": "min3(a, b, c)",
          "summary": ""
        },
        {
          "name": "max3",
          "kind": "function",
          "signature": "max3(a, b, c)",
          "summary": ""
        },
        {
          "name": "min4",
          "kind": "function",
          "signature": "min4(a, b, c, d)",
          "summary": ""
        },
        {
          "name": "max4",
          "kind": "function",
          "signature": "max4(a, b, c, d)",
          "summary": ""
        },
        {
          "name": "minArray",
          "kind": "function",
          "signature": "minArray(arr)",
          "summary": ""
        },
        {
          "name": "maxArray",
          "kind": "function",
          "signature": "maxArray(arr)",
          "summary": ""
        },
        {
          "name": "moveToward",
          "kind": "function",
          "signature": "moveToward(current, target, maxDelta)",
          "summary": ""
        },
        {
          "name": "damp",
          "kind": "function",
          "signature": "damp(current, target, smoothing, dt)",
          "summary": ""
        },
        {
          "name": "springDamp",
          "kind": "function",
          "signature": "springDamp(current, target, velocity, smoothTime, dt)",
          "summary": ""
        },
        {
          "name": "pingPong",
          "kind": "function",
          "signature": "pingPong(t, length)",
          "summary": ""
        },
        {
          "name": "repeat",
          "kind": "function",
          "signature": "repeat(t, length)",
          "summary": ""
        },
        {
          "name": "deltaAngle",
          "kind": "function",
          "signature": "deltaAngle(current, target)",
          "summary": ""
        },
        {
          "name": "moveTowardAngle",
          "kind": "function",
          "signature": "moveTowardAngle(current, target, maxDelta)",
          "summary": ""
        },
        {
          "name": "inverseSqrt",
          "kind": "function",
          "signature": "inverseSqrt(x)",
          "summary": ""
        },
        {
          "name": "fma",
          "kind": "function",
          "signature": "fma(a, b, c)",
          "summary": ""
        },
        {
          "name": "bias",
          "kind": "function",
          "signature": "bias(x, b)",
          "summary": ""
        },
        {
          "name": "gain",
          "kind": "function",
          "signature": "gain(x, g)",
          "summary": ""
        },
        {
          "name": "almostIdentity",
          "kind": "function",
          "signature": "almostIdentity(x, threshold, value)",
          "summary": ""
        },
        {
          "name": "clamp01",
          "kind": "constant",
          "signature": "clamp01",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathSignal",
      "path": "engine/reference/core/math/MathSignal.md",
      "source": "engine/core/math/MathSignal.js",
      "import": "/engine/core/math/MathSignal.js",
      "sourceHash": "41133c3775a3d04628b9f7264b7f6de69d769e468973e3cabe89769e4df9e50e",
      "summary": "MathSignal.js - FFT and Signal Processing FFT, window functions, filters, convolution, spectral analysis",
      "exports": [
        {
          "name": "fft",
          "kind": "function",
          "signature": "fft(real, imag = null)",
          "summary": ""
        },
        {
          "name": "ifft",
          "kind": "function",
          "signature": "ifft(real, imag)",
          "summary": ""
        },
        {
          "name": "rfft",
          "kind": "function",
          "signature": "rfft(input)",
          "summary": ""
        },
        {
          "name": "powerSpectrum",
          "kind": "function",
          "signature": "powerSpectrum(real, imag)",
          "summary": ""
        },
        {
          "name": "magnitudeSpectrum",
          "kind": "function",
          "signature": "magnitudeSpectrum(real, imag)",
          "summary": ""
        },
        {
          "name": "phaseSpectrum",
          "kind": "function",
          "signature": "phaseSpectrum(real, imag)",
          "summary": ""
        },
        {
          "name": "fftFrequencies",
          "kind": "function",
          "signature": "fftFrequencies(n, sampleRate)",
          "summary": ""
        },
        {
          "name": "rfftFrequencies",
          "kind": "function",
          "signature": "rfftFrequencies(n, sampleRate)",
          "summary": ""
        },
        {
          "name": "fft2D",
          "kind": "function",
          "signature": "fft2D(data, width, height)",
          "summary": ""
        },
        {
          "name": "ifft2D",
          "kind": "function",
          "signature": "ifft2D(real, imag, width, height)",
          "summary": ""
        },
        {
          "name": "hannWindow",
          "kind": "function",
          "signature": "hannWindow(n)",
          "summary": ""
        },
        {
          "name": "hammingWindow",
          "kind": "function",
          "signature": "hammingWindow(n)",
          "summary": ""
        },
        {
          "name": "blackmanWindow",
          "kind": "function",
          "signature": "blackmanWindow(n)",
          "summary": ""
        },
        {
          "name": "blackmanHarrisWindow",
          "kind": "function",
          "signature": "blackmanHarrisWindow(n)",
          "summary": ""
        },
        {
          "name": "kaiserWindow",
          "kind": "function",
          "signature": "kaiserWindow(n, beta = 5)",
          "summary": ""
        },
        {
          "name": "gaussianWindow",
          "kind": "function",
          "signature": "gaussianWindow(n, sigma = 0.4)",
          "summary": ""
        },
        {
          "name": "triangularWindow",
          "kind": "function",
          "signature": "triangularWindow(n)",
          "summary": ""
        },
        {
          "name": "flatTopWindow",
          "kind": "function",
          "signature": "flatTopWindow(n)",
          "summary": ""
        },
        {
          "name": "rectangularWindow",
          "kind": "function",
          "signature": "rectangularWindow(n)",
          "summary": ""
        },
        {
          "name": "applyWindow",
          "kind": "function",
          "signature": "applyWindow(signal, window)",
          "summary": ""
        },
        {
          "name": "signalEnergy",
          "kind": "function",
          "signature": "signalEnergy(signal)",
          "summary": ""
        },
        {
          "name": "signalMean",
          "kind": "function",
          "signature": "signalMean(signal)",
          "summary": ""
        },
        {
          "name": "signalRms",
          "kind": "function",
          "signature": "signalRms(signal)",
          "summary": ""
        },
        {
          "name": "signalPeakReport",
          "kind": "function",
          "signature": "signalPeakReport(signal)",
          "summary": ""
        },
        {
          "name": "zeroCrossingCount",
          "kind": "function",
          "signature": "zeroCrossingCount(signal, options = {})",
          "summary": ""
        },
        {
          "name": "zeroCrossingRate",
          "kind": "function",
          "signature": "zeroCrossingRate(signal, options = {})",
          "summary": ""
        },
        {
          "name": "signalSummaryReport",
          "kind": "function",
          "signature": "signalSummaryReport(signal, options = {})",
          "summary": ""
        },
        {
          "name": "resampleLengthForRate",
          "kind": "function",
          "signature": "resampleLengthForRate(sampleCount, sourceSampleRate, targetSampleRate)",
          "summary": ""
        },
        {
          "name": "resampleNearest",
          "kind": "function",
          "signature": "resampleNearest(signal, targetLength)",
          "summary": ""
        },
        {
          "name": "resampleLinear",
          "kind": "function",
          "signature": "resampleLinear(signal, targetLength)",
          "summary": ""
        },
        {
          "name": "movingAverage",
          "kind": "function",
          "signature": "movingAverage(signal, windowSize)",
          "summary": ""
        },
        {
          "name": "exponentialMovingAverage",
          "kind": "function",
          "signature": "exponentialMovingAverage(signal, alpha = 0.3)",
          "summary": ""
        },
        {
          "name": "medianFilter",
          "kind": "function",
          "signature": "medianFilter(signal, windowSize)",
          "summary": ""
        },
        {
          "name": "savitzkyGolayFilter",
          "kind": "function",
          "signature": "savitzkyGolayFilter(signal)",
          "summary": ""
        },
        {
          "name": "butterworthLowpass1",
          "kind": "function",
          "signature": "butterworthLowpass1(cutoffFreq, sampleRate)",
          "summary": ""
        },
        {
          "name": "butterworthHighpass1",
          "kind": "function",
          "signature": "butterworthHighpass1(cutoffFreq, sampleRate)",
          "summary": ""
        },
        {
          "name": "iirFilter",
          "kind": "function",
          "signature": "iirFilter(signal, b, a)",
          "summary": ""
        },
        {
          "name": "firFilter",
          "kind": "function",
          "signature": "firFilter(signal, coefficients)",
          "summary": ""
        },
        {
          "name": "firLowpassCoeffs",
          "kind": "function",
          "signature": "firLowpassCoeffs(cutoffFreq, sampleRate, numTaps)",
          "summary": ""
        },
        {
          "name": "firHighpassCoeffs",
          "kind": "function",
          "signature": "firHighpassCoeffs(cutoffFreq, sampleRate, numTaps)",
          "summary": ""
        },
        {
          "name": "firBandpassCoeffs",
          "kind": "function",
          "signature": "firBandpassCoeffs(lowFreq, highFreq, sampleRate, numTaps)",
          "summary": ""
        },
        {
          "name": "convolve",
          "kind": "function",
          "signature": "convolve(signal, kernel)",
          "summary": ""
        },
        {
          "name": "convolveSame",
          "kind": "function",
          "signature": "convolveSame(signal, kernel)",
          "summary": ""
        },
        {
          "name": "convolveFFT",
          "kind": "function",
          "signature": "convolveFFT(signal, kernel)",
          "summary": ""
        },
        {
          "name": "crossCorrelation",
          "kind": "function",
          "signature": "crossCorrelation(signal1, signal2)",
          "summary": ""
        },
        {
          "name": "autocorrelation",
          "kind": "function",
          "signature": "autocorrelation(signal)",
          "summary": ""
        },
        {
          "name": "normalizedCrossCorrelation",
          "kind": "function",
          "signature": "normalizedCrossCorrelation(signal1, signal2)",
          "summary": ""
        },
        {
          "name": "stft",
          "kind": "function",
          "signature": "stft(signal, windowSize, hopSize, windowFn = hannWindow)",
          "summary": ""
        },
        {
          "name": "istft",
          "kind": "function",
          "signature": "istft(frames, windowSize, hopSize, outputLength)",
          "summary": ""
        },
        {
          "name": "spectrogram",
          "kind": "function",
          "signature": "spectrogram(signal, windowSize, hopSize, windowFn = hannWindow)",
          "summary": ""
        },
        {
          "name": "melFilterbank",
          "kind": "function",
          "signature": "melFilterbank(numFilters, fftSize, sampleRate, lowFreq = 0, highFreq = null)",
          "summary": ""
        },
        {
          "name": "applyMelFilterbank",
          "kind": "function",
          "signature": "applyMelFilterbank(spectrum, filterbank)",
          "summary": ""
        },
        {
          "name": "mfcc",
          "kind": "function",
          "signature": "mfcc(signal, sampleRate, numCoeffs = 13, numFilters = 26, windowSize = 512, hopSize = 256)",
          "summary": ""
        },
        {
          "name": "generateSine",
          "kind": "function",
          "signature": "generateSine(frequency, sampleRate, duration, amplitude = 1)",
          "summary": ""
        },
        {
          "name": "generateCosine",
          "kind": "function",
          "signature": "generateCosine(frequency, sampleRate, duration, amplitude = 1)",
          "summary": ""
        },
        {
          "name": "generateSquare",
          "kind": "function",
          "signature": "generateSquare(frequency, sampleRate, duration, amplitude = 1)",
          "summary": ""
        },
        {
          "name": "generateSawtooth",
          "kind": "function",
          "signature": "generateSawtooth(frequency, sampleRate, duration, amplitude = 1)",
          "summary": ""
        },
        {
          "name": "generateTriangle",
          "kind": "function",
          "signature": "generateTriangle(frequency, sampleRate, duration, amplitude = 1)",
          "summary": ""
        },
        {
          "name": "generateWhiteNoise",
          "kind": "function",
          "signature": "generateWhiteNoise(sampleRate, duration, amplitude = 1)",
          "summary": ""
        },
        {
          "name": "generateChirp",
          "kind": "function",
          "signature": "generateChirp(startFreq, endFreq, sampleRate, duration, amplitude = 1)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathSphericalHarmonics",
      "path": "engine/reference/core/math/MathSphericalHarmonics.md",
      "source": "engine/core/math/MathSphericalHarmonics.js",
      "import": "/engine/core/math/MathSphericalHarmonics.js",
      "sourceHash": "04658a599b6922086beaedcf42da9629ee8476976bbb1fbada9b39cb87952a55",
      "summary": "MathSphericalHarmonics.js - CPU-side Spherical Harmonics (L0-L2, 9 coefficients) Consolidates: RealtimeGI.js inline WGSL evalSH, provides CPU parity for probe baking/debugging Three.js SphericalHarmonics3 parity",
      "exports": [
        {
          "name": "shZero",
          "kind": "function",
          "signature": "shZero()",
          "summary": "Create zero SH (9 RGB coefficients = 27 floats)"
        },
        {
          "name": "shClone",
          "kind": "function",
          "signature": "shClone(sh)",
          "summary": "Clone SH coefficients"
        },
        {
          "name": "shFromColor",
          "kind": "function",
          "signature": "shFromColor(r, g, b)",
          "summary": "Create SH from constant color (ambient only, L0 band)"
        },
        {
          "name": "shEvaluateBasis",
          "kind": "function",
          "signature": "shEvaluateBasis(dir)",
          "summary": "Evaluate 9 SH basis functions for a direction [x,y,z] (must be normalized)"
        },
        {
          "name": "shEvaluateBasisL1",
          "kind": "function",
          "signature": "shEvaluateBasisL1(dir)",
          "summary": "Evaluate 4 SH basis functions (L0+L1 only, cheaper)"
        },
        {
          "name": "shEvaluate",
          "kind": "function",
          "signature": "shEvaluate(sh, dir)",
          "summary": "Evaluate RGB color from SH coefficients at a direction"
        },
        {
          "name": "shIrradiance",
          "kind": "function",
          "signature": "shIrradiance(sh, normal)",
          "summary": "Evaluate irradiance (diffuse lighting) from SH at a surface normal"
        },
        {
          "name": "shProject",
          "kind": "function",
          "signature": "shProject(directions, colors)",
          "summary": "Project directional samples onto SH coefficients"
        },
        {
          "name": "shAdd",
          "kind": "function",
          "signature": "shAdd(a, b)",
          "summary": "Add two SH: out = a + b"
        },
        {
          "name": "shScale",
          "kind": "function",
          "signature": "shScale(sh, s)",
          "summary": "Scale SH by scalar"
        },
        {
          "name": "shLerp",
          "kind": "function",
          "signature": "shLerp(a, b, t)",
          "summary": "Lerp between two SH"
        },
        {
          "name": "shAccumulate",
          "kind": "function",
          "signature": "shAccumulate(out, sh, weight)",
          "summary": "Accumulate: out += sh * weight (in-place)"
        },
        {
          "name": "shConvolve",
          "kind": "function",
          "signature": "shConvolve(sh, kernel)",
          "summary": "Convolve SH with per-band kernel (e.g., cosine lobe for diffuse)"
        },
        {
          "name": "shWindow",
          "kind": "function",
          "signature": "shWindow(sh, windowWidth)",
          "summary": "Apply Hanning window to reduce ringing"
        },
        {
          "name": "shRotate",
          "kind": "function",
          "signature": "shRotate(sh, mat3)",
          "summary": "Rotate SH coefficients by a 3x3 rotation matrix L0 is invariant. L1 rotates directly. L2 uses the explicit 5x5 rotation. Reference: Ivanic & Ruedenberg (1996), Green \"SH Lighting: The Gritty Details\" (2003)"
        },
        {
          "name": "shFromCubemap",
          "kind": "function",
          "signature": "shFromCubemap(faces)",
          "summary": "Project 6-face cubemap to SH"
        },
        {
          "name": "shToGPUBuffer",
          "kind": "function",
          "signature": "shToGPUBuffer(sh)",
          "summary": "Convert SH to Float32Array suitable for GPU uniform upload (already is Float32Array)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathStatistics",
      "path": "engine/reference/core/math/MathStatistics.md",
      "source": "engine/core/math/MathStatistics.js",
      "import": "/engine/core/math/MathStatistics.js",
      "sourceHash": "298b1fe52ca05dc01d65613b428b70956ae43d01791b52828921be3407d74c62",
      "summary": "MathStatistics.js - Running statistics, array stats, exponential moving average Consolidates: PerformanceAnalyzer inline variance/stdDev, FramePacingController running average Welford's online algorithm for numerically stable running stats",
      "exports": [
        {
          "name": "runningStatsCreate",
          "kind": "function",
          "signature": "runningStatsCreate()",
          "summary": ""
        },
        {
          "name": "runningStatsPush",
          "kind": "function",
          "signature": "runningStatsPush(stats, value)",
          "summary": ""
        },
        {
          "name": "runningStatsRemove",
          "kind": "function",
          "signature": "runningStatsRemove(stats, value)",
          "summary": ""
        },
        {
          "name": "runningStatsVariance",
          "kind": "function",
          "signature": "runningStatsVariance(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsPopulationVariance",
          "kind": "function",
          "signature": "runningStatsPopulationVariance(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsStdDev",
          "kind": "function",
          "signature": "runningStatsStdDev(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsMerge",
          "kind": "function",
          "signature": "runningStatsMerge(a, b)",
          "summary": ""
        },
        {
          "name": "runningStatsReset",
          "kind": "function",
          "signature": "runningStatsReset(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsClone",
          "kind": "function",
          "signature": "runningStatsClone(stats)",
          "summary": ""
        },
        {
          "name": "statsMean",
          "kind": "function",
          "signature": "statsMean(arr)",
          "summary": ""
        },
        {
          "name": "statsSum",
          "kind": "function",
          "signature": "statsSum(arr)",
          "summary": ""
        },
        {
          "name": "statsVariance",
          "kind": "function",
          "signature": "statsVariance(arr)",
          "summary": ""
        },
        {
          "name": "statsPopulationVariance",
          "kind": "function",
          "signature": "statsPopulationVariance(arr)",
          "summary": ""
        },
        {
          "name": "statsMin",
          "kind": "function",
          "signature": "statsMin(arr)",
          "summary": ""
        },
        {
          "name": "statsMax",
          "kind": "function",
          "signature": "statsMax(arr)",
          "summary": ""
        },
        {
          "name": "statsMedian",
          "kind": "function",
          "signature": "statsMedian(arr)",
          "summary": ""
        },
        {
          "name": "statsPercentile",
          "kind": "function",
          "signature": "statsPercentile(arr, p)",
          "summary": ""
        },
        {
          "name": "statsIQR",
          "kind": "function",
          "signature": "statsIQR(arr)",
          "summary": ""
        },
        {
          "name": "emaCreate",
          "kind": "function",
          "signature": "emaCreate(alpha = 0.1)",
          "summary": ""
        },
        {
          "name": "emaPush",
          "kind": "function",
          "signature": "emaPush(ema, value)",
          "summary": ""
        },
        {
          "name": "emaReset",
          "kind": "function",
          "signature": "emaReset(ema)",
          "summary": ""
        },
        {
          "name": "windowedStatsCreate",
          "kind": "function",
          "signature": "windowedStatsCreate(windowSize = 60)",
          "summary": ""
        },
        {
          "name": "windowedStatsPush",
          "kind": "function",
          "signature": "windowedStatsPush(ws, value)",
          "summary": ""
        },
        {
          "name": "windowedStatsVariance",
          "kind": "function",
          "signature": "windowedStatsVariance(ws)",
          "summary": ""
        },
        {
          "name": "windowedStatsReset",
          "kind": "function",
          "signature": "windowedStatsReset(ws)",
          "summary": ""
        },
        {
          "name": "runningStatsMean",
          "kind": "function",
          "signature": "runningStatsMean(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsCount",
          "kind": "function",
          "signature": "runningStatsCount(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsMin",
          "kind": "function",
          "signature": "runningStatsMin(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsMax",
          "kind": "function",
          "signature": "runningStatsMax(stats)",
          "summary": ""
        },
        {
          "name": "runningStatsRange",
          "kind": "function",
          "signature": "runningStatsRange(stats)",
          "summary": ""
        },
        {
          "name": "statsStdDev",
          "kind": "function",
          "signature": "statsStdDev(arr)",
          "summary": ""
        },
        {
          "name": "statsPopulationStdDev",
          "kind": "function",
          "signature": "statsPopulationStdDev(arr)",
          "summary": ""
        },
        {
          "name": "statsRange",
          "kind": "function",
          "signature": "statsRange(arr)",
          "summary": ""
        },
        {
          "name": "emaGet",
          "kind": "function",
          "signature": "emaGet(ema)",
          "summary": ""
        },
        {
          "name": "windowedStatsMean",
          "kind": "function",
          "signature": "windowedStatsMean(ws)",
          "summary": ""
        },
        {
          "name": "windowedStatsStdDev",
          "kind": "function",
          "signature": "windowedStatsStdDev(ws)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathValidation",
      "path": "engine/reference/core/math/MathValidation.md",
      "source": "engine/core/math/MathValidation.js",
      "import": "/engine/core/math/MathValidation.js",
      "sourceHash": "eee2e281591f93abbb1adeb566f03fcdf46e3fc194b770af070d9873fb380b88",
      "summary": "MathValidation.js - reusable finite, range, alignment, histogram, and probability reports.",
      "exports": [
        {
          "name": "finiteNumberReport",
          "kind": "function",
          "signature": "finiteNumberReport(value, options = {})",
          "summary": ""
        },
        {
          "name": "finiteArrayReport",
          "kind": "function",
          "signature": "finiteArrayReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "rangeValidationReport",
          "kind": "function",
          "signature": "rangeValidationReport(value, min, max, options = {})",
          "summary": ""
        },
        {
          "name": "alignmentReport",
          "kind": "function",
          "signature": "alignmentReport(offset, alignment, options = {})",
          "summary": ""
        },
        {
          "name": "powerOfTwoReport",
          "kind": "function",
          "signature": "powerOfTwoReport(value)",
          "summary": ""
        },
        {
          "name": "histogramValidationReport",
          "kind": "function",
          "signature": "histogramValidationReport(histogram, options = {})",
          "summary": ""
        },
        {
          "name": "probabilityDistributionReport",
          "kind": "function",
          "signature": "probabilityDistributionReport(probabilities, options = {})",
          "summary": ""
        },
        {
          "name": "typedArrayLayoutReport",
          "kind": "function",
          "signature": "typedArrayLayoutReport(view, options = {})",
          "summary": ""
        },
        {
          "name": "vectorValidationReport",
          "kind": "function",
          "signature": "vectorValidationReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "unitVectorReport",
          "kind": "function",
          "signature": "unitVectorReport(values, options = {})",
          "summary": ""
        },
        {
          "name": "colorValidationReport",
          "kind": "function",
          "signature": "colorValidationReport(color, options = {})",
          "summary": ""
        },
        {
          "name": "schemaValidationReport",
          "kind": "function",
          "signature": "schemaValidationReport(value, schema, options = {})",
          "summary": ""
        },
        {
          "name": "assertValidationReport",
          "kind": "function",
          "signature": "assertValidationReport(report, message = 'validation failed')",
          "summary": ""
        },
        {
          "name": "assertFiniteArray",
          "kind": "function",
          "signature": "assertFiniteArray(values, options = {})",
          "summary": ""
        },
        {
          "name": "assertUnitVector",
          "kind": "function",
          "signature": "assertUnitVector(values, options = {})",
          "summary": ""
        },
        {
          "name": "assertColor",
          "kind": "function",
          "signature": "assertColor(color, options = {})",
          "summary": ""
        },
        {
          "name": "assertSchema",
          "kind": "function",
          "signature": "assertSchema(value, schema, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathVec2",
      "path": "engine/reference/core/math/MathVec2.md",
      "source": "engine/core/math/MathVec2.js",
      "import": "/engine/core/math/MathVec2.js",
      "sourceHash": "7cec804f62adb4fce2436db6eb28d65384d1d95fb7f4c692e520fe8a89761e02",
      "summary": "",
      "exports": [
        {
          "name": "vec2SmoothDamp",
          "kind": "function",
          "signature": "vec2SmoothDamp(current, target, currentVelocity, smoothTime, dt, maxSpeed = Infinity)",
          "summary": ""
        },
        {
          "name": "vec2Refract",
          "kind": "function",
          "signature": "vec2Refract(incident, normal, eta)",
          "summary": ""
        },
        {
          "name": "vec2",
          "kind": "function",
          "signature": "vec2(x = 0, y = 0)",
          "summary": ""
        },
        {
          "name": "vec2FromAngle",
          "kind": "function",
          "signature": "vec2FromAngle(angle, len = 1)",
          "summary": ""
        },
        {
          "name": "vec2FromArray",
          "kind": "function",
          "signature": "vec2FromArray(arr, offset = 0)",
          "summary": ""
        },
        {
          "name": "vec2Zero",
          "kind": "function",
          "signature": "vec2Zero()",
          "summary": ""
        },
        {
          "name": "vec2One",
          "kind": "function",
          "signature": "vec2One()",
          "summary": ""
        },
        {
          "name": "vec2Up",
          "kind": "function",
          "signature": "vec2Up()",
          "summary": ""
        },
        {
          "name": "vec2Down",
          "kind": "function",
          "signature": "vec2Down()",
          "summary": ""
        },
        {
          "name": "vec2Left",
          "kind": "function",
          "signature": "vec2Left()",
          "summary": ""
        },
        {
          "name": "vec2Right",
          "kind": "function",
          "signature": "vec2Right()",
          "summary": ""
        },
        {
          "name": "vec2Clone",
          "kind": "function",
          "signature": "vec2Clone(v)",
          "summary": ""
        },
        {
          "name": "vec2Copy",
          "kind": "function",
          "signature": "vec2Copy(out, v)",
          "summary": ""
        },
        {
          "name": "vec2Set",
          "kind": "function",
          "signature": "vec2Set(out, x, y)",
          "summary": ""
        },
        {
          "name": "vec2Add",
          "kind": "function",
          "signature": "vec2Add(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Sub",
          "kind": "function",
          "signature": "vec2Sub(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Mul",
          "kind": "function",
          "signature": "vec2Mul(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Div",
          "kind": "function",
          "signature": "vec2Div(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Scale",
          "kind": "function",
          "signature": "vec2Scale(v, s)",
          "summary": ""
        },
        {
          "name": "vec2Negate",
          "kind": "function",
          "signature": "vec2Negate(v)",
          "summary": ""
        },
        {
          "name": "vec2Inverse",
          "kind": "function",
          "signature": "vec2Inverse(v)",
          "summary": ""
        },
        {
          "name": "vec2AddInto",
          "kind": "function",
          "signature": "vec2AddInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec2SubInto",
          "kind": "function",
          "signature": "vec2SubInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec2ScaleInto",
          "kind": "function",
          "signature": "vec2ScaleInto(out, v, s)",
          "summary": ""
        },
        {
          "name": "vec2ScaleAndAdd",
          "kind": "function",
          "signature": "vec2ScaleAndAdd(out, a, b, s)",
          "summary": ""
        },
        {
          "name": "vec2Dot",
          "kind": "function",
          "signature": "vec2Dot(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Cross",
          "kind": "function",
          "signature": "vec2Cross(a, b)",
          "summary": ""
        },
        {
          "name": "vec2LengthSq",
          "kind": "function",
          "signature": "vec2LengthSq(v)",
          "summary": ""
        },
        {
          "name": "vec2Length",
          "kind": "function",
          "signature": "vec2Length(v)",
          "summary": ""
        },
        {
          "name": "vec2DistanceSq",
          "kind": "function",
          "signature": "vec2DistanceSq(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Distance",
          "kind": "function",
          "signature": "vec2Distance(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Manhattan",
          "kind": "function",
          "signature": "vec2Manhattan(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Chebyshev",
          "kind": "function",
          "signature": "vec2Chebyshev(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Normalize",
          "kind": "function",
          "signature": "vec2Normalize(v)",
          "summary": ""
        },
        {
          "name": "vec2NormalizeInto",
          "kind": "function",
          "signature": "vec2NormalizeInto(out, v)",
          "summary": ""
        },
        {
          "name": "vec2SetLength",
          "kind": "function",
          "signature": "vec2SetLength(v, len)",
          "summary": ""
        },
        {
          "name": "vec2ClampLength",
          "kind": "function",
          "signature": "vec2ClampLength(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec2Limit",
          "kind": "function",
          "signature": "vec2Limit(v, maxLen)",
          "summary": ""
        },
        {
          "name": "vec2Lerp",
          "kind": "function",
          "signature": "vec2Lerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec2SmoothStep",
          "kind": "function",
          "signature": "vec2SmoothStep(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec2Bezier2",
          "kind": "function",
          "signature": "vec2Bezier2(p0, p1, p2, t)",
          "summary": ""
        },
        {
          "name": "vec2Bezier3",
          "kind": "function",
          "signature": "vec2Bezier3(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "vec2Min",
          "kind": "function",
          "signature": "vec2Min(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Max",
          "kind": "function",
          "signature": "vec2Max(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Clamp",
          "kind": "function",
          "signature": "vec2Clamp(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec2ClampScalar",
          "kind": "function",
          "signature": "vec2ClampScalar(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec2Floor",
          "kind": "function",
          "signature": "vec2Floor(v)",
          "summary": ""
        },
        {
          "name": "vec2Ceil",
          "kind": "function",
          "signature": "vec2Ceil(v)",
          "summary": ""
        },
        {
          "name": "vec2Round",
          "kind": "function",
          "signature": "vec2Round(v)",
          "summary": ""
        },
        {
          "name": "vec2Trunc",
          "kind": "function",
          "signature": "vec2Trunc(v)",
          "summary": ""
        },
        {
          "name": "vec2Fract",
          "kind": "function",
          "signature": "vec2Fract(v)",
          "summary": ""
        },
        {
          "name": "vec2Abs",
          "kind": "function",
          "signature": "vec2Abs(v)",
          "summary": ""
        },
        {
          "name": "vec2Sign",
          "kind": "function",
          "signature": "vec2Sign(v)",
          "summary": ""
        },
        {
          "name": "vec2Snap",
          "kind": "function",
          "signature": "vec2Snap(v, step)",
          "summary": ""
        },
        {
          "name": "vec2SnapV",
          "kind": "function",
          "signature": "vec2SnapV(v, step)",
          "summary": ""
        },
        {
          "name": "vec2Angle",
          "kind": "function",
          "signature": "vec2Angle(v)",
          "summary": ""
        },
        {
          "name": "vec2AngleBetween",
          "kind": "function",
          "signature": "vec2AngleBetween(a, b)",
          "summary": ""
        },
        {
          "name": "vec2AngleTo",
          "kind": "function",
          "signature": "vec2AngleTo(from, to)",
          "summary": ""
        },
        {
          "name": "vec2Rotate",
          "kind": "function",
          "signature": "vec2Rotate(v, angle)",
          "summary": ""
        },
        {
          "name": "vec2RotateAround",
          "kind": "function",
          "signature": "vec2RotateAround(v, center, angle)",
          "summary": ""
        },
        {
          "name": "vec2Perpendicular",
          "kind": "function",
          "signature": "vec2Perpendicular(v)",
          "summary": ""
        },
        {
          "name": "vec2PerpendicularCW",
          "kind": "function",
          "signature": "vec2PerpendicularCW(v)",
          "summary": ""
        },
        {
          "name": "vec2Reflect",
          "kind": "function",
          "signature": "vec2Reflect(v, n)",
          "summary": ""
        },
        {
          "name": "vec2Project",
          "kind": "function",
          "signature": "vec2Project(v, onto)",
          "summary": ""
        },
        {
          "name": "vec2Reject",
          "kind": "function",
          "signature": "vec2Reject(v, from)",
          "summary": ""
        },
        {
          "name": "vec2MoveToward",
          "kind": "function",
          "signature": "vec2MoveToward(cur, tgt, maxDelta)",
          "summary": ""
        },
        {
          "name": "vec2Equals",
          "kind": "function",
          "signature": "vec2Equals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec2IsZero",
          "kind": "function",
          "signature": "vec2IsZero(v, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec2IsNormalized",
          "kind": "function",
          "signature": "vec2IsNormalized(v, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec2IsFinite",
          "kind": "function",
          "signature": "vec2IsFinite(v)",
          "summary": ""
        },
        {
          "name": "vec2Random",
          "kind": "function",
          "signature": "vec2Random(scale = 1)",
          "summary": ""
        },
        {
          "name": "vec2RandomInCircle",
          "kind": "function",
          "signature": "vec2RandomInCircle(r = 1)",
          "summary": ""
        },
        {
          "name": "vec2RandomInRect",
          "kind": "function",
          "signature": "vec2RandomInRect(w, h)",
          "summary": ""
        },
        {
          "name": "vec2RandomInRectCentered",
          "kind": "function",
          "signature": "vec2RandomInRectCentered(w, h)",
          "summary": ""
        },
        {
          "name": "vec2ComplexMul",
          "kind": "function",
          "signature": "vec2ComplexMul(a, b)",
          "summary": ""
        },
        {
          "name": "vec2ComplexDiv",
          "kind": "function",
          "signature": "vec2ComplexDiv(a, b)",
          "summary": ""
        },
        {
          "name": "vec2ComplexPow",
          "kind": "function",
          "signature": "vec2ComplexPow(v, n)",
          "summary": ""
        },
        {
          "name": "vec2ComplexSqrt",
          "kind": "function",
          "signature": "vec2ComplexSqrt(v)",
          "summary": ""
        },
        {
          "name": "vec2TransformMat2",
          "kind": "function",
          "signature": "vec2TransformMat2(v, m)",
          "summary": ""
        },
        {
          "name": "vec2TransformMat3",
          "kind": "function",
          "signature": "vec2TransformMat3(v, m)",
          "summary": ""
        },
        {
          "name": "vec2ToString",
          "kind": "function",
          "signature": "vec2ToString(v, precision = 3)",
          "summary": ""
        },
        {
          "name": "vec2ToArray",
          "kind": "function",
          "signature": "vec2ToArray(v, out = [], offset = 0)",
          "summary": ""
        },
        {
          "name": "vec2GetComponent",
          "kind": "function",
          "signature": "vec2GetComponent(v, index)",
          "summary": ""
        },
        {
          "name": "vec2SetComponent",
          "kind": "function",
          "signature": "vec2SetComponent(v, index, value)",
          "summary": ""
        },
        {
          "name": "vec2FromScalar",
          "kind": "function",
          "signature": "vec2FromScalar(s)",
          "summary": ""
        },
        {
          "name": "vec2Infinity",
          "kind": "function",
          "signature": "vec2Infinity()",
          "summary": ""
        },
        {
          "name": "vec2NegInfinity",
          "kind": "function",
          "signature": "vec2NegInfinity()",
          "summary": ""
        },
        {
          "name": "vec2AddScalar",
          "kind": "function",
          "signature": "vec2AddScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec2SubScalar",
          "kind": "function",
          "signature": "vec2SubScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec2MulInto",
          "kind": "function",
          "signature": "vec2MulInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec2NegateInto",
          "kind": "function",
          "signature": "vec2NegateInto(out, v)",
          "summary": ""
        },
        {
          "name": "vec2ManhattanLength",
          "kind": "function",
          "signature": "vec2ManhattanLength(v)",
          "summary": ""
        },
        {
          "name": "vec2SafeNormalize",
          "kind": "function",
          "signature": "vec2SafeNormalize(v, fallback = [0, 1])",
          "summary": ""
        },
        {
          "name": "vec2LerpInto",
          "kind": "function",
          "signature": "vec2LerpInto(out, a, b, t)",
          "summary": ""
        },
        {
          "name": "vec2LerpUnclamped",
          "kind": "function",
          "signature": "vec2LerpUnclamped(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec2LerpV",
          "kind": "function",
          "signature": "vec2LerpV(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec2Hermite",
          "kind": "function",
          "signature": "vec2Hermite(p0, t0, p1, t1, t)",
          "summary": ""
        },
        {
          "name": "vec2CatmullRom",
          "kind": "function",
          "signature": "vec2CatmullRom(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "vec2BezierDerivative",
          "kind": "function",
          "signature": "vec2BezierDerivative(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "vec2DirectionTo",
          "kind": "function",
          "signature": "vec2DirectionTo(from, to)",
          "summary": ""
        },
        {
          "name": "vec2Midpoint",
          "kind": "function",
          "signature": "vec2Midpoint(a, b)",
          "summary": ""
        },
        {
          "name": "vec2Slide",
          "kind": "function",
          "signature": "vec2Slide(v, n)",
          "summary": ""
        },
        {
          "name": "vec2Bounce",
          "kind": "function",
          "signature": "vec2Bounce(v, n)",
          "summary": ""
        },
        {
          "name": "vec2FaceForward",
          "kind": "function",
          "signature": "vec2FaceForward(v, incident, reference)",
          "summary": ""
        },
        {
          "name": "vec2Saturate",
          "kind": "function",
          "signature": "vec2Saturate(v)",
          "summary": ""
        },
        {
          "name": "vec2InverseSqrt",
          "kind": "function",
          "signature": "vec2InverseSqrt(v)",
          "summary": ""
        },
        {
          "name": "vec2FMA",
          "kind": "function",
          "signature": "vec2FMA(a, b, c)",
          "summary": ""
        },
        {
          "name": "vec2Step",
          "kind": "function",
          "signature": "vec2Step(edge, v)",
          "summary": ""
        },
        {
          "name": "vec2StepScalar",
          "kind": "function",
          "signature": "vec2StepScalar(edge, v)",
          "summary": ""
        },
        {
          "name": "vec2SmoothStepV",
          "kind": "function",
          "signature": "vec2SmoothStepV(low, high, v)",
          "summary": ""
        },
        {
          "name": "vec2PosMod",
          "kind": "function",
          "signature": "vec2PosMod(v, m)",
          "summary": ""
        },
        {
          "name": "vec2PosModV",
          "kind": "function",
          "signature": "vec2PosModV(v, m)",
          "summary": ""
        },
        {
          "name": "vec2MinScalar",
          "kind": "function",
          "signature": "vec2MinScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec2MaxScalar",
          "kind": "function",
          "signature": "vec2MaxScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec2ExactEquals",
          "kind": "function",
          "signature": "vec2ExactEquals(a, b)",
          "summary": ""
        },
        {
          "name": "vec2IsNaN",
          "kind": "function",
          "signature": "vec2IsNaN(v)",
          "summary": ""
        },
        {
          "name": "vec2MinComponent",
          "kind": "function",
          "signature": "vec2MinComponent(v)",
          "summary": ""
        },
        {
          "name": "vec2MaxComponent",
          "kind": "function",
          "signature": "vec2MaxComponent(v)",
          "summary": ""
        },
        {
          "name": "vec2Sum",
          "kind": "function",
          "signature": "vec2Sum(v)",
          "summary": ""
        },
        {
          "name": "vec2Average",
          "kind": "function",
          "signature": "vec2Average(v)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathVec3",
      "path": "engine/reference/core/math/MathVec3.md",
      "source": "engine/core/math/MathVec3.js",
      "import": "/engine/core/math/MathVec3.js",
      "sourceHash": "4b2cfa496909f668ecd8975de3f513c01b2a2abddf1624f90a8f45e05111bde2",
      "summary": "MathVec3.js - 3D Vector operations Depends on: MathConstants.js, MathScalar.js, MathRandom.js",
      "exports": [
        {
          "name": "vec3Slerp",
          "kind": "function",
          "signature": "vec3Slerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec3SignedAngle",
          "kind": "function",
          "signature": "vec3SignedAngle(from, to, axis)",
          "summary": ""
        },
        {
          "name": "vec3RotateX",
          "kind": "function",
          "signature": "vec3RotateX(v, origin, angle)",
          "summary": ""
        },
        {
          "name": "vec3RotateY",
          "kind": "function",
          "signature": "vec3RotateY(v, origin, angle)",
          "summary": ""
        },
        {
          "name": "vec3RotateZ",
          "kind": "function",
          "signature": "vec3RotateZ(v, origin, angle)",
          "summary": ""
        },
        {
          "name": "vec3RotateAxis",
          "kind": "function",
          "signature": "vec3RotateAxis(v, axis, angle)",
          "summary": ""
        },
        {
          "name": "vec3RandomDirection",
          "kind": "function",
          "signature": "vec3RandomDirection(scale = 1)",
          "summary": ""
        },
        {
          "name": "vec3RandomInSphere",
          "kind": "function",
          "signature": "vec3RandomInSphere(radius = 1)",
          "summary": ""
        },
        {
          "name": "vec3RandomOnSphere",
          "kind": "function",
          "signature": "vec3RandomOnSphere(radius = 1)",
          "summary": ""
        },
        {
          "name": "vec3RandomInHemisphere",
          "kind": "function",
          "signature": "vec3RandomInHemisphere(normal)",
          "summary": ""
        },
        {
          "name": "vec3FromSpherical",
          "kind": "function",
          "signature": "vec3FromSpherical(radius, phi, theta)",
          "summary": ""
        },
        {
          "name": "vec3ToSpherical",
          "kind": "function",
          "signature": "vec3ToSpherical(v)",
          "summary": ""
        },
        {
          "name": "vec3FromCylindrical",
          "kind": "function",
          "signature": "vec3FromCylindrical(radius, theta, y)",
          "summary": ""
        },
        {
          "name": "vec3ToCylindrical",
          "kind": "function",
          "signature": "vec3ToCylindrical(v)",
          "summary": ""
        },
        {
          "name": "vec3TransformMat4",
          "kind": "function",
          "signature": "vec3TransformMat4(v, m)",
          "summary": ""
        },
        {
          "name": "vec3TransformQuat",
          "kind": "function",
          "signature": "vec3TransformQuat(v, q)",
          "summary": ""
        },
        {
          "name": "vec3OrthonormalBasis",
          "kind": "function",
          "signature": "vec3OrthonormalBasis(n)",
          "summary": ""
        },
        {
          "name": "vec3Barycentric",
          "kind": "function",
          "signature": "vec3Barycentric(a, b, c, u, v)",
          "summary": ""
        },
        {
          "name": "vec3RotateTowards",
          "kind": "function",
          "signature": "vec3RotateTowards(current, target, maxRadiansDelta, maxMagnitudeDelta)",
          "summary": ""
        },
        {
          "name": "vec3SmoothDamp",
          "kind": "function",
          "signature": "vec3SmoothDamp(current, target, currentVelocity, smoothTime, dt, maxSpeed = Infinity)",
          "summary": ""
        },
        {
          "name": "vec3OrthoNormalize",
          "kind": "function",
          "signature": "vec3OrthoNormalize(normal, tangent)",
          "summary": ""
        },
        {
          "name": "vec3Refract",
          "kind": "function",
          "signature": "vec3Refract(incident, normal, eta)",
          "summary": ""
        },
        {
          "name": "vec3OctEncode",
          "kind": "function",
          "signature": "vec3OctEncode(n)",
          "summary": ""
        },
        {
          "name": "vec3OctDecode",
          "kind": "function",
          "signature": "vec3OctDecode(uv)",
          "summary": ""
        },
        {
          "name": "vec3Outer",
          "kind": "function",
          "signature": "vec3Outer(a, b)",
          "summary": ""
        },
        {
          "name": "vec3OrthonormalBasisDuff",
          "kind": "function",
          "signature": "vec3OrthonormalBasisDuff(n)",
          "summary": ""
        },
        {
          "name": "vec3",
          "kind": "function",
          "signature": "vec3(x = 0, y = 0, z = 0)",
          "summary": ""
        },
        {
          "name": "vec3FromArray",
          "kind": "function",
          "signature": "vec3FromArray(arr, offset = 0)",
          "summary": ""
        },
        {
          "name": "vec3FromVec2",
          "kind": "function",
          "signature": "vec3FromVec2(v, z = 0)",
          "summary": ""
        },
        {
          "name": "vec3FromScalar",
          "kind": "function",
          "signature": "vec3FromScalar(s)",
          "summary": ""
        },
        {
          "name": "vec3Zero",
          "kind": "function",
          "signature": "vec3Zero()",
          "summary": ""
        },
        {
          "name": "vec3One",
          "kind": "function",
          "signature": "vec3One()",
          "summary": ""
        },
        {
          "name": "vec3Up",
          "kind": "function",
          "signature": "vec3Up()",
          "summary": ""
        },
        {
          "name": "vec3Down",
          "kind": "function",
          "signature": "vec3Down()",
          "summary": ""
        },
        {
          "name": "vec3Left",
          "kind": "function",
          "signature": "vec3Left()",
          "summary": ""
        },
        {
          "name": "vec3Right",
          "kind": "function",
          "signature": "vec3Right()",
          "summary": ""
        },
        {
          "name": "vec3Forward",
          "kind": "function",
          "signature": "vec3Forward()",
          "summary": ""
        },
        {
          "name": "vec3Back",
          "kind": "function",
          "signature": "vec3Back()",
          "summary": ""
        },
        {
          "name": "vec3Clone",
          "kind": "function",
          "signature": "vec3Clone(v)",
          "summary": ""
        },
        {
          "name": "vec3Copy",
          "kind": "function",
          "signature": "vec3Copy(out, v)",
          "summary": ""
        },
        {
          "name": "vec3Set",
          "kind": "function",
          "signature": "vec3Set(out, x, y, z)",
          "summary": ""
        },
        {
          "name": "vec3Add",
          "kind": "function",
          "signature": "vec3Add(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Sub",
          "kind": "function",
          "signature": "vec3Sub(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Mul",
          "kind": "function",
          "signature": "vec3Mul(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Div",
          "kind": "function",
          "signature": "vec3Div(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Scale",
          "kind": "function",
          "signature": "vec3Scale(v, s)",
          "summary": ""
        },
        {
          "name": "vec3Negate",
          "kind": "function",
          "signature": "vec3Negate(v)",
          "summary": ""
        },
        {
          "name": "vec3Inverse",
          "kind": "function",
          "signature": "vec3Inverse(v)",
          "summary": ""
        },
        {
          "name": "vec3AddScalar",
          "kind": "function",
          "signature": "vec3AddScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec3SubScalar",
          "kind": "function",
          "signature": "vec3SubScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec3AddInto",
          "kind": "function",
          "signature": "vec3AddInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec3SubInto",
          "kind": "function",
          "signature": "vec3SubInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec3MulInto",
          "kind": "function",
          "signature": "vec3MulInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec3ScaleInto",
          "kind": "function",
          "signature": "vec3ScaleInto(out, v, s)",
          "summary": ""
        },
        {
          "name": "vec3ScaleAndAdd",
          "kind": "function",
          "signature": "vec3ScaleAndAdd(out, a, b, s)",
          "summary": ""
        },
        {
          "name": "vec3NegateInto",
          "kind": "function",
          "signature": "vec3NegateInto(out, v)",
          "summary": ""
        },
        {
          "name": "vec3CrossInto",
          "kind": "function",
          "signature": "vec3CrossInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec3Dot",
          "kind": "function",
          "signature": "vec3Dot(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Cross",
          "kind": "function",
          "signature": "vec3Cross(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Triple",
          "kind": "function",
          "signature": "vec3Triple(a, b, c)",
          "summary": ""
        },
        {
          "name": "vec3LengthSq",
          "kind": "function",
          "signature": "vec3LengthSq(v)",
          "summary": ""
        },
        {
          "name": "vec3Length",
          "kind": "function",
          "signature": "vec3Length(v)",
          "summary": ""
        },
        {
          "name": "vec3DistanceSq",
          "kind": "function",
          "signature": "vec3DistanceSq(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Distance",
          "kind": "function",
          "signature": "vec3Distance(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Manhattan",
          "kind": "function",
          "signature": "vec3Manhattan(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Chebyshev",
          "kind": "function",
          "signature": "vec3Chebyshev(a, b)",
          "summary": ""
        },
        {
          "name": "vec3ManhattanLength",
          "kind": "function",
          "signature": "vec3ManhattanLength(v)",
          "summary": ""
        },
        {
          "name": "vec3Normalize",
          "kind": "function",
          "signature": "vec3Normalize(v)",
          "summary": ""
        },
        {
          "name": "vec3NormalizeInto",
          "kind": "function",
          "signature": "vec3NormalizeInto(out, v)",
          "summary": ""
        },
        {
          "name": "vec3SetLength",
          "kind": "function",
          "signature": "vec3SetLength(v, len)",
          "summary": ""
        },
        {
          "name": "vec3ClampLength",
          "kind": "function",
          "signature": "vec3ClampLength(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec3Limit",
          "kind": "function",
          "signature": "vec3Limit(v, maxLen)",
          "summary": ""
        },
        {
          "name": "vec3SafeNormalize",
          "kind": "function",
          "signature": "vec3SafeNormalize(v, fallback = [0, 1, 0])",
          "summary": ""
        },
        {
          "name": "vec3Lerp",
          "kind": "function",
          "signature": "vec3Lerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec3LerpInto",
          "kind": "function",
          "signature": "vec3LerpInto(out, a, b, t)",
          "summary": ""
        },
        {
          "name": "vec3SmoothStep",
          "kind": "function",
          "signature": "vec3SmoothStep(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec3Hermite",
          "kind": "function",
          "signature": "vec3Hermite(p0, t0, p1, t1, t)",
          "summary": ""
        },
        {
          "name": "vec3Bezier2",
          "kind": "function",
          "signature": "vec3Bezier2(p0, p1, p2, t)",
          "summary": ""
        },
        {
          "name": "vec3Bezier3",
          "kind": "function",
          "signature": "vec3Bezier3(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "vec3CatmullRom",
          "kind": "function",
          "signature": "vec3CatmullRom(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "vec3Min",
          "kind": "function",
          "signature": "vec3Min(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Max",
          "kind": "function",
          "signature": "vec3Max(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Clamp",
          "kind": "function",
          "signature": "vec3Clamp(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec3ClampScalar",
          "kind": "function",
          "signature": "vec3ClampScalar(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec3Floor",
          "kind": "function",
          "signature": "vec3Floor(v)",
          "summary": ""
        },
        {
          "name": "vec3Ceil",
          "kind": "function",
          "signature": "vec3Ceil(v)",
          "summary": ""
        },
        {
          "name": "vec3Round",
          "kind": "function",
          "signature": "vec3Round(v)",
          "summary": ""
        },
        {
          "name": "vec3Trunc",
          "kind": "function",
          "signature": "vec3Trunc(v)",
          "summary": ""
        },
        {
          "name": "vec3Fract",
          "kind": "function",
          "signature": "vec3Fract(v)",
          "summary": ""
        },
        {
          "name": "vec3Abs",
          "kind": "function",
          "signature": "vec3Abs(v)",
          "summary": ""
        },
        {
          "name": "vec3Sign",
          "kind": "function",
          "signature": "vec3Sign(v)",
          "summary": ""
        },
        {
          "name": "vec3Snap",
          "kind": "function",
          "signature": "vec3Snap(v, step)",
          "summary": ""
        },
        {
          "name": "vec3AngleBetween",
          "kind": "function",
          "signature": "vec3AngleBetween(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Reflect",
          "kind": "function",
          "signature": "vec3Reflect(v, n)",
          "summary": ""
        },
        {
          "name": "vec3Project",
          "kind": "function",
          "signature": "vec3Project(v, onto)",
          "summary": ""
        },
        {
          "name": "vec3Reject",
          "kind": "function",
          "signature": "vec3Reject(v, from)",
          "summary": ""
        },
        {
          "name": "vec3ProjectOnPlane",
          "kind": "function",
          "signature": "vec3ProjectOnPlane(v, planeNormal)",
          "summary": ""
        },
        {
          "name": "vec3Slide",
          "kind": "function",
          "signature": "vec3Slide(v, normal)",
          "summary": ""
        },
        {
          "name": "vec3MoveToward",
          "kind": "function",
          "signature": "vec3MoveToward(cur, tgt, maxDelta)",
          "summary": ""
        },
        {
          "name": "vec3Equals",
          "kind": "function",
          "signature": "vec3Equals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec3ExactEquals",
          "kind": "function",
          "signature": "vec3ExactEquals(a, b)",
          "summary": ""
        },
        {
          "name": "vec3IsZero",
          "kind": "function",
          "signature": "vec3IsZero(v, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec3IsNormalized",
          "kind": "function",
          "signature": "vec3IsNormalized(v, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec3IsFinite",
          "kind": "function",
          "signature": "vec3IsFinite(v)",
          "summary": ""
        },
        {
          "name": "vec3IsNaN",
          "kind": "function",
          "signature": "vec3IsNaN(v)",
          "summary": ""
        },
        {
          "name": "vec3Random",
          "kind": "function",
          "signature": "vec3Random()",
          "summary": ""
        },
        {
          "name": "vec3RandomInBox",
          "kind": "function",
          "signature": "vec3RandomInBox(w, h, d)",
          "summary": ""
        },
        {
          "name": "vec3RandomInBoxCentered",
          "kind": "function",
          "signature": "vec3RandomInBoxCentered(w, h, d)",
          "summary": ""
        },
        {
          "name": "vec3TransformMat3",
          "kind": "function",
          "signature": "vec3TransformMat3(v, m)",
          "summary": ""
        },
        {
          "name": "vec3TransformDirection",
          "kind": "function",
          "signature": "vec3TransformDirection(v, m)",
          "summary": ""
        },
        {
          "name": "vec3TransformNormal",
          "kind": "function",
          "signature": "vec3TransformNormal(v, normalMat)",
          "summary": ""
        },
        {
          "name": "vec3MinComponent",
          "kind": "function",
          "signature": "vec3MinComponent(v)",
          "summary": ""
        },
        {
          "name": "vec3MaxComponent",
          "kind": "function",
          "signature": "vec3MaxComponent(v)",
          "summary": ""
        },
        {
          "name": "vec3Sum",
          "kind": "function",
          "signature": "vec3Sum(v)",
          "summary": ""
        },
        {
          "name": "vec3Average",
          "kind": "function",
          "signature": "vec3Average(v)",
          "summary": ""
        },
        {
          "name": "vec3DominantAxis",
          "kind": "function",
          "signature": "vec3DominantAxis(v)",
          "summary": ""
        },
        {
          "name": "vec3ToString",
          "kind": "function",
          "signature": "vec3ToString(v, precision = 3)",
          "summary": ""
        },
        {
          "name": "vec3ToArray",
          "kind": "function",
          "signature": "vec3ToArray(v, out = [], offset = 0)",
          "summary": ""
        },
        {
          "name": "vec3GetComponent",
          "kind": "function",
          "signature": "vec3GetComponent(v, index)",
          "summary": ""
        },
        {
          "name": "vec3SetComponent",
          "kind": "function",
          "signature": "vec3SetComponent(v, index, value)",
          "summary": ""
        },
        {
          "name": "vec3ToVec4Point",
          "kind": "function",
          "signature": "vec3ToVec4Point(v)",
          "summary": ""
        },
        {
          "name": "vec3ToVec4Direction",
          "kind": "function",
          "signature": "vec3ToVec4Direction(v)",
          "summary": ""
        },
        {
          "name": "vec3DirectionTo",
          "kind": "function",
          "signature": "vec3DirectionTo(from, to)",
          "summary": ""
        },
        {
          "name": "vec3Midpoint",
          "kind": "function",
          "signature": "vec3Midpoint(a, b)",
          "summary": ""
        },
        {
          "name": "vec3Bounce",
          "kind": "function",
          "signature": "vec3Bounce(v, n)",
          "summary": ""
        },
        {
          "name": "vec3LerpUnclamped",
          "kind": "function",
          "signature": "vec3LerpUnclamped(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec3LerpV",
          "kind": "function",
          "signature": "vec3LerpV(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec3FaceForward",
          "kind": "function",
          "signature": "vec3FaceForward(v, incident, reference)",
          "summary": ""
        },
        {
          "name": "vec3Saturate",
          "kind": "function",
          "signature": "vec3Saturate(v)",
          "summary": ""
        },
        {
          "name": "vec3InverseSqrt",
          "kind": "function",
          "signature": "vec3InverseSqrt(v)",
          "summary": ""
        },
        {
          "name": "vec3FMA",
          "kind": "function",
          "signature": "vec3FMA(a, b, c)",
          "summary": ""
        },
        {
          "name": "vec3Step",
          "kind": "function",
          "signature": "vec3Step(edge, v)",
          "summary": ""
        },
        {
          "name": "vec3StepScalar",
          "kind": "function",
          "signature": "vec3StepScalar(edge, v)",
          "summary": ""
        },
        {
          "name": "vec3SmoothStepV",
          "kind": "function",
          "signature": "vec3SmoothStepV(low, high, v)",
          "summary": ""
        },
        {
          "name": "vec3PosMod",
          "kind": "function",
          "signature": "vec3PosMod(v, m)",
          "summary": ""
        },
        {
          "name": "vec3PosModV",
          "kind": "function",
          "signature": "vec3PosModV(v, m)",
          "summary": ""
        },
        {
          "name": "vec3MinScalar",
          "kind": "function",
          "signature": "vec3MinScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec3MaxScalar",
          "kind": "function",
          "signature": "vec3MaxScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec3SnapV",
          "kind": "function",
          "signature": "vec3SnapV(v, step)",
          "summary": ""
        },
        {
          "name": "vec3BezierDerivative",
          "kind": "function",
          "signature": "vec3BezierDerivative(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "vec3Infinity",
          "kind": "function",
          "signature": "vec3Infinity()",
          "summary": ""
        },
        {
          "name": "vec3NegInfinity",
          "kind": "function",
          "signature": "vec3NegInfinity()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MathVec4",
      "path": "engine/reference/core/math/MathVec4.md",
      "source": "engine/core/math/MathVec4.js",
      "import": "/engine/core/math/MathVec4.js",
      "sourceHash": "08ceec9cae2105c44c3f177a95b24f29064bc6e8cf79b77f0f29087c91755297",
      "summary": "",
      "exports": [
        {
          "name": "vec4",
          "kind": "function",
          "signature": "vec4(x = 0, y = 0, z = 0, w = 1)",
          "summary": ""
        },
        {
          "name": "vec4FromVec3",
          "kind": "function",
          "signature": "vec4FromVec3(v, w = 1)",
          "summary": ""
        },
        {
          "name": "vec4FromVec2",
          "kind": "function",
          "signature": "vec4FromVec2(v, z = 0, w = 1)",
          "summary": ""
        },
        {
          "name": "vec4FromArray",
          "kind": "function",
          "signature": "vec4FromArray(arr, offset = 0)",
          "summary": ""
        },
        {
          "name": "vec4Zero",
          "kind": "function",
          "signature": "vec4Zero()",
          "summary": ""
        },
        {
          "name": "vec4One",
          "kind": "function",
          "signature": "vec4One()",
          "summary": ""
        },
        {
          "name": "vec4Clone",
          "kind": "function",
          "signature": "vec4Clone(v)",
          "summary": ""
        },
        {
          "name": "vec4Copy",
          "kind": "function",
          "signature": "vec4Copy(out, v)",
          "summary": ""
        },
        {
          "name": "vec4Set",
          "kind": "function",
          "signature": "vec4Set(out, x, y, z, w)",
          "summary": ""
        },
        {
          "name": "vec4ToVec3",
          "kind": "function",
          "signature": "vec4ToVec3(v)",
          "summary": ""
        },
        {
          "name": "vec4ToVec2",
          "kind": "function",
          "signature": "vec4ToVec2(v)",
          "summary": ""
        },
        {
          "name": "vec4XYZ",
          "kind": "function",
          "signature": "vec4XYZ(v)",
          "summary": ""
        },
        {
          "name": "vec4XY",
          "kind": "function",
          "signature": "vec4XY(v)",
          "summary": ""
        },
        {
          "name": "vec4Add",
          "kind": "function",
          "signature": "vec4Add(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Sub",
          "kind": "function",
          "signature": "vec4Sub(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Mul",
          "kind": "function",
          "signature": "vec4Mul(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Div",
          "kind": "function",
          "signature": "vec4Div(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Scale",
          "kind": "function",
          "signature": "vec4Scale(v, s)",
          "summary": ""
        },
        {
          "name": "vec4Negate",
          "kind": "function",
          "signature": "vec4Negate(v)",
          "summary": ""
        },
        {
          "name": "vec4Inverse",
          "kind": "function",
          "signature": "vec4Inverse(v)",
          "summary": ""
        },
        {
          "name": "vec4AddInto",
          "kind": "function",
          "signature": "vec4AddInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec4SubInto",
          "kind": "function",
          "signature": "vec4SubInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec4ScaleInto",
          "kind": "function",
          "signature": "vec4ScaleInto(out, v, s)",
          "summary": ""
        },
        {
          "name": "vec4ScaleAndAdd",
          "kind": "function",
          "signature": "vec4ScaleAndAdd(out, a, b, s)",
          "summary": ""
        },
        {
          "name": "vec4Dot",
          "kind": "function",
          "signature": "vec4Dot(a, b)",
          "summary": ""
        },
        {
          "name": "vec4LengthSq",
          "kind": "function",
          "signature": "vec4LengthSq(v)",
          "summary": ""
        },
        {
          "name": "vec4Length",
          "kind": "function",
          "signature": "vec4Length(v)",
          "summary": ""
        },
        {
          "name": "vec4DistanceSq",
          "kind": "function",
          "signature": "vec4DistanceSq(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Distance",
          "kind": "function",
          "signature": "vec4Distance(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Normalize",
          "kind": "function",
          "signature": "vec4Normalize(v)",
          "summary": ""
        },
        {
          "name": "vec4NormalizeInto",
          "kind": "function",
          "signature": "vec4NormalizeInto(out, v)",
          "summary": ""
        },
        {
          "name": "vec4Lerp",
          "kind": "function",
          "signature": "vec4Lerp(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec4Min",
          "kind": "function",
          "signature": "vec4Min(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Max",
          "kind": "function",
          "signature": "vec4Max(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Clamp",
          "kind": "function",
          "signature": "vec4Clamp(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec4ClampScalar",
          "kind": "function",
          "signature": "vec4ClampScalar(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec4Floor",
          "kind": "function",
          "signature": "vec4Floor(v)",
          "summary": ""
        },
        {
          "name": "vec4Ceil",
          "kind": "function",
          "signature": "vec4Ceil(v)",
          "summary": ""
        },
        {
          "name": "vec4Round",
          "kind": "function",
          "signature": "vec4Round(v)",
          "summary": ""
        },
        {
          "name": "vec4Abs",
          "kind": "function",
          "signature": "vec4Abs(v)",
          "summary": ""
        },
        {
          "name": "vec4PerspectiveDivide",
          "kind": "function",
          "signature": "vec4PerspectiveDivide(v)",
          "summary": ""
        },
        {
          "name": "vec4TransformMat4",
          "kind": "function",
          "signature": "vec4TransformMat4(v, m)",
          "summary": ""
        },
        {
          "name": "vec4TransformMat4Into",
          "kind": "function",
          "signature": "vec4TransformMat4Into(out, v, m)",
          "summary": ""
        },
        {
          "name": "vec4Equals",
          "kind": "function",
          "signature": "vec4Equals(a, b, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec4IsZero",
          "kind": "function",
          "signature": "vec4IsZero(v, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec4IsFinite",
          "kind": "function",
          "signature": "vec4IsFinite(v)",
          "summary": ""
        },
        {
          "name": "vec4FromRGBA",
          "kind": "function",
          "signature": "vec4FromRGBA(r, g, b, a = 1)",
          "summary": ""
        },
        {
          "name": "vec4ToRGBA",
          "kind": "function",
          "signature": "vec4ToRGBA(v)",
          "summary": ""
        },
        {
          "name": "vec4FromHex",
          "kind": "function",
          "signature": "vec4FromHex(hex)",
          "summary": ""
        },
        {
          "name": "vec4ToHex",
          "kind": "function",
          "signature": "vec4ToHex(v)",
          "summary": ""
        },
        {
          "name": "vec4Premultiply",
          "kind": "function",
          "signature": "vec4Premultiply(v)",
          "summary": ""
        },
        {
          "name": "vec4Unpremultiply",
          "kind": "function",
          "signature": "vec4Unpremultiply(v)",
          "summary": ""
        },
        {
          "name": "vec4Random",
          "kind": "function",
          "signature": "vec4Random()",
          "summary": ""
        },
        {
          "name": "vec4RandomUnit",
          "kind": "function",
          "signature": "vec4RandomUnit()",
          "summary": ""
        },
        {
          "name": "vec4ToString",
          "kind": "function",
          "signature": "vec4ToString(v, precision = 3)",
          "summary": ""
        },
        {
          "name": "vec4ToArray",
          "kind": "function",
          "signature": "vec4ToArray(v, out = [], offset = 0)",
          "summary": ""
        },
        {
          "name": "vec4GetComponent",
          "kind": "function",
          "signature": "vec4GetComponent(v, index)",
          "summary": ""
        },
        {
          "name": "vec4SetComponent",
          "kind": "function",
          "signature": "vec4SetComponent(v, index, value)",
          "summary": ""
        },
        {
          "name": "vec4FromScalar",
          "kind": "function",
          "signature": "vec4FromScalar(s)",
          "summary": ""
        },
        {
          "name": "vec4Infinity",
          "kind": "function",
          "signature": "vec4Infinity()",
          "summary": ""
        },
        {
          "name": "vec4NegInfinity",
          "kind": "function",
          "signature": "vec4NegInfinity()",
          "summary": ""
        },
        {
          "name": "vec4AddScalar",
          "kind": "function",
          "signature": "vec4AddScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec4SubScalar",
          "kind": "function",
          "signature": "vec4SubScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec4MulInto",
          "kind": "function",
          "signature": "vec4MulInto(out, a, b)",
          "summary": ""
        },
        {
          "name": "vec4NegateInto",
          "kind": "function",
          "signature": "vec4NegateInto(out, v)",
          "summary": ""
        },
        {
          "name": "vec4Manhattan",
          "kind": "function",
          "signature": "vec4Manhattan(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Chebyshev",
          "kind": "function",
          "signature": "vec4Chebyshev(a, b)",
          "summary": ""
        },
        {
          "name": "vec4ManhattanLength",
          "kind": "function",
          "signature": "vec4ManhattanLength(v)",
          "summary": ""
        },
        {
          "name": "vec4SetLength",
          "kind": "function",
          "signature": "vec4SetLength(v, len)",
          "summary": ""
        },
        {
          "name": "vec4ClampLength",
          "kind": "function",
          "signature": "vec4ClampLength(v, min, max)",
          "summary": ""
        },
        {
          "name": "vec4Limit",
          "kind": "function",
          "signature": "vec4Limit(v, maxLen)",
          "summary": ""
        },
        {
          "name": "vec4SafeNormalize",
          "kind": "function",
          "signature": "vec4SafeNormalize(v, fallback = [0,0,0,1])",
          "summary": ""
        },
        {
          "name": "vec4LerpInto",
          "kind": "function",
          "signature": "vec4LerpInto(out, a, b, t)",
          "summary": ""
        },
        {
          "name": "vec4LerpUnclamped",
          "kind": "function",
          "signature": "vec4LerpUnclamped(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec4LerpV",
          "kind": "function",
          "signature": "vec4LerpV(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec4SmoothStep",
          "kind": "function",
          "signature": "vec4SmoothStep(a, b, t)",
          "summary": ""
        },
        {
          "name": "vec4Midpoint",
          "kind": "function",
          "signature": "vec4Midpoint(a, b)",
          "summary": ""
        },
        {
          "name": "vec4Trunc",
          "kind": "function",
          "signature": "vec4Trunc(v)",
          "summary": ""
        },
        {
          "name": "vec4Fract",
          "kind": "function",
          "signature": "vec4Fract(v)",
          "summary": ""
        },
        {
          "name": "vec4Sign",
          "kind": "function",
          "signature": "vec4Sign(v)",
          "summary": ""
        },
        {
          "name": "vec4Snap",
          "kind": "function",
          "signature": "vec4Snap(v, step)",
          "summary": ""
        },
        {
          "name": "vec4SnapV",
          "kind": "function",
          "signature": "vec4SnapV(v, step)",
          "summary": ""
        },
        {
          "name": "vec4Saturate",
          "kind": "function",
          "signature": "vec4Saturate(v)",
          "summary": ""
        },
        {
          "name": "vec4InverseSqrt",
          "kind": "function",
          "signature": "vec4InverseSqrt(v)",
          "summary": ""
        },
        {
          "name": "vec4FMA",
          "kind": "function",
          "signature": "vec4FMA(a, b, c)",
          "summary": ""
        },
        {
          "name": "vec4Step",
          "kind": "function",
          "signature": "vec4Step(edge, v)",
          "summary": ""
        },
        {
          "name": "vec4StepScalar",
          "kind": "function",
          "signature": "vec4StepScalar(edge, v)",
          "summary": ""
        },
        {
          "name": "vec4SmoothStepV",
          "kind": "function",
          "signature": "vec4SmoothStepV(low, high, v)",
          "summary": ""
        },
        {
          "name": "vec4PosMod",
          "kind": "function",
          "signature": "vec4PosMod(v, m)",
          "summary": ""
        },
        {
          "name": "vec4PosModV",
          "kind": "function",
          "signature": "vec4PosModV(v, m)",
          "summary": ""
        },
        {
          "name": "vec4MinScalar",
          "kind": "function",
          "signature": "vec4MinScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec4MaxScalar",
          "kind": "function",
          "signature": "vec4MaxScalar(v, s)",
          "summary": ""
        },
        {
          "name": "vec4DirectionTo",
          "kind": "function",
          "signature": "vec4DirectionTo(from, to)",
          "summary": ""
        },
        {
          "name": "vec4ExactEquals",
          "kind": "function",
          "signature": "vec4ExactEquals(a, b)",
          "summary": ""
        },
        {
          "name": "vec4IsNormalized",
          "kind": "function",
          "signature": "vec4IsNormalized(v, eps = EPSILON)",
          "summary": ""
        },
        {
          "name": "vec4IsNaN",
          "kind": "function",
          "signature": "vec4IsNaN(v)",
          "summary": ""
        },
        {
          "name": "vec4MinComponent",
          "kind": "function",
          "signature": "vec4MinComponent(v)",
          "summary": ""
        },
        {
          "name": "vec4MaxComponent",
          "kind": "function",
          "signature": "vec4MaxComponent(v)",
          "summary": ""
        },
        {
          "name": "vec4Sum",
          "kind": "function",
          "signature": "vec4Sum(v)",
          "summary": ""
        },
        {
          "name": "vec4Average",
          "kind": "function",
          "signature": "vec4Average(v)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MediaTimingMath",
      "path": "engine/reference/core/math/MediaTimingMath.md",
      "source": "engine/core/math/MediaTimingMath.js",
      "import": "/engine/core/math/MediaTimingMath.js",
      "sourceHash": "95b4a7b32ac0da1f109f10d01e09edc78495d1188f36fc2d9fa08b4f7475510f",
      "summary": "MediaTimingMath.js - pure WebCodecs-shaped timestamp, cadence, sync, and metadata reports.",
      "exports": [
        {
          "name": "mediaTimestampUs",
          "kind": "function",
          "signature": "mediaTimestampUs(value, options = {})",
          "summary": ""
        },
        {
          "name": "mediaDurationUs",
          "kind": "function",
          "signature": "mediaDurationUs(value, options = {})",
          "summary": ""
        },
        {
          "name": "mediaTimestampReport",
          "kind": "function",
          "signature": "mediaTimestampReport(sample = {}, options = {})",
          "summary": ""
        },
        {
          "name": "mediaFrameIndexAtTimestamp",
          "kind": "function",
          "signature": "mediaFrameIndexAtTimestamp(timestamp, options = {})",
          "summary": ""
        },
        {
          "name": "mediaTimestampForFrameIndex",
          "kind": "function",
          "signature": "mediaTimestampForFrameIndex(frameIndex, options = {})",
          "summary": ""
        },
        {
          "name": "mediaTimelineReport",
          "kind": "function",
          "signature": "mediaTimelineReport(samples = [], options = {})",
          "summary": ""
        },
        {
          "name": "mediaDroppedFrameReport",
          "kind": "function",
          "signature": "mediaDroppedFrameReport(samples = [], options = {})",
          "summary": ""
        },
        {
          "name": "mediaDriftReport",
          "kind": "function",
          "signature": "mediaDriftReport(reference, candidate, options = {})",
          "summary": ""
        },
        {
          "name": "mediaAvSyncReport",
          "kind": "function",
          "signature": "mediaAvSyncReport(audioSamples = [], videoSamples = [], options = {})",
          "summary": ""
        },
        {
          "name": "mediaAudioDataTimingReport",
          "kind": "function",
          "signature": "mediaAudioDataTimingReport(audioData = {}, options = {})",
          "summary": ""
        },
        {
          "name": "mediaColorSpaceReport",
          "kind": "function",
          "signature": "mediaColorSpaceReport(videoFrameOrColorSpace = {}, options = {})",
          "summary": ""
        },
        {
          "name": "mediaQueuePressureReport",
          "kind": "function",
          "signature": "mediaQueuePressureReport(queue = {}, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MemoryLayoutMath",
      "path": "engine/reference/core/math/MemoryLayoutMath.md",
      "source": "engine/core/math/MemoryLayoutMath.js",
      "import": "/engine/core/math/MemoryLayoutMath.js",
      "sourceHash": "d0abb9972625b461ddee8ca01e8bbe103b91797f42c6a53a2b265ef6f4db501a",
      "summary": "MemoryLayoutMath.js - byte alignment, struct, interleaved, planar, WGSL, and std140 layout reports.",
      "exports": [
        {
          "name": "memoryLayoutAlignmentForKind",
          "kind": "function",
          "signature": "memoryLayoutAlignmentForKind(kind, fallback = 1)",
          "summary": ""
        },
        {
          "name": "alignMemoryOffset",
          "kind": "function",
          "signature": "alignMemoryOffset(offset, alignment)",
          "summary": ""
        },
        {
          "name": "memoryPaddingForAlignment",
          "kind": "function",
          "signature": "memoryPaddingForAlignment(offset, alignment)",
          "summary": ""
        },
        {
          "name": "isMemoryAligned",
          "kind": "function",
          "signature": "isMemoryAligned(offset, alignment)",
          "summary": ""
        },
        {
          "name": "alignedMemoryByteSize",
          "kind": "function",
          "signature": "alignedMemoryByteSize(byteSize, alignment)",
          "summary": ""
        },
        {
          "name": "memoryFieldLayout",
          "kind": "function",
          "signature": "memoryFieldLayout(fields, options = {})",
          "summary": ""
        },
        {
          "name": "interleavedVertexLayoutReport",
          "kind": "function",
          "signature": "interleavedVertexLayoutReport(attributes, options = {})",
          "summary": ""
        },
        {
          "name": "planarBufferLayoutReport",
          "kind": "function",
          "signature": "planarBufferLayoutReport(attributes, elementCount, options = {})",
          "summary": ""
        },
        {
          "name": "aosElementByteOffset",
          "kind": "function",
          "signature": "aosElementByteOffset(index, stride, fieldOffset = 0, baseOffset = 0)",
          "summary": ""
        },
        {
          "name": "soaElementByteOffset",
          "kind": "function",
          "signature": "soaElementByteOffset(index, elementByteSize, baseOffset = 0)",
          "summary": ""
        },
        {
          "name": "wgslStructLayoutReport",
          "kind": "function",
          "signature": "wgslStructLayoutReport(wgslCode)",
          "summary": ""
        },
        {
          "name": "std140StructLayoutReport",
          "kind": "function",
          "signature": "std140StructLayoutReport(name, fields)",
          "summary": ""
        },
        {
          "name": "MEMORY_LAYOUT_ALIGNMENTS",
          "kind": "constant",
          "signature": "MEMORY_LAYOUT_ALIGNMENTS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MeshAttributeMath",
      "path": "engine/reference/core/math/MeshAttributeMath.md",
      "source": "engine/core/math/MeshAttributeMath.js",
      "import": "/engine/core/math/MeshAttributeMath.js",
      "sourceHash": "9862c820a47b714c59b21f2bb561997cb6b07b7d7f8616e1221037d371c33801",
      "summary": "MeshAttributeMath.js - glTF-style accessor component, stride, tangent-frame, and decode helpers.",
      "exports": [
        {
          "name": "morphWeightStateReport",
          "kind": "function",
          "signature": "morphWeightStateReport(value, options = {})",
          "summary": "Validate serializable per-model morph control state keyed by stable part index."
        },
        {
          "name": "positionBoundsReport",
          "kind": "function",
          "signature": "positionBoundsReport(positions, options = {})",
          "summary": ""
        },
        {
          "name": "morphAttributeDeltasReport",
          "kind": "function",
          "signature": "morphAttributeDeltasReport(baseValues, morphTargets, morphWeights, options = {})",
          "summary": ""
        },
        {
          "name": "morphedPositionBoundsReport",
          "kind": "function",
          "signature": "morphedPositionBoundsReport(basePositions, morphTargets, morphWeights, options = {})",
          "summary": ""
        },
        {
          "name": "skinnedPositionBoundsReport",
          "kind": "function",
          "signature": "skinnedPositionBoundsReport(bindPositions, jointIndices, jointWeights, skinMatrices, options = {},)",
          "summary": ""
        },
        {
          "name": "componentTypedArray",
          "kind": "function",
          "signature": "componentTypedArray(componentType)",
          "summary": ""
        },
        {
          "name": "componentByteSize",
          "kind": "function",
          "signature": "componentByteSize(componentType)",
          "summary": ""
        },
        {
          "name": "accessorElementCount",
          "kind": "function",
          "signature": "accessorElementCount(type)",
          "summary": ""
        },
        {
          "name": "normalizedComponentRange",
          "kind": "function",
          "signature": "normalizedComponentRange(componentType)",
          "summary": ""
        },
        {
          "name": "normalizeAccessorComponent",
          "kind": "function",
          "signature": "normalizeAccessorComponent(value, componentType)",
          "summary": ""
        },
        {
          "name": "readAccessorComponent",
          "kind": "function",
          "signature": "readAccessorComponent(view, byteOffset, componentType, normalized = false)",
          "summary": ""
        },
        {
          "name": "accessorPackedByteStride",
          "kind": "function",
          "signature": "accessorPackedByteStride(accessor)",
          "summary": ""
        },
        {
          "name": "accessorByteLayout",
          "kind": "function",
          "signature": "accessorByteLayout(accessor, bufferView = {})",
          "summary": ""
        },
        {
          "name": "readAccessorArray",
          "kind": "function",
          "signature": "readAccessorArray(source, accessor, bufferView = {}, options = {})",
          "summary": ""
        },
        {
          "name": "accessorDecodeMetadata",
          "kind": "function",
          "signature": "accessorDecodeMetadata(accessor, bufferView = {})",
          "summary": ""
        },
        {
          "name": "attributeBounds",
          "kind": "function",
          "signature": "attributeBounds(values, componentCount = 3)",
          "summary": ""
        },
        {
          "name": "attributeScaleBiasFromBounds",
          "kind": "function",
          "signature": "attributeScaleBiasFromBounds(min, max)",
          "summary": ""
        },
        {
          "name": "meshoptDecodeMetadata",
          "kind": "function",
          "signature": "meshoptDecodeMetadata(extension = {}, bufferView = {})",
          "summary": ""
        },
        {
          "name": "indexBounds",
          "kind": "function",
          "signature": "indexBounds(indices, vertexCount)",
          "summary": ""
        },
        {
          "name": "tangentHandedness",
          "kind": "function",
          "signature": "tangentHandedness(tangent, fallback = 1)",
          "summary": ""
        },
        {
          "name": "tangentFrameFromNormalTangent",
          "kind": "function",
          "signature": "tangentFrameFromNormalTangent(normal, tangent, options = {})",
          "summary": ""
        },
        {
          "name": "gltfBitangentFromTangent",
          "kind": "function",
          "signature": "gltfBitangentFromTangent(normal, tangent, options = {})",
          "summary": ""
        },
        {
          "name": "decodeNormalTextureSample",
          "kind": "function",
          "signature": "decodeNormalTextureSample(sample, normalScale = 1, options = {})",
          "summary": ""
        },
        {
          "name": "normalTextureSampleToWorld",
          "kind": "function",
          "signature": "normalTextureSampleToWorld(sample, normal, tangent, normalScale = 1, options = {})",
          "summary": ""
        },
        {
          "name": "prepareMikkTSpaceInputGeometry",
          "kind": "function",
          "signature": "prepareMikkTSpaceInputGeometry(geometry)",
          "summary": ""
        },
        {
          "name": "mikkTSpaceReferenceFingerprint",
          "kind": "function",
          "signature": "mikkTSpaceReferenceFingerprint(preparedInput, faceTangents = null)",
          "summary": ""
        },
        {
          "name": "mikkTSpaceReferenceRegistryReport",
          "kind": "function",
          "signature": "mikkTSpaceReferenceRegistryReport(registry = MIKK_REFERENCE_CORPUS_REGISTRY)",
          "summary": ""
        },
        {
          "name": "mikkTSpaceReferenceProofReport",
          "kind": "function",
          "signature": "mikkTSpaceReferenceProofReport(preparedInput, faceTangents, proof = null, registry = MIKK_REFERENCE_CORPUS_REGISTRY)",
          "summary": ""
        },
        {
          "name": "mikkTSpaceFaceTangentOutputReport",
          "kind": "function",
          "signature": "mikkTSpaceFaceTangentOutputReport(faceTangents, expectedVertexCount, options = {})",
          "summary": ""
        },
        {
          "name": "applyMikkTSpaceFaceTangents",
          "kind": "function",
          "signature": "applyMikkTSpaceFaceTangents(preparedInput, faceTangents, options = {})",
          "summary": ""
        },
        {
          "name": "splitGeometryForTangentSpace",
          "kind": "function",
          "signature": "splitGeometryForTangentSpace(geometry, options = {})",
          "summary": ""
        },
        {
          "name": "tangentSpaceCompatibilityReport",
          "kind": "function",
          "signature": "tangentSpaceCompatibilityReport(geometry, referenceTangents = null, options = {})",
          "summary": ""
        },
        {
          "name": "generateTangentsFromGeometry",
          "kind": "function",
          "signature": "generateTangentsFromGeometry(positions, normals, uvs, indices = null, options = {})",
          "summary": ""
        },
        {
          "name": "GLTF_COMPONENT_TYPES",
          "kind": "constant",
          "signature": "GLTF_COMPONENT_TYPES",
          "summary": ""
        },
        {
          "name": "TANGENT_SPACE_GENERATOR_FALLBACK",
          "kind": "constant",
          "signature": "TANGENT_SPACE_GENERATOR_FALLBACK",
          "summary": ""
        },
        {
          "name": "TANGENT_SPACE_GENERATOR_MIKK_FACE_OUTPUT",
          "kind": "constant",
          "signature": "TANGENT_SPACE_GENERATOR_MIKK_FACE_OUTPUT",
          "summary": ""
        },
        {
          "name": "MIKK_REFERENCE_CORPUS_REGISTRY",
          "kind": "constant",
          "signature": "MIKK_REFERENCE_CORPUS_REGISTRY",
          "summary": ""
        },
        {
          "name": "SKINNED_POSITION_BOUNDS_LIMITS",
          "kind": "constant",
          "signature": "SKINNED_POSITION_BOUNDS_LIMITS",
          "summary": ""
        },
        {
          "name": "MORPH_ATTRIBUTE_LIMITS",
          "kind": "constant",
          "signature": "MORPH_ATTRIBUTE_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/MeshMath",
      "path": "engine/reference/core/math/MeshMath.md",
      "source": "engine/core/math/MeshMath.js",
      "import": "/engine/core/math/MeshMath.js",
      "sourceHash": "22e5e1d4b25b5d8e42256692e5ef3088f767cd19399939288286eb017ccaff5d",
      "summary": "MeshMath.js - reusable peer-graph, neighbor, relay, gossip, and mesh-health helpers.",
      "exports": [
        {
          "name": "meshGraphReport",
          "kind": "function",
          "signature": "meshGraphReport(options = {})",
          "summary": ""
        },
        {
          "name": "peerDegreeReport",
          "kind": "function",
          "signature": "peerDegreeReport(options = {})",
          "summary": ""
        },
        {
          "name": "partitionDetectionReport",
          "kind": "function",
          "signature": "partitionDetectionReport(options = {})",
          "summary": ""
        },
        {
          "name": "meshLinkQualityScore",
          "kind": "function",
          "signature": "meshLinkQualityScore(options = {})",
          "summary": ""
        },
        {
          "name": "peerNeighborScoreReport",
          "kind": "function",
          "signature": "peerNeighborScoreReport(peer = {}, options = {})",
          "summary": ""
        },
        {
          "name": "neighborSelectionReport",
          "kind": "function",
          "signature": "neighborSelectionReport(options = {})",
          "summary": ""
        },
        {
          "name": "supernodeScoreReport",
          "kind": "function",
          "signature": "supernodeScoreReport(options = {})",
          "summary": ""
        },
        {
          "name": "relaySelectionReport",
          "kind": "function",
          "signature": "relaySelectionReport(options = {})",
          "summary": ""
        },
        {
          "name": "nearestPeerReport",
          "kind": "function",
          "signature": "nearestPeerReport(options = {})",
          "summary": ""
        },
        {
          "name": "gossipFanoutReport",
          "kind": "function",
          "signature": "gossipFanoutReport(options = {})",
          "summary": ""
        },
        {
          "name": "redundantPathReport",
          "kind": "function",
          "signature": "redundantPathReport(options = {})",
          "summary": ""
        },
        {
          "name": "meshHealthReport",
          "kind": "function",
          "signature": "meshHealthReport(options = {})",
          "summary": ""
        },
        {
          "name": "topologyModeReport",
          "kind": "function",
          "signature": "topologyModeReport(options = {})",
          "summary": ""
        },
        {
          "name": "MESH_MIN_DEGREE",
          "kind": "constant",
          "signature": "MESH_MIN_DEGREE",
          "summary": ""
        },
        {
          "name": "MESH_DEFAULT_IDEAL_DEGREE",
          "kind": "constant",
          "signature": "MESH_DEFAULT_IDEAL_DEGREE",
          "summary": ""
        },
        {
          "name": "MESH_MAX_DEGREE",
          "kind": "constant",
          "signature": "MESH_MAX_DEGREE",
          "summary": ""
        },
        {
          "name": "MESH_SUPERNODE_DEGREE",
          "kind": "constant",
          "signature": "MESH_SUPERNODE_DEGREE",
          "summary": ""
        },
        {
          "name": "MESH_FULL_MESH_CEILING",
          "kind": "constant",
          "signature": "MESH_FULL_MESH_CEILING",
          "summary": ""
        },
        {
          "name": "MESH_SUPERNODE_THRESHOLD",
          "kind": "constant",
          "signature": "MESH_SUPERNODE_THRESHOLD",
          "summary": ""
        },
        {
          "name": "MESH_SUPERNODE_SCORE",
          "kind": "constant",
          "signature": "MESH_SUPERNODE_SCORE",
          "summary": ""
        },
        {
          "name": "MESH_GOSSIP_FACTOR",
          "kind": "constant",
          "signature": "MESH_GOSSIP_FACTOR",
          "summary": ""
        },
        {
          "name": "MESH_GOSSIP_MIN_LAZY",
          "kind": "constant",
          "signature": "MESH_GOSSIP_MIN_LAZY",
          "summary": ""
        },
        {
          "name": "MESH_GOSSIP_ROUNDS",
          "kind": "constant",
          "signature": "MESH_GOSSIP_ROUNDS",
          "summary": ""
        },
        {
          "name": "MESH_NEIGHBOR_SCORE_WEIGHTS",
          "kind": "constant",
          "signature": "MESH_NEIGHBOR_SCORE_WEIGHTS",
          "summary": ""
        },
        {
          "name": "MESH_LINK_QUALITY_WEIGHTS",
          "kind": "constant",
          "signature": "MESH_LINK_QUALITY_WEIGHTS",
          "summary": ""
        },
        {
          "name": "MESH_SUPERNODE_TIER_MULTIPLIER",
          "kind": "constant",
          "signature": "MESH_SUPERNODE_TIER_MULTIPLIER",
          "summary": ""
        },
        {
          "name": "MESH_NEIGHBOR_TIER_PENALTY",
          "kind": "constant",
          "signature": "MESH_NEIGHBOR_TIER_PENALTY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/NavigationMath",
      "path": "engine/reference/core/math/NavigationMath.md",
      "source": "engine/core/math/NavigationMath.js",
      "import": "/engine/core/math/NavigationMath.js",
      "sourceHash": "95de2633178db6fe90445bfcfe340da30eaa78d1a3bf917e0e3312e9ba6eeb3f",
      "summary": "NavigationMath.js - pure navigation corridor, path, area-cost, and steering reports.",
      "exports": [
        {
          "name": "navPoint2",
          "kind": "function",
          "signature": "navPoint2(point, options = {})",
          "summary": ""
        },
        {
          "name": "navDistance2D",
          "kind": "function",
          "signature": "navDistance2D(a, b, options = {})",
          "summary": ""
        },
        {
          "name": "navPathLength",
          "kind": "function",
          "signature": "navPathLength(waypoints = [], options = {})",
          "summary": ""
        },
        {
          "name": "navPortalReport",
          "kind": "function",
          "signature": "navPortalReport(portal, options = {})",
          "summary": ""
        },
        {
          "name": "navStringPull",
          "kind": "function",
          "signature": "navStringPull(portals = [], options = {})",
          "summary": ""
        },
        {
          "name": "navPathCorridorReport",
          "kind": "function",
          "signature": "navPathCorridorReport(portals = [], options = {})",
          "summary": ""
        },
        {
          "name": "navAreaTraversalCost",
          "kind": "function",
          "signature": "navAreaTraversalCost(distance, area = 0, options = {})",
          "summary": ""
        },
        {
          "name": "navNearestPolyScore",
          "kind": "function",
          "signature": "navNearestPolyScore(point, polygon, options = {})",
          "summary": ""
        },
        {
          "name": "navPackPolyRef",
          "kind": "function",
          "signature": "navPackPolyRef(ref = {}, options = {})",
          "summary": ""
        },
        {
          "name": "navUnpackPolyRef",
          "kind": "function",
          "signature": "navUnpackPolyRef(value, options = {})",
          "summary": ""
        },
        {
          "name": "navSmoothPath",
          "kind": "function",
          "signature": "navSmoothPath(waypoints = [], smoothing = 0.5, options = {})",
          "summary": ""
        },
        {
          "name": "navSteeringTargetReport",
          "kind": "function",
          "signature": "navSteeringTargetReport(currentPosition, waypoints = [], options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/NetworkMetricMath",
      "path": "engine/reference/core/math/NetworkMetricMath.md",
      "source": "engine/core/math/NetworkMetricMath.js",
      "import": "/engine/core/math/NetworkMetricMath.js",
      "sourceHash": "33a7e1aa682956444b31015a9efaf1f011e17bb2e25aba77aa9866e52d59da8a",
      "summary": "NetworkMetricMath.js - reusable RTT, jitter, loss, throughput, goodput, and timeout helpers.",
      "exports": [
        {
          "name": "networkDurationSeconds",
          "kind": "function",
          "signature": "networkDurationSeconds(durationMs)",
          "summary": ""
        },
        {
          "name": "networkRatePerSecond",
          "kind": "function",
          "signature": "networkRatePerSecond(count, durationMs)",
          "summary": ""
        },
        {
          "name": "packetsPerSecond",
          "kind": "function",
          "signature": "packetsPerSecond(packetCount, durationMs)",
          "summary": ""
        },
        {
          "name": "bitrateBps",
          "kind": "function",
          "signature": "bitrateBps(byteCount, durationMs)",
          "summary": ""
        },
        {
          "name": "throughputBps",
          "kind": "function",
          "signature": "throughputBps(byteCount, durationMs)",
          "summary": ""
        },
        {
          "name": "goodputReport",
          "kind": "function",
          "signature": "goodputReport(options = {})",
          "summary": ""
        },
        {
          "name": "packetLossReport",
          "kind": "function",
          "signature": "packetLossReport(options = {})",
          "summary": ""
        },
        {
          "name": "rttSampleMs",
          "kind": "function",
          "signature": "rttSampleMs(options = {})",
          "summary": ""
        },
        {
          "name": "oneWayLatencyEstimateMs",
          "kind": "function",
          "signature": "oneWayLatencyEstimateMs(options = {})",
          "summary": ""
        },
        {
          "name": "timeoutEstimateMs",
          "kind": "function",
          "signature": "timeoutEstimateMs(estimator = {}, options = {})",
          "summary": ""
        },
        {
          "name": "rttEstimatorUpdate",
          "kind": "function",
          "signature": "rttEstimatorUpdate(sampleRttMs, previous = null, options = {})",
          "summary": ""
        },
        {
          "name": "quicProbeTimeoutMs",
          "kind": "function",
          "signature": "quicProbeTimeoutMs(estimator = {}, options = {})",
          "summary": ""
        },
        {
          "name": "rtpTransitTimeMs",
          "kind": "function",
          "signature": "rtpTransitTimeMs(packet = {})",
          "summary": ""
        },
        {
          "name": "interarrivalJitterUpdate",
          "kind": "function",
          "signature": "interarrivalJitterUpdate(previousTransitMs, currentTransitMs, previousJitterMs = 0, options = {})",
          "summary": ""
        },
        {
          "name": "rtpInterarrivalJitterUpdate",
          "kind": "function",
          "signature": "rtpInterarrivalJitterUpdate(previous = null, packet = {})",
          "summary": ""
        },
        {
          "name": "latencyJitterReport",
          "kind": "function",
          "signature": "latencyJitterReport(samplesMs = [])",
          "summary": ""
        },
        {
          "name": "networkQualityReport",
          "kind": "function",
          "signature": "networkQualityReport(options = {})",
          "summary": ""
        },
        {
          "name": "NETWORK_RTO_ALPHA",
          "kind": "constant",
          "signature": "NETWORK_RTO_ALPHA",
          "summary": ""
        },
        {
          "name": "NETWORK_RTO_BETA",
          "kind": "constant",
          "signature": "NETWORK_RTO_BETA",
          "summary": ""
        },
        {
          "name": "NETWORK_RTO_VARIANCE_MULTIPLIER",
          "kind": "constant",
          "signature": "NETWORK_RTO_VARIANCE_MULTIPLIER",
          "summary": ""
        },
        {
          "name": "NETWORK_DEFAULT_MIN_TIMEOUT_MS",
          "kind": "constant",
          "signature": "NETWORK_DEFAULT_MIN_TIMEOUT_MS",
          "summary": ""
        },
        {
          "name": "NETWORK_DEFAULT_MAX_TIMEOUT_MS",
          "kind": "constant",
          "signature": "NETWORK_DEFAULT_MAX_TIMEOUT_MS",
          "summary": ""
        },
        {
          "name": "NETWORK_DEFAULT_CLOCK_GRANULARITY_MS",
          "kind": "constant",
          "signature": "NETWORK_DEFAULT_CLOCK_GRANULARITY_MS",
          "summary": ""
        },
        {
          "name": "NETWORK_RTP_JITTER_GAIN",
          "kind": "constant",
          "signature": "NETWORK_RTP_JITTER_GAIN",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/PacketMath",
      "path": "engine/reference/core/math/PacketMath.md",
      "source": "engine/core/math/PacketMath.js",
      "import": "/engine/core/math/PacketMath.js",
      "sourceHash": "af0324e10600c8b8a0b2e21f5fb31691ba433b1fb188b64e529a217cc115df96",
      "summary": "PacketMath.js - reusable packet sequence, ACK range, fragmentation, flight, and loss helpers.",
      "exports": [
        {
          "name": "packetSequenceModulo",
          "kind": "function",
          "signature": "packetSequenceModulo(sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "wrapPacketSequence",
          "kind": "function",
          "signature": "wrapPacketSequence(sequence, sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "advancePacketSequence",
          "kind": "function",
          "signature": "advancePacketSequence(sequence, increment = 1, sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "packetSequenceForwardDelta",
          "kind": "function",
          "signature": "packetSequenceForwardDelta(fromSequence, toSequence, sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "packetSequenceSignedDelta",
          "kind": "function",
          "signature": "packetSequenceSignedDelta(fromSequence, toSequence, sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "comparePacketSequence",
          "kind": "function",
          "signature": "comparePacketSequence(leftSequence, rightSequence, sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "isPacketSequenceNewer",
          "kind": "function",
          "signature": "isPacketSequenceNewer(candidateSequence, baselineSequence, sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "packetSequenceWindowReport",
          "kind": "function",
          "signature": "packetSequenceWindowReport(sequence, windowStart, windowSize, sequenceBits = PACKET_SEQUENCE_BITS_DEFAULT)",
          "summary": ""
        },
        {
          "name": "packetAckRangeReport",
          "kind": "function",
          "signature": "packetAckRangeReport(packetNumbers = [], options = {})",
          "summary": ""
        },
        {
          "name": "packetMissingRangeReport",
          "kind": "function",
          "signature": "packetMissingRangeReport(options = {})",
          "summary": ""
        },
        {
          "name": "packetPayloadBudgetReport",
          "kind": "function",
          "signature": "packetPayloadBudgetReport(options = {})",
          "summary": ""
        },
        {
          "name": "packetFragmentPlan",
          "kind": "function",
          "signature": "packetFragmentPlan(payloadBytes, options = {})",
          "summary": ""
        },
        {
          "name": "packetReassemblyReport",
          "kind": "function",
          "signature": "packetReassemblyReport(fragments = [], options = {})",
          "summary": ""
        },
        {
          "name": "packetFlightReport",
          "kind": "function",
          "signature": "packetFlightReport(packets = [])",
          "summary": ""
        },
        {
          "name": "packetSendWindowReport",
          "kind": "function",
          "signature": "packetSendWindowReport(options = {})",
          "summary": ""
        },
        {
          "name": "packetLossCandidateReport",
          "kind": "function",
          "signature": "packetLossCandidateReport(sentPackets = [], options = {})",
          "summary": ""
        },
        {
          "name": "quicPacketNumberEncodingBytes",
          "kind": "function",
          "signature": "quicPacketNumberEncodingBytes(packetNumber, largestAcknowledgedPacket = null)",
          "summary": ""
        },
        {
          "name": "quicDecodeTruncatedPacketNumber",
          "kind": "function",
          "signature": "quicDecodeTruncatedPacketNumber(largestReceivedPacket, truncatedPacketNumber, packetNumberBits)",
          "summary": ""
        },
        {
          "name": "PACKET_SEQUENCE_BITS_DEFAULT",
          "kind": "constant",
          "signature": "PACKET_SEQUENCE_BITS_DEFAULT",
          "summary": ""
        },
        {
          "name": "PACKET_SEQUENCE_BITS_MAX_SAFE",
          "kind": "constant",
          "signature": "PACKET_SEQUENCE_BITS_MAX_SAFE",
          "summary": ""
        },
        {
          "name": "PACKET_LOSS_PACKET_THRESHOLD",
          "kind": "constant",
          "signature": "PACKET_LOSS_PACKET_THRESHOLD",
          "summary": ""
        },
        {
          "name": "PACKET_LOSS_TIME_THRESHOLD",
          "kind": "constant",
          "signature": "PACKET_LOSS_TIME_THRESHOLD",
          "summary": ""
        },
        {
          "name": "PACKET_LOSS_GRANULARITY_MS",
          "kind": "constant",
          "signature": "PACKET_LOSS_GRANULARITY_MS",
          "summary": ""
        },
        {
          "name": "PACKET_DEFAULT_DATAGRAM_BYTES",
          "kind": "constant",
          "signature": "PACKET_DEFAULT_DATAGRAM_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/ProfileMath",
      "path": "engine/reference/core/math/ProfileMath.md",
      "source": "engine/core/math/ProfileMath.js",
      "import": "/engine/core/math/ProfileMath.js",
      "sourceHash": "d6ea64bf316e631ac1cadf7c0d4843e5925c10d1d95264db5371b79170fe3981",
      "summary": "ProfileMath.js - reusable latency, frame-budget, and stage profile summaries.",
      "exports": [
        {
          "name": "latencyStatsReport",
          "kind": "function",
          "signature": "latencyStatsReport(samplesMs, options = {})",
          "summary": ""
        },
        {
          "name": "frameBudgetReport",
          "kind": "function",
          "signature": "frameBudgetReport(frameTimeMs, options = {})",
          "summary": ""
        },
        {
          "name": "profileStageReport",
          "kind": "function",
          "signature": "profileStageReport(stages, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/QuantMath",
      "path": "engine/reference/core/math/QuantMath.md",
      "source": "engine/core/math/QuantMath.js",
      "import": "/engine/core/math/QuantMath.js",
      "sourceHash": "3cdae6db1997b0214f50224c0815abc35f491410e5aff6823e64752566fa19f4",
      "summary": "QuantMath.js - reusable scalar and array quantization primitives.",
      "exports": [
        {
          "name": "quantizationStep",
          "kind": "function",
          "signature": "quantizationStep(range, maxValue = QUANT_INT16_MAX)",
          "summary": ""
        },
        {
          "name": "quantizationMaxAbsoluteError",
          "kind": "function",
          "signature": "quantizationMaxAbsoluteError(range, maxValue = QUANT_INT16_MAX)",
          "summary": ""
        },
        {
          "name": "quantizeSignedFloat",
          "kind": "function",
          "signature": "quantizeSignedFloat(value, range, maxValue = QUANT_INT16_MAX)",
          "summary": ""
        },
        {
          "name": "dequantizeSignedFloat",
          "kind": "function",
          "signature": "dequantizeSignedFloat(quantized, range, maxValue = QUANT_INT16_MAX)",
          "summary": ""
        },
        {
          "name": "quantizeSignedFloatToInt16",
          "kind": "function",
          "signature": "quantizeSignedFloatToInt16(value, range)",
          "summary": ""
        },
        {
          "name": "dequantizeSignedInt16ToFloat",
          "kind": "function",
          "signature": "dequantizeSignedInt16ToFloat(quantized, range)",
          "summary": ""
        },
        {
          "name": "quantizeSignedFloatToInt8",
          "kind": "function",
          "signature": "quantizeSignedFloatToInt8(value, range)",
          "summary": ""
        },
        {
          "name": "dequantizeSignedInt8ToFloat",
          "kind": "function",
          "signature": "dequantizeSignedInt8ToFloat(quantized, range)",
          "summary": ""
        },
        {
          "name": "quantizeSignedFloatArrayToInt16",
          "kind": "function",
          "signature": "quantizeSignedFloatArrayToInt16(values, range)",
          "summary": ""
        },
        {
          "name": "dequantizeSignedInt16ArrayToFloat32",
          "kind": "function",
          "signature": "dequantizeSignedInt16ArrayToFloat32(quantized, range)",
          "summary": ""
        },
        {
          "name": "quantizeSignedFloatArrayToInt8",
          "kind": "function",
          "signature": "quantizeSignedFloatArrayToInt8(values, range)",
          "summary": ""
        },
        {
          "name": "dequantizeSignedInt8ArrayToFloat32",
          "kind": "function",
          "signature": "dequantizeSignedInt8ArrayToFloat32(quantized, range)",
          "summary": ""
        },
        {
          "name": "quantizeUnitFloatToUint16",
          "kind": "function",
          "signature": "quantizeUnitFloatToUint16(value)",
          "summary": ""
        },
        {
          "name": "dequantizeUint16ToUnitFloat",
          "kind": "function",
          "signature": "dequantizeUint16ToUnitFloat(quantized)",
          "summary": ""
        },
        {
          "name": "quantizeUnitFloatArrayToUint16",
          "kind": "function",
          "signature": "quantizeUnitFloatArrayToUint16(values)",
          "summary": ""
        },
        {
          "name": "dequantizeUint16ArrayToFloat32",
          "kind": "function",
          "signature": "dequantizeUint16ArrayToFloat32(quantized)",
          "summary": ""
        },
        {
          "name": "quantizeVec2ToInt16",
          "kind": "function",
          "signature": "quantizeVec2ToInt16(value, range)",
          "summary": ""
        },
        {
          "name": "dequantizeVec2FromInt16",
          "kind": "function",
          "signature": "dequantizeVec2FromInt16(quantized, range)",
          "summary": ""
        },
        {
          "name": "quantizeVec3ToInt16",
          "kind": "function",
          "signature": "quantizeVec3ToInt16(value, range)",
          "summary": ""
        },
        {
          "name": "dequantizeVec3FromInt16",
          "kind": "function",
          "signature": "dequantizeVec3FromInt16(quantized, range)",
          "summary": ""
        },
        {
          "name": "signedQuantizationMaxValue",
          "kind": "function",
          "signature": "signedQuantizationMaxValue(bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "unsignedQuantizationMaxValue",
          "kind": "function",
          "signature": "unsignedQuantizationMaxValue(bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "quantizeSignedFloatArray",
          "kind": "function",
          "signature": "quantizeSignedFloatArray(values, range, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "dequantizeSignedFloatArray",
          "kind": "function",
          "signature": "dequantizeSignedFloatArray(quantized, range, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "quantizeRange",
          "kind": "function",
          "signature": "quantizeRange(value, min, max, bitDepth = 16, fallback = 0)",
          "summary": ""
        },
        {
          "name": "dequantizeRange",
          "kind": "function",
          "signature": "dequantizeRange(quantized, min, max, bitDepth = 16, fallback = 0)",
          "summary": ""
        },
        {
          "name": "quantizeRangeArray",
          "kind": "function",
          "signature": "quantizeRangeArray(values, min, max, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "dequantizeRangeArray",
          "kind": "function",
          "signature": "dequantizeRangeArray(quantized, min, max, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "quantizeVec2",
          "kind": "function",
          "signature": "quantizeVec2(value, range, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "dequantizeVec2",
          "kind": "function",
          "signature": "dequantizeVec2(quantized, range, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "quantizeVec3",
          "kind": "function",
          "signature": "quantizeVec3(value, range, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "dequantizeVec3",
          "kind": "function",
          "signature": "dequantizeVec3(quantized, range, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "quantizeColor",
          "kind": "function",
          "signature": "quantizeColor(color, bitDepth = 8)",
          "summary": ""
        },
        {
          "name": "dequantizeColor",
          "kind": "function",
          "signature": "dequantizeColor(quantized, bitDepth = 8)",
          "summary": ""
        },
        {
          "name": "quantizeColorRGBA8",
          "kind": "function",
          "signature": "quantizeColorRGBA8(color)",
          "summary": ""
        },
        {
          "name": "dequantizeColorRGBA8",
          "kind": "function",
          "signature": "dequantizeColorRGBA8(quantized)",
          "summary": ""
        },
        {
          "name": "quantizeNormal",
          "kind": "function",
          "signature": "quantizeNormal(normal)",
          "summary": ""
        },
        {
          "name": "dequantizeNormal",
          "kind": "function",
          "signature": "dequantizeNormal(packed)",
          "summary": ""
        },
        {
          "name": "deltaQuantize",
          "kind": "function",
          "signature": "deltaQuantize(values, range, bitDepth = 16)",
          "summary": ""
        },
        {
          "name": "deltaDequantize",
          "kind": "function",
          "signature": "deltaDequantize(packed)",
          "summary": ""
        },
        {
          "name": "quantizationErrorReport",
          "kind": "function",
          "signature": "quantizationErrorReport(source, decoded, tolerance = 0)",
          "summary": ""
        },
        {
          "name": "quaternionOrientationErrorReport",
          "kind": "function",
          "signature": "quaternionOrientationErrorReport(source, decoded, toleranceRadians = 0)",
          "summary": ""
        },
        {
          "name": "adaptiveQuantize",
          "kind": "function",
          "signature": "adaptiveQuantize(values, options = {})",
          "summary": ""
        },
        {
          "name": "adaptiveDequantize",
          "kind": "function",
          "signature": "adaptiveDequantize(packed)",
          "summary": ""
        },
        {
          "name": "QUANT_INT16_MAX",
          "kind": "constant",
          "signature": "QUANT_INT16_MAX",
          "summary": ""
        },
        {
          "name": "QUANT_INT8_MAX",
          "kind": "constant",
          "signature": "QUANT_INT8_MAX",
          "summary": ""
        },
        {
          "name": "QUANT_UNORM16_MAX",
          "kind": "constant",
          "signature": "QUANT_UNORM16_MAX",
          "summary": ""
        },
        {
          "name": "dequantizeDelta",
          "kind": "constant",
          "signature": "dequantizeDelta",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/QueueMath",
      "path": "engine/reference/core/math/QueueMath.md",
      "source": "engine/core/math/QueueMath.js",
      "import": "/engine/core/math/QueueMath.js",
      "sourceHash": "a8bd4dc985714e90cc78d81f63692f241660c214a0f202bb2180d1a813b58663",
      "summary": "QueueMath.js - reusable queue depth, delay, bucket, share, ramp, and backpressure helpers.",
      "exports": [
        {
          "name": "queueDepthReport",
          "kind": "function",
          "signature": "queueDepthReport(options = {})",
          "summary": ""
        },
        {
          "name": "queueDrainTimeMs",
          "kind": "function",
          "signature": "queueDrainTimeMs(options = {})",
          "summary": ""
        },
        {
          "name": "queueDelayReport",
          "kind": "function",
          "signature": "queueDelayReport(options = {})",
          "summary": ""
        },
        {
          "name": "queueDrainReport",
          "kind": "function",
          "signature": "queueDrainReport(options = {})",
          "summary": ""
        },
        {
          "name": "tokenBucketRefill",
          "kind": "function",
          "signature": "tokenBucketRefill(tokens, options = {})",
          "summary": ""
        },
        {
          "name": "tokenBucketConsume",
          "kind": "function",
          "signature": "tokenBucketConsume(options = {})",
          "summary": ""
        },
        {
          "name": "singleRateThreeColorMarkerReport",
          "kind": "function",
          "signature": "singleRateThreeColorMarkerReport(options = {})",
          "summary": ""
        },
        {
          "name": "leakyBucketReport",
          "kind": "function",
          "signature": "leakyBucketReport(options = {})",
          "summary": ""
        },
        {
          "name": "queueBudgetReport",
          "kind": "function",
          "signature": "queueBudgetReport(options = {})",
          "summary": ""
        },
        {
          "name": "fairShareRateReport",
          "kind": "function",
          "signature": "fairShareRateReport(options = {})",
          "summary": ""
        },
        {
          "name": "rateRampReport",
          "kind": "function",
          "signature": "rateRampReport(options = {})",
          "summary": ""
        },
        {
          "name": "queueBackpressureReport",
          "kind": "function",
          "signature": "queueBackpressureReport(options = {})",
          "summary": ""
        },
        {
          "name": "QUEUE_DEFAULT_TARGET_DELAY_MS",
          "kind": "constant",
          "signature": "QUEUE_DEFAULT_TARGET_DELAY_MS",
          "summary": ""
        },
        {
          "name": "QUEUE_DEFAULT_INTERVAL_MS",
          "kind": "constant",
          "signature": "QUEUE_DEFAULT_INTERVAL_MS",
          "summary": ""
        },
        {
          "name": "QUEUE_BACKPRESSURE_LOW",
          "kind": "constant",
          "signature": "QUEUE_BACKPRESSURE_LOW",
          "summary": ""
        },
        {
          "name": "QUEUE_BACKPRESSURE_MEDIUM",
          "kind": "constant",
          "signature": "QUEUE_BACKPRESSURE_MEDIUM",
          "summary": ""
        },
        {
          "name": "QUEUE_BACKPRESSURE_HIGH",
          "kind": "constant",
          "signature": "QUEUE_BACKPRESSURE_HIGH",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/RadioMath",
      "path": "engine/reference/core/math/RadioMath.md",
      "source": "engine/core/math/RadioMath.js",
      "import": "/engine/core/math/RadioMath.js",
      "sourceHash": "b04f416b9ee8c059d53d10a229d0f63fa7f50ffabc40411c32b8795d225af0a2",
      "summary": "RadioMath.js - reusable RF power, noise, path-loss, channel, and link-budget helpers.",
      "exports": [
        {
          "name": "linearToDecibels",
          "kind": "function",
          "signature": "linearToDecibels(ratio)",
          "summary": ""
        },
        {
          "name": "decibelsToLinear",
          "kind": "function",
          "signature": "decibelsToLinear(decibels)",
          "summary": ""
        },
        {
          "name": "milliwattsToDbm",
          "kind": "function",
          "signature": "milliwattsToDbm(milliwatts)",
          "summary": ""
        },
        {
          "name": "dbmToMilliwatts",
          "kind": "function",
          "signature": "dbmToMilliwatts(dbm)",
          "summary": ""
        },
        {
          "name": "wattsToDbm",
          "kind": "function",
          "signature": "wattsToDbm(watts)",
          "summary": ""
        },
        {
          "name": "dbmToWatts",
          "kind": "function",
          "signature": "dbmToWatts(dbm)",
          "summary": ""
        },
        {
          "name": "dbmToDbw",
          "kind": "function",
          "signature": "dbmToDbw(dbm)",
          "summary": ""
        },
        {
          "name": "dbwToDbm",
          "kind": "function",
          "signature": "dbwToDbm(dbw)",
          "summary": ""
        },
        {
          "name": "snrDb",
          "kind": "function",
          "signature": "snrDb(signalDbm, noiseDbm)",
          "summary": ""
        },
        {
          "name": "snrLinear",
          "kind": "function",
          "signature": "snrLinear(signalWatts, noiseWatts)",
          "summary": ""
        },
        {
          "name": "thermalNoiseFloorDbm",
          "kind": "function",
          "signature": "thermalNoiseFloorDbm(bandwidthHz, options = {})",
          "summary": ""
        },
        {
          "name": "receiverSensitivityDbm",
          "kind": "function",
          "signature": "receiverSensitivityDbm(options = {})",
          "summary": ""
        },
        {
          "name": "freeSpacePathLossDb",
          "kind": "function",
          "signature": "freeSpacePathLossDb(options = {})",
          "summary": ""
        },
        {
          "name": "logDistancePathLossDb",
          "kind": "function",
          "signature": "logDistancePathLossDb(options = {})",
          "summary": ""
        },
        {
          "name": "receivedPowerDbm",
          "kind": "function",
          "signature": "receivedPowerDbm(options = {})",
          "summary": ""
        },
        {
          "name": "linkBudgetReport",
          "kind": "function",
          "signature": "linkBudgetReport(options = {})",
          "summary": ""
        },
        {
          "name": "channelCapacityBps",
          "kind": "function",
          "signature": "channelCapacityBps(bandwidthHz, options = {})",
          "summary": ""
        },
        {
          "name": "requiredSnrForCapacityDb",
          "kind": "function",
          "signature": "requiredSnrForCapacityDb(capacityBps, bandwidthHz)",
          "summary": ""
        },
        {
          "name": "rssiQualityScore",
          "kind": "function",
          "signature": "rssiQualityScore(rssiDbm, options = {})",
          "summary": ""
        },
        {
          "name": "snrQualityScore",
          "kind": "function",
          "signature": "snrQualityScore(snrValueDb, options = {})",
          "summary": ""
        },
        {
          "name": "channelOverlapReport",
          "kind": "function",
          "signature": "channelOverlapReport(aCenterHz, aBandwidthHz, bCenterHz, bBandwidthHz)",
          "summary": ""
        },
        {
          "name": "interferencePowerDbm",
          "kind": "function",
          "signature": "interferencePowerDbm(powersDbm = [])",
          "summary": ""
        },
        {
          "name": "signalInterferenceNoiseRatioDb",
          "kind": "function",
          "signature": "signalInterferenceNoiseRatioDb(signalDbm, noiseDbm, interferenceDbm = -Infinity)",
          "summary": ""
        },
        {
          "name": "interferenceScore",
          "kind": "function",
          "signature": "interferenceScore(interferenceDbm, signalDbm, options = {})",
          "summary": ""
        },
        {
          "name": "radioLinkQualityReport",
          "kind": "function",
          "signature": "radioLinkQualityReport(options = {})",
          "summary": ""
        },
        {
          "name": "RADIO_SPEED_OF_LIGHT_MPS",
          "kind": "constant",
          "signature": "RADIO_SPEED_OF_LIGHT_MPS",
          "summary": ""
        },
        {
          "name": "RADIO_BOLTZMANN_J_PER_K",
          "kind": "constant",
          "signature": "RADIO_BOLTZMANN_J_PER_K",
          "summary": ""
        },
        {
          "name": "RADIO_REFERENCE_TEMPERATURE_K",
          "kind": "constant",
          "signature": "RADIO_REFERENCE_TEMPERATURE_K",
          "summary": ""
        },
        {
          "name": "RADIO_REFERENCE_NOISE_FLOOR_DBM_PER_HZ",
          "kind": "constant",
          "signature": "RADIO_REFERENCE_NOISE_FLOOR_DBM_PER_HZ",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/RobustNumericMath",
      "path": "engine/reference/core/math/RobustNumericMath.md",
      "source": "engine/core/math/RobustNumericMath.js",
      "import": "/engine/core/math/RobustNumericMath.js",
      "sourceHash": "b25f3b3e254f3bd6ce447930f2af90e2b128f22604286b9e145da719a17575db",
      "summary": "RobustNumericMath.js - floating-point policy, stable sums, cancellation, and filtered predicates.",
      "exports": [
        {
          "name": "float64Bits",
          "kind": "function",
          "signature": "float64Bits(value)",
          "summary": ""
        },
        {
          "name": "float64FromBits",
          "kind": "function",
          "signature": "float64FromBits(bits)",
          "summary": ""
        },
        {
          "name": "float64Classify",
          "kind": "function",
          "signature": "float64Classify(value)",
          "summary": ""
        },
        {
          "name": "float64NextAfter",
          "kind": "function",
          "signature": "float64NextAfter(value, direction)",
          "summary": ""
        },
        {
          "name": "float64Ulp",
          "kind": "function",
          "signature": "float64Ulp(value)",
          "summary": ""
        },
        {
          "name": "float64UlpDistance",
          "kind": "function",
          "signature": "float64UlpDistance(left, right)",
          "summary": ""
        },
        {
          "name": "compensatedSum",
          "kind": "function",
          "signature": "compensatedSum(values)",
          "summary": ""
        },
        {
          "name": "pairwiseSum",
          "kind": "function",
          "signature": "pairwiseSum(values)",
          "summary": ""
        },
        {
          "name": "stableSumReport",
          "kind": "function",
          "signature": "stableSumReport(values)",
          "summary": ""
        },
        {
          "name": "cancellationReport",
          "kind": "function",
          "signature": "cancellationReport(left, right, operation = 'subtract')",
          "summary": ""
        },
        {
          "name": "orientation2DReport",
          "kind": "function",
          "signature": "orientation2DReport(a, b, c, options = {})",
          "summary": ""
        },
        {
          "name": "robustNumericPolicyReport",
          "kind": "function",
          "signature": "robustNumericPolicyReport(values)",
          "summary": ""
        },
        {
          "name": "FLOAT64_SIGNIFICAND_BITS",
          "kind": "constant",
          "signature": "FLOAT64_SIGNIFICAND_BITS",
          "summary": ""
        },
        {
          "name": "FLOAT64_MIN_NORMAL",
          "kind": "constant",
          "signature": "FLOAT64_MIN_NORMAL",
          "summary": ""
        },
        {
          "name": "FLOAT64_MAX_FINITE",
          "kind": "constant",
          "signature": "FLOAT64_MAX_FINITE",
          "summary": ""
        },
        {
          "name": "FLOAT64_EPSILON",
          "kind": "constant",
          "signature": "FLOAT64_EPSILON",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/SIMDLayoutMath",
      "path": "engine/reference/core/math/SIMDLayoutMath.md",
      "source": "engine/core/math/SIMDLayoutMath.js",
      "import": "/engine/core/math/SIMDLayoutMath.js",
      "sourceHash": "dd17f177bbe507effe90177dc4e005d91ba4ee8b767351fa3b2cf48229878e8e",
      "summary": "SIMDLayoutMath.js - WebAssembly-style v128 lane metadata and SoA/AoS layout helpers.",
      "exports": [
        {
          "name": "simdLaneShape",
          "kind": "function",
          "signature": "simdLaneShape(shape = 'f32x4')",
          "summary": ""
        },
        {
          "name": "simdVectorByteSize",
          "kind": "function",
          "signature": "simdVectorByteSize(shape = 'f32x4')",
          "summary": ""
        },
        {
          "name": "simdLaneByteOffset",
          "kind": "function",
          "signature": "simdLaneByteOffset(shape = 'f32x4', vectorIndex = 0, laneIndex = 0, baseOffset = 0)",
          "summary": ""
        },
        {
          "name": "simdVectorAlignmentReport",
          "kind": "function",
          "signature": "simdVectorAlignmentReport(shape = 'f32x4', byteOffset = 0, options = {})",
          "summary": ""
        },
        {
          "name": "simdChunkPlan",
          "kind": "function",
          "signature": "simdChunkPlan(elementCount, shape = 'f32x4')",
          "summary": ""
        },
        {
          "name": "simdLaneMask",
          "kind": "function",
          "signature": "simdLaneMask(shape = 'f32x4', enabledLanes = 'all')",
          "summary": ""
        },
        {
          "name": "simdTailLaneMask",
          "kind": "function",
          "signature": "simdTailLaneMask(elementCount, shape = 'f32x4')",
          "summary": ""
        },
        {
          "name": "simdSoALayoutReport",
          "kind": "function",
          "signature": "simdSoALayoutReport(componentCount, elementCount, options = {})",
          "summary": ""
        },
        {
          "name": "simdAoSToSoA",
          "kind": "function",
          "signature": "simdAoSToSoA(vectors, options = {})",
          "summary": ""
        },
        {
          "name": "simdSoAToAoS",
          "kind": "function",
          "signature": "simdSoAToAoS(soa, options = {})",
          "summary": ""
        },
        {
          "name": "simdScalarFallbackReport",
          "kind": "function",
          "signature": "simdScalarFallbackReport(elementCount, shape = 'f32x4', options = {})",
          "summary": ""
        },
        {
          "name": "SIMD_V128_BIT_SIZE",
          "kind": "constant",
          "signature": "SIMD_V128_BIT_SIZE",
          "summary": ""
        },
        {
          "name": "SIMD_V128_BYTE_SIZE",
          "kind": "constant",
          "signature": "SIMD_V128_BYTE_SIZE",
          "summary": ""
        },
        {
          "name": "SIMD_V128_ALIGNMENT",
          "kind": "constant",
          "signature": "SIMD_V128_ALIGNMENT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/SamplingMath",
      "path": "engine/reference/core/math/SamplingMath.md",
      "source": "engine/core/math/SamplingMath.js",
      "import": "/engine/core/math/SamplingMath.js",
      "sourceHash": "f454b936655f6a88ef3cfca4199f44bc03c977a66bc3e789b7f2739d2749d328",
      "summary": "SamplingMath.js - pure sample-grid, time-window, and sample-rate report helpers.",
      "exports": [
        {
          "name": "sampleRateReport",
          "kind": "function",
          "signature": "sampleRateReport(sampleRate = DEFAULT_SAMPLE_RATE)",
          "summary": ""
        },
        {
          "name": "sampleIndexForTime",
          "kind": "function",
          "signature": "sampleIndexForTime(seconds, sampleRate = DEFAULT_SAMPLE_RATE, options = {})",
          "summary": ""
        },
        {
          "name": "sampleTimeForIndex",
          "kind": "function",
          "signature": "sampleTimeForIndex(index, sampleRate = DEFAULT_SAMPLE_RATE, options = {})",
          "summary": ""
        },
        {
          "name": "sampleWindowReport",
          "kind": "function",
          "signature": "sampleWindowReport(options = {})",
          "summary": ""
        },
        {
          "name": "sampleFrameWindowReport",
          "kind": "function",
          "signature": "sampleFrameWindowReport(sampleCount, windowSize, hopSize, options = {})",
          "summary": ""
        },
        {
          "name": "sampleRateConversionReport",
          "kind": "function",
          "signature": "sampleRateConversionReport(sampleCount, sourceSampleRate, targetSampleRate)",
          "summary": ""
        },
        {
          "name": "samplePlaybackRateReport",
          "kind": "function",
          "signature": "samplePlaybackRateReport(bufferSampleRate, contextSampleRate, playbackRate = 1, options = {})",
          "summary": ""
        },
        {
          "name": "spatialBilinearSampleReport",
          "kind": "function",
          "signature": "spatialBilinearSampleReport(grid, width, height, x, y, options = {})",
          "summary": ""
        },
        {
          "name": "spatialTrilinearSampleReport",
          "kind": "function",
          "signature": "spatialTrilinearSampleReport(grid, width, height, depth, x, y, z, options = {})",
          "summary": ""
        },
        {
          "name": "catmullRomSample",
          "kind": "function",
          "signature": "catmullRomSample(p0, p1, p2, p3, t)",
          "summary": ""
        },
        {
          "name": "catmullRomSampleReport",
          "kind": "function",
          "signature": "catmullRomSampleReport(samples, x, options = {})",
          "summary": ""
        },
        {
          "name": "spatialBicubicSampleReport",
          "kind": "function",
          "signature": "spatialBicubicSampleReport(grid, width, height, x, y, options = {})",
          "summary": ""
        },
        {
          "name": "spatialAreaSampleReport",
          "kind": "function",
          "signature": "spatialAreaSampleReport(grid, width, height, area = {}, options = {})",
          "summary": ""
        },
        {
          "name": "stratifiedSampleGridReport",
          "kind": "function",
          "signature": "stratifiedSampleGridReport(columns, rows, options = {})",
          "summary": ""
        },
        {
          "name": "weightedSampleDistributionReport",
          "kind": "function",
          "signature": "weightedSampleDistributionReport(weights, options = {})",
          "summary": ""
        },
        {
          "name": "discreteImportanceSampleReport",
          "kind": "function",
          "signature": "discreteImportanceSampleReport(weights, u, options = {})",
          "summary": ""
        },
        {
          "name": "blueNoiseSampleSetReport",
          "kind": "function",
          "signature": "blueNoiseSampleSetReport(points, options = {})",
          "summary": ""
        },
        {
          "name": "sobol2DSample",
          "kind": "function",
          "signature": "sobol2DSample(index)",
          "summary": ""
        },
        {
          "name": "lowDiscrepancySequenceReport",
          "kind": "function",
          "signature": "lowDiscrepancySequenceReport(count, options = {})",
          "summary": ""
        },
        {
          "name": "multiJitteredSampleGridReport",
          "kind": "function",
          "signature": "multiJitteredSampleGridReport(size, options = {})",
          "summary": ""
        },
        {
          "name": "sampleSetUniformityReport",
          "kind": "function",
          "signature": "sampleSetUniformityReport(points, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/SceneQueryMath",
      "path": "engine/reference/core/math/SceneQueryMath.md",
      "source": "engine/core/math/SceneQueryMath.js",
      "import": "/engine/core/math/SceneQueryMath.js",
      "sourceHash": "6d64bbd24fb70a6eee2e7ff3e8be61466a054782a1b968887d6c0c40eb7a3b63",
      "summary": "SceneQueryMath.js - pure ray/overlap/sweep query reports for engine callers.",
      "exports": [
        {
          "name": "sceneQueryHitReport",
          "kind": "function",
          "signature": "sceneQueryHitReport(hit, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQueryHitListReport",
          "kind": "function",
          "signature": "sceneQueryHitListReport(hits, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQueryFilterReport",
          "kind": "function",
          "signature": "sceneQueryFilterReport(query = {}, target = {}, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQuerySweptAabbReport",
          "kind": "function",
          "signature": "sceneQuerySweptAabbReport(movingMin, movingMax, staticMin, staticMax, delta, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQueryAabbOverlapReport",
          "kind": "function",
          "signature": "sceneQueryAabbOverlapReport(aMin, aMax, bMin, bMax, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQuerySpherePenetrationReport",
          "kind": "function",
          "signature": "sceneQuerySpherePenetrationReport(centerA, radiusA, centerB, radiusB, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQueryContactNormalReport",
          "kind": "function",
          "signature": "sceneQueryContactNormalReport(normal, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQueryConvexRadiusReport",
          "kind": "function",
          "signature": "sceneQueryConvexRadiusReport(radius, options = {})",
          "summary": ""
        },
        {
          "name": "sceneQueryBroadphasePairScore",
          "kind": "function",
          "signature": "sceneQueryBroadphasePairScore(aMin, aMax, bMin, bMax, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/SignalQualityMath",
      "path": "engine/reference/core/math/SignalQualityMath.md",
      "source": "engine/core/math/SignalQualityMath.js",
      "import": "/engine/core/math/SignalQualityMath.js",
      "sourceHash": "67078c6a522c41c4a34afa8e0fe90123b8708f3484dd0c05d5ace9040d1a4347",
      "summary": "SignalQualityMath.js - reusable signal/link health scoring for radio and WebRTC diagnostics.",
      "exports": [
        {
          "name": "signalLevelQualityScore",
          "kind": "function",
          "signature": "signalLevelQualityScore(valueDb, options = {})",
          "summary": ""
        },
        {
          "name": "signalDeliveryQualityScore",
          "kind": "function",
          "signature": "signalDeliveryQualityScore(options = {})",
          "summary": ""
        },
        {
          "name": "signalLatencyQualityScore",
          "kind": "function",
          "signature": "signalLatencyQualityScore(rttMs, options = {})",
          "summary": ""
        },
        {
          "name": "signalJitterQualityScore",
          "kind": "function",
          "signature": "signalJitterQualityScore(jitterMs, options = {})",
          "summary": ""
        },
        {
          "name": "signalBitrateQualityScore",
          "kind": "function",
          "signature": "signalBitrateQualityScore(bitrateBps, options = {})",
          "summary": ""
        },
        {
          "name": "signalQualityReport",
          "kind": "function",
          "signature": "signalQualityReport(options = {})",
          "summary": ""
        },
        {
          "name": "webrtcStatsSignalReport",
          "kind": "function",
          "signature": "webrtcStatsSignalReport(stats, options = {})",
          "summary": ""
        },
        {
          "name": "signalQualityTrendReport",
          "kind": "function",
          "signature": "signalQualityTrendReport(samples = [], options = {})",
          "summary": ""
        },
        {
          "name": "SIGNAL_QUALITY_DEFAULT_WEIGHTS",
          "kind": "constant",
          "signature": "SIGNAL_QUALITY_DEFAULT_WEIGHTS",
          "summary": ""
        },
        {
          "name": "SIGNAL_QUALITY_DEFAULT_MAX_LOSS_RATIO",
          "kind": "constant",
          "signature": "SIGNAL_QUALITY_DEFAULT_MAX_LOSS_RATIO",
          "summary": ""
        },
        {
          "name": "SIGNAL_QUALITY_DEFAULT_TARGET_RTT_MS",
          "kind": "constant",
          "signature": "SIGNAL_QUALITY_DEFAULT_TARGET_RTT_MS",
          "summary": ""
        },
        {
          "name": "SIGNAL_QUALITY_DEFAULT_MAX_RTT_MS",
          "kind": "constant",
          "signature": "SIGNAL_QUALITY_DEFAULT_MAX_RTT_MS",
          "summary": ""
        },
        {
          "name": "SIGNAL_QUALITY_DEFAULT_TARGET_JITTER_MS",
          "kind": "constant",
          "signature": "SIGNAL_QUALITY_DEFAULT_TARGET_JITTER_MS",
          "summary": ""
        },
        {
          "name": "SIGNAL_QUALITY_DEFAULT_MAX_JITTER_MS",
          "kind": "constant",
          "signature": "SIGNAL_QUALITY_DEFAULT_MAX_JITTER_MS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/SpatialHash",
      "path": "engine/reference/core/math/SpatialHash.md",
      "source": "engine/core/math/SpatialHash.js",
      "import": "/engine/core/math/SpatialHash.js",
      "sourceHash": "d43a46a0d6e893a726d6311db81f0fe0db85756ff1acb033aed558d395c881b2",
      "summary": "SpatialHash.js - Fast spatial queries for particles and entities Uses a grid-based hash for O(1) average-case neighbor queries.",
      "exports": [
        {
          "name": "SpatialHash",
          "kind": "class",
          "signature": "class SpatialHash",
          "summary": "SpatialHash.js - Fast spatial queries for particles and entities Uses a grid-based hash for O(1) average-case neighbor queries."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/SpatialHashCompute",
      "path": "engine/reference/core/math/SpatialHashCompute.md",
      "source": "engine/core/math/SpatialHashCompute.js",
      "import": "/engine/core/math/SpatialHashCompute.js",
      "sourceHash": "be6c41e76886c0f9bb8788f6992ddab404612506e94e9cfb79978561f1001ad9",
      "summary": "",
      "exports": [
        {
          "name": "SpatialHashCompute",
          "kind": "class",
          "signature": "class SpatialHashCompute",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/TensorShapeMath",
      "path": "engine/reference/core/math/TensorShapeMath.md",
      "source": "engine/core/math/TensorShapeMath.js",
      "import": "/engine/core/math/TensorShapeMath.js",
      "sourceHash": "52ccff79dfcb9e8459595109ebdedc051f5bd7d6942805e86bde94b6ac141eda",
      "summary": "TensorShapeMath.js - reusable tensor shape, broadcast, stride, dtype, and graph memory reports.",
      "exports": [
        {
          "name": "normalizeTensorShape",
          "kind": "function",
          "signature": "normalizeTensorShape(shape, options = {})",
          "summary": ""
        },
        {
          "name": "tensorElementCount",
          "kind": "function",
          "signature": "tensorElementCount(shape, options = {})",
          "summary": ""
        },
        {
          "name": "tensorDTypeByteSize",
          "kind": "function",
          "signature": "tensorDTypeByteSize(dtype)",
          "summary": ""
        },
        {
          "name": "contiguousStrides",
          "kind": "function",
          "signature": "contiguousStrides(shape, options = {})",
          "summary": ""
        },
        {
          "name": "tensorIndexToOffset",
          "kind": "function",
          "signature": "tensorIndexToOffset(indices, strides, options = {})",
          "summary": ""
        },
        {
          "name": "tensorOffsetToIndices",
          "kind": "function",
          "signature": "tensorOffsetToIndices(offset, shape, options = {})",
          "summary": ""
        },
        {
          "name": "broadcastShapes",
          "kind": "function",
          "signature": "broadcastShapes(...inputShapes)",
          "summary": ""
        },
        {
          "name": "broadcastReport",
          "kind": "function",
          "signature": "broadcastReport(inputShapes)",
          "summary": ""
        },
        {
          "name": "unidirectionalBroadcastShape",
          "kind": "function",
          "signature": "unidirectionalBroadcastShape(shapeFrom, shapeTo)",
          "summary": ""
        },
        {
          "name": "blockwiseBroadcastReport",
          "kind": "function",
          "signature": "blockwiseBroadcastReport(shapeFrom, shapeTo)",
          "summary": ""
        },
        {
          "name": "reshapeReport",
          "kind": "function",
          "signature": "reshapeReport(inputShape, targetShape, options = {})",
          "summary": ""
        },
        {
          "name": "tensorLayoutReport",
          "kind": "function",
          "signature": "tensorLayoutReport(shape, options = {})",
          "summary": ""
        },
        {
          "name": "tensorBufferSizeReport",
          "kind": "function",
          "signature": "tensorBufferSizeReport(shape, dtype = 'float32', options = {})",
          "summary": ""
        },
        {
          "name": "reductionShape",
          "kind": "function",
          "signature": "reductionShape(shape, axes, options = {})",
          "summary": ""
        },
        {
          "name": "matmulShapeReport",
          "kind": "function",
          "signature": "matmulShapeReport(shapeA, shapeB)",
          "summary": ""
        },
        {
          "name": "elementwiseShapeReport",
          "kind": "function",
          "signature": "elementwiseShapeReport(inputShapes)",
          "summary": ""
        },
        {
          "name": "tensorGraphMemoryReport",
          "kind": "function",
          "signature": "tensorGraphMemoryReport(tensors, options = {})",
          "summary": ""
        },
        {
          "name": "TENSOR_DTYPE_BYTE_SIZE",
          "kind": "constant",
          "signature": "TENSOR_DTYPE_BYTE_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/TextMetricMath",
      "path": "engine/reference/core/math/TextMetricMath.md",
      "source": "engine/core/math/TextMetricMath.js",
      "import": "/engine/core/math/TextMetricMath.js",
      "sourceHash": "a2b80f4fd55cd689dad46e3a15eaaa409f3774a19dc6f85eff02f51ba5fba741",
      "summary": "TextMetricMath.js - grapheme, text-run, wrap, baseline, selection, and glyph-atlas reports.",
      "exports": [
        {
          "name": "textGraphemeSegments",
          "kind": "function",
          "signature": "textGraphemeSegments(text, options = {})",
          "summary": ""
        },
        {
          "name": "textGraphemeBoundaries",
          "kind": "function",
          "signature": "textGraphemeBoundaries(text, options = {})",
          "summary": ""
        },
        {
          "name": "textCursorAdvance",
          "kind": "function",
          "signature": "textCursorAdvance(text, offset = 0, direction = 1, options = {})",
          "summary": ""
        },
        {
          "name": "textRunMetricReport",
          "kind": "function",
          "signature": "textRunMetricReport(text, options = {})",
          "summary": ""
        },
        {
          "name": "textBidiRunReport",
          "kind": "function",
          "signature": "textBidiRunReport(text, options = {})",
          "summary": ""
        },
        {
          "name": "textLineBreakOpportunityReport",
          "kind": "function",
          "signature": "textLineBreakOpportunityReport(text, options = {})",
          "summary": ""
        },
        {
          "name": "textLineWrapReport",
          "kind": "function",
          "signature": "textLineWrapReport(text, maxWidth = Infinity, options = {})",
          "summary": ""
        },
        {
          "name": "textTruncateReport",
          "kind": "function",
          "signature": "textTruncateReport(text, maxWidth = Infinity, options = {})",
          "summary": ""
        },
        {
          "name": "textBaselineReport",
          "kind": "function",
          "signature": "textBaselineReport(metrics = {}, options = {})",
          "summary": ""
        },
        {
          "name": "textSelectionRects",
          "kind": "function",
          "signature": "textSelectionRects(wrapReport, start = 0, end = start, options = {})",
          "summary": ""
        },
        {
          "name": "glyphAtlasPlacementReport",
          "kind": "function",
          "signature": "glyphAtlasPlacementReport(glyphs = [], options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/TextureMath",
      "path": "engine/reference/core/math/TextureMath.md",
      "source": "engine/core/math/TextureMath.js",
      "import": "/engine/core/math/TextureMath.js",
      "sourceHash": "20dc9b3406e54f1e5fc6989e43c8e4b323a47b6e13d6f26951d4a69b69c2b49b",
      "summary": "TextureMath.js - shared UV, atlas, format, and mip pyramid helpers.",
      "exports": [
        {
          "name": "uvWrap",
          "kind": "function",
          "signature": "uvWrap(uv, min = [0, 0], max = [1, 1])",
          "summary": ""
        },
        {
          "name": "uvClamp",
          "kind": "function",
          "signature": "uvClamp(uv, min = [0, 0], max = [1, 1])",
          "summary": ""
        },
        {
          "name": "uvMirror",
          "kind": "function",
          "signature": "uvMirror(uv)",
          "summary": ""
        },
        {
          "name": "tileUV",
          "kind": "function",
          "signature": "tileUV(uv, scale = [1, 1], offset = [0, 0])",
          "summary": ""
        },
        {
          "name": "textureTransformUV",
          "kind": "function",
          "signature": "textureTransformUV(uv, transform = {})",
          "summary": ""
        },
        {
          "name": "atlasUVTransform",
          "kind": "function",
          "signature": "atlasUVTransform(x, y, width, height, atlasWidth, atlasHeight = atlasWidth)",
          "summary": ""
        },
        {
          "name": "textureMipExtent3D",
          "kind": "function",
          "signature": "textureMipExtent3D(width, height = width, depth = 1, mipLevel = 0)",
          "summary": ""
        },
        {
          "name": "atlasUV",
          "kind": "function",
          "signature": "atlasUV(uv, transform)",
          "summary": ""
        },
        {
          "name": "atlasPaddedExtent",
          "kind": "function",
          "signature": "atlasPaddedExtent(width, height = width, padding = 1)",
          "summary": ""
        },
        {
          "name": "atlasContentRect",
          "kind": "function",
          "signature": "atlasContentRect(x, y, width, height, padding = 1)",
          "summary": ""
        },
        {
          "name": "atlasPaddedRectFromContent",
          "kind": "function",
          "signature": "atlasPaddedRectFromContent(x, y, width, height, padding = 1)",
          "summary": ""
        },
        {
          "name": "atlasPaddedArea",
          "kind": "function",
          "signature": "atlasPaddedArea(width, height, padding = 1)",
          "summary": ""
        },
        {
          "name": "atlasRegionUVs",
          "kind": "function",
          "signature": "atlasRegionUVs(x, y, width, height, atlasWidth, atlasHeight = atlasWidth)",
          "summary": ""
        },
        {
          "name": "virtualTexturePageGrid",
          "kind": "function",
          "signature": "virtualTexturePageGrid(pageTableWidth = 2048, pageTableHeight = pageTableWidth)",
          "summary": ""
        },
        {
          "name": "virtualTexturePageId",
          "kind": "function",
          "signature": "virtualTexturePageId(pageX, pageY, pageTableWidth = 2048, pageTableHeight = pageTableWidth)",
          "summary": ""
        },
        {
          "name": "virtualTexturePageCoord",
          "kind": "function",
          "signature": "virtualTexturePageCoord(pageId, pageTableWidth = 2048, pageTableHeight = pageTableWidth)",
          "summary": ""
        },
        {
          "name": "virtualTexturePageCoordFromUV",
          "kind": "function",
          "signature": "virtualTexturePageCoordFromUV(uv, pageTableWidth = 2048, pageTableHeight = pageTableWidth)",
          "summary": ""
        },
        {
          "name": "virtualTexturePhysicalPageGrid",
          "kind": "function",
          "signature": "virtualTexturePhysicalPageGrid(cacheWidth = 4096, pageSize = 256, cacheHeight = cacheWidth)",
          "summary": ""
        },
        {
          "name": "virtualTexturePhysicalPageOrigin",
          "kind": "function",
          "signature": "virtualTexturePhysicalPageOrigin(slotIndex, cacheWidth = 4096, pageSize = 256, cacheHeight = cacheWidth)",
          "summary": ""
        },
        {
          "name": "virtualTexturePhysicalUV",
          "kind": "function",
          "signature": "virtualTexturePhysicalUV(uv, physicalPage, { pageTableWidth = 2048, pageTableHeight = pageTableWidth, pageSize = 256, cacheWidth = 4096, cacheHeight = cacheWidth, } = {})",
          "summary": ""
        },
        {
          "name": "virtualTexturePageTableEntry",
          "kind": "function",
          "signature": "virtualTexturePageTableEntry(pageId, physicalLocation, { pageTableWidth = 2048, pageTableHeight = pageTableWidth, pageSize = 256, resident = 1, reserved = 0, } = {})",
          "summary": ""
        },
        {
          "name": "virtualTextureFeedbackBufferLayout",
          "kind": "function",
          "signature": "virtualTextureFeedbackBufferLayout(pageTableWidth = 2048, pageTableHeight = pageTableWidth, bytesPerFlag = 4)",
          "summary": ""
        },
        {
          "name": "virtualTextureFeedbackBufferByteSize",
          "kind": "function",
          "signature": "virtualTextureFeedbackBufferByteSize(pageTableWidth = 2048, pageTableHeight = pageTableWidth, bytesPerFlag = 4)",
          "summary": ""
        },
        {
          "name": "virtualTextureFeedbackIndex",
          "kind": "function",
          "signature": "virtualTextureFeedbackIndex(pageId, pageTableWidth = 2048, pageTableHeight = pageTableWidth)",
          "summary": ""
        },
        {
          "name": "compactVirtualTextureFeedback",
          "kind": "function",
          "signature": "compactVirtualTextureFeedback(feedbackData, { pageTableWidth = 2048, pageTableHeight = pageTableWidth, maxRequests = Infinity, residentPages = null, } = {})",
          "summary": ""
        },
        {
          "name": "pixelToUV",
          "kind": "function",
          "signature": "pixelToUV(pixel, textureSize, centered = false)",
          "summary": ""
        },
        {
          "name": "uvToPixel",
          "kind": "function",
          "signature": "uvToPixel(uv, textureSize, centered = false)",
          "summary": ""
        },
        {
          "name": "triplanarWeights",
          "kind": "function",
          "signature": "triplanarWeights(normal, sharpness = 1)",
          "summary": ""
        },
        {
          "name": "textureMipLevelCount",
          "kind": "function",
          "signature": "textureMipLevelCount(width, height = width, depth = 1, maxMipLevels = Infinity)",
          "summary": ""
        },
        {
          "name": "textureMipExtent",
          "kind": "function",
          "signature": "textureMipExtent(width, height, mipLevel = 0)",
          "summary": ""
        },
        {
          "name": "textureMipByteSize",
          "kind": "function",
          "signature": "textureMipByteSize(width, height, bytesPerPixel = 4, mipLevels = 1, depthOrArrayLayers = 1)",
          "summary": ""
        },
        {
          "name": "textureFormatBlockInfo",
          "kind": "function",
          "signature": "textureFormatBlockInfo(format = 'rgba8unorm', fallbackBytesPerPixel = 4)",
          "summary": ""
        },
        {
          "name": "textureFormatFamily",
          "kind": "function",
          "signature": "textureFormatFamily(format = 'rgba8unorm')",
          "summary": ""
        },
        {
          "name": "textureFormatFeature",
          "kind": "function",
          "signature": "textureFormatFeature(format = 'rgba8unorm')",
          "summary": ""
        },
        {
          "name": "textureFormatAlphaMode",
          "kind": "function",
          "signature": "textureFormatAlphaMode(format = 'rgba8unorm')",
          "summary": ""
        },
        {
          "name": "textureFormatIsSupported",
          "kind": "function",
          "signature": "textureFormatIsSupported(format = 'rgba8unorm', features = null)",
          "summary": ""
        },
        {
          "name": "textureDefaultTranscodeTargets",
          "kind": "function",
          "signature": "textureDefaultTranscodeTargets({ needsAlpha = true, preferSrgb = false } = {})",
          "summary": ""
        },
        {
          "name": "textureBytesPerPixel",
          "kind": "function",
          "signature": "textureBytesPerPixel(format = 'rgba8unorm', fallbackBytesPerPixel = 4)",
          "summary": ""
        },
        {
          "name": "textureFormatBitsPerPixel",
          "kind": "function",
          "signature": "textureFormatBitsPerPixel(format = 'rgba8unorm', fallbackBytesPerPixel = 4)",
          "summary": ""
        },
        {
          "name": "textureMipBlockExtent",
          "kind": "function",
          "signature": "textureMipBlockExtent(width, height, format = 'rgba8unorm', mipLevel = 0)",
          "summary": ""
        },
        {
          "name": "textureMipBlockExtent3D",
          "kind": "function",
          "signature": "textureMipBlockExtent3D(width, height, depth = 1, format = 'rgba8unorm', mipLevel = 0)",
          "summary": ""
        },
        {
          "name": "textureFormatMipByteSize",
          "kind": "function",
          "signature": "textureFormatMipByteSize(width, height, format = 'rgba8unorm', mipLevels = 1, depthOrArrayLayers = 1)",
          "summary": ""
        },
        {
          "name": "textureDescriptorByteSize",
          "kind": "function",
          "signature": "textureDescriptorByteSize(descriptor = {})",
          "summary": ""
        },
        {
          "name": "textureContainerLevelByteSize",
          "kind": "function",
          "signature": "textureContainerLevelByteSize({ width, height = width, depth = 1, format = 'rgba8unorm', mipLevel = 0, layerCount = 1, faceCount = 1, } = {})",
          "summary": ""
        },
        {
          "name": "textureKtxLevelAlignment",
          "kind": "function",
          "signature": "textureKtxLevelAlignment(format = 'rgba8unorm', supercompressionScheme = 0)",
          "summary": ""
        },
        {
          "name": "alignByteOffset",
          "kind": "function",
          "signature": "alignByteOffset(byteOffset, alignment = 1)",
          "summary": ""
        },
        {
          "name": "textureKtxMipPadding",
          "kind": "function",
          "signature": "textureKtxMipPadding(byteOffset, format = 'rgba8unorm', supercompressionScheme = 0)",
          "summary": ""
        },
        {
          "name": "textureKtxSupercompressionSchemeInfo",
          "kind": "function",
          "signature": "textureKtxSupercompressionSchemeInfo(supercompressionScheme = 0)",
          "summary": ""
        },
        {
          "name": "textureKtxSupercompressionLevelReport",
          "kind": "function",
          "signature": "textureKtxSupercompressionLevelReport({ byteLength = 0, uncompressedByteLength = byteLength, supercompressionScheme = 0, expectedUncompressedByteLength = null, faceCount = 1, layerCount = 1, } = {})",
          "summary": ""
        },
        {
          "name": "textureKtxSupercompressionGlobalDataRange",
          "kind": "function",
          "signature": "textureKtxSupercompressionGlobalDataRange({ byteOffset = 0, byteLength = 0, precedingByteEnd = 0, supercompressionScheme = 0, } = {})",
          "summary": ""
        },
        {
          "name": "textureKtxSupercompressionPolicy",
          "kind": "function",
          "signature": "textureKtxSupercompressionPolicy({ supercompressionScheme = 0, levels = [], expectedUncompressedByteLengths = null, sgdByteOffset = 0, sgdByteLength = 0, precedingByteEnd = 0, faceCount = 1, layerCount = 1, } = {})",
          "summary": ""
        },
        {
          "name": "textureContainerImageLayout",
          "kind": "function",
          "signature": "textureContainerImageLayout({ width, height = width, depth = 1, format = 'rgba8unorm', mipLevel = 0, layerCount = 1, faceCount = 1, } = {})",
          "summary": ""
        },
        {
          "name": "textureContainerImageByteOffset",
          "kind": "function",
          "signature": "textureContainerImageByteOffset(layout, layer = 0, face = 0, zSlice = 0)",
          "summary": ""
        },
        {
          "name": "textureWebGpuUploadLayout",
          "kind": "function",
          "signature": "textureWebGpuUploadLayout({ width, height = width, depthOrArrayLayers = 1, format = 'rgba8unorm', mipLevel = 0, offset = 0, bytesPerRowAlignment = 1, copyBufferToTexture = false, } = {})",
          "summary": ""
        },
        {
          "name": "textureKtxLevelLayout",
          "kind": "function",
          "signature": "textureKtxLevelLayout({ width, height = width, depth = 1, format = 'rgba8unorm', levelCount = textureMipLevelCount(width, height, depth)",
          "summary": ""
        },
        {
          "name": "textureMemorySavingsRatio",
          "kind": "function",
          "signature": "textureMemorySavingsRatio(width, height, compressedFormat, referenceFormat = 'rgba8unorm', mipLevels = 1)",
          "summary": ""
        },
        {
          "name": "textureQualitySizeScore",
          "kind": "function",
          "signature": "textureQualitySizeScore({ width, height = width, format = 'rgba8unorm', referenceFormat = 'rgba8unorm', mipLevels = 1, depthOrArrayLayers = 1, quality = 1, byteBudget = Infinity, budgetBytes = byteBudget, qualityWeight = 0.7, sizeWeight = 0.3, budgetWeight, } = {})",
          "summary": ""
        },
        {
          "name": "textureTranscodeTargetScore",
          "kind": "function",
          "signature": "textureTranscodeTargetScore(target, { width, height = width, referenceFormat = 'rgba8unorm', mipLevels = 1, depthOrArrayLayers = 1, supportedFeatures = null, needsAlpha = true, allowPunchthroughAlpha = false, preferSrgb = false, byteBudget = Infinity, qualityWeight = 0.7, sizeWeight = 0.3, budgetWeight, } = {})",
          "summary": ""
        },
        {
          "name": "textureRankTranscodeTargets",
          "kind": "function",
          "signature": "textureRankTranscodeTargets({ candidates = null, needsAlpha = true, preferSrgb = false, ...options } = {})",
          "summary": ""
        },
        {
          "name": "textureSelectTranscodeTarget",
          "kind": "function",
          "signature": "textureSelectTranscodeTarget(options = {})",
          "summary": ""
        },
        {
          "name": "textureStreamingPriorityScore",
          "kind": "function",
          "signature": "textureStreamingPriorityScore({ priority = 0, distance = Infinity, lastUsedFrame = 0, frameIndex = 0, distanceScale = 0.01, recencyScale = 0.1, distanceWeight = 10, recencyWeight = 5, } = {})",
          "summary": ""
        },
        {
          "name": "mipLevelFromPixelSize",
          "kind": "function",
          "signature": "mipLevelFromPixelSize(pixelSize, maxMipLevel = Infinity)",
          "summary": ""
        },
        {
          "name": "textureFade",
          "kind": "function",
          "signature": "textureFade(distance, fadeStart, fadeEnd)",
          "summary": ""
        },
        {
          "name": "TEXTURE_FORMAT_BLOCKS",
          "kind": "constant",
          "signature": "TEXTURE_FORMAT_BLOCKS",
          "summary": ""
        },
        {
          "name": "TEXTURE_TRANSCODE_TARGETS",
          "kind": "constant",
          "signature": "TEXTURE_TRANSCODE_TARGETS",
          "summary": ""
        },
        {
          "name": "KTX_SUPERCOMPRESSION_SCHEMES",
          "kind": "constant",
          "signature": "KTX_SUPERCOMPRESSION_SCHEMES",
          "summary": ""
        },
        {
          "name": "WEBGPU_COPY_BYTES_PER_ROW_ALIGNMENT",
          "kind": "constant",
          "signature": "WEBGPU_COPY_BYTES_PER_ROW_ALIGNMENT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/UILayoutMath",
      "path": "engine/reference/core/math/UILayoutMath.md",
      "source": "engine/core/math/UILayoutMath.js",
      "import": "/engine/core/math/UILayoutMath.js",
      "sourceHash": "f1030128260446b3231aec2842263de2f39c4d416662281e2829d00b7cf5a50a",
      "summary": "UILayoutMath.js - pure CSS/UI length, constraint, and responsive layout reports.",
      "exports": [
        {
          "name": "uiCssUnitMetadata",
          "kind": "function",
          "signature": "uiCssUnitMetadata(unit, context = {})",
          "summary": ""
        },
        {
          "name": "uiCssMathFunctionReport",
          "kind": "function",
          "signature": "uiCssMathFunctionReport(value, context = {})",
          "summary": ""
        },
        {
          "name": "uiLayoutValueReport",
          "kind": "function",
          "signature": "uiLayoutValueReport(value, context = {})",
          "summary": ""
        },
        {
          "name": "uiPercentageBasisReport",
          "kind": "function",
          "signature": "uiPercentageBasisReport(value, basis, options = {})",
          "summary": ""
        },
        {
          "name": "uiViewportUnitReport",
          "kind": "function",
          "signature": "uiViewportUnitReport(value, viewport = {}, options = {})",
          "summary": ""
        },
        {
          "name": "uiSafeAreaInsetReport",
          "kind": "function",
          "signature": "uiSafeAreaInsetReport(insets = {}, options = {})",
          "summary": ""
        },
        {
          "name": "uiVisualViewportReport",
          "kind": "function",
          "signature": "uiVisualViewportReport(observed = {}, options = {})",
          "summary": ""
        },
        {
          "name": "uiLayoutClampReport",
          "kind": "function",
          "signature": "uiLayoutClampReport(value, minValue, maxValue, context = {})",
          "summary": ""
        },
        {
          "name": "uiBoxConstraintReport",
          "kind": "function",
          "signature": "uiBoxConstraintReport(style = {}, context = {})",
          "summary": ""
        },
        {
          "name": "uiFlexBasisReport",
          "kind": "function",
          "signature": "uiFlexBasisReport(style = {}, context = {})",
          "summary": ""
        },
        {
          "name": "uiFitContentReport",
          "kind": "function",
          "signature": "uiFitContentReport(options = {})",
          "summary": ""
        },
        {
          "name": "uiIntrinsicSizePolicyReport",
          "kind": "function",
          "signature": "uiIntrinsicSizePolicyReport(value = 'auto', options = {})",
          "summary": ""
        },
        {
          "name": "uiGridTrackSizingReport",
          "kind": "function",
          "signature": "uiGridTrackSizingReport(trackList = [], options = {})",
          "summary": ""
        },
        {
          "name": "uiResponsiveStepReport",
          "kind": "function",
          "signature": "uiResponsiveStepReport(value, steps = [], options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/UnionFind",
      "path": "engine/reference/core/math/UnionFind.md",
      "source": "engine/core/math/UnionFind.js",
      "import": "/engine/core/math/UnionFind.js",
      "sourceHash": "1a2b5e244ac84ee18555e6c12be39c8b3c0da70266870e7af3509bde17f96cc5",
      "summary": "Union-Find specialized for 3D voxel grids",
      "exports": [
        {
          "name": "UnionFind",
          "kind": "class",
          "signature": "class UnionFind",
          "summary": ""
        },
        {
          "name": "VoxelUnionFind",
          "kind": "class",
          "signature": "class VoxelUnionFind extends UnionFind",
          "summary": "Union-Find specialized for 3D voxel grids"
        },
        {
          "name": "HybridConnectivity",
          "kind": "class",
          "signature": "class HybridConnectivity",
          "summary": "Combines GPU flood-fill for initial/full recomputes with CPU Union-Find for incremental updates"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/UnitMath",
      "path": "engine/reference/core/math/UnitMath.md",
      "source": "engine/core/math/UnitMath.js",
      "import": "/engine/core/math/UnitMath.js",
      "sourceHash": "62ed3ffe556dd5b732b8118a48f0395f9d4c9c3cacb449b67eea0e22019f0043",
      "summary": "UnitMath.js - deterministic scalar unit conversion helpers.",
      "exports": [
        {
          "name": "angleToRadians",
          "kind": "function",
          "signature": "angleToRadians(value, unit = 'rad')",
          "summary": ""
        },
        {
          "name": "radiansToAngle",
          "kind": "function",
          "signature": "radiansToAngle(radians, unit = 'rad')",
          "summary": ""
        },
        {
          "name": "secondsToFrames",
          "kind": "function",
          "signature": "secondsToFrames(seconds, frameRate = DEFAULT_FRAME_RATE)",
          "summary": ""
        },
        {
          "name": "framesToSeconds",
          "kind": "function",
          "signature": "framesToSeconds(frames, frameRate = DEFAULT_FRAME_RATE)",
          "summary": ""
        },
        {
          "name": "millisecondsToFrames",
          "kind": "function",
          "signature": "millisecondsToFrames(milliseconds, frameRate = DEFAULT_FRAME_RATE)",
          "summary": ""
        },
        {
          "name": "framesToMilliseconds",
          "kind": "function",
          "signature": "framesToMilliseconds(frames, frameRate = DEFAULT_FRAME_RATE)",
          "summary": ""
        },
        {
          "name": "secondsToSamples",
          "kind": "function",
          "signature": "secondsToSamples(seconds, sampleRate = DEFAULT_SAMPLE_RATE)",
          "summary": ""
        },
        {
          "name": "samplesToSeconds",
          "kind": "function",
          "signature": "samplesToSeconds(samples, sampleRate = DEFAULT_SAMPLE_RATE)",
          "summary": ""
        },
        {
          "name": "sampleIndexAtTime",
          "kind": "function",
          "signature": "sampleIndexAtTime(seconds, sampleRate = DEFAULT_SAMPLE_RATE)",
          "summary": ""
        },
        {
          "name": "samplesToMilliseconds",
          "kind": "function",
          "signature": "samplesToMilliseconds(samples, sampleRate = DEFAULT_SAMPLE_RATE)",
          "summary": ""
        },
        {
          "name": "millisecondsToSamples",
          "kind": "function",
          "signature": "millisecondsToSamples(milliseconds, sampleRate = DEFAULT_SAMPLE_RATE)",
          "summary": ""
        },
        {
          "name": "bpmToSecondsPerBeat",
          "kind": "function",
          "signature": "bpmToSecondsPerBeat(bpm = DEFAULT_BPM)",
          "summary": ""
        },
        {
          "name": "secondsPerBeatToBpm",
          "kind": "function",
          "signature": "secondsPerBeatToBpm(secondsPerBeat)",
          "summary": ""
        },
        {
          "name": "beatsToSeconds",
          "kind": "function",
          "signature": "beatsToSeconds(beats, bpm = DEFAULT_BPM)",
          "summary": ""
        },
        {
          "name": "secondsToBeats",
          "kind": "function",
          "signature": "secondsToBeats(seconds, bpm = DEFAULT_BPM)",
          "summary": ""
        },
        {
          "name": "frequencyToPeriodSeconds",
          "kind": "function",
          "signature": "frequencyToPeriodSeconds(frequencyHz)",
          "summary": ""
        },
        {
          "name": "periodSecondsToFrequencyHz",
          "kind": "function",
          "signature": "periodSecondsToFrequencyHz(periodSeconds)",
          "summary": ""
        },
        {
          "name": "frequencyToWavelengthMeters",
          "kind": "function",
          "signature": "frequencyToWavelengthMeters(frequencyHz, waveSpeed = SPEED_OF_LIGHT)",
          "summary": ""
        },
        {
          "name": "wavelengthMetersToFrequencyHz",
          "kind": "function",
          "signature": "wavelengthMetersToFrequencyHz(wavelengthMeters, waveSpeed = SPEED_OF_LIGHT)",
          "summary": ""
        },
        {
          "name": "gainToDb",
          "kind": "function",
          "signature": "gainToDb(gain, floorDb = -Infinity)",
          "summary": ""
        },
        {
          "name": "powerRatioToDb",
          "kind": "function",
          "signature": "powerRatioToDb(powerRatio, floorDb = -Infinity)",
          "summary": ""
        },
        {
          "name": "frequencyRatioToCents",
          "kind": "function",
          "signature": "frequencyRatioToCents(ratio, floorCents = -Infinity)",
          "summary": ""
        },
        {
          "name": "cssPixelsToDevicePixels",
          "kind": "function",
          "signature": "cssPixelsToDevicePixels(cssPixels, devicePixelRatio = 1)",
          "summary": ""
        },
        {
          "name": "devicePixelsToCssPixels",
          "kind": "function",
          "signature": "devicePixelsToCssPixels(devicePixels, devicePixelRatio = 1)",
          "summary": ""
        },
        {
          "name": "worldUnitsToGridIndex",
          "kind": "function",
          "signature": "worldUnitsToGridIndex(worldValue, cellSize = 1, origin = 0)",
          "summary": ""
        },
        {
          "name": "gridIndexToWorldUnits",
          "kind": "function",
          "signature": "gridIndexToWorldUnits(gridIndex, cellSize = 1, origin = 0, centered = false)",
          "summary": ""
        },
        {
          "name": "worldUnitsToChunkIndex",
          "kind": "function",
          "signature": "worldUnitsToChunkIndex(worldValue, chunkCells = 16, cellSize = 1, origin = 0)",
          "summary": ""
        },
        {
          "name": "chunkIndexToWorldUnits",
          "kind": "function",
          "signature": "chunkIndexToWorldUnits(chunkIndex, chunkCells = 16, cellSize = 1, origin = 0, centered = false)",
          "summary": ""
        },
        {
          "name": "worldUnitsToLocalChunkIndex",
          "kind": "function",
          "signature": "worldUnitsToLocalChunkIndex(worldValue, chunkCells = 16, cellSize = 1, origin = 0)",
          "summary": ""
        },
        {
          "name": "degreesToRadians",
          "kind": "function",
          "signature": "degreesToRadians(degrees)",
          "summary": ""
        },
        {
          "name": "radiansToDegrees",
          "kind": "function",
          "signature": "radiansToDegrees(radians)",
          "summary": ""
        },
        {
          "name": "degreesToTurns",
          "kind": "function",
          "signature": "degreesToTurns(degrees)",
          "summary": ""
        },
        {
          "name": "turnsToDegrees",
          "kind": "function",
          "signature": "turnsToDegrees(turns)",
          "summary": ""
        },
        {
          "name": "radiansToTurns",
          "kind": "function",
          "signature": "radiansToTurns(radians)",
          "summary": ""
        },
        {
          "name": "turnsToRadians",
          "kind": "function",
          "signature": "turnsToRadians(turns)",
          "summary": ""
        },
        {
          "name": "degreesToGradians",
          "kind": "function",
          "signature": "degreesToGradians(degrees)",
          "summary": ""
        },
        {
          "name": "gradiansToDegrees",
          "kind": "function",
          "signature": "gradiansToDegrees(gradians)",
          "summary": ""
        },
        {
          "name": "radiansToGradians",
          "kind": "function",
          "signature": "radiansToGradians(radians)",
          "summary": ""
        },
        {
          "name": "gradiansToRadians",
          "kind": "function",
          "signature": "gradiansToRadians(gradians)",
          "summary": ""
        },
        {
          "name": "turnsToGradians",
          "kind": "function",
          "signature": "turnsToGradians(turns)",
          "summary": ""
        },
        {
          "name": "gradiansToTurns",
          "kind": "function",
          "signature": "gradiansToTurns(gradians)",
          "summary": ""
        },
        {
          "name": "secondsToMilliseconds",
          "kind": "function",
          "signature": "secondsToMilliseconds(seconds)",
          "summary": ""
        },
        {
          "name": "millisecondsToSeconds",
          "kind": "function",
          "signature": "millisecondsToSeconds(milliseconds)",
          "summary": ""
        },
        {
          "name": "secondsToMinutes",
          "kind": "function",
          "signature": "secondsToMinutes(seconds)",
          "summary": ""
        },
        {
          "name": "minutesToSeconds",
          "kind": "function",
          "signature": "minutesToSeconds(minutes)",
          "summary": ""
        },
        {
          "name": "minutesToHours",
          "kind": "function",
          "signature": "minutesToHours(minutes)",
          "summary": ""
        },
        {
          "name": "hoursToMinutes",
          "kind": "function",
          "signature": "hoursToMinutes(hours)",
          "summary": ""
        },
        {
          "name": "hoursToSeconds",
          "kind": "function",
          "signature": "hoursToSeconds(hours)",
          "summary": ""
        },
        {
          "name": "secondsToHours",
          "kind": "function",
          "signature": "secondsToHours(seconds)",
          "summary": ""
        },
        {
          "name": "daysToSeconds",
          "kind": "function",
          "signature": "daysToSeconds(days)",
          "summary": ""
        },
        {
          "name": "secondsToDays",
          "kind": "function",
          "signature": "secondsToDays(seconds)",
          "summary": ""
        },
        {
          "name": "bpmToHz",
          "kind": "function",
          "signature": "bpmToHz(bpm = DEFAULT_BPM)",
          "summary": ""
        },
        {
          "name": "hzToBpm",
          "kind": "function",
          "signature": "hzToBpm(frequencyHz)",
          "summary": ""
        },
        {
          "name": "hzToKhz",
          "kind": "function",
          "signature": "hzToKhz(frequencyHz)",
          "summary": ""
        },
        {
          "name": "khzToHz",
          "kind": "function",
          "signature": "khzToHz(frequencyKHz)",
          "summary": ""
        },
        {
          "name": "dbToGain",
          "kind": "function",
          "signature": "dbToGain(db)",
          "summary": ""
        },
        {
          "name": "dbToPowerRatio",
          "kind": "function",
          "signature": "dbToPowerRatio(db)",
          "summary": ""
        },
        {
          "name": "centsToFrequencyRatio",
          "kind": "function",
          "signature": "centsToFrequencyRatio(cents)",
          "summary": ""
        },
        {
          "name": "bitsToBytes",
          "kind": "function",
          "signature": "bitsToBytes(bits)",
          "summary": ""
        },
        {
          "name": "bytesToBits",
          "kind": "function",
          "signature": "bytesToBits(bytes)",
          "summary": ""
        },
        {
          "name": "bytesToKiB",
          "kind": "function",
          "signature": "bytesToKiB(bytes)",
          "summary": ""
        },
        {
          "name": "kiBToBytes",
          "kind": "function",
          "signature": "kiBToBytes(kibibytes)",
          "summary": ""
        },
        {
          "name": "bytesToMiB",
          "kind": "function",
          "signature": "bytesToMiB(bytes)",
          "summary": ""
        },
        {
          "name": "miBToBytes",
          "kind": "function",
          "signature": "miBToBytes(mebibytes)",
          "summary": ""
        },
        {
          "name": "bytesToGiB",
          "kind": "function",
          "signature": "bytesToGiB(bytes)",
          "summary": ""
        },
        {
          "name": "giBToBytes",
          "kind": "function",
          "signature": "giBToBytes(gibibytes)",
          "summary": ""
        },
        {
          "name": "MILLISECONDS_PER_SECOND",
          "kind": "constant",
          "signature": "MILLISECONDS_PER_SECOND",
          "summary": ""
        },
        {
          "name": "SECONDS_PER_MINUTE",
          "kind": "constant",
          "signature": "SECONDS_PER_MINUTE",
          "summary": ""
        },
        {
          "name": "MINUTES_PER_HOUR",
          "kind": "constant",
          "signature": "MINUTES_PER_HOUR",
          "summary": ""
        },
        {
          "name": "HOURS_PER_DAY",
          "kind": "constant",
          "signature": "HOURS_PER_DAY",
          "summary": ""
        },
        {
          "name": "DEFAULT_FRAME_RATE",
          "kind": "constant",
          "signature": "DEFAULT_FRAME_RATE",
          "summary": ""
        },
        {
          "name": "DEFAULT_SAMPLE_RATE",
          "kind": "constant",
          "signature": "DEFAULT_SAMPLE_RATE",
          "summary": ""
        },
        {
          "name": "DEFAULT_BPM",
          "kind": "constant",
          "signature": "DEFAULT_BPM",
          "summary": ""
        },
        {
          "name": "BITS_PER_BYTE",
          "kind": "constant",
          "signature": "BITS_PER_BYTE",
          "summary": ""
        },
        {
          "name": "BYTES_PER_KIB",
          "kind": "constant",
          "signature": "BYTES_PER_KIB",
          "summary": ""
        },
        {
          "name": "BYTES_PER_MIB",
          "kind": "constant",
          "signature": "BYTES_PER_MIB",
          "summary": ""
        },
        {
          "name": "BYTES_PER_GIB",
          "kind": "constant",
          "signature": "BYTES_PER_GIB",
          "summary": ""
        },
        {
          "name": "frequencyToWavelength",
          "kind": "constant",
          "signature": "frequencyToWavelength",
          "summary": ""
        },
        {
          "name": "wavelengthToFrequency",
          "kind": "constant",
          "signature": "wavelengthToFrequency",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/VideoMath",
      "path": "engine/reference/core/math/VideoMath.md",
      "source": "engine/core/math/VideoMath.js",
      "import": "/engine/core/math/VideoMath.js",
      "sourceHash": "30af104cbba41128a50e3e186eddd9897df736a7bcae55eaf28974d2f3527259",
      "summary": "VideoMath.js - pure sequence-level video/frame math over ImageData-like frames.",
      "exports": [
        {
          "name": "videoSequenceReport",
          "kind": "function",
          "signature": "videoSequenceReport(frames, options = {})",
          "summary": ""
        },
        {
          "name": "videoTemporalBlendFrame",
          "kind": "function",
          "signature": "videoTemporalBlendFrame(referenceFrame, candidateFrame, amount = 0.5, options = {})",
          "summary": ""
        },
        {
          "name": "videoSceneListReport",
          "kind": "function",
          "signature": "videoSceneListReport(frames, options = {})",
          "summary": ""
        },
        {
          "name": "videoKeyframePlanReport",
          "kind": "function",
          "signature": "videoKeyframePlanReport(frames, options = {})",
          "summary": ""
        },
        {
          "name": "videoMotionEntropyReport",
          "kind": "function",
          "signature": "videoMotionEntropyReport(frames, options = {})",
          "summary": ""
        },
        {
          "name": "videoTemporalEntropyReport",
          "kind": "function",
          "signature": "videoTemporalEntropyReport(frames, options = {})",
          "summary": ""
        },
        {
          "name": "videoThumbnailCandidateReport",
          "kind": "function",
          "signature": "videoThumbnailCandidateReport(frames, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/WGSLRegistry",
      "path": "engine/reference/core/math/WGSLRegistry.md",
      "source": "engine/core/math/WGSLRegistry.js",
      "import": "/engine/core/math/WGSLRegistry.js",
      "sourceHash": "ec5a408dcdd7fdcc778398f1c338b8ffef5174b0bc7f79cf5a2250d1d7237037",
      "summary": "WGSLRegistry.js - metadata for reusable WGSL chunks and CPU/WGSL mirror links.",
      "exports": [
        {
          "name": "wgslRegistryEntries",
          "kind": "function",
          "signature": "wgslRegistryEntries(filters = {})",
          "summary": ""
        },
        {
          "name": "wgslRegistryById",
          "kind": "function",
          "signature": "wgslRegistryById(id, registry = WGSL_REGISTRY)",
          "summary": ""
        },
        {
          "name": "wgslMirrorsForChunk",
          "kind": "function",
          "signature": "wgslMirrorsForChunk(chunkId, mirrors = WGSL_MIRROR_REGISTRY)",
          "summary": ""
        },
        {
          "name": "wgslRegistryReport",
          "kind": "function",
          "signature": "wgslRegistryReport(chunks = WGSL_CHUNK_REGISTRY, mirrors = WGSL_MIRROR_REGISTRY, moduleExports = WGSL_MODULE_EXPORTS, moduleExportClassifications = WGSL_MODULE_EXPORT_CLASSIFICATIONS)",
          "summary": ""
        },
        {
          "name": "mathRegistryWGSLMirrorReport",
          "kind": "function",
          "signature": "mathRegistryWGSLMirrorReport(mathFunctions = MATH_FUNCTION_REGISTRY, wgslMirrors = WGSL_MIRROR_REGISTRY)",
          "summary": ""
        },
        {
          "name": "wgslRegistryManifest",
          "kind": "function",
          "signature": "wgslRegistryManifest(chunks = WGSL_CHUNK_REGISTRY, mirrors = WGSL_MIRROR_REGISTRY)",
          "summary": ""
        },
        {
          "name": "WGSL_REGISTRY_VERSION",
          "kind": "constant",
          "signature": "WGSL_REGISTRY_VERSION",
          "summary": ""
        },
        {
          "name": "WGSL_CHUNK_REGISTRY",
          "kind": "constant",
          "signature": "WGSL_CHUNK_REGISTRY",
          "summary": ""
        },
        {
          "name": "WGSL_MIRROR_REGISTRY",
          "kind": "constant",
          "signature": "WGSL_MIRROR_REGISTRY",
          "summary": ""
        },
        {
          "name": "WGSL_REGISTRY",
          "kind": "constant",
          "signature": "WGSL_REGISTRY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/XRMath",
      "path": "engine/reference/core/math/XRMath.md",
      "source": "engine/core/math/XRMath.js",
      "import": "/engine/core/math/XRMath.js",
      "sourceHash": "11d240db66b96cf05848644b68e38b1a17cc792bcd16827d38be47aa36879794",
      "summary": "XRMath.js - pure WebXR-shaped pose, view, projection, and depth reports.",
      "exports": [
        {
          "name": "xrRigidTransformReport",
          "kind": "function",
          "signature": "xrRigidTransformReport(transform = {}, options = {})",
          "summary": ""
        },
        {
          "name": "xrPoseViewMatrix",
          "kind": "function",
          "signature": "xrPoseViewMatrix(transform = {}, options = {})",
          "summary": ""
        },
        {
          "name": "xrViewProjectionReport",
          "kind": "function",
          "signature": "xrViewProjectionReport(view = {}, options = {})",
          "summary": ""
        },
        {
          "name": "xrViewerPoseReport",
          "kind": "function",
          "signature": "xrViewerPoseReport(views = [], options = {})",
          "summary": ""
        },
        {
          "name": "xrReferenceSpaceOffsetReport",
          "kind": "function",
          "signature": "xrReferenceSpaceOffsetReport(baseTransform = {}, offsetTransform = {}, options = {})",
          "summary": ""
        },
        {
          "name": "xrProjectionDepthRangeReport",
          "kind": "function",
          "signature": "xrProjectionDepthRangeReport(depthNear, depthFar)",
          "summary": ""
        },
        {
          "name": "xrDepthRawToMeters",
          "kind": "function",
          "signature": "xrDepthRawToMeters(rawDepth, rawValueToMeters = 1)",
          "summary": ""
        },
        {
          "name": "xrDepthUvTransformPoint",
          "kind": "function",
          "signature": "xrDepthUvTransformPoint(point = {}, matrix = identity4()",
          "summary": ""
        },
        {
          "name": "xrDepthSampleIndex",
          "kind": "function",
          "signature": "xrDepthSampleIndex(width, height, u, v, options = {})",
          "summary": ""
        },
        {
          "name": "xrDepthSampleMeters",
          "kind": "function",
          "signature": "xrDepthSampleMeters(depthData, width, height, u, v, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/math/index",
      "path": "engine/reference/core/math/index.md",
      "source": "engine/core/math/index.js",
      "import": "/engine/core/math/index.js",
      "sourceHash": "db7ba3d52b24f7b206831140600e43958c66b68bb19b0e7284b713682d58ce81",
      "summary": "engine/core/math/index.js - Math Utilities Barrel Export",
      "exports": [
        {
          "name": "BVHBuilder",
          "kind": "re-export",
          "signature": "BVHBuilder",
          "summary": ""
        },
        {
          "name": "BVHNode",
          "kind": "re-export",
          "signature": "BVHNode",
          "summary": ""
        },
        {
          "name": "BVH_TRAVERSAL_WGSL",
          "kind": "re-export",
          "signature": "BVH_TRAVERSAL_WGSL",
          "summary": ""
        },
        {
          "name": "BezierDistanceCompute",
          "kind": "re-export",
          "signature": "BezierDistanceCompute",
          "summary": ""
        },
        {
          "name": "DEFAULT_BLEND_RADIUS",
          "kind": "re-export",
          "signature": "DEFAULT_BLEND_RADIUS",
          "summary": ""
        },
        {
          "name": "DEFAULT_RESOLUTION",
          "kind": "re-export",
          "signature": "DEFAULT_RESOLUTION",
          "summary": ""
        },
        {
          "name": "GPULineVoxelizer",
          "kind": "re-export",
          "signature": "GPULineVoxelizer",
          "summary": ""
        },
        {
          "name": "HybridConnectivity",
          "kind": "re-export",
          "signature": "HybridConnectivity",
          "summary": ""
        },
        {
          "name": "INF_T",
          "kind": "re-export",
          "signature": "INF_T",
          "summary": ""
        },
        {
          "name": "LineMaterials",
          "kind": "re-export",
          "signature": "LineMaterials",
          "summary": ""
        },
        {
          "name": "LineNetwork",
          "kind": "re-export",
          "signature": "LineNetwork",
          "summary": ""
        },
        {
          "name": "LineToVoxelizer",
          "kind": "re-export",
          "signature": "LineToVoxelizer",
          "summary": ""
        },
        {
          "name": "NetworkEdge",
          "kind": "re-export",
          "signature": "NetworkEdge",
          "summary": ""
        },
        {
          "name": "NetworkNode",
          "kind": "re-export",
          "signature": "NetworkNode",
          "summary": ""
        },
        {
          "name": "SpatialHash",
          "kind": "re-export",
          "signature": "SpatialHash",
          "summary": ""
        },
        {
          "name": "SpatialHashCompute",
          "kind": "re-export",
          "signature": "SpatialHashCompute",
          "summary": ""
        },
        {
          "name": "UnionFind",
          "kind": "re-export",
          "signature": "UnionFind",
          "summary": ""
        },
        {
          "name": "VoxelUnionFind",
          "kind": "re-export",
          "signature": "VoxelUnionFind",
          "summary": ""
        },
        {
          "name": "bezierClosestNewton",
          "kind": "re-export",
          "signature": "bezierClosestNewton",
          "summary": ""
        },
        {
          "name": "bezierDistanceBatch",
          "kind": "re-export",
          "signature": "bezierDistanceBatch",
          "summary": ""
        },
        {
          "name": "bezierDistanceCapsule",
          "kind": "re-export",
          "signature": "bezierDistanceCapsule",
          "summary": ""
        },
        {
          "name": "bezierDistanceHybrid",
          "kind": "re-export",
          "signature": "bezierDistanceHybrid",
          "summary": ""
        },
        {
          "name": "capsuleClosestT",
          "kind": "re-export",
          "signature": "capsuleClosestT",
          "summary": ""
        },
        {
          "name": "createRaycastMesh",
          "kind": "re-export",
          "signature": "createRaycastMesh",
          "summary": ""
        },
        {
          "name": "curvesToGPUBuffer",
          "kind": "re-export",
          "signature": "curvesToGPUBuffer",
          "summary": ""
        },
        {
          "name": "curvesToSegments",
          "kind": "re-export",
          "signature": "curvesToSegments",
          "summary": ""
        },
        {
          "name": "generateRoots",
          "kind": "re-export",
          "signature": "generateRoots",
          "summary": ""
        },
        {
          "name": "generateTree",
          "kind": "re-export",
          "signature": "generateTree",
          "summary": ""
        },
        {
          "name": "generateTunnel",
          "kind": "re-export",
          "signature": "generateTunnel",
          "summary": ""
        },
        {
          "name": "mat4FromRotationTranslation",
          "kind": "re-export",
          "signature": "mat4FromRotationTranslation",
          "summary": ""
        },
        {
          "name": "mat4Identity",
          "kind": "re-export",
          "signature": "mat4Identity",
          "summary": ""
        },
        {
          "name": "mat4Inverse",
          "kind": "re-export",
          "signature": "mat4Inverse",
          "summary": ""
        },
        {
          "name": "mat4LookAt",
          "kind": "re-export",
          "signature": "mat4LookAt",
          "summary": ""
        },
        {
          "name": "mat4Multiply",
          "kind": "re-export",
          "signature": "mat4Multiply",
          "summary": ""
        },
        {
          "name": "mat4Orthographic",
          "kind": "re-export",
          "signature": "mat4Orthographic",
          "summary": ""
        },
        {
          "name": "mat4OrthographicWebGPU",
          "kind": "re-export",
          "signature": "mat4OrthographicWebGPU",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveDeg",
          "kind": "re-export",
          "signature": "mat4PerspectiveDeg",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveDegWebGPU",
          "kind": "re-export",
          "signature": "mat4PerspectiveDegWebGPU",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveRad",
          "kind": "re-export",
          "signature": "mat4PerspectiveRad",
          "summary": ""
        },
        {
          "name": "mat4PerspectiveRadWebGPU",
          "kind": "re-export",
          "signature": "mat4PerspectiveRadWebGPU",
          "summary": ""
        },
        {
          "name": "mat4Scale",
          "kind": "re-export",
          "signature": "mat4Scale",
          "summary": ""
        },
        {
          "name": "mat4Translate",
          "kind": "re-export",
          "signature": "mat4Translate",
          "summary": ""
        },
        {
          "name": "multiCurveDistance",
          "kind": "re-export",
          "signature": "multiCurveDistance",
          "summary": ""
        },
        {
          "name": "multiCurveDistanceSmooth",
          "kind": "re-export",
          "signature": "multiCurveDistanceSmooth",
          "summary": ""
        },
        {
          "name": "rayTriangleIntersect",
          "kind": "re-export",
          "signature": "rayTriangleIntersect",
          "summary": ""
        },
        {
          "name": "sdCapsule",
          "kind": "re-export",
          "signature": "sdCapsule",
          "summary": ""
        },
        {
          "name": "serializeBVHForGPU",
          "kind": "re-export",
          "signature": "serializeBVHForGPU",
          "summary": ""
        },
        {
          "name": "traverseBVH",
          "kind": "re-export",
          "signature": "traverseBVH",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/ChunkBufferPool",
      "path": "engine/reference/core/memory/ChunkBufferPool.md",
      "source": "engine/core/memory/ChunkBufferPool.js",
      "import": "/engine/core/memory/ChunkBufferPool.js",
      "sourceHash": "c317a2220e2616004e1e182406df3d4092f80cec6932c12206783096b699fd72",
      "summary": "",
      "exports": [
        {
          "name": "ChunkBufferPool",
          "kind": "class",
          "signature": "class ChunkBufferPool",
          "summary": ""
        },
        {
          "name": "getChunkBufferPool",
          "kind": "function",
          "signature": "getChunkBufferPool()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/GPUMemoryManager",
      "path": "engine/reference/core/memory/GPUMemoryManager.md",
      "source": "engine/core/memory/GPUMemoryManager.js",
      "import": "/engine/core/memory/GPUMemoryManager.js",
      "sourceHash": "504d5df1092817cc3803cfa9fb55ef3d9d9a3b038c6ae946abaf9acd89de324b",
      "summary": "GPUMemoryManager.js - WebGPU Device Memory Management Implements: - Ring Buffer for dynamic uniform data (per-frame) - Buddy Allocator for static geometry (persistent) - Texture Atlas management with LRU eviction - BindGroup caching and deduplication Goal: Minimize GPU API calls and prevent VRAM fragmentation",
      "exports": [
        {
          "name": "RingBuffer",
          "kind": "class",
          "signature": "class RingBuffer",
          "summary": "Circular buffer for per-frame dynamic data (uniforms, instance data). Wraps around each frame, avoiding buffer creation overhead."
        },
        {
          "name": "BuddyAllocator",
          "kind": "class",
          "signature": "class BuddyAllocator",
          "summary": "Buddy allocator for persistent GPU memory (geometry, textures). Handles allocation/deallocation without fragmentation."
        },
        {
          "name": "StagingBufferPool",
          "kind": "class",
          "signature": "class StagingBufferPool",
          "summary": "Pool of mappable staging buffers for CPU->GPU transfers. Avoids creating new buffers for every upload."
        },
        {
          "name": "BindGroupCache",
          "kind": "class",
          "signature": "class BindGroupCache",
          "summary": "Cache for GPUBindGroup objects to avoid redundant creation. Uses content-based hashing for deduplication."
        },
        {
          "name": "TextureManager",
          "kind": "class",
          "signature": "class TextureManager",
          "summary": "Manages GPU textures with LRU eviction policy."
        },
        {
          "name": "GPUMemoryManager",
          "kind": "class",
          "signature": "class GPUMemoryManager",
          "summary": "Central GPU memory management facade."
        },
        {
          "name": "getGPUMemoryManager",
          "kind": "function",
          "signature": "getGPUMemoryManager(device)",
          "summary": "Get or create GPU memory manager singleton"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/HostMemoryManager",
      "path": "engine/reference/core/memory/HostMemoryManager.md",
      "source": "engine/core/memory/HostMemoryManager.js",
      "import": "/engine/core/memory/HostMemoryManager.js",
      "sourceHash": "81f16b8ccd3ffdcd564162a06a9bf7782e01274ec91f8d8ed4d07db19933695b",
      "summary": "Linear allocator that resets every frame. Provides zero-cost TypedArray views into a pre-allocated buffer.",
      "exports": [
        {
          "name": "SlabAllocator",
          "kind": "class",
          "signature": "class SlabAllocator",
          "summary": "Linear allocator that resets every frame. Provides zero-cost TypedArray views into a pre-allocated buffer."
        },
        {
          "name": "ObjectPool",
          "kind": "class",
          "signature": "class ObjectPool",
          "summary": "Generic object pool for reusable JavaScript objects. Uses LIFO (stack) for hot cache retrieval."
        },
        {
          "name": "SoAContainer",
          "kind": "class",
          "signature": "class SoAContainer",
          "summary": "SoA container for cache-efficient mass entity storage. All properties stored in contiguous TypedArrays."
        },
        {
          "name": "HostMemoryManager",
          "kind": "class",
          "signature": "class HostMemoryManager",
          "summary": "Central manager for all host memory allocation."
        },
        {
          "name": "createCommonPools",
          "kind": "function",
          "signature": "createCommonPools(manager = hostMemory)",
          "summary": "Create common pools for game objects"
        },
        {
          "name": "hostMemory",
          "kind": "constant",
          "signature": "hostMemory",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/MappedBufferRing",
      "path": "engine/reference/core/memory/MappedBufferRing.md",
      "source": "engine/core/memory/MappedBufferRing.js",
      "import": "/engine/core/memory/MappedBufferRing.js",
      "sourceHash": "e108cbec84970f46442ac14d637945f96ce42037aab33803bebeda1b3f48c459",
      "summary": "MappedBufferRing - Efficient GPU data upload with pre-mapped buffers",
      "exports": [
        {
          "name": "MappedBufferRing",
          "kind": "class",
          "signature": "class MappedBufferRing",
          "summary": "MappedBufferRing - Efficient GPU data upload with pre-mapped buffers"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/ObjectPool",
      "path": "engine/reference/core/memory/ObjectPool.md",
      "source": "engine/core/memory/ObjectPool.js",
      "import": "/engine/core/memory/ObjectPool.js",
      "sourceHash": "2fed7dfde7ec8eba92258d495048e3597858944c34db9d3bdb3a1687e7241145",
      "summary": "Generic object pool with factory function",
      "exports": [
        {
          "name": "ObjectPool",
          "kind": "class",
          "signature": "class ObjectPool",
          "summary": "Generic object pool with factory function"
        },
        {
          "name": "acquireVec3",
          "kind": "function",
          "signature": "acquireVec3(x = 0, y = 0, z = 0)",
          "summary": ""
        },
        {
          "name": "releaseVec3",
          "kind": "function",
          "signature": "releaseVec3(v)",
          "summary": ""
        },
        {
          "name": "acquireChunkInfo",
          "kind": "function",
          "signature": "acquireChunkInfo(cx, cy, cz)",
          "summary": ""
        },
        {
          "name": "releaseChunkInfo",
          "kind": "function",
          "signature": "releaseChunkInfo(info)",
          "summary": ""
        },
        {
          "name": "acquireRayResult",
          "kind": "function",
          "signature": "acquireRayResult()",
          "summary": ""
        },
        {
          "name": "releaseRayResult",
          "kind": "function",
          "signature": "releaseRayResult(result)",
          "summary": ""
        },
        {
          "name": "getPoolStats",
          "kind": "function",
          "signature": "getPoolStats()",
          "summary": ""
        },
        {
          "name": "vec3Pool",
          "kind": "constant",
          "signature": "vec3Pool",
          "summary": ""
        },
        {
          "name": "chunkInfoPool",
          "kind": "constant",
          "signature": "chunkInfoPool",
          "summary": ""
        },
        {
          "name": "rayResultPool",
          "kind": "constant",
          "signature": "rayResultPool",
          "summary": ""
        },
        {
          "name": "typedArrayPool",
          "kind": "constant",
          "signature": "typedArrayPool",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/PipelineCache",
      "path": "engine/reference/core/memory/PipelineCache.md",
      "source": "engine/core/memory/PipelineCache.js",
      "import": "/engine/core/memory/PipelineCache.js",
      "sourceHash": "bcc4511bb8a5c18ec8c6df9f01df1ca473b12ad09f4ec3eb26ec53b4ac484b97",
      "summary": "PipelineCache - Async pipeline compilation and caching",
      "exports": [
        {
          "name": "PipelineCache",
          "kind": "class",
          "signature": "class PipelineCache",
          "summary": "PipelineCache - Async pipeline compilation and caching"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/RenderBundleCache",
      "path": "engine/reference/core/memory/RenderBundleCache.md",
      "source": "engine/core/memory/RenderBundleCache.js",
      "import": "/engine/core/memory/RenderBundleCache.js",
      "sourceHash": "5472ec8ec88b2bc120326a2324e4987d5e25e3c153ca4da54b7ba5ae21a8062d",
      "summary": "RenderBundleCache - Manages render bundles for voxel terrain",
      "exports": [
        {
          "name": "RenderBundleCache",
          "kind": "class",
          "signature": "class RenderBundleCache",
          "summary": "RenderBundleCache - Manages render bundles for voxel terrain"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/SubChunkBufferPool",
      "path": "engine/reference/core/memory/SubChunkBufferPool.md",
      "source": "engine/core/memory/SubChunkBufferPool.js",
      "import": "/engine/core/memory/SubChunkBufferPool.js",
      "sourceHash": "f93b20d166a07ba3244171b5b76a56b9961e6ca880d2837eeb0aa2b37081eca9",
      "summary": "SubChunkBufferPool - Manages GPU buffer reuse for sub-chunk meshes",
      "exports": [
        {
          "name": "SubChunkBufferPool",
          "kind": "class",
          "signature": "class SubChunkBufferPool",
          "summary": "SubChunkBufferPool - Manages GPU buffer reuse for sub-chunk meshes"
        },
        {
          "name": "getBufferPool",
          "kind": "function",
          "signature": "getBufferPool()",
          "summary": "Get the global buffer pool instance"
        },
        {
          "name": "initBufferPool",
          "kind": "function",
          "signature": "initBufferPool(device)",
          "summary": "Initialize the global buffer pool"
        },
        {
          "name": "BUCKET_NAMES",
          "kind": "re-export",
          "signature": "BUCKET_NAMES",
          "summary": ""
        },
        {
          "name": "BUCKET_SIZES",
          "kind": "re-export",
          "signature": "BUCKET_SIZES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/UniformBufferRing",
      "path": "engine/reference/core/memory/UniformBufferRing.md",
      "source": "engine/core/memory/UniformBufferRing.js",
      "import": "/engine/core/memory/UniformBufferRing.js",
      "sourceHash": "05a093ea841ce819d9e1bb5c758dc4ee1a20d6a68df9a2b8e1fccbbdcb3b5794",
      "summary": "UniformBufferRing - Rotating uniform buffers",
      "exports": [
        {
          "name": "UniformBufferRing",
          "kind": "class",
          "signature": "class UniformBufferRing",
          "summary": "UniformBufferRing - Rotating uniform buffers"
        },
        {
          "name": "FrameUniformManager",
          "kind": "class",
          "signature": "class FrameUniformManager",
          "summary": "FrameUniformManager - Manages per-frame uniforms with automatic rotation"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/VertexPool",
      "path": "engine/reference/core/memory/VertexPool.md",
      "source": "engine/core/memory/VertexPool.js",
      "import": "/engine/core/memory/VertexPool.js",
      "sourceHash": "a4b2e9239333c20b720d665d29e5086e405331e698d2ecfbb2dcce2c61db8af8",
      "summary": "VertexPool - Manages a large persistent vertex buffer with bucket allocation",
      "exports": [
        {
          "name": "VertexPool",
          "kind": "class",
          "signature": "class VertexPool",
          "summary": "VertexPool - Manages a large persistent vertex buffer with bucket allocation"
        },
        {
          "name": "FaceOrientedVertexPool",
          "kind": "class",
          "signature": "class FaceOrientedVertexPool",
          "summary": "FaceOrientedVertexPool - Vertex pool with 6 sub-buckets per chunk for true back-face culling Each chunk gets 6 smaller buckets, one per face direction"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/memory/index",
      "path": "engine/reference/core/memory/index.md",
      "source": "engine/core/memory/index.js",
      "import": "/engine/core/memory/index.js",
      "sourceHash": "40ae25e7fdb747419c8d8687ea32adab16f16c34576438f6a516be15422925ac",
      "summary": "",
      "exports": [
        {
          "name": "BindGroupCache",
          "kind": "re-export",
          "signature": "BindGroupCache",
          "summary": ""
        },
        {
          "name": "BuddyAllocator",
          "kind": "re-export",
          "signature": "BuddyAllocator",
          "summary": ""
        },
        {
          "name": "GPUMemoryManager",
          "kind": "re-export",
          "signature": "GPUMemoryManager",
          "summary": ""
        },
        {
          "name": "HostMemoryManager",
          "kind": "re-export",
          "signature": "HostMemoryManager",
          "summary": ""
        },
        {
          "name": "ObjectPool",
          "kind": "re-export",
          "signature": "ObjectPool",
          "summary": ""
        },
        {
          "name": "RingBuffer",
          "kind": "re-export",
          "signature": "RingBuffer",
          "summary": ""
        },
        {
          "name": "SlabAllocator",
          "kind": "re-export",
          "signature": "SlabAllocator",
          "summary": ""
        },
        {
          "name": "SoAContainer",
          "kind": "re-export",
          "signature": "SoAContainer",
          "summary": ""
        },
        {
          "name": "StagingBufferPool",
          "kind": "re-export",
          "signature": "StagingBufferPool",
          "summary": ""
        },
        {
          "name": "TextureManager",
          "kind": "re-export",
          "signature": "TextureManager",
          "summary": ""
        },
        {
          "name": "createCommonPools",
          "kind": "re-export",
          "signature": "createCommonPools",
          "summary": ""
        },
        {
          "name": "getGPUMemoryManager",
          "kind": "re-export",
          "signature": "getGPUMemoryManager",
          "summary": ""
        },
        {
          "name": "hostMemory",
          "kind": "re-export",
          "signature": "hostMemory",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/platform/InputPlumbing",
      "path": "engine/reference/core/platform/InputPlumbing.md",
      "source": "engine/core/platform/InputPlumbing.js",
      "import": "/engine/core/platform/InputPlumbing.js",
      "sourceHash": "b7d7cc31c7575fcd6783cd5559402be1e586e70881e6b5e497fdc5740b0972b4",
      "summary": "",
      "exports": [
        {
          "name": "installPointerAndKeyboardListeners",
          "kind": "function",
          "signature": "installPointerAndKeyboardListeners(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/platform/MainLoop",
      "path": "engine/reference/core/platform/MainLoop.md",
      "source": "engine/core/platform/MainLoop.js",
      "import": "/engine/core/platform/MainLoop.js",
      "sourceHash": "58c9a84e75c26ac5b11bf8d251aa4bdc7ecd5e322626f605a296db99b03aaaac",
      "summary": "",
      "exports": [
        {
          "name": "createMainLoop",
          "kind": "function",
          "signature": "createMainLoop(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/platform/PlatformCanvas",
      "path": "engine/reference/core/platform/PlatformCanvas.md",
      "source": "engine/core/platform/PlatformCanvas.js",
      "import": "/engine/core/platform/PlatformCanvas.js",
      "sourceHash": "f08eddde9b957884dcc08dccb434fa7f5210d126deb2f9536a0b08bc5b18533e",
      "summary": "",
      "exports": [
        {
          "name": "createCanvasSurface",
          "kind": "function",
          "signature": "createCanvasSurface(gpuDevice, canvasTarget, options = {})",
          "summary": ""
        },
        {
          "name": "createViewportManager",
          "kind": "function",
          "signature": "createViewportManager(gpuDevice, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/profiler/DualRNG",
      "path": "engine/reference/core/profiler/DualRNG.md",
      "source": "engine/core/profiler/DualRNG.js",
      "import": "/engine/core/profiler/DualRNG.js",
      "sourceHash": "9b3b9dd15c3f168d9f35465890007f2519257f9ae1b273f43bff983724344bff",
      "summary": "DualRNG - Manages synchronized and visual RNGs",
      "exports": [
        {
          "name": "DualRNG",
          "kind": "class",
          "signature": "class DualRNG",
          "summary": "DualRNG - Manages synchronized and visual RNGs"
        },
        {
          "name": "positionHash",
          "kind": "function",
          "signature": "positionHash(x, y, z, seed = 0)",
          "summary": "Position-based hash for deterministic randomness at specific coordinates Useful for terrain generation where you need same result for same position"
        },
        {
          "name": "getGlobalRNG",
          "kind": "function",
          "signature": "getGlobalRNG()",
          "summary": "Get or create global DualRNG instance"
        },
        {
          "name": "initGlobalRNG",
          "kind": "function",
          "signature": "initGlobalRNG(seed)",
          "summary": "Initialize global RNG with seed (call from game init)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/profiler/FrameBudgetManager",
      "path": "engine/reference/core/profiler/FrameBudgetManager.md",
      "source": "engine/core/profiler/FrameBudgetManager.js",
      "import": "/engine/core/profiler/FrameBudgetManager.js",
      "sourceHash": "aa20a1d4dbc50641180e2011eb027a1f39aaf1f3703ca7be2e0fcdd3e837aa23",
      "summary": "FrameBudgetManager - Manages per-frame time budgets",
      "exports": [
        {
          "name": "FrameBudgetManager",
          "kind": "class",
          "signature": "class FrameBudgetManager",
          "summary": "FrameBudgetManager - Manages per-frame time budgets"
        },
        {
          "name": "getFrameBudgetManager",
          "kind": "function",
          "signature": "getFrameBudgetManager()",
          "summary": "Get global frame budget manager"
        },
        {
          "name": "shouldSkipWork",
          "kind": "function",
          "signature": "shouldSkipWork(section)",
          "summary": "Quick check if we should skip work this frame"
        },
        {
          "name": "DEFAULT_BUDGETS",
          "kind": "re-export",
          "signature": "DEFAULT_BUDGETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/profiler/GameplayProfiler",
      "path": "engine/reference/core/profiler/GameplayProfiler.md",
      "source": "engine/core/profiler/GameplayProfiler.js",
      "import": "/engine/core/profiler/GameplayProfiler.js",
      "sourceHash": "5690a5acd0afc62e59de9c589332f31d41e6c0a96d4a9a8d07025bbacc6b2b61",
      "summary": "",
      "exports": [
        {
          "name": "GameplayProfiler",
          "kind": "class",
          "signature": "class GameplayProfiler",
          "summary": ""
        },
        {
          "name": "PROFILE_MODE",
          "kind": "constant",
          "signature": "PROFILE_MODE",
          "summary": ""
        },
        {
          "name": "profiler",
          "kind": "constant",
          "signature": "profiler",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/profiler/PerformanceOptimizer",
      "path": "engine/reference/core/profiler/PerformanceOptimizer.md",
      "source": "engine/core/profiler/PerformanceOptimizer.js",
      "import": "/engine/core/profiler/PerformanceOptimizer.js",
      "sourceHash": "639e68a6aa3f54aa5a369f4a068a4236c6ef874a34286c6c63bfbb8a5aa95fe7",
      "summary": "Common workgroup sizes",
      "exports": [
        {
          "name": "WorkgroupTuner",
          "kind": "class",
          "signature": "class WorkgroupTuner",
          "summary": ""
        },
        {
          "name": "PingPongBuffer",
          "kind": "class",
          "signature": "class PingPongBuffer",
          "summary": ""
        },
        {
          "name": "FrameBudgetManager",
          "kind": "class",
          "signature": "class FrameBudgetManager",
          "summary": ""
        },
        {
          "name": "BufferPool",
          "kind": "class",
          "signature": "class BufferPool",
          "summary": ""
        },
        {
          "name": "PerformanceOptimizer",
          "kind": "class",
          "signature": "class PerformanceOptimizer",
          "summary": ""
        },
        {
          "name": "WorkgroupSizes",
          "kind": "constant",
          "signature": "WorkgroupSizes",
          "summary": "Common workgroup sizes"
        },
        {
          "name": "BufferStrategy",
          "kind": "constant",
          "signature": "BufferStrategy",
          "summary": "Buffer strategies"
        },
        {
          "name": "MemoryTier",
          "kind": "constant",
          "signature": "MemoryTier",
          "summary": "Memory allocation tiers"
        },
        {
          "name": "FrameBudget",
          "kind": "constant",
          "signature": "FrameBudget",
          "summary": "Frame budget targets"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/profiler/index",
      "path": "engine/reference/core/profiler/index.md",
      "source": "engine/core/profiler/index.js",
      "import": "/engine/core/profiler/index.js",
      "sourceHash": "d3f3e9b847a627249f09637ac58d03a2a9bbac1e55a202129b85ea3cb6f82371",
      "summary": "",
      "exports": [
        {
          "name": "DEFAULT_BUDGETS",
          "kind": "re-export",
          "signature": "DEFAULT_BUDGETS",
          "summary": ""
        },
        {
          "name": "DualRNG",
          "kind": "re-export",
          "signature": "DualRNG",
          "summary": ""
        },
        {
          "name": "FrameBudgetManager",
          "kind": "re-export",
          "signature": "FrameBudgetManager",
          "summary": ""
        },
        {
          "name": "GameplayProfiler",
          "kind": "re-export",
          "signature": "GameplayProfiler",
          "summary": ""
        },
        {
          "name": "PerformanceOptimizer",
          "kind": "re-export",
          "signature": "PerformanceOptimizer",
          "summary": ""
        },
        {
          "name": "getFrameBudgetManager",
          "kind": "re-export",
          "signature": "getFrameBudgetManager",
          "summary": ""
        },
        {
          "name": "getGlobalRNG",
          "kind": "re-export",
          "signature": "getGlobalRNG",
          "summary": ""
        },
        {
          "name": "initGlobalRNG",
          "kind": "re-export",
          "signature": "initGlobalRNG",
          "summary": ""
        },
        {
          "name": "positionHash",
          "kind": "re-export",
          "signature": "positionHash",
          "summary": ""
        },
        {
          "name": "shouldSkipWork",
          "kind": "re-export",
          "signature": "shouldSkipWork",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/profiling/PerformanceAnalyzer",
      "path": "engine/reference/core/profiling/PerformanceAnalyzer.md",
      "source": "engine/core/profiling/PerformanceAnalyzer.js",
      "import": "/engine/core/profiling/PerformanceAnalyzer.js",
      "sourceHash": "0ea5c3f1dc899c7358ebf0f76d514bd311c173301171373f037acb88208ab55c",
      "summary": "",
      "exports": [
        {
          "name": "PerformanceAnalyzer",
          "kind": "class",
          "signature": "class PerformanceAnalyzer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/save/SaveSystem",
      "path": "engine/reference/core/save/SaveSystem.md",
      "source": "engine/core/save/SaveSystem.js",
      "import": "/engine/core/save/SaveSystem.js",
      "sourceHash": "91d0e3a9839e86d3b22acb56793e0e22615879531b6f9e2a2cb7c8a1f8f7216e",
      "summary": "",
      "exports": [
        {
          "name": "SaveSystem",
          "kind": "class",
          "signature": "class SaveSystem",
          "summary": ""
        },
        {
          "name": "createLocalStorageAdapter",
          "kind": "function",
          "signature": "createLocalStorageAdapter(storage)",
          "summary": ""
        },
        {
          "name": "SAVE_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "SAVE_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/save/index",
      "path": "engine/reference/core/save/index.md",
      "source": "engine/core/save/index.js",
      "import": "/engine/core/save/index.js",
      "sourceHash": "610d3e17c7ba73bc6764adb2fba123bee1e2b8b646f96449e3439dbce74664e6",
      "summary": "",
      "exports": [
        {
          "name": "SAVE_SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "SAVE_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "SaveSystem",
          "kind": "re-export",
          "signature": "SaveSystem",
          "summary": ""
        },
        {
          "name": "createLocalStorageAdapter",
          "kind": "re-export",
          "signature": "createLocalStorageAdapter",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/scheduler/TaskScheduler",
      "path": "engine/reference/core/scheduler/TaskScheduler.md",
      "source": "engine/core/scheduler/TaskScheduler.js",
      "import": "/engine/core/scheduler/TaskScheduler.js",
      "sourceHash": "960af72eb56ef755ce4e1ef1144d5a5c8f00207b799d67dda466267ed7945d70",
      "summary": "Represents a unit of work",
      "exports": [
        {
          "name": "Job",
          "kind": "class",
          "signature": "class Job",
          "summary": "Represents a unit of work"
        },
        {
          "name": "WorkerPool",
          "kind": "class",
          "signature": "class WorkerPool",
          "summary": "Pool of Web Workers for parallel job execution"
        },
        {
          "name": "TaskScheduler",
          "kind": "class",
          "signature": "class TaskScheduler",
          "summary": "Main task scheduler with frame budget management"
        },
        {
          "name": "JobPriority",
          "kind": "constant",
          "signature": "JobPriority",
          "summary": ""
        },
        {
          "name": "scheduler",
          "kind": "constant",
          "signature": "scheduler",
          "summary": ""
        },
        {
          "name": "workerTemplate",
          "kind": "constant",
          "signature": "workerTemplate",
          "summary": "Template for worker script. Export this and use with URL.createObjectURL."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/scheduler/index",
      "path": "engine/reference/core/scheduler/index.md",
      "source": "engine/core/scheduler/index.js",
      "import": "/engine/core/scheduler/index.js",
      "sourceHash": "3e708b367f1a07924204365c625b17a8507f5ea08870e0c68547d6b394ebcfef",
      "summary": "",
      "exports": [
        {
          "name": "Job",
          "kind": "re-export",
          "signature": "Job",
          "summary": ""
        },
        {
          "name": "JobPriority",
          "kind": "re-export",
          "signature": "JobPriority",
          "summary": ""
        },
        {
          "name": "TaskScheduler",
          "kind": "re-export",
          "signature": "TaskScheduler",
          "summary": ""
        },
        {
          "name": "WorkerPool",
          "kind": "re-export",
          "signature": "WorkerPool",
          "summary": ""
        },
        {
          "name": "scheduler",
          "kind": "re-export",
          "signature": "scheduler",
          "summary": ""
        },
        {
          "name": "workerTemplate",
          "kind": "re-export",
          "signature": "workerTemplate",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/schema/BrowserRecordContract",
      "path": "engine/reference/core/schema/BrowserRecordContract.md",
      "source": "engine/core/schema/BrowserRecordContract.js",
      "import": "/engine/core/schema/BrowserRecordContract.js",
      "sourceHash": "94304533d4fa512ef7cbdbffcb1b76d2a0964e9635fd43bfcabc2fd23ad82c73",
      "summary": "Shared expand-contract owner for structured browser key/value records.",
      "exports": [
        {
          "name": "BrowserRecordContractError",
          "kind": "class",
          "signature": "class BrowserRecordContractError extends Error",
          "summary": ""
        },
        {
          "name": "createBrowserRecordContract",
          "kind": "function",
          "signature": "createBrowserRecordContract({ schema, legacyKey, currentKey = `${legacyKey}.v2`, payloadKey = 'value', validate, maxBytes = 4 * 1024 * 1024, } = {})",
          "summary": ""
        },
        {
          "name": "BROWSER_RECORD_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "BROWSER_RECORD_SCHEMA_VERSION",
          "summary": "Shared expand-contract owner for structured browser key/value records."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/schema/SchemaEvolutionRegistry",
      "path": "engine/reference/core/schema/SchemaEvolutionRegistry.md",
      "source": "engine/core/schema/SchemaEvolutionRegistry.js",
      "import": "/engine/core/schema/SchemaEvolutionRegistry.js",
      "sourceHash": "59842ed7f57d5c085d7fdddff04b79dcb3cc4bf295b4b8a1ff47e52d48d9f8ef",
      "summary": "Pure registry for explicit schema readers, writers, and migration graphs. It transforms decoded values only and never reads or writes persistence.",
      "exports": [
        {
          "name": "SchemaEvolutionError",
          "kind": "class",
          "signature": "class SchemaEvolutionError extends Error",
          "summary": ""
        },
        {
          "name": "SchemaEvolutionRegistry",
          "kind": "class",
          "signature": "class SchemaEvolutionRegistry",
          "summary": "Pure registry for explicit schema readers, writers, and migration graphs. It transforms decoded values only and never reads or writes persistence."
        },
        {
          "name": "canonicalSchemaValue",
          "kind": "function",
          "signature": "canonicalSchemaValue(value)",
          "summary": ""
        },
        {
          "name": "cloneSchemaValue",
          "kind": "function",
          "signature": "cloneSchemaValue(value)",
          "summary": ""
        },
        {
          "name": "fingerprintSchemaValue",
          "kind": "function",
          "signature": "fingerprintSchemaValue(value)",
          "summary": ""
        },
        {
          "name": "createSchemaEvolutionRegistry",
          "kind": "function",
          "signature": "createSchemaEvolutionRegistry()",
          "summary": ""
        },
        {
          "name": "SCHEMA_MIGRATION_PLAN_FORMAT",
          "kind": "constant",
          "signature": "SCHEMA_MIGRATION_PLAN_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/schema/SchemaValidator",
      "path": "engine/reference/core/schema/SchemaValidator.md",
      "source": "engine/core/schema/SchemaValidator.js",
      "import": "/engine/core/schema/SchemaValidator.js",
      "sourceHash": "800783f4d8d032008cb13951de6e7a8bc296f70d63a4caf01b80f26adfd7bd5f",
      "summary": "SchemaValidator — Validates game data against JSON schemas. Lightweight validator (no external deps). Checks required fields, types, enums, min/max, and array items. Reports all errors.",
      "exports": [
        {
          "name": "SchemaValidator",
          "kind": "class",
          "signature": "class SchemaValidator",
          "summary": "SchemaValidator — Validates game data against JSON schemas. Lightweight validator (no external deps). Checks required fields, types, enums, min/max, and array items. Reports all errors."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/schema/index",
      "path": "engine/reference/core/schema/index.md",
      "source": "engine/core/schema/index.js",
      "import": "/engine/core/schema/index.js",
      "sourceHash": "6f2808bd1810808e80b7824a9cdb353d70d80e25fb7b6ee6e54ab9080965f06b",
      "summary": "",
      "exports": [
        {
          "name": "SCHEMA_MIGRATION_PLAN_FORMAT",
          "kind": "re-export",
          "signature": "SCHEMA_MIGRATION_PLAN_FORMAT",
          "summary": ""
        },
        {
          "name": "SchemaEvolutionError",
          "kind": "re-export",
          "signature": "SchemaEvolutionError",
          "summary": ""
        },
        {
          "name": "SchemaEvolutionRegistry",
          "kind": "re-export",
          "signature": "SchemaEvolutionRegistry",
          "summary": ""
        },
        {
          "name": "SchemaValidator",
          "kind": "re-export",
          "signature": "SchemaValidator",
          "summary": ""
        },
        {
          "name": "canonicalSchemaValue",
          "kind": "re-export",
          "signature": "canonicalSchemaValue",
          "summary": ""
        },
        {
          "name": "cloneSchemaValue",
          "kind": "re-export",
          "signature": "cloneSchemaValue",
          "summary": ""
        },
        {
          "name": "createSchemaEvolutionRegistry",
          "kind": "re-export",
          "signature": "createSchemaEvolutionRegistry",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        },
        {
          "name": "fingerprintSchemaValue",
          "kind": "re-export",
          "signature": "fingerprintSchemaValue",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/timing/DisplayRefreshEstimator",
      "path": "engine/reference/core/timing/DisplayRefreshEstimator.md",
      "source": "engine/core/timing/DisplayRefreshEstimator.js",
      "import": "/engine/core/timing/DisplayRefreshEstimator.js",
      "sourceHash": "fc39edee4ae3af82519376dd73da91c3d1197803747895bf1afa389bc3e1e43a",
      "summary": "Robustly estimates the host display cadence from requestAnimationFrame intervals. Missed callbacks are filtered before estimation, so a busy frame does not incorrectly turn a 144 Hz display into a 72 Hz quality target.",
      "exports": [
        {
          "name": "DisplayRefreshEstimator",
          "kind": "class",
          "signature": "class DisplayRefreshEstimator",
          "summary": "Robustly estimates the host display cadence from requestAnimationFrame intervals. Missed callbacks are filtered before estimation, so a busy frame does not incorrectly turn a 144 Hz display into a 72 Hz quality target."
        },
        {
          "name": "createDisplayRefreshEstimator",
          "kind": "function",
          "signature": "createDisplayRefreshEstimator(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/timing/FramePacingController",
      "path": "engine/reference/core/timing/FramePacingController.md",
      "source": "engine/core/timing/FramePacingController.js",
      "import": "/engine/core/timing/FramePacingController.js",
      "sourceHash": "555e9b18fed8cf9414c1b87bfbc30482962b16a5892ffc299b06bcc3aaaefe24",
      "summary": "",
      "exports": [
        {
          "name": "FramePacingController",
          "kind": "class",
          "signature": "class FramePacingController",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/timing/index",
      "path": "engine/reference/core/timing/index.md",
      "source": "engine/core/timing/index.js",
      "import": "/engine/core/timing/index.js",
      "sourceHash": "32f749a141ed10649314d4a87a0df92461e9bf682f0040d29f043f008dc62fe0",
      "summary": "",
      "exports": [
        {
          "name": "DisplayRefreshEstimator",
          "kind": "re-export",
          "signature": "DisplayRefreshEstimator",
          "summary": ""
        },
        {
          "name": "FramePacingController",
          "kind": "re-export",
          "signature": "FramePacingController",
          "summary": ""
        },
        {
          "name": "createDisplayRefreshEstimator",
          "kind": "re-export",
          "signature": "createDisplayRefreshEstimator",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "core/workers/WorkerPool",
      "path": "engine/reference/core/workers/WorkerPool.md",
      "source": "engine/core/workers/WorkerPool.js",
      "import": "/engine/core/workers/WorkerPool.js",
      "sourceHash": "ba5da61919ffe21d51f3a7bb37b42a059f51c50163b8f24f127e69de9d31ef48",
      "summary": "Web Worker Pool - Multi-threaded asset loading and processing Eliminates main thread blocking during heavy operations",
      "exports": [
        {
          "name": "WorkerPool",
          "kind": "class",
          "signature": "class WorkerPool",
          "summary": "Web Worker Pool - Multi-threaded asset loading and processing Eliminates main thread blocking during heavy operations"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/ComponentHealer",
      "path": "engine/reference/ecs/ComponentHealer.md",
      "source": "engine/ecs/ComponentHealer.js",
      "import": "/engine/ecs/ComponentHealer.js",
      "sourceHash": "5892b658a75b37005c40faa9665f9fe1d1e9ecd07625049c7a0f44927ab1de55",
      "summary": "ComponentHealer.js - Self-Healing Data Validation System Implements auto-repair for component data using triangulation: - Detects missing/invalid/corrupted data - Infers correct values from multiple sources (redundancy) - Applies intelligent repairs with fallbacks - Logs all healing actions for diagnostics Based on self-healing system principles: 1. Monitoring & Detection 2. Diagnostics Engine 3. Decision-Making Module 4. Execution Framework 5. Knowledge Base (schema defaults + inference rules) 6. Feedback Loop (healing log)",
      "exports": [
        {
          "name": "TriangulationContext",
          "kind": "class",
          "signature": "class TriangulationContext",
          "summary": "Triangulation context - provides multiple sources for inferring values"
        },
        {
          "name": "getHealingLog",
          "kind": "function",
          "signature": "getHealingLog()",
          "summary": ""
        },
        {
          "name": "clearHealingLog",
          "kind": "function",
          "signature": "clearHealingLog()",
          "summary": ""
        },
        {
          "name": "healComponent",
          "kind": "function",
          "signature": "healComponent(componentName, data, ctx = new TriangulationContext()",
          "summary": "Heal a component using schema and triangulation"
        },
        {
          "name": "healAndValidate",
          "kind": "function",
          "signature": "healAndValidate(componentName, data, options = {})",
          "summary": "Heal and validate component data before use This is the main entry point for the healing system"
        },
        {
          "name": "getHealingStats",
          "kind": "function",
          "signature": "getHealingStats()",
          "summary": "Get healing statistics with detailed metrics"
        },
        {
          "name": "batchHealComponents",
          "kind": "function",
          "signature": "batchHealComponents(components, sharedContext = {})",
          "summary": "Batch heal multiple components efficiently"
        },
        {
          "name": "validateComponentData",
          "kind": "function",
          "signature": "validateComponentData(componentName, data)",
          "summary": "Validate component without healing - just check for issues"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/EntityManager",
      "path": "engine/reference/ecs/EntityManager.md",
      "source": "engine/ecs/EntityManager.js",
      "import": "/engine/ecs/EntityManager.js",
      "sourceHash": "d36b9d8fc44ae88eb038d652d354eed6d75157a7d9a565023d0e74c8492c0deb",
      "summary": "Delete an entity with full cleanup of associated resources.",
      "exports": [
        {
          "name": "deleteEntity",
          "kind": "function",
          "signature": "deleteEntity(options)",
          "summary": "Delete an entity with full cleanup of associated resources."
        },
        {
          "name": "deleteSelectedEntity",
          "kind": "function",
          "signature": "deleteSelectedEntity(ecsState, options)",
          "summary": "Delete the currently selected entity."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/EntitySchema",
      "path": "engine/reference/ecs/EntitySchema.md",
      "source": "engine/ecs/EntitySchema.js",
      "import": "/engine/ecs/EntitySchema.js",
      "sourceHash": "554650c58581f66ce473163c3ec1c21f06bbbf06f68026ee42daec73fcd3a198",
      "summary": "Normalize a single field value based on its type definition",
      "exports": [
        {
          "name": "normalizeField",
          "kind": "function",
          "signature": "normalizeField(fieldDef, value)",
          "summary": "Normalize a single field value based on its type definition"
        },
        {
          "name": "normalizeBySchema",
          "kind": "function",
          "signature": "normalizeBySchema(schema, value)",
          "summary": "Normalize a component value using its schema definition This is the primary function component files should use"
        },
        {
          "name": "getSchemaDefaults",
          "kind": "function",
          "signature": "getSchemaDefaults(schema)",
          "summary": "Get default values from a schema"
        },
        {
          "name": "getCollisionMask",
          "kind": "function",
          "signature": "getCollisionMask(...layerNames)",
          "summary": "Helper: Get collision layer mask from layer names"
        },
        {
          "name": "layersCollide",
          "kind": "function",
          "signature": "layersCollide(layerA, maskA, layerB, maskB)",
          "summary": "Helper: Check if two layer masks collide"
        },
        {
          "name": "getPhysXFlagsForCollisionMode",
          "kind": "function",
          "signature": "getPhysXFlagsForCollisionMode(mode)",
          "summary": "Helper: Get collision mode flags for PhysX Returns { pairFlags, shapeFlags } for PhysX configuration"
        },
        {
          "name": "registerComponentSchema",
          "kind": "function",
          "signature": "registerComponentSchema(schema)",
          "summary": "Register a custom component schema at runtime Allows component files to auto-register their schemas"
        },
        {
          "name": "getRegisteredSchemaNames",
          "kind": "function",
          "signature": "getRegisteredSchemaNames()",
          "summary": "Get all registered component schema names"
        },
        {
          "name": "validateComponent",
          "kind": "function",
          "signature": "validateComponent(componentName, value)",
          "summary": "Validate and normalize a component value against its schema"
        },
        {
          "name": "createDefaultComponent",
          "kind": "function",
          "signature": "createDefaultComponent(componentName)",
          "summary": "Create default component data"
        },
        {
          "name": "validateTransform",
          "kind": "function",
          "signature": "validateTransform(value)",
          "summary": "Validate Transform component"
        },
        {
          "name": "validatePhysicsBody",
          "kind": "function",
          "signature": "validatePhysicsBody(value)",
          "summary": "Validate PhysicsBody component"
        },
        {
          "name": "validateCollider",
          "kind": "function",
          "signature": "validateCollider(value)",
          "summary": "Validate Collider component"
        },
        {
          "name": "validateLight",
          "kind": "function",
          "signature": "validateLight(value)",
          "summary": "Validate Light component"
        },
        {
          "name": "validateCamera",
          "kind": "function",
          "signature": "validateCamera(value)",
          "summary": "Validate Camera component"
        },
        {
          "name": "validateRenderable",
          "kind": "function",
          "signature": "validateRenderable(value)",
          "summary": "Validate Renderable component"
        },
        {
          "name": "validateParticleEmitter",
          "kind": "function",
          "signature": "validateParticleEmitter(value)",
          "summary": "Validate ParticleEmitter component"
        },
        {
          "name": "validateNavAgent",
          "kind": "function",
          "signature": "validateNavAgent(value)",
          "summary": "Validate NavAgent component"
        },
        {
          "name": "validatePhysicsChain",
          "kind": "function",
          "signature": "validatePhysicsChain(value)",
          "summary": "Validate PhysicsChain component"
        },
        {
          "name": "createDefaultTransform",
          "kind": "function",
          "signature": "createDefaultTransform()",
          "summary": "Create default Transform"
        },
        {
          "name": "createDefaultPhysicsBody",
          "kind": "function",
          "signature": "createDefaultPhysicsBody()",
          "summary": "Create default PhysicsBody"
        },
        {
          "name": "createDefaultCollider",
          "kind": "function",
          "signature": "createDefaultCollider()",
          "summary": "Create default Collider"
        },
        {
          "name": "createDefaultLight",
          "kind": "function",
          "signature": "createDefaultLight()",
          "summary": "Create default Light"
        },
        {
          "name": "createDefaultCamera",
          "kind": "function",
          "signature": "createDefaultCamera()",
          "summary": "Create default Camera"
        },
        {
          "name": "createDefaultRenderable",
          "kind": "function",
          "signature": "createDefaultRenderable()",
          "summary": "Create default Renderable"
        },
        {
          "name": "createDefaultPhysicsChain",
          "kind": "function",
          "signature": "createDefaultPhysicsChain()",
          "summary": "Create default PhysicsChain"
        },
        {
          "name": "createEmptyEntity",
          "kind": "function",
          "signature": "createEmptyEntity(id)",
          "summary": "Create empty entity"
        },
        {
          "name": "createEntitySnapshot",
          "kind": "function",
          "signature": "createEntitySnapshot(entityId, transform, physicsBody)",
          "summary": "Create entity snapshot"
        },
        {
          "name": "createWorldSnapshot",
          "kind": "function",
          "signature": "createWorldSnapshot(time, frameIndex)",
          "summary": "Create world snapshot"
        },
        {
          "name": "jsonReplacer",
          "kind": "function",
          "signature": "jsonReplacer(key, value)",
          "summary": "JSON replacer function for special values Use with JSON.stringify(obj, jsonReplacer)"
        },
        {
          "name": "jsonReviver",
          "kind": "function",
          "signature": "jsonReviver(key, value)",
          "summary": "JSON reviver function for special values Use with JSON.parse(str, jsonReviver)"
        },
        {
          "name": "serializeComponent",
          "kind": "function",
          "signature": "serializeComponent(componentName, value)",
          "summary": "Serialize component to JSON-safe object"
        },
        {
          "name": "deserializeComponent",
          "kind": "function",
          "signature": "deserializeComponent(componentName, json, healingContext = null)",
          "summary": "Deserialize component from JSON with optional self-healing"
        },
        {
          "name": "serializeEntitySnapshot",
          "kind": "function",
          "signature": "serializeEntitySnapshot(snapshot)",
          "summary": "Serialize entity snapshot to JSON-safe object"
        },
        {
          "name": "serializeWorldSnapshot",
          "kind": "function",
          "signature": "serializeWorldSnapshot(snapshot)",
          "summary": "Serialize world snapshot to JSON-safe object"
        },
        {
          "name": "deserializeWorldSnapshot",
          "kind": "function",
          "signature": "deserializeWorldSnapshot(json)",
          "summary": "Deserialize world snapshot from JSON"
        },
        {
          "name": "lerpVec3",
          "kind": "function",
          "signature": "lerpVec3(a, b, t)",
          "summary": "Interpolate between two vec3 values"
        },
        {
          "name": "lerpQuat",
          "kind": "function",
          "signature": "lerpQuat(a, b, t)",
          "summary": "Interpolate between two quaternions (simple lerp, not slerp)"
        },
        {
          "name": "interpolateTransform",
          "kind": "function",
          "signature": "interpolateTransform(a, b, t)",
          "summary": "Interpolate Transform between two states"
        },
        {
          "name": "interpolatePhysicsBody",
          "kind": "function",
          "signature": "interpolatePhysicsBody(a, b, t)",
          "summary": "Interpolate PhysicsBody between two states"
        },
        {
          "name": "interpolateEntitySnapshot",
          "kind": "function",
          "signature": "interpolateEntitySnapshot(a, b, t)",
          "summary": "Interpolate entity snapshot between two states"
        },
        {
          "name": "getColliderShapeId",
          "kind": "function",
          "signature": "getColliderShapeId(shapeName)",
          "summary": "Get collider shape ID from name"
        },
        {
          "name": "getColliderShapeName",
          "kind": "function",
          "signature": "getColliderShapeName(shapeId)",
          "summary": "Get collider shape name from ID"
        },
        {
          "name": "getLightTypeId",
          "kind": "function",
          "signature": "getLightTypeId(typeName)",
          "summary": "Get light type ID from name"
        },
        {
          "name": "getLightTypeName",
          "kind": "function",
          "signature": "getLightTypeName(typeId)",
          "summary": "Get light type name from ID"
        },
        {
          "name": "getCameraProjectionId",
          "kind": "function",
          "signature": "getCameraProjectionId(projName)",
          "summary": "Get camera projection ID from name"
        },
        {
          "name": "getEmitterShapeId",
          "kind": "function",
          "signature": "getEmitterShapeId(shapeName)",
          "summary": "Get emitter shape ID from name"
        },
        {
          "name": "FIELD_TYPES",
          "kind": "constant",
          "signature": "FIELD_TYPES",
          "summary": "Common field types used across components"
        },
        {
          "name": "TRANSFORM_SCHEMA",
          "kind": "constant",
          "signature": "TRANSFORM_SCHEMA",
          "summary": "Transform component schema"
        },
        {
          "name": "PHYSICS_BODY_SCHEMA",
          "kind": "constant",
          "signature": "PHYSICS_BODY_SCHEMA",
          "summary": "PhysicsBody component schema"
        },
        {
          "name": "COLLIDER_SHAPES",
          "kind": "constant",
          "signature": "COLLIDER_SHAPES",
          "summary": "Collider shapes"
        },
        {
          "name": "COLLIDER_SCHEMA",
          "kind": "constant",
          "signature": "COLLIDER_SCHEMA",
          "summary": "Collider component schema"
        },
        {
          "name": "LIGHT_TYPES",
          "kind": "constant",
          "signature": "LIGHT_TYPES",
          "summary": "Light types"
        },
        {
          "name": "LIGHT_SCHEMA",
          "kind": "constant",
          "signature": "LIGHT_SCHEMA",
          "summary": "Light component schema"
        },
        {
          "name": "CAMERA_PROJECTIONS",
          "kind": "constant",
          "signature": "CAMERA_PROJECTIONS",
          "summary": "Camera projection types"
        },
        {
          "name": "CAMERA_MODES",
          "kind": "constant",
          "signature": "CAMERA_MODES",
          "summary": "Camera modes"
        },
        {
          "name": "CAMERA_SCHEMA",
          "kind": "constant",
          "signature": "CAMERA_SCHEMA",
          "summary": "Camera component schema"
        },
        {
          "name": "RENDERABLE_SCHEMA",
          "kind": "constant",
          "signature": "RENDERABLE_SCHEMA",
          "summary": "Renderable component schema"
        },
        {
          "name": "EMITTER_SHAPES",
          "kind": "constant",
          "signature": "EMITTER_SHAPES",
          "summary": "Emitter shapes for particle spawning"
        },
        {
          "name": "PARTICLE_EMITTER_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_EMITTER_SCHEMA",
          "summary": "ParticleEmitter component schema"
        },
        {
          "name": "NAV_AGENT_SCHEMA",
          "kind": "constant",
          "signature": "NAV_AGENT_SCHEMA",
          "summary": "NavAgent component schema"
        },
        {
          "name": "CHAIN_BACKENDS",
          "kind": "constant",
          "signature": "CHAIN_BACKENDS",
          "summary": "Chain physics backends"
        },
        {
          "name": "ROPE_BACKENDS",
          "kind": "constant",
          "signature": "ROPE_BACKENDS",
          "summary": ""
        },
        {
          "name": "PHYSICS_CHAIN_SCHEMA",
          "kind": "constant",
          "signature": "PHYSICS_CHAIN_SCHEMA",
          "summary": "PhysicsChain component schema (unified: particle chains + rigid chains) mode: \"particle\" = PBD/GPU/PhysX particle chain (formerly PhysicsRope) mode: \"rigid\"    = rigid linked chain (formerly PhysicsChain)"
        },
        {
          "name": "PHYSICS_ROPE_SCHEMA",
          "kind": "constant",
          "signature": "PHYSICS_ROPE_SCHEMA",
          "summary": ""
        },
        {
          "name": "TWISTED_ROPE_SCHEMA",
          "kind": "constant",
          "signature": "TWISTED_ROPE_SCHEMA",
          "summary": ""
        },
        {
          "name": "WELD_TYPES",
          "kind": "constant",
          "signature": "WELD_TYPES",
          "summary": "Weld constraint types"
        },
        {
          "name": "WELD_CONSTRAINT_SCHEMA",
          "kind": "constant",
          "signature": "WELD_CONSTRAINT_SCHEMA",
          "summary": "WeldConstraint component schema - Defines a physics weld between two entities Welds merge collision shapes from child into parent, creating compound bodies. When saved: stores entity IDs and offset When loaded: recreates weld during physics init"
        },
        {
          "name": "COLLISION_MODES",
          "kind": "constant",
          "signature": "COLLISION_MODES",
          "summary": "Collision modes - determines how physics engine handles collisions Maps to PhysX PxPairFlags and shape flags"
        },
        {
          "name": "COLLISION_LAYERS",
          "kind": "constant",
          "signature": "COLLISION_LAYERS",
          "summary": "Predefined collision layers (bitmask) Each entity belongs to one layer (collisionLayer) and can collide with multiple layers (collisionMask)"
        },
        {
          "name": "ENTITY_FLAGS_SCHEMA",
          "kind": "constant",
          "signature": "ENTITY_FLAGS_SCHEMA",
          "summary": "EntityFlags component schema - Unified flags for collision, visibility, and editor behavior This component centralizes all entity interaction flags: - Collision: layer/mask filtering, collision mode (solid/trigger/noPush/ghost) - Visibility: render visibility, layer masks, editor-only visibility - Editor: pickable, selectable, locked, hidden in hierarchy - Physics: weldable, pushable, sleepable PhysX Integration: - collisionLayer → PxFilterData.word0 - collisionMask → PxFilterData.word1 - collisionMode → PxPairFlags (eSOLVE_CONTACT, eDETECT_DISCRETE_CONTACT, etc.)"
        },
        {
          "name": "COMPONENT_SCHEMAS",
          "kind": "constant",
          "signature": "COMPONENT_SCHEMAS",
          "summary": ""
        },
        {
          "name": "ENTITY_SCHEMA",
          "kind": "constant",
          "signature": "ENTITY_SCHEMA",
          "summary": "Complete entity schema (entity + components)"
        },
        {
          "name": "ENTITY_SNAPSHOT_SCHEMA",
          "kind": "constant",
          "signature": "ENTITY_SNAPSHOT_SCHEMA",
          "summary": "Entity state snapshot (for rewind)"
        },
        {
          "name": "WORLD_SNAPSHOT_SCHEMA",
          "kind": "constant",
          "signature": "WORLD_SNAPSHOT_SCHEMA",
          "summary": "World snapshot schema"
        },
        {
          "name": "validatePhysicsRope",
          "kind": "constant",
          "signature": "validatePhysicsRope",
          "summary": ""
        },
        {
          "name": "createDefaultPhysicsRope",
          "kind": "constant",
          "signature": "createDefaultPhysicsRope",
          "summary": ""
        },
        {
          "name": "normalizeAny",
          "kind": "re-export",
          "signature": "normalizeAny",
          "summary": ""
        },
        {
          "name": "normalizeArray",
          "kind": "re-export",
          "signature": "normalizeArray",
          "summary": ""
        },
        {
          "name": "normalizeBoolean",
          "kind": "re-export",
          "signature": "normalizeBoolean",
          "summary": ""
        },
        {
          "name": "normalizeEnum",
          "kind": "re-export",
          "signature": "normalizeEnum",
          "summary": ""
        },
        {
          "name": "normalizeNumber",
          "kind": "re-export",
          "signature": "normalizeNumber",
          "summary": ""
        },
        {
          "name": "normalizeQuat",
          "kind": "re-export",
          "signature": "normalizeQuat",
          "summary": ""
        },
        {
          "name": "normalizeString",
          "kind": "re-export",
          "signature": "normalizeString",
          "summary": ""
        },
        {
          "name": "normalizeVec2",
          "kind": "re-export",
          "signature": "normalizeVec2",
          "summary": ""
        },
        {
          "name": "normalizeVec3",
          "kind": "re-export",
          "signature": "normalizeVec3",
          "summary": ""
        },
        {
          "name": "normalizeVec3Nullable",
          "kind": "re-export",
          "signature": "normalizeVec3Nullable",
          "summary": ""
        },
        {
          "name": "normalizeVec4",
          "kind": "re-export",
          "signature": "normalizeVec4",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/SceneInit",
      "path": "engine/reference/ecs/SceneInit.md",
      "source": "engine/ecs/SceneInit.js",
      "import": "/engine/ecs/SceneInit.js",
      "sourceHash": "0191ada9a32aa642d0a83fd27a463bad9cf914975b3f474e71712da07c79ed5b",
      "summary": "Initialize ECS world with physics sandbox scene.",
      "exports": [
        {
          "name": "initEcsWorld",
          "kind": "function",
          "signature": "initEcsWorld(options)",
          "summary": "Initialize ECS world with physics sandbox scene."
        },
        {
          "name": "createMinimalWorld",
          "kind": "function",
          "signature": "createMinimalWorld(options = {})",
          "summary": "Create a minimal ECS world without physics sandbox."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/Camera",
      "path": "engine/reference/ecs/components/Camera.md",
      "source": "engine/ecs/components/Camera.js",
      "import": "/engine/ecs/components/Camera.js",
      "sourceHash": "2f2a6d26b5253b5e5b656832196f0824969b3d67ec83775279ebc18b79adb807",
      "summary": "",
      "exports": [
        {
          "name": "createCamera",
          "kind": "function",
          "signature": "createCamera(initial)",
          "summary": ""
        },
        {
          "name": "CameraDefinition",
          "kind": "constant",
          "signature": "CameraDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/Cloth",
      "path": "engine/reference/ecs/components/Cloth.md",
      "source": "engine/ecs/components/Cloth.js",
      "import": "/engine/ecs/components/Cloth.js",
      "sourceHash": "62973a25300366a157b5b3902519e6b0036ffad000c1f4ff7b5afbf114d67ba0",
      "summary": "",
      "exports": [
        {
          "name": "createCloth",
          "kind": "function",
          "signature": "createCloth(initial)",
          "summary": ""
        },
        {
          "name": "ClothDefinition",
          "kind": "constant",
          "signature": "ClothDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/Collider",
      "path": "engine/reference/ecs/components/Collider.md",
      "source": "engine/ecs/components/Collider.js",
      "import": "/engine/ecs/components/Collider.js",
      "sourceHash": "c338cb8e4f9b9c7c387c24e1a409342eae3e29be7774ce312adcf27f56d49741",
      "summary": "",
      "exports": [
        {
          "name": "createCollider",
          "kind": "function",
          "signature": "createCollider(initial)",
          "summary": ""
        },
        {
          "name": "ColliderDefinition",
          "kind": "constant",
          "signature": "ColliderDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/ComponentRegistry",
      "path": "engine/reference/ecs/components/ComponentRegistry.md",
      "source": "engine/ecs/components/ComponentRegistry.js",
      "import": "/engine/ecs/components/ComponentRegistry.js",
      "sourceHash": "f88996c3cb2d21f5588306dabd04fc3560b3f6f9830e28067ce95afe565365dc",
      "summary": "Get schema for a component from EntitySchema",
      "exports": [
        {
          "name": "defineComponentType",
          "kind": "function",
          "signature": "defineComponentType(config)",
          "summary": ""
        },
        {
          "name": "getComponentDefinition",
          "kind": "function",
          "signature": "getComponentDefinition(name)",
          "summary": ""
        },
        {
          "name": "listComponentDefinitions",
          "kind": "function",
          "signature": "listComponentDefinitions()",
          "summary": ""
        },
        {
          "name": "getComponentSchema",
          "kind": "function",
          "signature": "getComponentSchema(name)",
          "summary": "Get schema for a component from EntitySchema"
        },
        {
          "name": "validateComponentSchema",
          "kind": "function",
          "signature": "validateComponentSchema(name, value)",
          "summary": "Validate component using EntitySchema"
        },
        {
          "name": "createDefaultFromSchema",
          "kind": "function",
          "signature": "createDefaultFromSchema(name)",
          "summary": "Create default component using EntitySchema"
        },
        {
          "name": "getRegisteredSchemaNames",
          "kind": "re-export",
          "signature": "getRegisteredSchemaNames",
          "summary": ""
        },
        {
          "name": "registerComponentSchema",
          "kind": "re-export",
          "signature": "registerComponentSchema",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/FluidSource",
      "path": "engine/reference/ecs/components/FluidSource.md",
      "source": "engine/ecs/components/FluidSource.js",
      "import": "/engine/ecs/components/FluidSource.js",
      "sourceHash": "eefdb3ea87139b4f47c6b987485fbfe12eeda25bcb52b10401af6f8005430f85",
      "summary": "",
      "exports": [
        {
          "name": "createFluidSource",
          "kind": "function",
          "signature": "createFluidSource(initial)",
          "summary": ""
        },
        {
          "name": "FluidSourceDefinition",
          "kind": "constant",
          "signature": "FluidSourceDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/FluidVolume",
      "path": "engine/reference/ecs/components/FluidVolume.md",
      "source": "engine/ecs/components/FluidVolume.js",
      "import": "/engine/ecs/components/FluidVolume.js",
      "sourceHash": "7d050745aacf9674b5a893d6caeda7c1e137f871e8b89d3737d77e567d83d3da",
      "summary": "",
      "exports": [
        {
          "name": "createFluidVolume",
          "kind": "function",
          "signature": "createFluidVolume(initial)",
          "summary": ""
        },
        {
          "name": "FluidVolumeDefinition",
          "kind": "constant",
          "signature": "FluidVolumeDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/Input",
      "path": "engine/reference/ecs/components/Input.md",
      "source": "engine/ecs/components/Input.js",
      "import": "/engine/ecs/components/Input.js",
      "sourceHash": "f6c864bf3d36730e0023711553587b084569f50e9dd4cedfc98939e039b345ce",
      "summary": "",
      "exports": [
        {
          "name": "createInput",
          "kind": "function",
          "signature": "createInput(initial)",
          "summary": ""
        },
        {
          "name": "InputDefinition",
          "kind": "constant",
          "signature": "InputDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/Light",
      "path": "engine/reference/ecs/components/Light.md",
      "source": "engine/ecs/components/Light.js",
      "import": "/engine/ecs/components/Light.js",
      "sourceHash": "deaea5b6fa7421475d414bde33193b7f366c7079db2057e20f3b69dcd07a077a",
      "summary": "",
      "exports": [
        {
          "name": "createLight",
          "kind": "function",
          "signature": "createLight(initial)",
          "summary": ""
        },
        {
          "name": "LightDefinition",
          "kind": "constant",
          "signature": "LightDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/NavAgent",
      "path": "engine/reference/ecs/components/NavAgent.md",
      "source": "engine/ecs/components/NavAgent.js",
      "import": "/engine/ecs/components/NavAgent.js",
      "sourceHash": "8ee7a8b42071f6a987755569aaa90a6d00492ec4dad9b4221f05b15c3a704537",
      "summary": "",
      "exports": [
        {
          "name": "createNavAgent",
          "kind": "function",
          "signature": "createNavAgent(initial)",
          "summary": ""
        },
        {
          "name": "NavAgentDefinition",
          "kind": "constant",
          "signature": "NavAgentDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/NetReplicated",
      "path": "engine/reference/ecs/components/NetReplicated.md",
      "source": "engine/ecs/components/NetReplicated.js",
      "import": "/engine/ecs/components/NetReplicated.js",
      "sourceHash": "ff2cc3c46e8016dd5f0830eabeb787529691e4400a6bac83707a38e1cfab4ddb",
      "summary": "",
      "exports": [
        {
          "name": "createNetReplicated",
          "kind": "function",
          "signature": "createNetReplicated(initial)",
          "summary": ""
        },
        {
          "name": "NetReplicatedDefinition",
          "kind": "constant",
          "signature": "NetReplicatedDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/ParticleEmitter",
      "path": "engine/reference/ecs/components/ParticleEmitter.md",
      "source": "engine/ecs/components/ParticleEmitter.js",
      "import": "/engine/ecs/components/ParticleEmitter.js",
      "sourceHash": "495091be90a49587d51209227d922ab28403d0ae883333f8ea2cacb0401adf72",
      "summary": "",
      "exports": [
        {
          "name": "createParticleEmitter",
          "kind": "function",
          "signature": "createParticleEmitter(initial)",
          "summary": ""
        },
        {
          "name": "ParticleEmitterDefinition",
          "kind": "constant",
          "signature": "ParticleEmitterDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/ParticleField",
      "path": "engine/reference/ecs/components/ParticleField.md",
      "source": "engine/ecs/components/ParticleField.js",
      "import": "/engine/ecs/components/ParticleField.js",
      "sourceHash": "9e15856f40893f783354ed9f609d9e3368ed6a62c22e768958acc77ceb273f2f",
      "summary": "",
      "exports": [
        {
          "name": "createParticleField",
          "kind": "function",
          "signature": "createParticleField(initial)",
          "summary": ""
        },
        {
          "name": "ParticleFieldDefinition",
          "kind": "constant",
          "signature": "ParticleFieldDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicalMaterial",
      "path": "engine/reference/ecs/components/PhysicalMaterial.md",
      "source": "engine/ecs/components/PhysicalMaterial.js",
      "import": "/engine/ecs/components/PhysicalMaterial.js",
      "sourceHash": "51912f01e27b4bac788677bba12d33502dd95c6be0496d5ea164c5fe2d8966ff",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicalMaterialComponent",
          "kind": "function",
          "signature": "createPhysicalMaterialComponent(initial)",
          "summary": ""
        },
        {
          "name": "PhysicalMaterialDefinition",
          "kind": "constant",
          "signature": "PhysicalMaterialDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicsBody",
      "path": "engine/reference/ecs/components/PhysicsBody.md",
      "source": "engine/ecs/components/PhysicsBody.js",
      "import": "/engine/ecs/components/PhysicsBody.js",
      "sourceHash": "3294d24e457177c44d3396fa1ca4a76a8e634ade0327d7d9d9fb8acf171601c1",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsBody",
          "kind": "function",
          "signature": "createPhysicsBody(initial)",
          "summary": ""
        },
        {
          "name": "PhysicsBodyDefinition",
          "kind": "constant",
          "signature": "PhysicsBodyDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicsChain",
      "path": "engine/reference/ecs/components/PhysicsChain.md",
      "source": "engine/ecs/components/PhysicsChain.js",
      "import": "/engine/ecs/components/PhysicsChain.js",
      "sourceHash": "9b76c6dfb9e056b407c029cfc724ee25e0cd436f53ed38b944ac30d3f51e9860",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsChain",
          "kind": "function",
          "signature": "createPhysicsChain(initial)",
          "summary": ""
        },
        {
          "name": "PhysicsChainDefinition",
          "kind": "constant",
          "signature": "PhysicsChainDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicsCloth",
      "path": "engine/reference/ecs/components/PhysicsCloth.md",
      "source": "engine/ecs/components/PhysicsCloth.js",
      "import": "/engine/ecs/components/PhysicsCloth.js",
      "sourceHash": "b3c742066e869e8840ea02a8f779a4ea95ee395cd8ca85de679923878a0e2f24",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsCloth",
          "kind": "function",
          "signature": "createPhysicsCloth(initial)",
          "summary": ""
        },
        {
          "name": "PhysicsClothDefinition",
          "kind": "constant",
          "signature": "PhysicsClothDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicsHair",
      "path": "engine/reference/ecs/components/PhysicsHair.md",
      "source": "engine/ecs/components/PhysicsHair.js",
      "import": "/engine/ecs/components/PhysicsHair.js",
      "sourceHash": "9d5fbf8828b48359016961f0d4d32004f81d9eb0287ba4cb593abde420011c69",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsHair",
          "kind": "function",
          "signature": "createPhysicsHair(initial)",
          "summary": ""
        },
        {
          "name": "PhysicsHairDefinition",
          "kind": "constant",
          "signature": "PhysicsHairDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicsRope",
      "path": "engine/reference/ecs/components/PhysicsRope.md",
      "source": "engine/ecs/components/PhysicsRope.js",
      "import": "/engine/ecs/components/PhysicsRope.js",
      "sourceHash": "c68804de3d9f98c828a86e540ae40258e731d27e399795b87a42ac4f6b3e0b1d",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsRope",
          "kind": "function",
          "signature": "createPhysicsRope(initial)",
          "summary": ""
        },
        {
          "name": "PhysicsRopeDefinition",
          "kind": "constant",
          "signature": "PhysicsRopeDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicsSoftBody",
      "path": "engine/reference/ecs/components/PhysicsSoftBody.md",
      "source": "engine/ecs/components/PhysicsSoftBody.js",
      "import": "/engine/ecs/components/PhysicsSoftBody.js",
      "sourceHash": "7ac7d8e6aa7fef86b46b2d38daf5b0271f8be612c60743c6f5745a04bf56dfa1",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsSoftBody",
          "kind": "function",
          "signature": "createPhysicsSoftBody(initial)",
          "summary": ""
        },
        {
          "name": "PhysicsSoftBodyDefinition",
          "kind": "constant",
          "signature": "PhysicsSoftBodyDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/PhysicsWire",
      "path": "engine/reference/ecs/components/PhysicsWire.md",
      "source": "engine/ecs/components/PhysicsWire.js",
      "import": "/engine/ecs/components/PhysicsWire.js",
      "sourceHash": "cef57e533c2d76bfb1c9395af163a0b9fad50b905a339050b5f0e79cd6ff01fb",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsWire",
          "kind": "function",
          "signature": "createPhysicsWire(initial)",
          "summary": ""
        },
        {
          "name": "PhysicsWireDefinition",
          "kind": "constant",
          "signature": "PhysicsWireDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/Renderable",
      "path": "engine/reference/ecs/components/Renderable.md",
      "source": "engine/ecs/components/Renderable.js",
      "import": "/engine/ecs/components/Renderable.js",
      "sourceHash": "21bb42c82a3f13aea4c29f4d96e388154105be43d8117b5218365bfea7145b24",
      "summary": "",
      "exports": [
        {
          "name": "createRenderable",
          "kind": "function",
          "signature": "createRenderable(initial)",
          "summary": ""
        },
        {
          "name": "RenderableDefinition",
          "kind": "constant",
          "signature": "RenderableDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/StickmanRagdoll",
      "path": "engine/reference/ecs/components/StickmanRagdoll.md",
      "source": "engine/ecs/components/StickmanRagdoll.js",
      "import": "/engine/ecs/components/StickmanRagdoll.js",
      "sourceHash": "e18b2bf47447bdc3ec3152956b2226b6079b10e9c6bd228af186dcb4db32a98b",
      "summary": "",
      "exports": [
        {
          "name": "createStickmanRagdoll",
          "kind": "function",
          "signature": "createStickmanRagdoll(initial)",
          "summary": ""
        },
        {
          "name": "StickmanRagdollDefinition",
          "kind": "constant",
          "signature": "StickmanRagdollDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/Transform",
      "path": "engine/reference/ecs/components/Transform.md",
      "source": "engine/ecs/components/Transform.js",
      "import": "/engine/ecs/components/Transform.js",
      "sourceHash": "61e9493e103a2ec9a4a4cda8b4a6c5ee2134114dd4a458bd8a8953863f880f54",
      "summary": "",
      "exports": [
        {
          "name": "createTransform",
          "kind": "function",
          "signature": "createTransform(initial)",
          "summary": ""
        },
        {
          "name": "TransformDefinition",
          "kind": "constant",
          "signature": "TransformDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/TwistedRope",
      "path": "engine/reference/ecs/components/TwistedRope.md",
      "source": "engine/ecs/components/TwistedRope.js",
      "import": "/engine/ecs/components/TwistedRope.js",
      "sourceHash": "50328d830d5a1de0da01bdfe04994abe82323434d05c687abd39689c3b7bb5fc",
      "summary": "",
      "exports": [
        {
          "name": "TwistedRopeDefinition",
          "kind": "constant",
          "signature": "TwistedRopeDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components/WeldConstraint",
      "path": "engine/reference/ecs/components/WeldConstraint.md",
      "source": "engine/ecs/components/WeldConstraint.js",
      "import": "/engine/ecs/components/WeldConstraint.js",
      "sourceHash": "e6cd106c78dc16269dac6788d2edf04376b1cdfa93609b9c4fb8156852394d40",
      "summary": "Create a new WeldConstraint component",
      "exports": [
        {
          "name": "createWeldConstraint",
          "kind": "function",
          "signature": "createWeldConstraint(initial)",
          "summary": "Create a new WeldConstraint component"
        },
        {
          "name": "createWeld",
          "kind": "function",
          "signature": "createWeld(parentEntityId, childEntityId, options = {})",
          "summary": "Create a weld constraint between two entities"
        },
        {
          "name": "isValidWeld",
          "kind": "function",
          "signature": "isValidWeld(weld)",
          "summary": "Check if a weld constraint is valid"
        },
        {
          "name": "breakWeld",
          "kind": "function",
          "signature": "breakWeld(weld)",
          "summary": "Mark a weld as broken"
        },
        {
          "name": "WeldConstraintDefinition",
          "kind": "constant",
          "signature": "WeldConstraintDefinition",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/prefabs/PrefabRegistry",
      "path": "engine/reference/ecs/prefabs/PrefabRegistry.md",
      "source": "engine/ecs/prefabs/PrefabRegistry.js",
      "import": "/engine/ecs/prefabs/PrefabRegistry.js",
      "sourceHash": "8feaa467513f1ff392a44a9152aabd1843aa293222df835d97bcc64b2dafd914",
      "summary": "PrefabRegistry - Runtime prefab system for entity templates Prefabs define reusable entity configurations including: - Default components - Geometry data - Collider configuration - Visual properties The editor uses spawnables which extend this with spawn UI logic. Runtime uses prefabs directly for instantiation.",
      "exports": [
        {
          "name": "registerPrefab",
          "kind": "function",
          "signature": "registerPrefab(id, definition)",
          "summary": "Register a prefab"
        },
        {
          "name": "getPrefab",
          "kind": "function",
          "signature": "getPrefab(id)",
          "summary": "Get a prefab by ID"
        },
        {
          "name": "getAllPrefabs",
          "kind": "function",
          "signature": "getAllPrefabs()",
          "summary": "Get all registered prefabs"
        },
        {
          "name": "getPrefabsByCategory",
          "kind": "function",
          "signature": "getPrefabsByCategory(category)",
          "summary": "Get prefabs by category"
        },
        {
          "name": "instantiatePrefab",
          "kind": "function",
          "signature": "instantiatePrefab(id, overrides = {})",
          "summary": "Instantiate a prefab into components"
        },
        {
          "name": "clearPrefabs",
          "kind": "function",
          "signature": "clearPrefabs()",
          "summary": "Clear all prefabs (for testing)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/prefabs/index",
      "path": "engine/reference/ecs/prefabs/index.md",
      "source": "engine/ecs/prefabs/index.js",
      "import": "/engine/ecs/prefabs/index.js",
      "sourceHash": "5a267fb89a0a9ced984bde99b265cfa48a9d41aa1d626faa99652438157f69ca",
      "summary": "Prefab System - Runtime entity templates",
      "exports": [
        {
          "name": "clearPrefabs",
          "kind": "re-export",
          "signature": "clearPrefabs",
          "summary": ""
        },
        {
          "name": "getAllPrefabs",
          "kind": "re-export",
          "signature": "getAllPrefabs",
          "summary": ""
        },
        {
          "name": "getPrefab",
          "kind": "re-export",
          "signature": "getPrefab",
          "summary": ""
        },
        {
          "name": "getPrefabsByCategory",
          "kind": "re-export",
          "signature": "getPrefabsByCategory",
          "summary": ""
        },
        {
          "name": "instantiatePrefab",
          "kind": "re-export",
          "signature": "instantiatePrefab",
          "summary": ""
        },
        {
          "name": "registerPrefab",
          "kind": "re-export",
          "signature": "registerPrefab",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/query/Query",
      "path": "engine/reference/ecs/query/Query.md",
      "source": "engine/ecs/query/Query.js",
      "import": "/engine/ecs/query/Query.js",
      "sourceHash": "8d0393bcf53045a15537c60650dd36e309d73b363eee1baa92aad0231e58b6b1",
      "summary": "",
      "exports": [
        {
          "name": "createQuery",
          "kind": "function",
          "signature": "createQuery(options)",
          "summary": ""
        },
        {
          "name": "forEachEntity",
          "kind": "function",
          "signature": "forEachEntity(world, query, callback)",
          "summary": ""
        },
        {
          "name": "getQueryDebugSnapshot",
          "kind": "function",
          "signature": "getQueryDebugSnapshot(world, query)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/replication/ReplicationProfiles",
      "path": "engine/reference/ecs/replication/ReplicationProfiles.md",
      "source": "engine/ecs/replication/ReplicationProfiles.js",
      "import": "/engine/ecs/replication/ReplicationProfiles.js",
      "sourceHash": "fd20614cc73ec7ed47feeaab955a8981d39815dead98671fffbc0b346e335900",
      "summary": "",
      "exports": [
        {
          "name": "defineReplicationProfile",
          "kind": "function",
          "signature": "defineReplicationProfile(name, definition, options = {})",
          "summary": ""
        },
        {
          "name": "getReplicationProfile",
          "kind": "function",
          "signature": "getReplicationProfile(name)",
          "summary": ""
        },
        {
          "name": "listReplicationProfiles",
          "kind": "function",
          "signature": "listReplicationProfiles()",
          "summary": ""
        },
        {
          "name": "resolveReplicationProfile",
          "kind": "function",
          "signature": "resolveReplicationProfile(name, overrides = {})",
          "summary": ""
        },
        {
          "name": "profileAllowsComponent",
          "kind": "function",
          "signature": "profileAllowsComponent(profileOrName, componentName)",
          "summary": ""
        },
        {
          "name": "createReplicationProjection",
          "kind": "function",
          "signature": "createReplicationProjection(netReplicated, components, context = {})",
          "summary": ""
        },
        {
          "name": "REPLICATION_AUTHORITY",
          "kind": "constant",
          "signature": "REPLICATION_AUTHORITY",
          "summary": ""
        },
        {
          "name": "REPLICATION_STRATEGY",
          "kind": "constant",
          "signature": "REPLICATION_STRATEGY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/storage/ArchetypeStorage",
      "path": "engine/reference/ecs/storage/ArchetypeStorage.md",
      "source": "engine/ecs/storage/ArchetypeStorage.js",
      "import": "/engine/ecs/storage/ArchetypeStorage.js",
      "sourceHash": "4d9861178db23867f8c92b3c48f8ea06dfd30810533a54e9255248568c770be8",
      "summary": "Fast path: update an existing component WITHOUT normalization. Use ONLY when the value is already known-valid (e.g., from physics engine output). The entity MUST already have this component — this will NOT add new components. Returns the value if successful, null if entity/component not found.",
      "exports": [
        {
          "name": "createArchetypeStorage",
          "kind": "function",
          "signature": "createArchetypeStorage(world)",
          "summary": ""
        },
        {
          "name": "getArchetypeStorage",
          "kind": "function",
          "signature": "getArchetypeStorage(world)",
          "summary": ""
        },
        {
          "name": "setEntityComponent",
          "kind": "function",
          "signature": "setEntityComponent(world, entityId, componentName, value)",
          "summary": ""
        },
        {
          "name": "setEntityComponentDirect",
          "kind": "function",
          "signature": "setEntityComponentDirect(world, entityId, componentName, value)",
          "summary": "Fast path: update an existing component WITHOUT normalization. Use ONLY when the value is already known-valid (e.g., from physics engine output). The entity MUST already have this component — this will NOT add new components. Returns the value if successful, null if entity/component not found."
        },
        {
          "name": "removeEntityComponent",
          "kind": "function",
          "signature": "removeEntityComponent(world, entityId, componentName)",
          "summary": ""
        },
        {
          "name": "removeEntityFromStorage",
          "kind": "function",
          "signature": "removeEntityFromStorage(world, entityId)",
          "summary": ""
        },
        {
          "name": "getEntityComponent",
          "kind": "function",
          "signature": "getEntityComponent(world, entityId, componentName)",
          "summary": ""
        },
        {
          "name": "getEntityComponentRecord",
          "kind": "function",
          "signature": "getEntityComponentRecord(world, entityId)",
          "summary": ""
        },
        {
          "name": "getArchetypeStorageSnapshot",
          "kind": "function",
          "signature": "getArchetypeStorageSnapshot(world)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/CameraSystem",
      "path": "engine/reference/ecs/systems/CameraSystem.md",
      "source": "engine/ecs/systems/CameraSystem.js",
      "import": "/engine/ecs/systems/CameraSystem.js",
      "sourceHash": "695afb7622e89a7ad7a22a8c14232989f0037471fbf771d56e86da1ff3b37fc8",
      "summary": "",
      "exports": [
        {
          "name": "registerCameraSystem",
          "kind": "function",
          "signature": "registerCameraSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/ClothSystem",
      "path": "engine/reference/ecs/systems/ClothSystem.md",
      "source": "engine/ecs/systems/ClothSystem.js",
      "import": "/engine/ecs/systems/ClothSystem.js",
      "sourceHash": "da58b16f312541cd8a8140e6cbf5eb835602261a56f899dab24e496502eec18e",
      "summary": "",
      "exports": [
        {
          "name": "registerClothSystem",
          "kind": "function",
          "signature": "registerClothSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/FluidDebugSystem",
      "path": "engine/reference/ecs/systems/FluidDebugSystem.md",
      "source": "engine/ecs/systems/FluidDebugSystem.js",
      "import": "/engine/ecs/systems/FluidDebugSystem.js",
      "sourceHash": "7836595eb31d688a76af1506153fc176ec521b5923f8d948c943bfec227ed90e",
      "summary": "",
      "exports": [
        {
          "name": "registerFluidDebugSystem",
          "kind": "function",
          "signature": "registerFluidDebugSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/FluidSystem",
      "path": "engine/reference/ecs/systems/FluidSystem.md",
      "source": "engine/ecs/systems/FluidSystem.js",
      "import": "/engine/ecs/systems/FluidSystem.js",
      "sourceHash": "eadaaf44eeb6b66e281a30985312b900751b5afd7f76ba51abf139cf8d6b7554",
      "summary": "",
      "exports": [
        {
          "name": "registerFluidSystem",
          "kind": "function",
          "signature": "registerFluidSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/NavAgentSystem",
      "path": "engine/reference/ecs/systems/NavAgentSystem.md",
      "source": "engine/ecs/systems/NavAgentSystem.js",
      "import": "/engine/ecs/systems/NavAgentSystem.js",
      "sourceHash": "8517bc7f17d21ea75b99fc393bcb2ce14eeccb9f45a8859ad73414ab14c2ba30",
      "summary": "",
      "exports": [
        {
          "name": "registerNavAgentSystem",
          "kind": "function",
          "signature": "registerNavAgentSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/ParticleDebugSystem",
      "path": "engine/reference/ecs/systems/ParticleDebugSystem.md",
      "source": "engine/ecs/systems/ParticleDebugSystem.js",
      "import": "/engine/ecs/systems/ParticleDebugSystem.js",
      "sourceHash": "65ea67c5f6909715799af6f808c3762d7e858db4d5817b7c3d65cd2e87c3b5b1",
      "summary": "",
      "exports": [
        {
          "name": "registerParticleDebugSystem",
          "kind": "function",
          "signature": "registerParticleDebugSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/ParticleSystem",
      "path": "engine/reference/ecs/systems/ParticleSystem.md",
      "source": "engine/ecs/systems/ParticleSystem.js",
      "import": "/engine/ecs/systems/ParticleSystem.js",
      "sourceHash": "2efe4fa33f76622ce326f75a689d2c6fcd09670231cdd79e754f3a145098b2ae",
      "summary": "",
      "exports": [
        {
          "name": "registerParticleSystem",
          "kind": "function",
          "signature": "registerParticleSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/PerceptionSystem",
      "path": "engine/reference/ecs/systems/PerceptionSystem.md",
      "source": "engine/ecs/systems/PerceptionSystem.js",
      "import": "/engine/ecs/systems/PerceptionSystem.js",
      "sourceHash": "3b2fc98ecd4ea4e301e50f6e32848f8ae36a85b9e80f2197f568a99e80fa02f9",
      "summary": "",
      "exports": [
        {
          "name": "registerPerceptionSystem",
          "kind": "function",
          "signature": "registerPerceptionSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/PhysicsSystem",
      "path": "engine/reference/ecs/systems/PhysicsSystem.md",
      "source": "engine/ecs/systems/PhysicsSystem.js",
      "import": "/engine/ecs/systems/PhysicsSystem.js",
      "sourceHash": "17c569aa87fb2dec5d5dcf0a14bc39adf1c0ce9b205e85854161aa58aeaa942b",
      "summary": "",
      "exports": [
        {
          "name": "registerPhysicsSystem",
          "kind": "function",
          "signature": "registerPhysicsSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/SystemRegistry",
      "path": "engine/reference/ecs/systems/SystemRegistry.md",
      "source": "engine/ecs/systems/SystemRegistry.js",
      "import": "/engine/ecs/systems/SystemRegistry.js",
      "sourceHash": "bc499fa47c96bb2abb096361d69a79ddaf48f038d5b77e215fde1e63cd7790f2",
      "summary": "",
      "exports": [
        {
          "name": "registerSystem",
          "kind": "function",
          "signature": "registerSystem(world, descriptor)",
          "summary": ""
        },
        {
          "name": "unregisterSystem",
          "kind": "function",
          "signature": "unregisterSystem(world, systemOrId)",
          "summary": ""
        },
        {
          "name": "setSystemEnabled",
          "kind": "function",
          "signature": "setSystemEnabled(world, systemOrId, enabled)",
          "summary": ""
        },
        {
          "name": "getRegisteredSystems",
          "kind": "function",
          "signature": "getRegisteredSystems(world)",
          "summary": ""
        },
        {
          "name": "setSystemGroupEnabled",
          "kind": "function",
          "signature": "setSystemGroupEnabled(world, groupName, enabled)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/ThirdPersonCameraSystem",
      "path": "engine/reference/ecs/systems/ThirdPersonCameraSystem.md",
      "source": "engine/ecs/systems/ThirdPersonCameraSystem.js",
      "import": "/engine/ecs/systems/ThirdPersonCameraSystem.js",
      "sourceHash": "c8aeca77bcc912493caddc269d5f730d70722b23db5d306cc4198bda0439afa4",
      "summary": "",
      "exports": [
        {
          "name": "registerThirdPersonCameraSystem",
          "kind": "function",
          "signature": "registerThirdPersonCameraSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/systems/WorldSystem",
      "path": "engine/reference/ecs/systems/WorldSystem.md",
      "source": "engine/ecs/systems/WorldSystem.js",
      "import": "/engine/ecs/systems/WorldSystem.js",
      "sourceHash": "9e1eaad5fcf037e1c26bf67586bddcb0a1caebff0f89f5ec310e226c6be50c4b",
      "summary": "",
      "exports": [
        {
          "name": "registerWorldSystem",
          "kind": "function",
          "signature": "registerWorldSystem(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/world/World",
      "path": "engine/reference/ecs/world/World.md",
      "source": "engine/ecs/world/World.js",
      "import": "/engine/ecs/world/World.js",
      "sourceHash": "ae9cd51a68eb5ac3f84d35847cab849c086c8e1e8ab395771bdddb48df435547",
      "summary": "",
      "exports": [
        {
          "name": "createWorld",
          "kind": "function",
          "signature": "createWorld(options = {})",
          "summary": ""
        },
        {
          "name": "createEntity",
          "kind": "function",
          "signature": "createEntity(world)",
          "summary": ""
        },
        {
          "name": "destroyEntity",
          "kind": "function",
          "signature": "destroyEntity(world, id)",
          "summary": ""
        },
        {
          "name": "isEntityAlive",
          "kind": "function",
          "signature": "isEntityAlive(world, id)",
          "summary": ""
        },
        {
          "name": "getWorldStats",
          "kind": "function",
          "signature": "getWorldStats(world)",
          "summary": ""
        },
        {
          "name": "getWorldDebugSnapshot",
          "kind": "function",
          "signature": "getWorldDebugSnapshot(world, options = {})",
          "summary": ""
        },
        {
          "name": "captureWorldSnapshot",
          "kind": "function",
          "signature": "captureWorldSnapshot(world, options)",
          "summary": ""
        },
        {
          "name": "restoreWorldFromSnapshot",
          "kind": "function",
          "signature": "restoreWorldFromSnapshot(world, snapshot)",
          "summary": ""
        },
        {
          "name": "stepWorld",
          "kind": "function",
          "signature": "stepWorld(world, deltaSeconds)",
          "summary": ""
        },
        {
          "name": "stepWorldFrame",
          "kind": "function",
          "signature": "stepWorldFrame(world, deltaSeconds)",
          "summary": ""
        },
        {
          "name": "debugDecodeEntityId",
          "kind": "function",
          "signature": "debugDecodeEntityId(id)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/world/WorldPersistence",
      "path": "engine/reference/ecs/world/WorldPersistence.md",
      "source": "engine/ecs/world/WorldPersistence.js",
      "import": "/engine/ecs/world/WorldPersistence.js",
      "sourceHash": "1b9a4e02a4dc71814a30f77d22b27145b999a68c60d226a2187e24408be0f871",
      "summary": "",
      "exports": [
        {
          "name": "createWorldSavePayload",
          "kind": "function",
          "signature": "createWorldSavePayload(world, options = {})",
          "summary": ""
        },
        {
          "name": "restoreWorldFromSavePayload",
          "kind": "function",
          "signature": "restoreWorldFromSavePayload(world, payload, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/ai/InstinctGraph",
      "path": "engine/reference/gameplay/ai/InstinctGraph.md",
      "source": "engine/gameplay/ai/InstinctGraph.js",
      "import": "/engine/gameplay/ai/InstinctGraph.js",
      "sourceHash": "e3f49ca87ab1e2118e6b312c680c1826494f2e8749d2a321d1ee4f341cd935f3",
      "summary": "",
      "exports": [
        {
          "name": "InstinctGraph",
          "kind": "class",
          "signature": "class InstinctGraph",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/ai/NPCBrain",
      "path": "engine/reference/gameplay/ai/NPCBrain.md",
      "source": "engine/gameplay/ai/NPCBrain.js",
      "import": "/engine/gameplay/ai/NPCBrain.js",
      "sourceHash": "380ee5aae14fb3b9efa2ade1e794ef8c3fbc46dcf04aebcf2638d326e230b690",
      "summary": "NPCBrain — Tiny JavaScript brain for each NPC. Inputs feed drives. The strongest LEGAL drive wins (RuleGraph filters). Memory changes the weights over time. Drives: fight, flee, protect, steal, obey, betray, comfort, digBuild, follow, reportCrime",
      "exports": [
        {
          "name": "NPCBrain",
          "kind": "class",
          "signature": "class NPCBrain",
          "summary": ""
        },
        {
          "name": "DriveType",
          "kind": "constant",
          "signature": "DriveType",
          "summary": "NPCBrain — Tiny JavaScript brain for each NPC. Inputs feed drives. The strongest LEGAL drive wins (RuleGraph filters). Memory changes the weights over time. Drives: fight, flee, protect, steal, obey, betray, comfort, digBuild, follow, reportCrime"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/ai/index",
      "path": "engine/reference/gameplay/ai/index.md",
      "source": "engine/gameplay/ai/index.js",
      "import": "/engine/gameplay/ai/index.js",
      "sourceHash": "91b8a4123333cce75a789d28d43dc72425d9946e07a265388eed026ed81631c6",
      "summary": "",
      "exports": [
        {
          "name": "DriveType",
          "kind": "re-export",
          "signature": "DriveType",
          "summary": ""
        },
        {
          "name": "InstinctGraph",
          "kind": "re-export",
          "signature": "InstinctGraph",
          "summary": ""
        },
        {
          "name": "NPCBrain",
          "kind": "re-export",
          "signature": "NPCBrain",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/events/EventGraph",
      "path": "engine/reference/gameplay/events/EventGraph.md",
      "source": "engine/gameplay/events/EventGraph.js",
      "import": "/engine/gameplay/events/EventGraph.js",
      "sourceHash": "fb3c16fb62bb6fdab4f74ad772010899c6df6143f1fbb33167f33f242b905081",
      "summary": "EventGraph — The event bus and event log for LIFE. Every meaningful thing in the world becomes an event. Events power: memories, dialogue, reputation, crimes, family history, item souls, resolve changes, and storylet triggers. Events are immutable once created. The log is append-only. Listeners can subscribe to event types or use wildcard '*'.",
      "exports": [
        {
          "name": "EventGraph",
          "kind": "class",
          "signature": "class EventGraph",
          "summary": "EventGraph — global event bus + per-entity event logs."
        },
        {
          "name": "createEvent",
          "kind": "function",
          "signature": "createEvent(config)",
          "summary": "Creates an immutable event object."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/events/index",
      "path": "engine/reference/gameplay/events/index.md",
      "source": "engine/gameplay/events/index.js",
      "import": "/engine/gameplay/events/index.js",
      "sourceHash": "04097b1bef98c583344c7acb44c772b613ba03e153a12762cc0e7631b65b1e0d",
      "summary": "",
      "exports": [
        {
          "name": "EventGraph",
          "kind": "re-export",
          "signature": "EventGraph",
          "summary": ""
        },
        {
          "name": "createEvent",
          "kind": "re-export",
          "signature": "createEvent",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/inventory/Inventory",
      "path": "engine/reference/gameplay/inventory/Inventory.md",
      "source": "engine/gameplay/inventory/Inventory.js",
      "import": "/engine/gameplay/inventory/Inventory.js",
      "sourceHash": "7b0319de588145541bb74705c0e10e90b58c9e9715f0116ad07a7bf113d5ed3f",
      "summary": "",
      "exports": [
        {
          "name": "Inventory",
          "kind": "class",
          "signature": "class Inventory",
          "summary": ""
        },
        {
          "name": "defaultResolveEquipSlot",
          "kind": "function",
          "signature": "defaultResolveEquipSlot(itemData)",
          "summary": ""
        },
        {
          "name": "createInventory",
          "kind": "function",
          "signature": "createInventory(maxSlots, options)",
          "summary": ""
        },
        {
          "name": "EquipSlot",
          "kind": "constant",
          "signature": "EquipSlot",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/inventory/index",
      "path": "engine/reference/gameplay/inventory/index.md",
      "source": "engine/gameplay/inventory/index.js",
      "import": "/engine/gameplay/inventory/index.js",
      "sourceHash": "6b355e89862004a11957f4dce6c669b8a2d3e7dade3978ee898162536bddd4b6",
      "summary": "",
      "exports": [
        {
          "name": "EquipSlot",
          "kind": "re-export",
          "signature": "EquipSlot",
          "summary": ""
        },
        {
          "name": "Inventory",
          "kind": "re-export",
          "signature": "Inventory",
          "summary": ""
        },
        {
          "name": "createInventory",
          "kind": "re-export",
          "signature": "createInventory",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        },
        {
          "name": "defaultResolveEquipSlot",
          "kind": "re-export",
          "signature": "defaultResolveEquipSlot",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/items/ItemOwnership",
      "path": "engine/reference/gameplay/items/ItemOwnership.md",
      "source": "engine/gameplay/items/ItemOwnership.js",
      "import": "/engine/gameplay/items/ItemOwnership.js",
      "sourceHash": "b62ba607a847d7ddf95f786d9a2102bca0d5d2b6ba3fa8c4b041e915b4731e0c",
      "summary": "ItemOwnership — Tracks who owns what, detects theft, handles transfers.",
      "exports": [
        {
          "name": "ItemOwnership",
          "kind": "class",
          "signature": "class ItemOwnership",
          "summary": ""
        },
        {
          "name": "createOwnedItem",
          "kind": "function",
          "signature": "createOwnedItem(config)",
          "summary": ""
        },
        {
          "name": "TransferType",
          "kind": "constant",
          "signature": "TransferType",
          "summary": "ItemOwnership — Tracks who owns what, detects theft, handles transfers."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/items/ItemSoulSystem",
      "path": "engine/reference/gameplay/items/ItemSoulSystem.md",
      "source": "engine/gameplay/items/ItemSoulSystem.js",
      "import": "/engine/gameplay/items/ItemSoulSystem.js",
      "sourceHash": "ef9c5771d1798031d9788d8446ce72761497685de5828dc4c1b9ebc4b2b10270",
      "summary": "ItemSoulSystem — Items slowly gain souls through history. Stages: Normal → Remembered → Resonant → Awakened → Talking → Contract Item Soul growth triggers: named, used often, saved someone, repaired many times, inherited, used in major battles, exposed to domains, part of a contract, emotionally important, connected to death/rescue/betrayal/redemption.",
      "exports": [
        {
          "name": "ItemSoulSystem",
          "kind": "class",
          "signature": "class ItemSoulSystem",
          "summary": ""
        },
        {
          "name": "SoulStage",
          "kind": "constant",
          "signature": "SoulStage",
          "summary": "ItemSoulSystem — Items slowly gain souls through history. Stages: Normal → Remembered → Resonant → Awakened → Talking → Contract Item Soul growth triggers: named, used often, saved someone, repaired many times, inherited, used in major battles, exposed to domains, part of a contract, emotionally important, connected to death/rescue/betrayal/redemption."
        },
        {
          "name": "SOUL_STAGE_NAMES",
          "kind": "constant",
          "signature": "SOUL_STAGE_NAMES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/items/index",
      "path": "engine/reference/gameplay/items/index.md",
      "source": "engine/gameplay/items/index.js",
      "import": "/engine/gameplay/items/index.js",
      "sourceHash": "5d574ddaa25664dadf5a2fef3c01f15e2d0228b06ffc9e7da7f74c7389474f34",
      "summary": "",
      "exports": [
        {
          "name": "ItemOwnership",
          "kind": "re-export",
          "signature": "ItemOwnership",
          "summary": ""
        },
        {
          "name": "ItemSoulSystem",
          "kind": "re-export",
          "signature": "ItemSoulSystem",
          "summary": ""
        },
        {
          "name": "SOUL_STAGE_NAMES",
          "kind": "re-export",
          "signature": "SOUL_STAGE_NAMES",
          "summary": ""
        },
        {
          "name": "SoulStage",
          "kind": "re-export",
          "signature": "SoulStage",
          "summary": ""
        },
        {
          "name": "TransferType",
          "kind": "re-export",
          "signature": "TransferType",
          "summary": ""
        },
        {
          "name": "createOwnedItem",
          "kind": "re-export",
          "signature": "createOwnedItem",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/BackgroundMatcher",
      "path": "engine/reference/gameplay/narrative/BackgroundMatcher.md",
      "source": "engine/gameplay/narrative/BackgroundMatcher.js",
      "import": "/engine/gameplay/narrative/BackgroundMatcher.js",
      "sourceHash": "671b84924877d94019feecd39d644b2af81cf099ddc382040dc9a39e896f1e76",
      "summary": "BackgroundMatcher — Extracts origin tags from player-written background text. The player types a \"soul memory\" and the system extracts semantic tags that drive world generation: family type, culture, social status, early hardships, resolve seeds, and starting storylets. Uses keyword/phrase matching with weighted scoring. No heavy ML needed for the first playable — just pattern matching with synonyms.",
      "exports": [
        {
          "name": "extractOriginTags",
          "kind": "function",
          "signature": "extractOriginTags(text)",
          "summary": "Extract origin tags from player-written background text."
        },
        {
          "name": "mapTagsToOrigin",
          "kind": "function",
          "signature": "mapTagsToOrigin(tagResult)",
          "summary": "Map extracted tags to world generation parameters."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/DialogueSystem",
      "path": "engine/reference/gameplay/narrative/DialogueSystem.md",
      "source": "engine/gameplay/narrative/DialogueSystem.js",
      "import": "/engine/gameplay/narrative/DialogueSystem.js",
      "sourceHash": "a5580ae0cea0b3eae85580ddb165bdba50dfdee8123ed08abd2de89c46a11b90",
      "summary": "DialogueSystem — Dynamic narrative template system. Pipeline: event → intent → template → mood → voice layer → relationship tone → final line NPC speech uses templates, not generative AI. The voice layer changes sentence length, glue words, confidence, politeness, swearing, emotional intensity.",
      "exports": [
        {
          "name": "DialogueSystem",
          "kind": "class",
          "signature": "class DialogueSystem",
          "summary": ""
        },
        {
          "name": "VoiceStyle",
          "kind": "constant",
          "signature": "VoiceStyle",
          "summary": "DialogueSystem — Dynamic narrative template system. Pipeline: event → intent → template → mood → voice layer → relationship tone → final line NPC speech uses templates, not generative AI. The voice layer changes sentence length, glue words, confidence, politeness, swearing, emotional intensity."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/DialogueTree",
      "path": "engine/reference/gameplay/narrative/DialogueTree.md",
      "source": "engine/gameplay/narrative/DialogueTree.js",
      "import": "/engine/gameplay/narrative/DialogueTree.js",
      "sourceHash": "45a9de51618888f22958a9be07e9ec14538c6d8d3d129f537bff31427ae0fe4b",
      "summary": "DialogueRunner — Executes a dialogue tree, manages state, and produces UI output.",
      "exports": [
        {
          "name": "DialogueRunner",
          "kind": "class",
          "signature": "class DialogueRunner",
          "summary": "DialogueRunner — Executes a dialogue tree, manages state, and produces UI output."
        },
        {
          "name": "node",
          "kind": "function",
          "signature": "node(type, data)",
          "summary": "Create a dialogue node."
        },
        {
          "name": "textNode",
          "kind": "function",
          "signature": "textNode(speaker, text, next)",
          "summary": "Shorthand builders."
        },
        {
          "name": "choiceNode",
          "kind": "function",
          "signature": "choiceNode(prompt, choices)",
          "summary": ""
        },
        {
          "name": "branchNode",
          "kind": "function",
          "signature": "branchNode(variable, branches, fallback)",
          "summary": ""
        },
        {
          "name": "setNode",
          "kind": "function",
          "signature": "setNode(variable, value, next)",
          "summary": ""
        },
        {
          "name": "endNode",
          "kind": "function",
          "signature": "endNode(action)",
          "summary": ""
        },
        {
          "name": "NodeType",
          "kind": "constant",
          "signature": "NodeType",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/LifePhases",
      "path": "engine/reference/gameplay/narrative/LifePhases.md",
      "source": "engine/gameplay/narrative/LifePhases.js",
      "import": "/engine/gameplay/narrative/LifePhases.js",
      "sourceHash": "ff0851c9a8188b08b67e4bf57a8192936cd46709432254b730482bb43ba08fb2",
      "summary": "LifePhases — Controls the origin sequence: birth → childhood → crisis → youth → main game. Each phase runs a sequence of events and storylets, then transitions to the next. The player watches/interacts through text during early phases, then gains full control at Youth.",
      "exports": [
        {
          "name": "LifePhases",
          "kind": "class",
          "signature": "class LifePhases",
          "summary": ""
        },
        {
          "name": "Phase",
          "kind": "constant",
          "signature": "Phase",
          "summary": "LifePhases — Controls the origin sequence: birth → childhood → crisis → youth → main game. Each phase runs a sequence of events and storylets, then transitions to the next. The player watches/interacts through text during early phases, then gains full control at Youth."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/OriginGenerator",
      "path": "engine/reference/gameplay/narrative/OriginGenerator.md",
      "source": "engine/gameplay/narrative/OriginGenerator.js",
      "import": "/engine/gameplay/narrative/OriginGenerator.js",
      "sourceHash": "3afbfb507476636365d4150eda680d1e04b6b7ca01ca71babeedc507e1bb9678",
      "summary": "Generate a full origin from mapped tags.",
      "exports": [
        {
          "name": "generateOrigin",
          "kind": "function",
          "signature": "generateOrigin(origin, suggestedName)",
          "summary": "Generate a full origin from mapped tags."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/SituationGraph",
      "path": "engine/reference/gameplay/narrative/SituationGraph.md",
      "source": "engine/gameplay/narrative/SituationGraph.js",
      "import": "/engine/gameplay/narrative/SituationGraph.js",
      "sourceHash": "d165a53ca11fe62def64c89710c8d65933518977faeaccd80b3dc895b50c925d",
      "summary": "SituationGraph — Selects life pressure situations for the player. Situation buckets: family, survival, crime, faction, power, exploration, social, build/dig, item soul, law, domain, revenge, redemption. Chooses situations based on player background, family state, location, NPC relationships, faction reputation, active crimes, wealth, danger, resolve path, recent failures/victories.",
      "exports": [
        {
          "name": "SituationGraph",
          "kind": "class",
          "signature": "class SituationGraph",
          "summary": ""
        },
        {
          "name": "SituationBucket",
          "kind": "constant",
          "signature": "SituationBucket",
          "summary": "SituationGraph — Selects life pressure situations for the player. Situation buckets: family, survival, crime, faction, power, exploration, social, build/dig, item soul, law, domain, revenge, redemption. Chooses situations based on player background, family state, location, NPC relationships, faction reputation, active crimes, wealth, danger, resolve path, recent failures/victories."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/StoryGraph",
      "path": "engine/reference/gameplay/narrative/StoryGraph.md",
      "source": "engine/gameplay/narrative/StoryGraph.js",
      "import": "/engine/gameplay/narrative/StoryGraph.js",
      "sourceHash": "0f44ada44637fa6bde6b879b1cef17ed6d8cbb9f55151accc809254395749168",
      "summary": "StoryGraph — Storylet engine for LIFE. Stories are storylets, not one fixed script. A storylet is a small reusable story event that triggers when conditions are true. Each storylet has: trigger conditions, cast, stakes, choices, consequences, memories, and graph updates.",
      "exports": [
        {
          "name": "StoryGraph",
          "kind": "class",
          "signature": "class StoryGraph",
          "summary": ""
        },
        {
          "name": "createStorylet",
          "kind": "function",
          "signature": "createStorylet(config)",
          "summary": "Create a storylet definition."
        },
        {
          "name": "StoryletRarity",
          "kind": "constant",
          "signature": "StoryletRarity",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/WorldDirector",
      "path": "engine/reference/gameplay/narrative/WorldDirector.md",
      "source": "engine/gameplay/narrative/WorldDirector.js",
      "import": "/engine/gameplay/narrative/WorldDirector.js",
      "sourceHash": "3d99037389e388a6639ae3978554f1f80454a6a7831f96fccfe5b3a81ad506df",
      "summary": "WorldDirector — Controls pacing and selects world events. Watches: player stress, supplies, family conflict, recent fights, deaths, victories, crew size, base strength, faction anger, unresolved crimes, resolve growth, domain activity. Selects events to create: pressure → relief → pressure → consequence. Not constant chaos.",
      "exports": [
        {
          "name": "WorldDirector",
          "kind": "class",
          "signature": "class WorldDirector",
          "summary": ""
        },
        {
          "name": "DirectorEventType",
          "kind": "constant",
          "signature": "DirectorEventType",
          "summary": "WorldDirector — Controls pacing and selects world events. Watches: player stress, supplies, family conflict, recent fights, deaths, victories, crew size, base strength, faction anger, unresolved crimes, resolve growth, domain activity. Selects events to create: pressure → relief → pressure → consequence. Not constant chaos."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/index",
      "path": "engine/reference/gameplay/narrative/index.md",
      "source": "engine/gameplay/narrative/index.js",
      "import": "/engine/gameplay/narrative/index.js",
      "sourceHash": "dabd9070596d5a2353c65479a505874df568d3c17a34ec0faa48dacc608fbc3f",
      "summary": "",
      "exports": [
        {
          "name": "CORE_STORYLETS",
          "kind": "re-export",
          "signature": "CORE_STORYLETS",
          "summary": ""
        },
        {
          "name": "DialogueRunner",
          "kind": "re-export",
          "signature": "DialogueRunner",
          "summary": ""
        },
        {
          "name": "DialogueSystem",
          "kind": "re-export",
          "signature": "DialogueSystem",
          "summary": ""
        },
        {
          "name": "DirectorEventType",
          "kind": "re-export",
          "signature": "DirectorEventType",
          "summary": ""
        },
        {
          "name": "LifePhases",
          "kind": "re-export",
          "signature": "LifePhases",
          "summary": ""
        },
        {
          "name": "NodeType",
          "kind": "re-export",
          "signature": "NodeType",
          "summary": ""
        },
        {
          "name": "Phase",
          "kind": "re-export",
          "signature": "Phase",
          "summary": ""
        },
        {
          "name": "SituationBucket",
          "kind": "re-export",
          "signature": "SituationBucket",
          "summary": ""
        },
        {
          "name": "SituationGraph",
          "kind": "re-export",
          "signature": "SituationGraph",
          "summary": ""
        },
        {
          "name": "StoryGraph",
          "kind": "re-export",
          "signature": "StoryGraph",
          "summary": ""
        },
        {
          "name": "StoryletRarity",
          "kind": "re-export",
          "signature": "StoryletRarity",
          "summary": ""
        },
        {
          "name": "VoiceStyle",
          "kind": "re-export",
          "signature": "VoiceStyle",
          "summary": ""
        },
        {
          "name": "WorldDirector",
          "kind": "re-export",
          "signature": "WorldDirector",
          "summary": ""
        },
        {
          "name": "branchNode",
          "kind": "re-export",
          "signature": "branchNode",
          "summary": ""
        },
        {
          "name": "choiceNode",
          "kind": "re-export",
          "signature": "choiceNode",
          "summary": ""
        },
        {
          "name": "createStorylet",
          "kind": "re-export",
          "signature": "createStorylet",
          "summary": ""
        },
        {
          "name": "endNode",
          "kind": "re-export",
          "signature": "endNode",
          "summary": ""
        },
        {
          "name": "extractOriginTags",
          "kind": "re-export",
          "signature": "extractOriginTags",
          "summary": ""
        },
        {
          "name": "generateOrigin",
          "kind": "re-export",
          "signature": "generateOrigin",
          "summary": ""
        },
        {
          "name": "mapTagsToOrigin",
          "kind": "re-export",
          "signature": "mapTagsToOrigin",
          "summary": ""
        },
        {
          "name": "node",
          "kind": "re-export",
          "signature": "node",
          "summary": ""
        },
        {
          "name": "setNode",
          "kind": "re-export",
          "signature": "setNode",
          "summary": ""
        },
        {
          "name": "textNode",
          "kind": "re-export",
          "signature": "textNode",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/narrative/storylets/core_storylets",
      "path": "engine/reference/gameplay/narrative/storylets/core_storylets.md",
      "source": "engine/gameplay/narrative/storylets/core_storylets.js",
      "import": "/engine/gameplay/narrative/storylets/core_storylets.js",
      "sourceHash": "9a62e0aca86c8fc44009f8170d566c27dcb1e92b13a5c1a69c866a099ef68e79",
      "summary": "Core Storylet Library — Initial content for the StoryGraph. Each storylet has trigger conditions, cast selection, and execution logic.",
      "exports": [
        {
          "name": "CORE_STORYLETS",
          "kind": "constant",
          "signature": "CORE_STORYLETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/perception/PerceptionGraph",
      "path": "engine/reference/gameplay/perception/PerceptionGraph.md",
      "source": "engine/gameplay/perception/PerceptionGraph.js",
      "import": "/engine/gameplay/perception/PerceptionGraph.js",
      "sourceHash": "00357cacb6128252042654b842e4c232883a97a4116bad9894f22be7cbfe2b94",
      "summary": "PerceptionGraph — Controls what the player can perceive about NPCs. NPCs have hidden truth. The player sees tags based on perception skill, distance, lighting, relationship, NPC deception, disguise, and domain effects. Tags can be WRONG if the NPC is good at hiding.",
      "exports": [
        {
          "name": "PerceptionGraph",
          "kind": "class",
          "signature": "class PerceptionGraph",
          "summary": ""
        },
        {
          "name": "PerceptionLevel",
          "kind": "constant",
          "signature": "PerceptionLevel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/perception/index",
      "path": "engine/reference/gameplay/perception/index.md",
      "source": "engine/gameplay/perception/index.js",
      "import": "/engine/gameplay/perception/index.js",
      "sourceHash": "cabc4a1aceb6fc8472f11d955823c7fd395314632d8bbe0ef60f45755ab560db",
      "summary": "",
      "exports": [
        {
          "name": "PerceptionGraph",
          "kind": "re-export",
          "signature": "PerceptionGraph",
          "summary": ""
        },
        {
          "name": "PerceptionLevel",
          "kind": "re-export",
          "signature": "PerceptionLevel",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/progression/ContractSystem",
      "path": "engine/reference/gameplay/progression/ContractSystem.md",
      "source": "engine/gameplay/progression/ContractSystem.js",
      "import": "/engine/gameplay/progression/ContractSystem.js",
      "sourceHash": "8ae80725a5c41eeb6a0dbc4fd6f5075b954b0b9972f711a1e6770256e0e246a4",
      "summary": "",
      "exports": [
        {
          "name": "ContractSystem",
          "kind": "class",
          "signature": "class ContractSystem",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/progression/DomainGraph",
      "path": "engine/reference/gameplay/progression/DomainGraph.md",
      "source": "engine/gameplay/progression/DomainGraph.js",
      "import": "/engine/gameplay/progression/DomainGraph.js",
      "sourceHash": "b5640c030635be785a7c9e3e44b9c00c45da36def79d5b0aff580712ea5d7416",
      "summary": "DomainGraph — Local rule overrides. A domain is a personal law forced onto an area. Domains are rare and earned. They modify rules within a radius, cost stamina/resolve to maintain, and have weaknesses and failure conditions. Domain rules are priority 8 in RuleGraph — they can override local reality but not engine safety or physics.",
      "exports": [
        {
          "name": "DomainGraph",
          "kind": "class",
          "signature": "class DomainGraph",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/progression/PowerGraph",
      "path": "engine/reference/gameplay/progression/PowerGraph.md",
      "source": "engine/gameplay/progression/PowerGraph.js",
      "import": "/engine/gameplay/progression/PowerGraph.js",
      "sourceHash": "0b2fbe1724948d35f8b2490350ee1f61a7c3e25db85dd313c18fc9d84c49f1b4",
      "summary": "",
      "exports": [
        {
          "name": "PowerGraph",
          "kind": "class",
          "signature": "class PowerGraph",
          "summary": ""
        },
        {
          "name": "createPower",
          "kind": "function",
          "signature": "createPower(config)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/progression/ResolveSystem",
      "path": "engine/reference/gameplay/progression/ResolveSystem.md",
      "source": "engine/gameplay/progression/ResolveSystem.js",
      "import": "/engine/gameplay/progression/ResolveSystem.js",
      "sourceHash": "da1f1137044f68962a192858d2d51303318721fdb1b32ed9d59a69be5298c313",
      "summary": "",
      "exports": [
        {
          "name": "ResolveSystem",
          "kind": "class",
          "signature": "class ResolveSystem",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/progression/index",
      "path": "engine/reference/gameplay/progression/index.md",
      "source": "engine/gameplay/progression/index.js",
      "import": "/engine/gameplay/progression/index.js",
      "sourceHash": "d672cec2fe6045ec6baa8fad828da44089d905e1b4c7a40956afd654adb77f98",
      "summary": "",
      "exports": [
        {
          "name": "ContractSystem",
          "kind": "re-export",
          "signature": "ContractSystem",
          "summary": ""
        },
        {
          "name": "DomainGraph",
          "kind": "re-export",
          "signature": "DomainGraph",
          "summary": ""
        },
        {
          "name": "PowerGraph",
          "kind": "re-export",
          "signature": "PowerGraph",
          "summary": ""
        },
        {
          "name": "ResolveSystem",
          "kind": "re-export",
          "signature": "ResolveSystem",
          "summary": ""
        },
        {
          "name": "createPower",
          "kind": "re-export",
          "signature": "createPower",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/rules/RuleGraph",
      "path": "engine/reference/gameplay/rules/RuleGraph.md",
      "source": "engine/gameplay/rules/RuleGraph.js",
      "import": "/engine/gameplay/rules/RuleGraph.js",
      "sourceHash": "8014bcdfe1b098cadf7b966ccb6e87d350b71bdf56a508e9792d13f1b8e40c3d",
      "summary": "RuleGraph — The master rule resolver for LIFE. Everything in the world passes through RuleGraph to decide what is legal. Rules have priorities (1=highest), conditions, effects, and sources. When rules conflict, the highest priority wins. Ties break by specificity. Priority levels: 1 = Engine safety (cannot crash the game) 2 = Physics / material (fire burns wood) 3 = Survival / body (hunger kills) 4 = World rules (gravity, time) 5 = Law / faction (city forbids theft) 6 = Item rules (sword needs two hands) 7 = Contract rules (guardian vow restricts solo fighting) 8 = Domain rules (domain overrides local reality) 9 = Temporary status / visual (buff, aura, particle effect)",
      "exports": [
        {
          "name": "RuleGraph",
          "kind": "class",
          "signature": "class RuleGraph",
          "summary": "RuleGraph — singleton-style rule management and resolution."
        },
        {
          "name": "createRule",
          "kind": "function",
          "signature": "createRule(config)",
          "summary": "Creates a new rule object."
        },
        {
          "name": "RuleCategory",
          "kind": "constant",
          "signature": "RuleCategory",
          "summary": ""
        },
        {
          "name": "RuleEffect",
          "kind": "constant",
          "signature": "RuleEffect",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/rules/index",
      "path": "engine/reference/gameplay/rules/index.md",
      "source": "engine/gameplay/rules/index.js",
      "import": "/engine/gameplay/rules/index.js",
      "sourceHash": "452f3a40c249e728bd436cefb8f61e72fc455c970f7698f248c3c635ce0f7b52",
      "summary": "",
      "exports": [
        {
          "name": "RuleCategory",
          "kind": "re-export",
          "signature": "RuleCategory",
          "summary": ""
        },
        {
          "name": "RuleEffect",
          "kind": "re-export",
          "signature": "RuleEffect",
          "summary": ""
        },
        {
          "name": "RuleGraph",
          "kind": "re-export",
          "signature": "RuleGraph",
          "summary": ""
        },
        {
          "name": "createRule",
          "kind": "re-export",
          "signature": "createRule",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/simulation/SimulationManager",
      "path": "engine/reference/gameplay/simulation/SimulationManager.md",
      "source": "engine/gameplay/simulation/SimulationManager.js",
      "import": "/engine/gameplay/simulation/SimulationManager.js",
      "sourceHash": "c79d82c746d0aa692499661e9156a79f6cf48831cba7f41a94bfe5ced3052217",
      "summary": "SimulationManager — Controls simulation levels for all entities. Active:  Near player — full behavior, every tick Warm:    Same town — slower updates, simplified drives Cold:    Far away — daily summary simulation Frozen:  No updates until touched by event Transition triggers: player proximity, event targeting, faction actions.",
      "exports": [
        {
          "name": "SimulationManager",
          "kind": "class",
          "signature": "class SimulationManager",
          "summary": ""
        },
        {
          "name": "SimLevel",
          "kind": "constant",
          "signature": "SimLevel",
          "summary": "SimulationManager — Controls simulation levels for all entities. Active:  Near player — full behavior, every tick Warm:    Same town — slower updates, simplified drives Cold:    Far away — daily summary simulation Frozen:  No updates until touched by event Transition triggers: player proximity, event targeting, faction actions."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/simulation/index",
      "path": "engine/reference/gameplay/simulation/index.md",
      "source": "engine/gameplay/simulation/index.js",
      "import": "/engine/gameplay/simulation/index.js",
      "sourceHash": "8d45bbf80e2a8299b5592a71ef18e868dc9f95e324009d34d7080bb30a5e6fd7",
      "summary": "",
      "exports": [
        {
          "name": "SimLevel",
          "kind": "re-export",
          "signature": "SimLevel",
          "summary": ""
        },
        {
          "name": "SimulationManager",
          "kind": "re-export",
          "signature": "SimulationManager",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/social/SoulGraph",
      "path": "engine/reference/gameplay/social/SoulGraph.md",
      "source": "engine/gameplay/social/SoulGraph.js",
      "import": "/engine/gameplay/social/SoulGraph.js",
      "sourceHash": "d36fe14946ff800f603c9f7f5fe0f83ddc8736e2265d6fe54e57a22903841300",
      "summary": "SoulGraph — The social nervous system of the world. Each NPC is a \"neuron\" node. Relationships are weighted edges. Events are signals. Mood is activation state. Memory is weight change. Actions are outputs. The graph propagates influence through connections. NPC = soul node Relationship = weighted edge (trust, fear, love, hate, loyalty, resentment, familiarity) Event = signal Mood = activation state Memory = weight change Action = output",
      "exports": [
        {
          "name": "SoulGraph",
          "kind": "class",
          "signature": "class SoulGraph",
          "summary": "SoulGraph — The social nervous system of the world. Each NPC is a \"neuron\" node. Relationships are weighted edges. Events are signals. Mood is activation state. Memory is weight change. Actions are outputs. The graph propagates influence through connections. NPC = soul node Relationship = weighted edge (trust, fear, love, hate, loyalty, resentment, familiarity) Event = signal Mood = activation state Memory = weight change Action = output"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/social/SoulGraphMessaging",
      "path": "engine/reference/gameplay/social/SoulGraphMessaging.md",
      "source": "engine/gameplay/social/SoulGraphMessaging.js",
      "import": "/engine/gameplay/social/SoulGraphMessaging.js",
      "sourceHash": "687588af365ade04ad8bcdaa7cf6c666b3f99b5e160fa46e48639909629093cd",
      "summary": "Create a message.",
      "exports": [
        {
          "name": "SoulGraphMessaging",
          "kind": "class",
          "signature": "class SoulGraphMessaging",
          "summary": ""
        },
        {
          "name": "createMessage",
          "kind": "function",
          "signature": "createMessage(config)",
          "summary": "Create a message."
        },
        {
          "name": "MessageChannel",
          "kind": "constant",
          "signature": "MessageChannel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/social/index",
      "path": "engine/reference/gameplay/social/index.md",
      "source": "engine/gameplay/social/index.js",
      "import": "/engine/gameplay/social/index.js",
      "sourceHash": "b0a08d4eb47dc2b52ef63fade7f392df360014adf6f3b94532d226842748a75f",
      "summary": "",
      "exports": [
        {
          "name": "MessageChannel",
          "kind": "re-export",
          "signature": "MessageChannel",
          "summary": ""
        },
        {
          "name": "SoulGraph",
          "kind": "re-export",
          "signature": "SoulGraph",
          "summary": ""
        },
        {
          "name": "SoulGraphMessaging",
          "kind": "re-export",
          "signature": "SoulGraphMessaging",
          "summary": ""
        },
        {
          "name": "createMessage",
          "kind": "re-export",
          "signature": "createMessage",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/society/CitySystem",
      "path": "engine/reference/gameplay/society/CitySystem.md",
      "source": "engine/gameplay/society/CitySystem.js",
      "import": "/engine/gameplay/society/CitySystem.js",
      "sourceHash": "240b5aa53fa67642e9ac641a364fc9edf510af72a69a0ba17ba819c97dce6353",
      "summary": "CitySystem — City templates, population, economy, laws, reputation.",
      "exports": [
        {
          "name": "CitySystem",
          "kind": "class",
          "signature": "class CitySystem",
          "summary": ""
        },
        {
          "name": "createCity",
          "kind": "function",
          "signature": "createCity(config)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/society/FactionGraph",
      "path": "engine/reference/gameplay/society/FactionGraph.md",
      "source": "engine/gameplay/society/FactionGraph.js",
      "import": "/engine/gameplay/society/FactionGraph.js",
      "sourceHash": "6896c515aaeca79b4a55a26930a3d8ff4da28997f5207b66bfc435d95a8b1e9a",
      "summary": "FactionGraph — Group souls with politics, reputation, and actions. Factions track: leader, values, laws, territory, resources, enemies/allies, fear, morale, population, reputation toward player, domain users, crimes, contracts.",
      "exports": [
        {
          "name": "FactionGraph",
          "kind": "class",
          "signature": "class FactionGraph",
          "summary": ""
        },
        {
          "name": "createFaction",
          "kind": "function",
          "signature": "createFaction(config)",
          "summary": ""
        },
        {
          "name": "FactionAction",
          "kind": "constant",
          "signature": "FactionAction",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/society/LawGraph",
      "path": "engine/reference/gameplay/society/LawGraph.md",
      "source": "engine/gameplay/society/LawGraph.js",
      "import": "/engine/gameplay/society/LawGraph.js",
      "sourceHash": "878e0574febe2706730f2196d89ca9cfe3da2768966d83ed028a7b35d7e46bb9",
      "summary": "LawGraph — Crime, witnesses, punishment, and justice. Different cities and factions have different laws. Tracks: witnesses, evidence, suspicion, reputation. Punishment: bounty, exile, prison, revenge, retaliation.",
      "exports": [
        {
          "name": "LawGraph",
          "kind": "class",
          "signature": "class LawGraph",
          "summary": ""
        },
        {
          "name": "createCrimeRecord",
          "kind": "function",
          "signature": "createCrimeRecord(config)",
          "summary": ""
        },
        {
          "name": "CrimeType",
          "kind": "constant",
          "signature": "CrimeType",
          "summary": ""
        },
        {
          "name": "PunishmentType",
          "kind": "constant",
          "signature": "PunishmentType",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/society/index",
      "path": "engine/reference/gameplay/society/index.md",
      "source": "engine/gameplay/society/index.js",
      "import": "/engine/gameplay/society/index.js",
      "sourceHash": "d43c6d90ea93a2eb820515f61fa91bf3833856755a5b1378d39f53d6cb644b0c",
      "summary": "",
      "exports": [
        {
          "name": "CitySystem",
          "kind": "re-export",
          "signature": "CitySystem",
          "summary": ""
        },
        {
          "name": "CrimeType",
          "kind": "re-export",
          "signature": "CrimeType",
          "summary": ""
        },
        {
          "name": "FactionAction",
          "kind": "re-export",
          "signature": "FactionAction",
          "summary": ""
        },
        {
          "name": "FactionGraph",
          "kind": "re-export",
          "signature": "FactionGraph",
          "summary": ""
        },
        {
          "name": "LawGraph",
          "kind": "re-export",
          "signature": "LawGraph",
          "summary": ""
        },
        {
          "name": "PunishmentType",
          "kind": "re-export",
          "signature": "PunishmentType",
          "summary": ""
        },
        {
          "name": "createCity",
          "kind": "re-export",
          "signature": "createCity",
          "summary": ""
        },
        {
          "name": "createCrimeRecord",
          "kind": "re-export",
          "signature": "createCrimeRecord",
          "summary": ""
        },
        {
          "name": "createFaction",
          "kind": "re-export",
          "signature": "createFaction",
          "summary": ""
        },
        {
          "name": "default",
          "kind": "re-export",
          "signature": "default",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/spells/SpellElementMixer",
      "path": "engine/reference/gameplay/spells/SpellElementMixer.md",
      "source": "engine/gameplay/spells/SpellElementMixer.js",
      "import": "/engine/gameplay/spells/SpellElementMixer.js",
      "sourceHash": "d536ca217304ea9db223a4f724a0b19a1dbf360e34973d77caab597f4f20ce0d",
      "summary": "SpellElementMixer.js - Element Combination System Handles mixing two or more elements to create combined/hybrid elements: - Fire + Ice = Steam - Fire + Nature = Ash - Lightning + Water = Electrified - etc. Combined elements have unique visual effects and status effects.",
      "exports": [
        {
          "name": "SpellElementMixer",
          "kind": "class",
          "signature": "class SpellElementMixer",
          "summary": ""
        },
        {
          "name": "getSpellElementMixer",
          "kind": "function",
          "signature": "getSpellElementMixer()",
          "summary": ""
        },
        {
          "name": "mixElements",
          "kind": "function",
          "signature": "mixElements(element1, element2)",
          "summary": ""
        },
        {
          "name": "mixMultipleElements",
          "kind": "function",
          "signature": "mixMultipleElements(elements)",
          "summary": ""
        },
        {
          "name": "ELEMENT_COMBINATIONS",
          "kind": "constant",
          "signature": "ELEMENT_COMBINATIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/spells/SpellGenerator",
      "path": "engine/reference/gameplay/spells/SpellGenerator.md",
      "source": "engine/gameplay/spells/SpellGenerator.js",
      "import": "/engine/gameplay/spells/SpellGenerator.js",
      "sourceHash": "434ec3334ea155bad394df49b3d08b42103d7044afa00f75ff0429f15e43dcd8",
      "summary": "SpellGenerator.js - Procedural Spell Creation System Generates complete spells from parameters: - Element (Fire, Ice, Lightning, Arcane, Nature, Dark, Holy) - Type (Projectile, AOE, Beam, Shield, Buff, Summon) - Modifiers (Homing, Piercing, Explosive, Chain, etc.) - Power level for stat scaling Outputs: - Visual effect (uses CustomParticleEffect SDF) - Collision shape (same SDF as visual) - Particle emitter config - Game stats (damage, mana cost, cooldown) - Sound effect hints MULTIPLAYER: All generation is deterministic via seeded RNG. Never use Math.random() or Date.now() for gameplay-affecting values.",
      "exports": [
        {
          "name": "SpellGenerator",
          "kind": "class",
          "signature": "class SpellGenerator",
          "summary": ""
        },
        {
          "name": "spellDeterministicIdHash",
          "kind": "function",
          "signature": "spellDeterministicIdHash(element, seed)",
          "summary": ""
        },
        {
          "name": "spellParticleEffectHash",
          "kind": "function",
          "signature": "spellParticleEffectHash(elementId, seed)",
          "summary": ""
        },
        {
          "name": "serializeSpellForNetwork",
          "kind": "function",
          "signature": "serializeSpellForNetwork(spell)",
          "summary": "Serialize spell to minimal format for network transmission Only includes data needed to regenerate the spell deterministically"
        },
        {
          "name": "deserializeSpellFromNetwork",
          "kind": "function",
          "signature": "deserializeSpellFromNetwork(data)",
          "summary": "Deserialize spell from network format Regenerates full spell from minimal data"
        },
        {
          "name": "validateSpellIntegrity",
          "kind": "function",
          "signature": "validateSpellIntegrity(spell)",
          "summary": "Validate spell data matches seed (anti-cheat) Returns true if spell stats match what seed would generate"
        },
        {
          "name": "getSpellGenerator",
          "kind": "function",
          "signature": "getSpellGenerator()",
          "summary": ""
        },
        {
          "name": "generateSpell",
          "kind": "function",
          "signature": "generateSpell(params)",
          "summary": ""
        },
        {
          "name": "generateRandomSpell",
          "kind": "function",
          "signature": "generateRandomSpell(constraints)",
          "summary": ""
        },
        {
          "name": "SPELL_ELEMENTS",
          "kind": "constant",
          "signature": "SPELL_ELEMENTS",
          "summary": ""
        },
        {
          "name": "SPELL_TYPES",
          "kind": "constant",
          "signature": "SPELL_TYPES",
          "summary": ""
        },
        {
          "name": "SPELL_MODIFIERS",
          "kind": "constant",
          "signature": "SPELL_MODIFIERS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/spells/SpellGeneratorIntegration",
      "path": "engine/reference/gameplay/spells/SpellGeneratorIntegration.md",
      "source": "engine/gameplay/spells/SpellGeneratorIntegration.js",
      "import": "/engine/gameplay/spells/SpellGeneratorIntegration.js",
      "sourceHash": "6e26b0829944e6f1867ebf71705530a4fbfd1afd220c0a0853f6c089336b0cfb",
      "summary": "SpellGeneratorIntegration.js - Connect SpellGenerator to existing SpellConfig Bridges the procedural spell generator with the existing spell system: - Converts generated spells to SpellConfig format - Integrates with SpellEffectFactory for particle emitters - Provides save/load for generated spells",
      "exports": [
        {
          "name": "generatedSpellToConfig",
          "kind": "function",
          "signature": "generatedSpellToConfig(generatedSpell)",
          "summary": "Convert a generated spell to the existing SpellConfig format Compatible with SpellConfig.js SPELL_PRESETS structure"
        },
        {
          "name": "configToGeneratorFormat",
          "kind": "function",
          "signature": "configToGeneratorFormat(spellConfig)",
          "summary": "Convert existing SpellConfig preset to generator format Allows editing existing spells in the generator"
        },
        {
          "name": "readGeneratedSpellLibraryRecord",
          "kind": "function",
          "signature": "readGeneratedSpellLibraryRecord(storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "writeGeneratedSpellLibraryRecord",
          "kind": "function",
          "signature": "writeGeneratedSpellLibraryRecord(library, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "saveGeneratedSpell",
          "kind": "function",
          "signature": "async saveGeneratedSpell(generatedSpell, storage = globalThis.localStorage)",
          "summary": "Save generated spell to library (IndexedDB via registry pattern)"
        },
        {
          "name": "getSpellLibrary",
          "kind": "function",
          "signature": "getSpellLibrary(storage = globalThis.localStorage)",
          "summary": "Load spell library from storage"
        },
        {
          "name": "getGeneratedSpell",
          "kind": "function",
          "signature": "getGeneratedSpell(id)",
          "summary": "Get a generated spell by ID"
        },
        {
          "name": "deleteGeneratedSpell",
          "kind": "function",
          "signature": "deleteGeneratedSpell(id, storage = globalThis.localStorage)",
          "summary": "Delete a generated spell"
        },
        {
          "name": "getAllGeneratedSpells",
          "kind": "function",
          "signature": "getAllGeneratedSpells(storage = globalThis.localStorage)",
          "summary": "Get all generated spells as array"
        },
        {
          "name": "createEmitterFromGeneratedSpell",
          "kind": "function",
          "signature": "createEmitterFromGeneratedSpell(generatedSpell, options = {})",
          "summary": "Create particle emitter config from generated spell For use with SpellEffectFactory IMPORTANT: Physics parameters (mass, drag, bounciness, collisionEnabled) are included to ensure collision behavior matches visual expectations. The effectId links to the SAME SDF used for both rendering AND collision."
        },
        {
          "name": "quickGenerateSpell",
          "kind": "function",
          "signature": "quickGenerateSpell(element, type, powerLevel = 1.0)",
          "summary": "Quick generate a spell with minimal parameters"
        },
        {
          "name": "generateCombinedSpell",
          "kind": "function",
          "signature": "generateCombinedSpell(element1, element2, type, powerLevel = 1.0)",
          "summary": "Generate a combined element spell"
        },
        {
          "name": "generateLootSpell",
          "kind": "function",
          "signature": "generateLootSpell(rarity = 'common')",
          "summary": "Generate loot-style random spell"
        },
        {
          "name": "GENERATED_SPELL_LIBRARY_SCHEMA",
          "kind": "constant",
          "signature": "GENERATED_SPELL_LIBRARY_SCHEMA",
          "summary": ""
        },
        {
          "name": "GENERATED_SPELL_LIBRARY_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "GENERATED_SPELL_LIBRARY_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "gameplay/spells/index",
      "path": "engine/reference/gameplay/spells/index.md",
      "source": "engine/gameplay/spells/index.js",
      "import": "/engine/gameplay/spells/index.js",
      "sourceHash": "2e5ccda254652ea919ce7f39bd7094dc74b60276eb920b83c10340a636983811",
      "summary": "Spell System Exports Barrel file for easy importing of all spell-related modules.",
      "exports": [
        {
          "name": "ELEMENT_COMBINATIONS",
          "kind": "re-export",
          "signature": "ELEMENT_COMBINATIONS",
          "summary": ""
        },
        {
          "name": "SPELL_ELEMENTS",
          "kind": "re-export",
          "signature": "SPELL_ELEMENTS",
          "summary": ""
        },
        {
          "name": "SPELL_MODIFIERS",
          "kind": "re-export",
          "signature": "SPELL_MODIFIERS",
          "summary": ""
        },
        {
          "name": "SPELL_TYPES",
          "kind": "re-export",
          "signature": "SPELL_TYPES",
          "summary": ""
        },
        {
          "name": "SpellElementMixer",
          "kind": "re-export",
          "signature": "SpellElementMixer",
          "summary": ""
        },
        {
          "name": "SpellGenerator",
          "kind": "re-export",
          "signature": "SpellGenerator",
          "summary": ""
        },
        {
          "name": "configToGeneratorFormat",
          "kind": "re-export",
          "signature": "configToGeneratorFormat",
          "summary": ""
        },
        {
          "name": "createEmitterFromGeneratedSpell",
          "kind": "re-export",
          "signature": "createEmitterFromGeneratedSpell",
          "summary": ""
        },
        {
          "name": "deleteGeneratedSpell",
          "kind": "re-export",
          "signature": "deleteGeneratedSpell",
          "summary": ""
        },
        {
          "name": "deserializeSpellFromNetwork",
          "kind": "re-export",
          "signature": "deserializeSpellFromNetwork",
          "summary": ""
        },
        {
          "name": "generateCombinedSpell",
          "kind": "re-export",
          "signature": "generateCombinedSpell",
          "summary": ""
        },
        {
          "name": "generateLootSpell",
          "kind": "re-export",
          "signature": "generateLootSpell",
          "summary": ""
        },
        {
          "name": "generateRandomSpell",
          "kind": "re-export",
          "signature": "generateRandomSpell",
          "summary": ""
        },
        {
          "name": "generateSpell",
          "kind": "re-export",
          "signature": "generateSpell",
          "summary": ""
        },
        {
          "name": "generatedSpellToConfig",
          "kind": "re-export",
          "signature": "generatedSpellToConfig",
          "summary": ""
        },
        {
          "name": "getAllGeneratedSpells",
          "kind": "re-export",
          "signature": "getAllGeneratedSpells",
          "summary": ""
        },
        {
          "name": "getGeneratedSpell",
          "kind": "re-export",
          "signature": "getGeneratedSpell",
          "summary": ""
        },
        {
          "name": "getSpellElementMixer",
          "kind": "re-export",
          "signature": "getSpellElementMixer",
          "summary": ""
        },
        {
          "name": "getSpellGenerator",
          "kind": "re-export",
          "signature": "getSpellGenerator",
          "summary": ""
        },
        {
          "name": "getSpellLibrary",
          "kind": "re-export",
          "signature": "getSpellLibrary",
          "summary": ""
        },
        {
          "name": "mixElements",
          "kind": "re-export",
          "signature": "mixElements",
          "summary": ""
        },
        {
          "name": "mixMultipleElements",
          "kind": "re-export",
          "signature": "mixMultipleElements",
          "summary": ""
        },
        {
          "name": "quickGenerateSpell",
          "kind": "re-export",
          "signature": "quickGenerateSpell",
          "summary": ""
        },
        {
          "name": "saveGeneratedSpell",
          "kind": "re-export",
          "signature": "saveGeneratedSpell",
          "summary": ""
        },
        {
          "name": "serializeSpellForNetwork",
          "kind": "re-export",
          "signature": "serializeSpellForNetwork",
          "summary": ""
        },
        {
          "name": "validateSpellIntegrity",
          "kind": "re-export",
          "signature": "validateSpellIntegrity",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/index",
      "path": "engine/reference/kaolin/index.md",
      "source": "engine/kaolin/index.js",
      "import": "/engine/kaolin/index.js",
      "sourceHash": "7b9094e6622b1fedc822856820d68912e40f86dff63211841bc78bc369b51663",
      "summary": "engine/kaolin — Kaolin-equivalent 3D Geometry Toolkit WebGPU-native geometry operations inspired by NVIDIA Kaolin. Provides representation conversions, mesh ops, SDF tools, point cloud ops, and physics bridges for the engine's particle/softbody/mesh/voxel systems. Usage: import { ops } from '../kaolin/index.js'; const he = new ops.mesh.HalfEdgeMesh(positions, indices); const normals = ops.mesh.computeVertexNormals(positions, indices);",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/io/MeshIO",
      "path": "engine/reference/kaolin/io/MeshIO.md",
      "source": "engine/kaolin/io/MeshIO.js",
      "import": "/engine/kaolin/io/MeshIO.js",
      "sourceHash": "c0446e47b634c9bf1694dc82488895f33f055abffa831172c4f64826570878d8",
      "summary": "MeshIO.js — Programmatic mesh import/export (OBJ, PLY, STL) Pure JS parsers/writers for common mesh formats. No dependencies — works with fetch() or FileReader in browser. All outputs use the Kaolin convention: positions: Float32Array stride 3 indices:   Uint32Array stride 3 normals:   Float32Array stride 3 (optional) uvs:       Float32Array stride 2 (optional) Compatible with: - MeshOps.js, MeshSubdivision.js, MeshTetrahedralize.js - Editor GLB loader (supplementary path for non-GLB formats) - EntityMeshRenderer",
      "exports": [
        {
          "name": "parseOBJ",
          "kind": "function",
          "signature": "parseOBJ(objText, options = {})",
          "summary": "Parse an OBJ string into mesh data."
        },
        {
          "name": "writeOBJ",
          "kind": "function",
          "signature": "writeOBJ(positions, indices, options = {})",
          "summary": "Write mesh data to OBJ format string."
        },
        {
          "name": "parsePLY",
          "kind": "function",
          "signature": "parsePLY(buffer)",
          "summary": "Parse a PLY file (ArrayBuffer) into mesh data. Supports ASCII and binary_little_endian formats."
        },
        {
          "name": "writePLY",
          "kind": "function",
          "signature": "writePLY(positions, indices, options = {})",
          "summary": "Write mesh data to PLY format (ASCII)."
        },
        {
          "name": "parseSTL",
          "kind": "function",
          "signature": "parseSTL(buffer)",
          "summary": "Parse an STL file (ArrayBuffer) into mesh data. Auto-detects ASCII vs binary."
        },
        {
          "name": "writeSTL",
          "kind": "function",
          "signature": "writeSTL(positions, indices, normals = null)",
          "summary": "Write mesh data to binary STL format."
        },
        {
          "name": "loadMesh",
          "kind": "function",
          "signature": "async loadMesh(url)",
          "summary": "Load a mesh from URL (auto-detects format from extension)."
        },
        {
          "name": "downloadMesh",
          "kind": "function",
          "signature": "downloadMesh(filename, data)",
          "summary": "Download mesh as a file (browser)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/io/PointCloudIO",
      "path": "engine/reference/kaolin/io/PointCloudIO.md",
      "source": "engine/kaolin/io/PointCloudIO.js",
      "import": "/engine/kaolin/io/PointCloudIO.js",
      "sourceHash": "9cc4a885c779fa0471ab3db1d3ce69a88bcf5691c0b33e983b4190304809fbd1",
      "summary": "PointCloudIO.js — Point cloud import/export (PLY, PCD, XYZ) Pure JS parsers/writers for point cloud formats. Outputs: Float32Array positions (stride 3) + optional normals/colors. Compatible with: - PointCloudOps.js - MeshToPoints.js / PointsToMesh.js - Particle system (direct spawn from loaded points)",
      "exports": [
        {
          "name": "parsePLYPointCloud",
          "kind": "function",
          "signature": "parsePLYPointCloud(buffer)",
          "summary": "Load a point cloud from PLY (ArrayBuffer). Ignores face data — returns only vertex positions + attributes."
        },
        {
          "name": "writePLYPointCloud",
          "kind": "function",
          "signature": "writePLYPointCloud(points, options = {})",
          "summary": "Write a point cloud to PLY format (ASCII string, no faces)."
        },
        {
          "name": "parseXYZ",
          "kind": "function",
          "signature": "parseXYZ(text)",
          "summary": "Parse XYZ text format. Each line: x y z [nx ny nz] [r g b]"
        },
        {
          "name": "writeXYZ",
          "kind": "function",
          "signature": "writeXYZ(points, options = {})",
          "summary": "Write points to XYZ text format."
        },
        {
          "name": "parsePCD",
          "kind": "function",
          "signature": "parsePCD(text)",
          "summary": "Parse PCD text format (ASCII only)."
        },
        {
          "name": "writePCD",
          "kind": "function",
          "signature": "writePCD(points, options = {})",
          "summary": "Write points to PCD ASCII format."
        },
        {
          "name": "loadPointCloud",
          "kind": "function",
          "signature": "async loadPointCloud(url)",
          "summary": "Load a point cloud from URL (auto-detects format from extension)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/io/index",
      "path": "engine/reference/kaolin/io/index.md",
      "source": "engine/kaolin/io/index.js",
      "import": "/engine/kaolin/io/index.js",
      "sourceHash": "b09c4152a97b8921d81430facd3794cbec8f989c90d39a88dd1ff9109e17f445",
      "summary": "Kaolin IO — Barrel exports Mesh and point cloud import/export (OBJ, PLY, STL, XYZ, PCD).",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/metrics/ChamferDistance",
      "path": "engine/reference/kaolin/metrics/ChamferDistance.md",
      "source": "engine/kaolin/metrics/ChamferDistance.js",
      "import": "/engine/kaolin/metrics/ChamferDistance.js",
      "sourceHash": "48ea5c5a575af5c0552230fe6d8525deb7c06cf0ca923546436b8b52f6752bc0",
      "summary": "ChamferDistance.js — Bidirectional nearest-neighbor distance metric Measures how close two point sets (or meshes) are to each other. For each point in A, find nearest in B (and vice versa), average the distances. Standard metric in 3D reconstruction / generative model evaluation. Used by: agi/ training loops, mesh quality assessment, LOD validation. CPU path with spatial hash acceleration. For GPU path, see future WebGPU compute implementation.",
      "exports": [
        {
          "name": "chamferDistance",
          "kind": "function",
          "signature": "chamferDistance(pointsA, pointsB, options = {})",
          "summary": "Compute Chamfer Distance between two point sets. CD(A, B) = (1/|A|) Σ min_{b∈B} ||a - b||² + (1/|B|) Σ min_{a∈A} ||b - a||²"
        },
        {
          "name": "chamferDistancePerPoint",
          "kind": "function",
          "signature": "chamferDistancePerPoint(pointsA, pointsB)",
          "summary": "Compute per-point nearest distances from A to B. Useful for visualization (color-coded error maps)."
        },
        {
          "name": "earthMoversDistance",
          "kind": "function",
          "signature": "earthMoversDistance(pointsA, pointsB)",
          "summary": "Approximate Earth Mover's Distance via auction algorithm. Both point sets must have the same number of points. This is O(n²) and practical only for small sets (<1000 points)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/metrics/GPUMetrics",
      "path": "engine/reference/kaolin/metrics/GPUMetrics.md",
      "source": "engine/kaolin/metrics/GPUMetrics.js",
      "import": "/engine/kaolin/metrics/GPUMetrics.js",
      "sourceHash": "46595a65454ba210cfee0469f03a635285f165dd93e04260361bfd764ec1c9bd",
      "summary": "GPUMetrics.js — WebGPU compute shader accelerated 3D distance metrics GPU-accelerated implementations of: - Chamfer Distance (bidirectional nearest-neighbor) - Hausdorff Distance (max nearest-neighbor) - Mean Distance / RMSE For each point in set A, a compute shader finds the nearest point in set B using a brute-force O(N*M) scan parallelized across workgroups. Results are reduced on the GPU via a parallel reduction pass. Falls back to CPU path (ChamferDistance.js / HausdorffDistance.js) if WebGPU is unavailable or point counts are below the GPU-beneficial threshold (~2000). Usage: const gpu = new GPUMetrics(device); const result = await gpu.chamferDistance(pointsA, pointsB);",
      "exports": [
        {
          "name": "GPUMetrics",
          "kind": "class",
          "signature": "class GPUMetrics",
          "summary": ""
        },
        {
          "name": "getGPUMetrics",
          "kind": "function",
          "signature": "getGPUMetrics(device)",
          "summary": "Get or create a singleton GPUMetrics instance."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/metrics/HausdorffDistance",
      "path": "engine/reference/kaolin/metrics/HausdorffDistance.md",
      "source": "engine/kaolin/metrics/HausdorffDistance.js",
      "import": "/engine/kaolin/metrics/HausdorffDistance.js",
      "sourceHash": "1b4cb4dc234c976adc4c2f9c82f15c7727fb092f822c38d0d60dff5f5af4c221",
      "summary": "HausdorffDistance.js — Maximum surface deviation metric Measures the worst-case distance between two point sets or meshes. Hausdorff(A, B) = max( max_{a∈A} min_{b∈B} ||a-b||, max_{b∈B} min_{a∈A} ||b-a|| ) Variants: - Standard Hausdorff (max of mins) - Percentile Hausdorff (e.g. 95th percentile — more robust to outliers) - Directed Hausdorff (one direction only) Used by: mesh quality validation, LOD error bounds, surface fitting.",
      "exports": [
        {
          "name": "hausdorffDistance",
          "kind": "function",
          "signature": "hausdorffDistance(pointsA, pointsB, options = {})",
          "summary": "Compute Hausdorff distance between two point sets."
        },
        {
          "name": "directedDistances",
          "kind": "function",
          "signature": "directedDistances(pointsA, pointsB)",
          "summary": "Compute per-point minimum distances from A to B. Returns the distance of each point in A to its nearest neighbor in B."
        },
        {
          "name": "rmse",
          "kind": "function",
          "signature": "rmse(pointsA, pointsB)",
          "summary": "Compute RMSE (Root Mean Square Error) between two point sets. Symmetric: averages both directions."
        },
        {
          "name": "meanDistance",
          "kind": "function",
          "signature": "meanDistance(pointsA, pointsB)",
          "summary": "Compute mean absolute distance between two point sets (one direction)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/metrics/VolumetricIoU",
      "path": "engine/reference/kaolin/metrics/VolumetricIoU.md",
      "source": "engine/kaolin/metrics/VolumetricIoU.js",
      "import": "/engine/kaolin/metrics/VolumetricIoU.js",
      "sourceHash": "5e6dbb19ac870833bed2189edeed74278a306e25eb53d17a467747e131fd7ea4",
      "summary": "VolumetricIoU.js — Intersection over Union for 3D shapes Measures overlap between two 3D shapes by voxelizing both and computing |intersection| / |union|. Also supports direct voxel grid inputs (skip re-voxelization). Used by: agi/ training loops, mesh reconstruction quality, shape matching.",
      "exports": [
        {
          "name": "volumetricIoU",
          "kind": "function",
          "signature": "volumetricIoU(positionsA, indicesA, positionsB, indicesB, options = {})",
          "summary": "Compute Volumetric IoU between two triangle meshes. Voxelizes both at the same resolution/origin, then counts overlap."
        },
        {
          "name": "voxelGridIoU",
          "kind": "function",
          "signature": "voxelGridIoU(gridA, gridB)",
          "summary": "Compute IoU directly from two voxel grids (same dimensions)."
        },
        {
          "name": "fScore",
          "kind": "function",
          "signature": "fScore(pointsPred, pointsGT, threshold)",
          "summary": "F-Score: harmonic mean of precision and recall at a distance threshold. Precision = fraction of predicted points within threshold of ground truth. Recall = fraction of ground truth points within threshold of prediction."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/metrics/index",
      "path": "engine/reference/kaolin/metrics/index.md",
      "source": "engine/kaolin/metrics/index.js",
      "import": "/engine/kaolin/metrics/index.js",
      "sourceHash": "02acaef08727a4c1ee19317b0491b9f813f355d2b038269a8a70d40d7c9cc856",
      "summary": "Kaolin Metrics — Barrel exports 3D shape comparison metrics for training loops and quality assessment.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/DualContouring",
      "path": "engine/reference/kaolin/ops/conversions/DualContouring.md",
      "source": "engine/kaolin/ops/conversions/DualContouring.js",
      "import": "/engine/kaolin/ops/conversions/DualContouring.js",
      "sourceHash": "f985ede43c3d6df963d7842aa819cef306438024555e81a2346076c1fe089a88",
      "summary": "DualContouring.js — Sharp-feature-preserving isosurface extraction Implements Dual Contouring (Ju et al., 2002) for extracting triangle meshes from SDF fields while preserving sharp edges and corners that Marching Cubes rounds off. Uses Hermite data (intersection points + normals on sign-changing edges) and QEF (Quadratic Error Function) minimization to optimally place vertices within cells. Features: - QEF vertex placement via SVD-free normal equations solver - Sharp edge/corner detection via eigenvalue analysis - Adaptive sharpness threshold (user-configurable) - Manifold quad→tri output with consistent winding - Works with grid SDF arrays or analytical SDF functions Compatible with: - SDFToMesh.js (same input/output conventions) - MeshToVoxel.js voxelGridToSDF() output - CSGShape.js V2 boolean operations",
      "exports": [
        {
          "name": "dualContouringSDF",
          "kind": "function",
          "signature": "dualContouringSDF(sdf, resX, resY, resZ, options = {})",
          "summary": "Extract an isosurface from a 3D SDF grid using Dual Contouring."
        },
        {
          "name": "dualContouringFunction",
          "kind": "function",
          "signature": "dualContouringFunction(sdfFn, boundsMin, boundsMax, resolution = 64, options = {})",
          "summary": "Dual Contour an analytical SDF function."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/FlexiCubes",
      "path": "engine/reference/kaolin/ops/conversions/FlexiCubes.md",
      "source": "engine/kaolin/ops/conversions/FlexiCubes.js",
      "import": "/engine/kaolin/ops/conversions/FlexiCubes.js",
      "sourceHash": "a9cffce30bc766147eb3448feb1f004ddc8d795439b5c6c56e4d5f19e8ae7075",
      "summary": "FlexiCubes.js — Flexible Marching Cubes mesh extraction An improved isosurface extraction inspired by NVIDIA's FlexiCubes (2023). Key improvements over standard Marching Cubes: 1. **Flexible edge vertices** — Instead of fixed linear interpolation along edges, vertex positions can be adjusted (flexed) to better approximate the true surface, improving triangle quality. 2. **Flexible dual vertices** — Each cube gets a \"dual vertex\" (interior point) that can be optimized. Quads are formed connecting dual vertices of adjacent cubes across sign-changing edges, then split into tris. 3. **Adaptive splitting** — Quad-to-triangle splitting direction is chosen to minimize the max angle, producing more uniform triangulations. 4. **Gradient-aware vertex placement** — Uses SDF gradient (surface normal) to project dual vertices onto the isosurface for better accuracy. Compatible with: - SDFToMesh.js (same API conventions) - DualContouring.js (complementary approach) - MeshToVoxel.js voxelGridToSDF() output",
      "exports": [
        {
          "name": "flexiCubesSDF",
          "kind": "function",
          "signature": "flexiCubesSDF(sdf, resX, resY, resZ, options = {})",
          "summary": "Extract an isosurface from a 3D SDF grid using FlexiCubes."
        },
        {
          "name": "flexiCubesFunction",
          "kind": "function",
          "signature": "flexiCubesFunction(sdfFn, boundsMin, boundsMax, resolution = 64, options = {})",
          "summary": "FlexiCubes extraction from an analytical SDF function."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/MeshToPoints",
      "path": "engine/reference/kaolin/ops/conversions/MeshToPoints.md",
      "source": "engine/kaolin/ops/conversions/MeshToPoints.js",
      "import": "/engine/kaolin/ops/conversions/MeshToPoints.js",
      "sourceHash": "c946147eb05442949c5ce81f79b6b018077af984479f30df86dd8469c7886610",
      "summary": "MeshToPoints.js — Sample points from triangle meshes Three sampling strategies: 1. Uniform random — area-weighted triangle sampling (fast) 2. Poisson disk — blue-noise distribution (quality) 3. Farthest point — greedy maximin spacing (LOD/coverage) Output: Float32Array of positions (stride 3) + optional normals Compatible with: - Particle system (direct spawn from sampled points) - MeshToParticlesCompute.js (CPU fallback path) - Point cloud operations (PointCloudOps.js)",
      "exports": [
        {
          "name": "sampleUniform",
          "kind": "function",
          "signature": "sampleUniform(positions, indices, numSamples, options = {})",
          "summary": "Sample points uniformly on a triangle mesh surface. Uses area-weighted triangle selection + barycentric random point."
        },
        {
          "name": "samplePoissonDisk",
          "kind": "function",
          "signature": "samplePoissonDisk(positions, indices, minDist, options = {})",
          "summary": "Poisson disk sampling on a triangle mesh surface. Produces well-distributed (blue-noise) point sets. Uses dart-throwing with spatial hash acceleration."
        },
        {
          "name": "farthestPointSample",
          "kind": "function",
          "signature": "farthestPointSample(points, numSamples)",
          "summary": "Farthest point sampling from a set of candidate points. Iteratively picks the point farthest from all previously selected points. Produces excellent coverage for LOD and feature-preserving downsampling."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/MeshToVoxel",
      "path": "engine/reference/kaolin/ops/conversions/MeshToVoxel.md",
      "source": "engine/kaolin/ops/conversions/MeshToVoxel.js",
      "import": "/engine/kaolin/ops/conversions/MeshToVoxel.js",
      "sourceHash": "5f378d38724da3f123db0945ac776e45f1552221653fd7aa5ddf4d128806bca9",
      "summary": "MeshToVoxel.js — Voxelize any triangle mesh Converts a triangle surface mesh into a 3D voxel grid. Uses conservative voxelization: any voxel that overlaps a triangle is set. Approaches: 1. CPU scanline (simple, robust) — default 2. GPU compute (fast, for large meshes) — requires WebGPU device Output: Uint8Array (1 = solid, 0 = empty) indexed [x + y*resX + z*resX*resY] Compatible with: - engine/voxel/ chunk system (ChunkRegistry) - MarchingCubesMesher (feed density field) - ConnectivityCompute (structural analysis) - VoronoiFracture (fracture source)",
      "exports": [
        {
          "name": "meshToVoxel",
          "kind": "function",
          "signature": "meshToVoxel(positions, indices, options = {})",
          "summary": "Voxelize a triangle mesh on the CPU."
        },
        {
          "name": "voxelGridToDensity",
          "kind": "function",
          "signature": "voxelGridToDensity(grid, resX, resY, resZ)",
          "summary": "Convert voxel grid to a density field (Float32Array) for Marching Cubes. Surface voxels get density 0, interior > 0, exterior < 0."
        },
        {
          "name": "voxelGridToSDF",
          "kind": "function",
          "signature": "voxelGridToSDF(grid, resX, resY, resZ, voxelSize)",
          "summary": "Compute a signed distance field from a voxel grid. Uses distance transform (chamfer approximation)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/ParticlesToMesh",
      "path": "engine/reference/kaolin/ops/conversions/ParticlesToMesh.md",
      "source": "engine/kaolin/ops/conversions/ParticlesToMesh.js",
      "import": "/engine/kaolin/ops/conversions/ParticlesToMesh.js",
      "sourceHash": "6862661b6cc6d7785637110432a10e046b2f8fa8b9e70193461f6a1204e1aeb2",
      "summary": "ParticlesToMesh.js — Convert particle positions into a triangle mesh Generates an isosurface from particle density fields using metaball-style implicit functions + Marching Cubes extraction. Use cases: - Fluid surface rendering (SPH → mesh) - Particle cloud → solid mesh for physics - Point sprite → mesh conversion for LOD Compatible with: - Particle system readback (ParticleSimWorld positions) - FluidMPM / ParticleSPH output - SDFToMesh.js (shares MC internals)",
      "exports": [
        {
          "name": "particlesToMesh",
          "kind": "function",
          "signature": "particlesToMesh(particlePositions, options = {})",
          "summary": "Build an isosurface mesh from particle positions using metaball density. Each particle contributes a smooth falloff: d(r) = 1 - (r/radius)^2 summed at each grid point. Isosurface at threshold extracts the mesh."
        },
        {
          "name": "particlesToMeshAnisotropic",
          "kind": "function",
          "signature": "particlesToMeshAnisotropic(positions, velocities, options = {})",
          "summary": "Build mesh from particles with anisotropic kernels. Each particle's influence is stretched along its velocity direction."
        },
        {
          "name": "particlesToMeshFast",
          "kind": "function",
          "signature": "particlesToMeshFast(positions, radius, resolution = 24)",
          "summary": "Quick mesh from particles using a simple point-to-voxel splat. Faster than full metaball but lower quality. Good for preview/LOD."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/PointsToMesh",
      "path": "engine/reference/kaolin/ops/conversions/PointsToMesh.md",
      "source": "engine/kaolin/ops/conversions/PointsToMesh.js",
      "import": "/engine/kaolin/ops/conversions/PointsToMesh.js",
      "sourceHash": "3624813a5da53c2b2ec3aed2148df15fdf221849db17257599d64983ec289c09",
      "summary": "PointsToMesh.js — Surface reconstruction from point clouds Converts unstructured 3D point sets into triangle meshes. Approaches: 1. Ball-Pivoting Algorithm (BPA) — requires oriented normals 2. Poisson Surface Reconstruction (simplified) — smooth, gap-filling 3. Alpha Shapes — convex hull variant with concavity control Compatible with: - MeshToPoints.js output (round-trip) - Particle system readback positions - LiDAR / scan data",
      "exports": [
        {
          "name": "ballPivoting",
          "kind": "function",
          "signature": "ballPivoting(points, normals, radius, options = {})",
          "summary": "Ball-Pivoting Algorithm for surface reconstruction. Rolls a ball of given radius over the point cloud; when it touches exactly 3 points it creates a triangle. Requires oriented normals for consistent triangle winding."
        },
        {
          "name": "alphaShape",
          "kind": "function",
          "signature": "alphaShape(points, alpha)",
          "summary": "Alpha-shape surface reconstruction. Computes 3D Delaunay tetrahedralization, then removes tetrahedra whose circumradius exceeds 1/alpha. Extracts boundary triangles."
        },
        {
          "name": "convexHull",
          "kind": "function",
          "signature": "convexHull(points)",
          "summary": "Convex hull of a 3D point set. Uses incremental algorithm. For large sets, prefer GPUConvexHull.js."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/SDFToMesh",
      "path": "engine/reference/kaolin/ops/conversions/SDFToMesh.md",
      "source": "engine/kaolin/ops/conversions/SDFToMesh.js",
      "import": "/engine/kaolin/ops/conversions/SDFToMesh.js",
      "sourceHash": "1cf835669df9f6221cf5c4c052d78a8c1963c7d994f2a0340aa94324f0dfede5",
      "summary": "SDFToMesh.js — Extract triangle mesh from a Signed Distance Field Converts a 3D SDF volume (Float32Array grid) into a triangle mesh using Marching Cubes. This is the CPU path for Kaolin conversions; for GPU-accelerated MC see engine/voxel/MarchingCubesMesher.js. Also supports evaluating analytical SDF functions directly. Compatible with: - MeshToVoxel.js voxelGridToSDF() output - MeshSDFGenerator.js baked SDF textures - SDFCollision.js primitives - FlexiCubes (future Phase 3+)",
      "exports": [
        {
          "name": "sdfToMesh",
          "kind": "function",
          "signature": "sdfToMesh(sdf, resX, resY, resZ, options = {})",
          "summary": "Extract an isosurface from a 3D SDF grid using Marching Cubes."
        },
        {
          "name": "sdfFunctionToMesh",
          "kind": "function",
          "signature": "sdfFunctionToMesh(sdfFn, boundsMin, boundsMax, resolution = 64, options = {})",
          "summary": "Mesh an analytical SDF function by evaluating it on a grid."
        },
        {
          "name": "sdfCSGToMesh",
          "kind": "function",
          "signature": "sdfCSGToMesh(ops, boundsMin, boundsMax, resolution = 64)",
          "summary": "Mesh a CSG combination of SDF primitives. Accepts an array of { sdf: fn(x,y,z), op: 'union'|'subtract'|'intersect' }."
        },
        {
          "name": "sdfSphere",
          "kind": "function",
          "signature": "sdfSphere(radius)",
          "summary": "Sphere SDF centered at origin"
        },
        {
          "name": "sdfBox",
          "kind": "function",
          "signature": "sdfBox(halfX, halfY, halfZ)",
          "summary": "Box SDF centered at origin"
        },
        {
          "name": "sdfTorus",
          "kind": "function",
          "signature": "sdfTorus(majorR, minorR)",
          "summary": "Torus SDF centered at origin, in XZ plane"
        },
        {
          "name": "sdfCylinder",
          "kind": "function",
          "signature": "sdfCylinder(radius, halfHeight)",
          "summary": "Cylinder SDF centered at origin, along Y axis"
        },
        {
          "name": "sdfTranslate",
          "kind": "function",
          "signature": "sdfTranslate(sdfFn, tx, ty, tz)",
          "summary": "Translate an SDF function"
        },
        {
          "name": "sdfSmoothUnion",
          "kind": "function",
          "signature": "sdfSmoothUnion(sdfA, sdfB, k)",
          "summary": "Smooth union of two SDF functions"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/conversions/index",
      "path": "engine/reference/kaolin/ops/conversions/index.md",
      "source": "engine/kaolin/ops/conversions/index.js",
      "import": "/engine/kaolin/ops/conversions/index.js",
      "sourceHash": "ed4a42ee6b0fd88382f9a789618d87f6efcf8c6f3ab3a71a8f207f7e7c3cb3d3",
      "summary": "Kaolin Conversions — Barrel exports Representation conversion modules: - Mesh ↔ Voxel - Mesh ↔ Points - Mesh ↔ SDF - Particles → Mesh",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/index",
      "path": "engine/reference/kaolin/ops/index.md",
      "source": "engine/kaolin/ops/index.js",
      "import": "/engine/kaolin/ops/index.js",
      "sourceHash": "ba2904257eecd4ce606e3296dc75967db77403d04fae11bbacb9be8d6423354f",
      "summary": "engine/kaolin/ops — Geometry operations Primitive processing functions for batched 3D models: meshes, voxelgrids, point clouds, and conversions between them.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/mesh/MeshOps",
      "path": "engine/reference/kaolin/ops/mesh/MeshOps.md",
      "source": "engine/kaolin/ops/mesh/MeshOps.js",
      "import": "/engine/kaolin/ops/mesh/MeshOps.js",
      "sourceHash": "12b2869b789a1e8f198f08ac5114197ce9824d7d4280832e244d41a283a9df16",
      "summary": "MeshOps.js — Core Mesh Operations for Kaolin-style 3D Geometry Toolkit Provides half-edge data structure, adjacency queries, normals, area, Laplacian smoothing, validation, and mesh analysis. All operations work on flat typed arrays (GPU-friendly) with optional object wrappers. Data format (Kaolin convention): positions: Float32Array — stride 3 (x, y, z per vertex) indices:   Uint32Array  — stride 3 (v0, v1, v2 per triangle) Compatible with existing engine systems: - MeshDecimation.js (Vertex/Triangle classes) - MeshCutter.js (plain [x,y,z] arrays) - GPUSoftBody.js (SoA GPU buffers) - EntityMeshRenderer (interleaved vertex buffers)",
      "exports": [
        {
          "name": "HalfEdgeMesh",
          "kind": "class",
          "signature": "class HalfEdgeMesh",
          "summary": "Index-based half-edge mesh representation. Each half-edge stores: vertex   — index of the vertex it points TO face     — index of the face it belongs to (-1 for boundary) twin     — index of the opposite half-edge (-1 if boundary) next     — index of the next half-edge in the face loop prev     — index of the previous half-edge in the face loop Stored as parallel typed arrays for cache efficiency."
        },
        {
          "name": "computeFaceNormals",
          "kind": "function",
          "signature": "computeFaceNormals(positions, indices, normalize = true)",
          "summary": "Compute per-face normals (unnormalized = area-weighted, or normalized)."
        },
        {
          "name": "computeVertexNormals",
          "kind": "function",
          "signature": "computeVertexNormals(positions, indices)",
          "summary": "Compute per-vertex normals via area-weighted average of adjacent face normals."
        },
        {
          "name": "computeVertexNormalsAngleWeighted",
          "kind": "function",
          "signature": "computeVertexNormalsAngleWeighted(positions, indices)",
          "summary": "Compute per-vertex normals weighted by the angle at each vertex in each face. More accurate than area-weighted for meshes with very different triangle sizes."
        },
        {
          "name": "computeFaceAreas",
          "kind": "function",
          "signature": "computeFaceAreas(positions, indices)",
          "summary": "Compute area of each triangle face."
        },
        {
          "name": "computeSurfaceArea",
          "kind": "function",
          "signature": "computeSurfaceArea(positions, indices)",
          "summary": "Total surface area of the mesh."
        },
        {
          "name": "computeSignedVolume",
          "kind": "function",
          "signature": "computeSignedVolume(positions, indices)",
          "summary": "Signed volume of a closed triangle mesh (divergence theorem). Positive if normals point outward with consistent winding."
        },
        {
          "name": "computeEdgeLengths",
          "kind": "function",
          "signature": "computeEdgeLengths(positions, indices)",
          "summary": "Compute lengths of all unique edges."
        },
        {
          "name": "computeBoundingBox",
          "kind": "function",
          "signature": "computeBoundingBox(positions)",
          "summary": "Compute axis-aligned bounding box."
        },
        {
          "name": "buildVertexAdjacency",
          "kind": "function",
          "signature": "buildVertexAdjacency(indices, numVertices)",
          "summary": "Build vertex-to-vertex adjacency (sparse neighbor lists)."
        },
        {
          "name": "buildVertexFaceAdjacency",
          "kind": "function",
          "signature": "buildVertexFaceAdjacency(indices, numVertices)",
          "summary": "Build vertex-to-face adjacency."
        },
        {
          "name": "buildFaceAdjacency",
          "kind": "function",
          "signature": "buildFaceAdjacency(indices, numFaces)",
          "summary": "Build face-to-face adjacency (faces sharing an edge)."
        },
        {
          "name": "laplacianSmooth",
          "kind": "function",
          "signature": "laplacianSmooth(positions, indices, iterations = 1, lambda = 0.5, pinned = null)",
          "summary": "Uniform Laplacian smoothing (iterative). Moves each vertex toward the centroid of its neighbors."
        },
        {
          "name": "taubinSmooth",
          "kind": "function",
          "signature": "taubinSmooth(positions, indices, iterations = 5, lambda = 0.5, mu = -0.53, pinned = null)",
          "summary": "Taubin smoothing (λ|μ) — Laplacian smooth that preserves volume. Alternates positive (shrinking) and negative (inflating) steps."
        },
        {
          "name": "cotangentLaplacianSmooth",
          "kind": "function",
          "signature": "cotangentLaplacianSmooth(positions, indices, lambda = 0.5, pinned = null)",
          "summary": "Cotangent-weighted Laplacian smoothing (1 iteration). More geometrically accurate than uniform — preserves curvature better."
        },
        {
          "name": "validateMesh",
          "kind": "function",
          "signature": "validateMesh(positions, indices)",
          "summary": "Validate mesh integrity. Returns a report object."
        },
        {
          "name": "computeCentroid",
          "kind": "function",
          "signature": "computeCentroid(positions)",
          "summary": "Compute mesh centroid (average of vertex positions)."
        },
        {
          "name": "fromVertexTriangleClasses",
          "kind": "function",
          "signature": "fromVertexTriangleClasses(vertices, triangles)",
          "summary": "Convert from MeshDecimation.js Vertex/Triangle classes to flat arrays."
        },
        {
          "name": "fromArrays",
          "kind": "function",
          "signature": "fromArrays(verts, faces)",
          "summary": "Convert from plain [x,y,z] arrays (MeshCutter style) to flat Float32Array."
        },
        {
          "name": "toArrays",
          "kind": "function",
          "signature": "toArrays(positions, indices)",
          "summary": "Convert flat arrays to plain [x,y,z] arrays."
        },
        {
          "name": "fromInterleavedBuffer",
          "kind": "function",
          "signature": "fromInterleavedBuffer(interleavedBuffer, stride, posOffset, indexBuffer)",
          "summary": "Extract positions/indices from an interleaved GPU vertex buffer + index buffer."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/mesh/MeshSubdivision",
      "path": "engine/reference/kaolin/ops/mesh/MeshSubdivision.md",
      "source": "engine/kaolin/ops/mesh/MeshSubdivision.js",
      "import": "/engine/kaolin/ops/mesh/MeshSubdivision.js",
      "sourceHash": "e351e17376afb9d96ba821efcb04aa3febf52c7784b866f238daf7c1305ae32c",
      "summary": "MeshSubdivision.js — Loop & Catmull-Clark Subdivision Subdivision surface algorithms for the Kaolin geometry toolkit. Loop Subdivision (Charles Loop, 1987): - Operates on triangle meshes only - Inserts edge midpoints, reconnects into 4 sub-triangles per face - Uses β-weighting for smooth limit surface (Warren weights) - Boundary edges get special 1/8, 3/4, 1/8 stencil Catmull-Clark Subdivision (Catmull & Clark, 1978): - Operates on quad or mixed meshes - Face points → edge points → vertex points → reconnect - Converges to C² (bi-cubic B-spline) surface away from extraordinary verts - Triangle input is first converted to all-quad via 1-to-3 split Both algorithms support: - Boundary handling (crease preservation) - Pinned vertices (kept fixed) - Multiple subdivision levels Data format matches MeshOps.js: positions: Float32Array — stride 3 indices:   Uint32Array  — stride 3 (triangles) or stride 4 (quads)",
      "exports": [
        {
          "name": "loopSubdivide",
          "kind": "function",
          "signature": "loopSubdivide(positions, indices, options = {})",
          "summary": "Perform one level of Loop subdivision on a triangle mesh."
        },
        {
          "name": "loopSubdivideMulti",
          "kind": "function",
          "signature": "loopSubdivideMulti(positions, indices, levels = 1, options = {})",
          "summary": "Perform multiple levels of Loop subdivision."
        },
        {
          "name": "catmullClarkSubdivide",
          "kind": "function",
          "signature": "catmullClarkSubdivide(positions, faceIndices, faceVertCounts, options = {})",
          "summary": "Perform one level of Catmull-Clark subdivision. Input can be triangle or quad faces (mixed is allowed). - triangles: indices stride 3, faceVertCounts = [3, 3, ...] - quads:     indices stride 4, faceVertCounts = [4, 4, ...] - mixed:     flat indices + faceVertCounts array For simplicity, this implementation accepts two formats: 1. (positions, quadIndices) — all-quad, quadIndices = Uint32Array stride 4 2. (positions, triIndices, { triangleInput: true }) — converts tris to quads first"
        },
        {
          "name": "catmullClarkSubdivideMulti",
          "kind": "function",
          "signature": "catmullClarkSubdivideMulti(positions, faceIndices, faceVertCounts, levels = 1, options = {})",
          "summary": "Perform multiple levels of Catmull-Clark subdivision."
        },
        {
          "name": "trianglesToFaceList",
          "kind": "function",
          "signature": "trianglesToFaceList(triIndices)",
          "summary": "Convert a triangle mesh to the faceIndices + faceVertCounts format expected by catmullClarkSubdivide."
        },
        {
          "name": "quadFacesToTriangles",
          "kind": "function",
          "signature": "quadFacesToTriangles(positions, faceIndices, faceVertCounts)",
          "summary": "Convert Catmull-Clark output (all quads) to triangles for rendering. Each quad is split into 2 triangles along the shorter diagonal."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/mesh/MeshTetrahedralize",
      "path": "engine/reference/kaolin/ops/mesh/MeshTetrahedralize.md",
      "source": "engine/kaolin/ops/mesh/MeshTetrahedralize.js",
      "import": "/engine/kaolin/ops/mesh/MeshTetrahedralize.js",
      "sourceHash": "3dfc6cb8a9d8c8ce29f37ee176d70c99d642bf6815e786729cc0676c8263494c",
      "summary": "MeshTetrahedralize.js — Surface Mesh → Tetrahedral Mesh Converts a closed triangle surface mesh into a tetrahedral volume mesh suitable for FEM soft body simulation (GPUSoftBody.js). Algorithm: Constrained Delaunay Tetrahedralization 1. Compute bounding box, generate interior sample points 2. Combine surface vertices + interior points 3. Build Delaunay tetrahedralization via incremental insertion 4. Remove tets outside the surface (using winding number or ray test) 5. Output: nodePositions (Float32Array stride 3) + tetIndices (Uint32Array stride 4) The output format matches GPUSoftBody.createSoftBody() exactly: nodePositions: Float32Array — [x0, y0, z0, x1, y1, z1, ...] tetIndices:    Uint32Array  — [n0, n1, n2, n3, ...] (4 per tet) References: - Si, \"TetGen: A Delaunay-Based Quality Tetrahedral Mesh Generator\" (2015) - Shewchuk, \"Tetrahedral Mesh Generation by Delaunay Refinement\" (1998) - Jacobson et al., \"Robust Inside-Outside Segmentation using Generalized Winding Numbers\" (2013)",
      "exports": [
        {
          "name": "tetrahedralize",
          "kind": "function",
          "signature": "tetrahedralize(positions, indices, options = {})",
          "summary": "Tetrahedralize a closed triangle surface mesh."
        },
        {
          "name": "tetrahedralizeGrid",
          "kind": "function",
          "signature": "tetrahedralizeGrid(positions, indices, gridRes = 6)",
          "summary": "Quick tetrahedralize using simple grid-based approach. Faster but lower quality than full Delaunay. Good for real-time use."
        },
        {
          "name": "computeTetQuality",
          "kind": "function",
          "signature": "computeTetQuality(positions, tetIndices)",
          "summary": "Compute quality ratio for each tet (radius ratio = circumradius / inradius). Ideal = 3 (regular tet). Higher = worse (slivers)."
        },
        {
          "name": "extractTetSurface",
          "kind": "function",
          "signature": "extractTetSurface(tetIndices)",
          "summary": "Extract the surface triangles of a tetrahedral mesh. Surface faces are those that belong to exactly one tetrahedron."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/mesh/index",
      "path": "engine/reference/kaolin/ops/mesh/index.md",
      "source": "engine/kaolin/ops/mesh/index.js",
      "import": "/engine/kaolin/ops/mesh/index.js",
      "sourceHash": "2a392948d091a5a22d10d545f39c5448cf91191dfaf6d69d2e7e8bdb0dfefd8c",
      "summary": "engine/kaolin/ops/mesh — Core mesh operations Half-edge data structure, adjacency, normals, area, Laplacian smoothing, validation, and subdivision surfaces (Loop + Catmull-Clark).",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/pointcloud/PointCloudOps",
      "path": "engine/reference/kaolin/ops/pointcloud/PointCloudOps.md",
      "source": "engine/kaolin/ops/pointcloud/PointCloudOps.js",
      "import": "/engine/kaolin/ops/pointcloud/PointCloudOps.js",
      "sourceHash": "4ff18a6b98a537bc8c716b076a609995d5881ec913083aeca863331f3a40516f",
      "summary": "PointCloudOps.js — Point cloud geometric analysis Operations on unstructured 3D point sets: - k-NN queries via spatial hash - Normal estimation (PCA on local neighborhood) - Curvature estimation (from fitted normals) - Statistical outlier removal - Voxel downsampling - Centroid / bounding box / oriented bounding box - Normal orientation propagation (MST-based) Compatible with: - MeshToPoints.js output - Particle system readback (Float32Array stride 3) - PointsToMesh.js input (provides normals for BPA)",
      "exports": [
        {
          "name": "buildSpatialHash",
          "kind": "function",
          "signature": "buildSpatialHash(points, cellSize)",
          "summary": "Build a spatial hash for fast neighbor queries."
        },
        {
          "name": "knnQuery",
          "kind": "function",
          "signature": "knnQuery(points, grid, cellSize, qi, k, maxRadius = Infinity)",
          "summary": "Find k nearest neighbors for a single query point."
        },
        {
          "name": "batchKNN",
          "kind": "function",
          "signature": "batchKNN(points, k, searchRadius)",
          "summary": "Batch k-NN for all points."
        },
        {
          "name": "estimateNormals",
          "kind": "function",
          "signature": "estimateNormals(points, k = 12, options = {})",
          "summary": "Estimate normals for a point cloud using PCA on local neighborhoods. For each point, finds k nearest neighbors and fits a plane via PCA. The normal is the eigenvector corresponding to the smallest eigenvalue of the covariance matrix."
        },
        {
          "name": "estimateCurvature",
          "kind": "function",
          "signature": "estimateCurvature(points, normals, k = 12)",
          "summary": "Estimate per-point curvature from normals and neighborhood. Uses the ratio of the smallest eigenvalue to the sum of eigenvalues."
        },
        {
          "name": "removeStatisticalOutliers",
          "kind": "function",
          "signature": "removeStatisticalOutliers(points, k = 20, stdRatio = 2.0)",
          "summary": "Remove statistical outliers based on mean distance to k neighbors. Points with mean distance > (global_mean + stdRatio * global_std) are removed."
        },
        {
          "name": "removeRadiusOutliers",
          "kind": "function",
          "signature": "removeRadiusOutliers(points, radius, minNeighbors = 3)",
          "summary": "Remove points with fewer than minNeighbors within given radius."
        },
        {
          "name": "voxelDownsample",
          "kind": "function",
          "signature": "voxelDownsample(points, voxelSize, normals = null)",
          "summary": "Downsample a point cloud by averaging points within each voxel cell."
        },
        {
          "name": "computeAABB",
          "kind": "function",
          "signature": "computeAABB(points)",
          "summary": "Compute axis-aligned bounding box."
        },
        {
          "name": "computeCentroid",
          "kind": "function",
          "signature": "computeCentroid(points)",
          "summary": "Compute centroid of a point cloud."
        },
        {
          "name": "computeOBB",
          "kind": "function",
          "signature": "computeOBB(points)",
          "summary": "Compute oriented bounding box via PCA. Returns axes (3 Float32Array[3]), half-extents, and center."
        },
        {
          "name": "cropToAABB",
          "kind": "function",
          "signature": "cropToAABB(points, min, max)",
          "summary": "Crop points to an axis-aligned bounding box."
        },
        {
          "name": "cropToSphere",
          "kind": "function",
          "signature": "cropToSphere(points, cx, cy, cz, radius)",
          "summary": "Crop points to a sphere."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/pointcloud/index",
      "path": "engine/reference/kaolin/ops/pointcloud/index.md",
      "source": "engine/kaolin/ops/pointcloud/index.js",
      "import": "/engine/kaolin/ops/pointcloud/index.js",
      "sourceHash": "ce357a5edaaa573ced00e18444788cafd95f5f64da131e858894cac9125506ca",
      "summary": "Kaolin Point Cloud — Barrel exports",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/voxelgrid/VoxelOps",
      "path": "engine/reference/kaolin/ops/voxelgrid/VoxelOps.md",
      "source": "engine/kaolin/ops/voxelgrid/VoxelOps.js",
      "import": "/engine/kaolin/ops/voxelgrid/VoxelOps.js",
      "sourceHash": "b9ca8e462e6f106ef7ec18c6c67f018eb135850c0cd354770452e6e77f4c01b7",
      "summary": "VoxelOps.js — Voxel grid operations Operations on binary/scalar 3D voxel grids: - Fill interior (flood fill) - Hollow (keep only surface shell) - CSG boolean: union, intersect, subtract - Downsample / upsample - Morphological: dilate, erode, open, close - Extract isosurface info (surface voxels, boundary) - Connected component labeling Grid format: Uint8Array indexed [x + y*resX + z*resX*resY] 1 = solid, 0 = empty (unless scalar grid — Float32Array) Compatible with: - MeshToVoxel.js output - engine/voxel/ chunk system (ChunkRegistry) - ConnectivityCompute.js (structural analysis) - VoronoiFracture.js (fracture source)",
      "exports": [
        {
          "name": "voxelUnion",
          "kind": "function",
          "signature": "voxelUnion(gridA, gridB)",
          "summary": "Union of two voxel grids (same dimensions required). Result = A OR B."
        },
        {
          "name": "voxelIntersect",
          "kind": "function",
          "signature": "voxelIntersect(gridA, gridB)",
          "summary": "Intersection of two voxel grids. Result = A AND B."
        },
        {
          "name": "voxelSubtract",
          "kind": "function",
          "signature": "voxelSubtract(gridA, gridB)",
          "summary": "Subtraction: A minus B. Result = A AND NOT B."
        },
        {
          "name": "voxelXOR",
          "kind": "function",
          "signature": "voxelXOR(gridA, gridB)",
          "summary": "Symmetric difference (XOR). Result = A XOR B."
        },
        {
          "name": "voxelInvert",
          "kind": "function",
          "signature": "voxelInvert(grid)",
          "summary": "Invert a voxel grid."
        },
        {
          "name": "voxelFill",
          "kind": "function",
          "signature": "voxelFill(grid, resX, resY, resZ)",
          "summary": "Fill the interior of a closed voxel shell. Uses flood fill from boundary to mark exterior, then inverts."
        },
        {
          "name": "voxelHollow",
          "kind": "function",
          "signature": "voxelHollow(grid, resX, resY, resZ, thickness = 1)",
          "summary": "Hollow a voxel grid — keep only the outer shell (surface voxels). A voxel is surface if it's solid and has at least one empty 6-neighbor."
        },
        {
          "name": "voxelDilate",
          "kind": "function",
          "signature": "voxelDilate(grid, resX, resY, resZ, radius = 1)",
          "summary": "Dilate: expand solid voxels by `radius` voxels (6-connected)."
        },
        {
          "name": "voxelErode",
          "kind": "function",
          "signature": "voxelErode(grid, resX, resY, resZ, radius = 1)",
          "summary": "Erode: shrink solid voxels by `radius` voxels (6-connected)."
        },
        {
          "name": "voxelOpen",
          "kind": "function",
          "signature": "voxelOpen(grid, resX, resY, resZ, radius = 1)",
          "summary": "Morphological open: erode then dilate (removes small protrusions)."
        },
        {
          "name": "voxelClose",
          "kind": "function",
          "signature": "voxelClose(grid, resX, resY, resZ, radius = 1)",
          "summary": "Morphological close: dilate then erode (fills small holes)."
        },
        {
          "name": "voxelDownsample",
          "kind": "function",
          "signature": "voxelDownsample(grid, resX, resY, resZ, factor = 2)",
          "summary": "Downsample a voxel grid by factor (majority vote per super-voxel)."
        },
        {
          "name": "voxelUpsample",
          "kind": "function",
          "signature": "voxelUpsample(grid, resX, resY, resZ, factor = 2)",
          "summary": "Upsample a voxel grid by factor (nearest-neighbor replication)."
        },
        {
          "name": "connectedComponents",
          "kind": "function",
          "signature": "connectedComponents(grid, resX, resY, resZ)",
          "summary": "Label connected components in a voxel grid (6-connected)."
        },
        {
          "name": "removeSmallComponents",
          "kind": "function",
          "signature": "removeSmallComponents(grid, resX, resY, resZ, minSize)",
          "summary": "Remove small connected components below a size threshold."
        },
        {
          "name": "extractSurfaceVoxels",
          "kind": "function",
          "signature": "extractSurfaceVoxels(grid, resX, resY, resZ)",
          "summary": "Extract surface voxels (solid voxels with at least one empty 6-neighbor)."
        },
        {
          "name": "countSolid",
          "kind": "function",
          "signature": "countSolid(grid)",
          "summary": "Count solid voxels."
        },
        {
          "name": "computeVolume",
          "kind": "function",
          "signature": "computeVolume(grid, voxelSize)",
          "summary": "Compute volume in world units."
        },
        {
          "name": "computeSurfaceArea",
          "kind": "function",
          "signature": "computeSurfaceArea(grid, resX, resY, resZ, voxelSize)",
          "summary": "Compute approximate surface area (count exposed faces × voxelSize²)."
        },
        {
          "name": "createGrid",
          "kind": "function",
          "signature": "createGrid(resX, resY, resZ)",
          "summary": "Create an empty voxel grid."
        },
        {
          "name": "createSphere",
          "kind": "function",
          "signature": "createSphere(resX, resY, resZ, cx, cy, cz, radius)",
          "summary": "Create a solid sphere in a voxel grid."
        },
        {
          "name": "createBox",
          "kind": "function",
          "signature": "createBox(resX, resY, resZ, minX, minY, minZ, maxX, maxY, maxZ)",
          "summary": "Create a solid box in a voxel grid."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/ops/voxelgrid/index",
      "path": "engine/reference/kaolin/ops/voxelgrid/index.md",
      "source": "engine/kaolin/ops/voxelgrid/index.js",
      "import": "/engine/kaolin/ops/voxelgrid/index.js",
      "sourceHash": "8a0ab248ec3f75b73b89cc5da8150ebe449096cd385c6d3776b143236c51d4bb",
      "summary": "Kaolin Voxel Grid — Barrel exports",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/physics/AutoTetMesh",
      "path": "engine/reference/kaolin/physics/AutoTetMesh.md",
      "source": "engine/kaolin/physics/AutoTetMesh.js",
      "import": "/engine/kaolin/physics/AutoTetMesh.js",
      "sourceHash": "1f9ab015155aadf821b703eb514ff34eefabf583a810398e5f8def3e2d1a427d",
      "summary": "AutoTetMesh.js — Automatic surface mesh → tetrahedral mesh → GPUSoftBody bridge One-call pipeline: give it a triangle mesh, get back a soft body. Pipeline: 1. Validate + repair mesh (MeshOps.validateMesh) 2. Optionally decimate for performance (MeshDecimation) 3. Tetrahedralize (MeshTetrahedralize) 4. Quality check + optimization 5. Create GPUSoftBody instance Compatible with: - GPUSoftBody.createSoftBody() — exact format match - MeshDecimation.js — LOD before tet generation - EntityMeshRenderer — visual mesh binding - MeshTetrahedralize.js — Delaunay + grid methods",
      "exports": [
        {
          "name": "autoTetMesh",
          "kind": "function",
          "signature": "autoTetMesh(positions, indices, options = {})",
          "summary": "Full pipeline: surface mesh → tet mesh ready for GPUSoftBody."
        },
        {
          "name": "createSoftBodyFromMesh",
          "kind": "function",
          "signature": "createSoftBodyFromMesh(softBodySystem, positions, indices, material = 'rubber', options = {})",
          "summary": "Create a GPUSoftBody from a surface mesh in one call."
        },
        {
          "name": "createSoftBodiesBatch",
          "kind": "function",
          "signature": "createSoftBodiesBatch(softBodySystem, meshes)",
          "summary": "Batch-create multiple soft bodies from meshes."
        },
        {
          "name": "generateTetLODs",
          "kind": "function",
          "signature": "generateTetLODs(positions, indices, gridResolutions = [8, 5, 3])",
          "summary": "Generate multiple LOD levels of tet meshes from a single surface mesh."
        },
        {
          "name": "TET_PRESETS",
          "kind": "constant",
          "signature": "TET_PRESETS",
          "summary": "Preset configurations for different use cases."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/physics/ParticleSkinning",
      "path": "engine/reference/kaolin/physics/ParticleSkinning.md",
      "source": "engine/kaolin/physics/ParticleSkinning.js",
      "import": "/engine/kaolin/physics/ParticleSkinning.js",
      "sourceHash": "5c84a5bf4d40d0c37d057f697ed2ece139a298cacae986eeac5d9f6723d38fdb",
      "summary": "ParticleSkinning.js — Learned reduced deformation basis from particle sim Inspired by NVIDIA Simplicits: learn a small set of skinning weights that approximate the full FEM simulation at a fraction of the cost. Pipeline: 1. Run full sim for N frames → capture deformation snapshots 2. PCA on displacement field → extract dominant deformation modes 3. Compute skinning weights via least-squares fitting 4. At runtime: blend modes with learned weights → fast approximate deformation This enables: - Real-time soft body preview without FEM solve - LOD: near = full FEM, far = skinned approximation - Baking physics to animation for replay Compatible with: - GPUSoftBody.js — reads back node positions for training - EntityMeshRenderer — applies skinned deformation to visual mesh - SkeletalAnimation.js — similar weight/bone concept",
      "exports": [
        {
          "name": "createDeformationCapture",
          "kind": "function",
          "signature": "createDeformationCapture(restPositions)",
          "summary": "Capture deformation snapshots from a running soft body. Call this each frame during a training run."
        },
        {
          "name": "captureFrame",
          "kind": "function",
          "signature": "captureFrame(capture, currentPositions)",
          "summary": "Record a frame's deformed positions."
        },
        {
          "name": "extractDeformationModes",
          "kind": "function",
          "signature": "extractDeformationModes(capture, numModes = 8)",
          "summary": "Extract dominant deformation modes via PCA on displacement snapshots."
        },
        {
          "name": "computeSkinningWeights",
          "kind": "function",
          "signature": "computeSkinningWeights(decomposition, capture)",
          "summary": "Compute skinning weights for each node per deformation mode. Uses least-squares: for each snapshot, find mode weights that best reconstruct the displacement."
        },
        {
          "name": "createSkinningEvaluator",
          "kind": "function",
          "signature": "createSkinningEvaluator(restPositions, modes, meanDisplacement)",
          "summary": "Create a runtime skinning evaluator."
        },
        {
          "name": "evaluateSkinning",
          "kind": "function",
          "signature": "evaluateSkinning(evaluator, coefficients)",
          "summary": "Evaluate skinned deformation with given mode coefficients."
        },
        {
          "name": "fitCoefficients",
          "kind": "function",
          "signature": "fitCoefficients(evaluator, targetPositions)",
          "summary": "Fit mode coefficients to match a target deformation (least-squares). Useful for transitioning from full FEM to skinned approximation."
        },
        {
          "name": "bakeToAnimation",
          "kind": "function",
          "signature": "bakeToAnimation(capture, decomposition, fps = 60)",
          "summary": "Bake deformation snapshots into mode coefficient keyframes. Output can drive the skinning evaluator for replay without physics."
        },
        {
          "name": "sampleAnimation",
          "kind": "function",
          "signature": "sampleAnimation(animation, time)",
          "summary": "Interpolate baked animation at a given time."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "kaolin/physics/index",
      "path": "engine/reference/kaolin/physics/index.md",
      "source": "engine/kaolin/physics/index.js",
      "import": "/engine/kaolin/physics/index.js",
      "sourceHash": "cd051e3b3b8e414f70cb2133e26fe858b3486e761935bc384c76de4ebc44a26a",
      "summary": "Kaolin Physics — Barrel exports Physics bridges: auto tet mesh generation + learned skinning.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/capability/RouteCapability",
      "path": "engine/reference/network/capability/RouteCapability.md",
      "source": "engine/network/capability/RouteCapability.js",
      "import": "/engine/network/capability/RouteCapability.js",
      "sourceHash": "82424c8ab87f3200ad2cce0e76ae843d2b3c0ce5ec7fde4dba35a4c7f270b3ed",
      "summary": "network/capability/RouteCapability.js — capability-based route access for the Particle Global OS Network Layer (network plan §10).  Reuses the Causal State Engine's UCAN-style capability primitive (engine/state/authority/Capability.js: makeCapability/attenuate/authorizes) unmodified. A route capability names a principal (device/profile/membership signer fingerprint), the route as its object, and an allow-list of route/* verbs enforced via a caveat predicate — narrowing-only delegation comes for free from `attenuate()`. `CapabilityRegistry` (also reused as-is) tracks issuance, revocation, and single-use consumption.",
      "exports": [
        {
          "name": "makeRouteCapability",
          "kind": "function",
          "signature": "makeRouteCapability({ principal, routeId, allow = DEFAULT_ROUTE_ALLOW, constraints = {}, expiresAt = null, singleUse = false, delegable = true, } = {})",
          "summary": "Mint a route capability. The capability's own `action` is always `'*'`; the actual allow-list is enforced by a `route-allow` caveat so it composes correctly with further `attenuateRouteCapability()` narrowing."
        },
        {
          "name": "attenuateRouteCapability",
          "kind": "function",
          "signature": "attenuateRouteCapability(cap, { allow, predicate, key, label } = {})",
          "summary": "Narrow an existing route capability's allow-list and/or add an arbitrary extra predicate (e.g. \"only from this device fingerprint\"). Cannot widen beyond the parent's allow-list — throws if it would."
        },
        {
          "name": "authorizesRoute",
          "kind": "function",
          "signature": "authorizesRoute(cap, { principal, routeId, action, epoch, context = {} } = {})",
          "summary": "Check whether a capability authorizes a specific route action right now."
        },
        {
          "name": "createRouteCapabilityRegistry",
          "kind": "function",
          "signature": "createRouteCapabilityRegistry()",
          "summary": "Create a fresh registry to issue/revoke/consume route capabilities in."
        },
        {
          "name": "DEFAULT_ROUTE_ALLOW",
          "kind": "constant",
          "signature": "DEFAULT_ROUTE_ALLOW",
          "summary": "Default allow-list for a freshly-minted route capability (network plan §10)."
        },
        {
          "name": "ROUTE_ACTIONS",
          "kind": "constant",
          "signature": "ROUTE_ACTIONS",
          "summary": "All route verbs the network layer currently understands."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/AnonymityMode",
      "path": "engine/reference/network/carrier/AnonymityMode.md",
      "source": "engine/network/carrier/AnonymityMode.js",
      "import": "/engine/network/carrier/AnonymityMode.js",
      "sourceHash": "2ad3e61252431762618d92c424dac4919aa16ea4458169b9099f7426c039565e",
      "summary": "network/carrier/AnonymityMode.js — connection mode selection + UI transport-truth labels (network plan §25/§42): the UI must never claim a connection is more private than it actually is.",
      "exports": [
        {
          "name": "selectAnonymityMode",
          "kind": "function",
          "signature": "selectAnonymityMode({ isSelfDevice = false, groupApproved = false, trustPending = false, highRiskOverride = false } = {})",
          "summary": "Decide the anonymity mode for a peer relationship (network plan §25 policy: unknown/public -> anonymous; new invites -> anonymous until approved; group members -> group policy; trusted/own devices -> direct)."
        },
        {
          "name": "transportTruthLabel",
          "kind": "function",
          "signature": "transportTruthLabel(mode)",
          "summary": "Human-readable, honest transport label for the UI (§42)."
        },
        {
          "name": "allowsDirectTransport",
          "kind": "function",
          "signature": "allowsDirectTransport(mode)",
          "summary": "Whether a mode permits direct (non-relayed) transport — direct may reveal network metadata to the peer (§42)."
        },
        {
          "name": "ANONYMITY_MODE",
          "kind": "constant",
          "signature": "ANONYMITY_MODE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/CarrierForwarder",
      "path": "engine/reference/network/carrier/CarrierForwarder.md",
      "source": "engine/network/carrier/CarrierForwarder.js",
      "import": "/engine/network/carrier/CarrierForwarder.js",
      "sourceHash": "92787daaff6b2f0eacdf713a3c13c3aab58a976fad152c0991a5f981f634b261",
      "summary": "network/carrier/CarrierForwarder.js — the forwarding decision a carrier node makes for a sealed packet, WITHOUT ever inspecting its payload (network plan §24/§35/§36): expiry, hop-limit (TTL), dedupe, and rate limit, in that order. Reuses `chunks/DedupeCache.js` as-is (network plan §29 dedupe applies uniformly to control/route/carrier traffic).",
      "exports": [
        {
          "name": "evaluateForward",
          "kind": "function",
          "signature": "evaluateForward({ packet, dedupeCache, rateLimiter, dedupeTtlMs = 60000, now = Date.now()",
          "summary": "Decide whether to forward a carrier packet."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/CarrierIdentity",
      "path": "engine/reference/network/carrier/CarrierIdentity.md",
      "source": "engine/network/carrier/CarrierIdentity.js",
      "import": "/engine/network/carrier/CarrierIdentity.js",
      "sourceHash": "097de13581112ac514b3c66b477897df4c92af8e29afd0e913ffdd24ba0e05f2",
      "summary": "network/carrier/CarrierIdentity.js — announces a node's carrier-layer (§26) ECDH onion-recipient public key to its current mesh peers. Closes the gap `CarrierRelay.js`'s own doc flagged: \"another peer can only address this device as an onion hop if it learned the key out-of-band.\" This is that in-band announce: a tiny message sent over the SAME mesh session data channel (via `sendToPeer`, typically from `onPeerJoin`), cached locally so a future `SealedPacket.buildSealedPacket({hops, payload})` call can look up a hop's key without any prior out-of-band exchange.  Deliberately NOT signed/verified against a stronger identity (e.g. the CSE profile/device signer) — WebRTC's own DTLS already authenticates \"these bytes came from the peer this data channel is connected to\"; the remaining trust question (should carrier packets even be routed through this specific peer) is a routing/reputation decision for the caller, not this module's job. `handleCarrierIdentityMessage` only checks that the announce's claimed peerId matches the channel it arrived on (fails closed on mismatch — either a bug or a spoof attempt).",
      "exports": [
        {
          "name": "createCarrierIdentityRegistry",
          "kind": "function",
          "signature": "createCarrierIdentityRegistry()",
          "summary": "Create an empty registry of peerId -> carrier-recipient ECDH public key."
        },
        {
          "name": "buildCarrierIdentityAnnounce",
          "kind": "function",
          "signature": "buildCarrierIdentityAnnounce(selfPeerId, ecdhPublicKeyRaw)",
          "summary": "Build the announce message to hand to a mesh session's `sendToPeer`. Returns null if this node has no key to announce."
        },
        {
          "name": "handleCarrierIdentityMessage",
          "kind": "function",
          "signature": "handleCarrierIdentityMessage(registry, fromPeerId, op)",
          "summary": "Feed every relevant `onOp(peerId, op)` message through this, alongside `ChunkTransport.js`/`CarrierRelay.js`/`DhtTransport.js`'s own handlers (same `(peerId, op) => boolean` chaining pattern)."
        },
        {
          "name": "lookupCarrierRecipientKey",
          "kind": "function",
          "signature": "lookupCarrierRecipientKey(registry, peerId)",
          "summary": "Look up a previously-announced peer's carrier-recipient ECDH public key (raw bytes), or null."
        },
        {
          "name": "listKnownCarrierRecipients",
          "kind": "function",
          "signature": "listKnownCarrierRecipients(registry)",
          "summary": "List peerIds this node has learned a carrier-recipient key for."
        },
        {
          "name": "forgetCarrierRecipient",
          "kind": "function",
          "signature": "forgetCarrierRecipient(registry, peerId)",
          "summary": "Forget a peer's announced key (e.g. on disconnect/leave)."
        },
        {
          "name": "CARRIER_IDENTITY_MESSAGE_TYPE",
          "kind": "constant",
          "signature": "CARRIER_IDENTITY_MESSAGE_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/CarrierPacket",
      "path": "engine/reference/network/carrier/CarrierPacket.md",
      "source": "engine/network/carrier/CarrierPacket.js",
      "import": "/engine/network/carrier/CarrierPacket.js",
      "sourceHash": "a94afcc2b175dc373e942cc55d9fda6772c3571db020dc3d9a8bcdaa2cefaff1",
      "summary": "network/carrier/CarrierPacket.js — the carrier layer's OUTER envelope (network plan §26): visible routing metadata (route/ttl/expiry) plus an opaque sealed payload (SealedPacket.js) that carrier nodes forward without ever decrypting.",
      "exports": [
        {
          "name": "makeCarrierPacket",
          "kind": "function",
          "signature": "makeCarrierPacket({ routeId, ttl = 4, expiresAt = null, sealed } = {})",
          "summary": "Wrap a sealed onion packet for carrier forwarding."
        },
        {
          "name": "decrementCarrierTtl",
          "kind": "function",
          "signature": "decrementCarrierTtl(packet)",
          "summary": "Return a new carrier packet with ttl decremented by 1 (does not mutate the input)."
        },
        {
          "name": "isCarrierPacketExpired",
          "kind": "function",
          "signature": "isCarrierPacketExpired(packet, now = Date.now()",
          "summary": ""
        },
        {
          "name": "isCarrierTtlExhausted",
          "kind": "function",
          "signature": "isCarrierTtlExhausted(packet)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/CarrierRelay",
      "path": "engine/reference/network/carrier/CarrierRelay.md",
      "source": "engine/network/carrier/CarrierRelay.js",
      "import": "/engine/network/carrier/CarrierRelay.js",
      "sourceHash": "c360a804893025dc821a693b07c9b59b00b970404bc66d1b5ae8d27f6bc7c77d",
      "summary": "network/carrier/CarrierRelay.js — routes a CarrierPacket across a real mesh (network plan §24/§35/§36, previously deferred: \"CollabMeshTopology gossip/fanout/TTL wiring for actual multi-peer carrier mesh topology\").  SealedPacket.js's onion path is an ordered peerId list chosen by the SENDER, but not every hop in that path is necessarily a live WebRTC neighbor of the previous hop — K-neighbor partial-mesh/supernode modes deliberately do NOT connect every peer to every peer (see engine/collab/CollabMeshTopology.js's header comment: \"K-neighbor gossip mesh ... messages reach all N peers in ~log_K(N) hops\"). This module bridges that gap: - If the addressed next hop IS a direct neighbor right now, deliver directly — cheapest path, one hop, no flood. - Otherwise, gossip-flood the envelope via CollabMeshTopology's existing TTL+dedupe fanout (`gossipWrap`/`gossipReceive`) so it propagates through the mesh until it reaches a peer who either IS the target or has it as a direct neighbor, at which point THAT peer delivers it directly instead of re-flooding.  Every touch of a carrier packet — direct delivery or gossip relay — always runs through `CarrierForwarder.evaluateForward()` first (onion-layer expiry/TTL/dedupe/rate-limit), independent of and in addition to the mesh gossip's OWN TTL/dedupe: gossip TTL bounds mesh hops for one flood attempt; carrier TTL bounds total onion hops end-to-end. Neither layer ever inspects the sealed payload itself (network plan §24's core guarantee) — only `peelSealedPacket`, called with THIS node's own private key when (and only when) this node is the addressed hop, can see anything beyond the next hop id.",
      "exports": [
        {
          "name": "createCarrierRelay",
          "kind": "function",
          "signature": "createCarrierRelay({ sendToPeer, topology, dedupeCache, rateLimiter, recipientEcdhPrivateKey = null, onPayloadReceived = ()",
          "summary": ""
        },
        {
          "name": "relayCarrierPacket",
          "kind": "function",
          "signature": "relayCarrierPacket(relay, nextHopPeerId, packet)",
          "summary": "Send/relay a carrier packet toward its addressed next hop. Runs the standard forwarding check first — a caller originating a brand-new packet should still go through this (it's the same expiry/TTL/dedupe/rate-limit gate every intermediate hop uses, applied uniformly per network plan §35)."
        },
        {
          "name": "handleCarrierRelayMessage",
          "kind": "function",
          "signature": "async handleCarrierRelayMessage(relay, fromPeerId, op)",
          "summary": "Feed every relevant `onOp(peerId, op)` message through this (e.g. from `createCollabCore({ onOp })`, alongside `ChunkTransport.js`'s own `handleChunkTransportMessage` — both follow the same \"return false if not ours\" chaining pattern). Handles: peeling a layer addressed to this node, delivering the final payload, direct-hop forwarding, and mesh-gossip re-forwarding."
        },
        {
          "name": "CARRIER_RELAY_MESSAGE_TYPE",
          "kind": "constant",
          "signature": "CARRIER_RELAY_MESSAGE_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/RateLimiter",
      "path": "engine/reference/network/carrier/RateLimiter.md",
      "source": "engine/network/carrier/RateLimiter.js",
      "import": "/engine/network/carrier/RateLimiter.js",
      "sourceHash": "f8e16317d3349f229b875b0d880e1cda0b14abac4a6dac2a12d7fd1b7c755c89",
      "summary": "network/carrier/RateLimiter.js — token-bucket rate limiting for carrier forwarding (network plan §35/§36 spam controls, V1: rate limits + dedupe, no proof-of-work yet).",
      "exports": [
        {
          "name": "createRateLimiter",
          "kind": "function",
          "signature": "createRateLimiter({ capacity = 30, refillPerSecond = 10 } = {})",
          "summary": "Create a token bucket."
        },
        {
          "name": "tryConsume",
          "kind": "function",
          "signature": "tryConsume(limiter, cost = 1, now = Date.now()",
          "summary": "Try to consume `cost` tokens. Returns false (caller should drop/reject) if insufficient."
        },
        {
          "name": "availableTokens",
          "kind": "function",
          "signature": "availableTokens(limiter, now = Date.now()",
          "summary": "Tokens currently available (after applying refill for elapsed time)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/SealedPacket",
      "path": "engine/reference/network/carrier/SealedPacket.md",
      "source": "engine/network/carrier/SealedPacket.js",
      "import": "/engine/network/carrier/SealedPacket.js",
      "sourceHash": "2e66d31a51adcf9548c8aba00fb77a8b72b15b2189d3102e0b479ad788028e17",
      "summary": "network/carrier/SealedPacket.js — multi-hop onion-sealed packets (network plan §24/§26 public carrier layer).  Phase 0 audit finding: `engine/collab/CollabAnonymousRelay.js` implements SINGLE-hop anonymization (host relay + garlic-encrypted payload) for one game-collab session. The OS network layer needs TRUE multi-hop onion routing across semi-trusted carrier meshes that are not part of any group. This module builds that generically, reusing the same ECDH P-256 + AES-256-GCM primitives (`CollabCrypto`) rather than inventing new crypto.  Each layer is wrapped from the innermost (final recipient) outward, so only the addressed hop can decrypt its own layer. A peeled layer reveals only the NEXT hop's peerId (or, at the final layer, the actual payload) — never the full path, the true sender, or the payload, matching §26.",
      "exports": [
        {
          "name": "buildSealedPacket",
          "kind": "function",
          "signature": "async buildSealedPacket({ hops, payload } = {})",
          "summary": "Build a multi-hop sealed packet."
        },
        {
          "name": "peelSealedPacket",
          "kind": "function",
          "signature": "async peelSealedPacket(sealedLayer, recipientPrivateKey)",
          "summary": "Peel one layer with this hop's ECDH private key."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/carrier/index",
      "path": "engine/reference/network/carrier/index.md",
      "source": "engine/network/carrier/index.js",
      "import": "/engine/network/carrier/index.js",
      "sourceHash": "b8d1eaa85357a4851afb33d05a71361ed7d98c34782761b34fd13a9e79a724e4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/ChunkCache",
      "path": "engine/reference/network/chunks/ChunkCache.md",
      "source": "engine/network/chunks/ChunkCache.js",
      "import": "/engine/network/chunks/ChunkCache.js",
      "sourceHash": "080d95eca8da322e2627de08758b9712016f93514f15d1112eade50b19b4a54f",
      "summary": "Bounded in-memory LRU used only while the browser endpoint is alive.",
      "exports": [
        {
          "name": "createChunkCache",
          "kind": "function",
          "signature": "createChunkCache({ maxEntries = 128, maxBytes = 64 * 1024 * 1024 } = {})",
          "summary": "Bounded in-memory LRU used only while the browser endpoint is alive."
        },
        {
          "name": "cacheVerifiedChunk",
          "kind": "function",
          "signature": "cacheVerifiedChunk(cache, { chunkId, fragmentRoot, bytes } = {})",
          "summary": "Store bytes that the caller has already content/Merkle verified."
        },
        {
          "name": "readCachedChunk",
          "kind": "function",
          "signature": "readCachedChunk(cache, chunkId)",
          "summary": ""
        },
        {
          "name": "chunkCacheStatus",
          "kind": "function",
          "signature": "chunkCacheStatus(cache)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/ChunkFragmenter",
      "path": "engine/reference/network/chunks/ChunkFragmenter.md",
      "source": "engine/network/chunks/ChunkFragmenter.js",
      "import": "/engine/network/chunks/ChunkFragmenter.js",
      "sourceHash": "1c5ebd97202016060cf531bdbf1f1445f97d1e3ccb43601d6c23eeedce5d444f",
      "summary": "network/chunks/ChunkFragmenter.js — split large objects into chunks, and chunks into transport-sized fragments (network plan §27/§31/§32).",
      "exports": [
        {
          "name": "splitIntoChunks",
          "kind": "function",
          "signature": "splitIntoChunks(bytes, chunkSize = DEFAULT_CHUNK_BYTES)",
          "summary": "Split an object's bytes into chunks no larger than `chunkSize` (which must not exceed the network-wide 4MB ceiling)."
        },
        {
          "name": "splitChunkIntoFragments",
          "kind": "function",
          "signature": "splitChunkIntoFragments(chunkBytes, fragmentSize = DEFAULT_FRAGMENT_BYTES)",
          "summary": "Split one chunk's bytes into transport-sized fragments."
        },
        {
          "name": "reassembleFragments",
          "kind": "function",
          "signature": "reassembleFragments(fragments)",
          "summary": "Concatenate fragments back into one chunk's bytes."
        },
        {
          "name": "reassembleChunks",
          "kind": "function",
          "signature": "reassembleChunks(chunks)",
          "summary": "Concatenate chunks back into the full object's bytes."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/ChunkLimits",
      "path": "engine/reference/network/chunks/ChunkLimits.md",
      "source": "engine/network/chunks/ChunkLimits.js",
      "import": "/engine/network/chunks/ChunkLimits.js",
      "sourceHash": "d83f4d8c7b1e85960f2eb49876fc1ba86ca74a5f940df7eb7dadc0da12e75e21",
      "summary": "network/chunks/ChunkLimits.js — size ceilings/defaults (network plan §27).",
      "exports": [
        {
          "name": "MAX_CHUNK_BYTES",
          "kind": "constant",
          "signature": "MAX_CHUNK_BYTES",
          "summary": "Network-wide hard ceiling for one logical chunk. Not the default — a ceiling."
        },
        {
          "name": "DEFAULT_CHUNK_BYTES",
          "kind": "constant",
          "signature": "DEFAULT_CHUNK_BYTES",
          "summary": "Sensible default chunk size (§27: \"512 KB-1 MB\")."
        },
        {
          "name": "DEFAULT_FRAGMENT_BYTES",
          "kind": "constant",
          "signature": "DEFAULT_FRAGMENT_BYTES",
          "summary": "Default transport fragment size (§27/§28; matches WebRTC DataChannel's assumed default `max-message-size`)."
        },
        {
          "name": "MAX_FRAGMENT_BYTES",
          "kind": "constant",
          "signature": "MAX_FRAGMENT_BYTES",
          "summary": "Experimental larger fragment size for trusted high-bandwidth links."
        },
        {
          "name": "CONTROL_MAX_BYTES",
          "kind": "constant",
          "signature": "CONTROL_MAX_BYTES",
          "summary": "Soft caps for non-bulk message classes (§27)."
        },
        {
          "name": "MANIFEST_MAX_BYTES",
          "kind": "constant",
          "signature": "MANIFEST_MAX_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/ChunkTransport",
      "path": "engine/reference/network/chunks/ChunkTransport.md",
      "source": "engine/network/chunks/ChunkTransport.js",
      "import": "/engine/network/chunks/ChunkTransport.js",
      "sourceHash": "93dc7e6b16d2ac9febfdc5a0aacec1dd7d3f80dc920368394569509d773ae13a",
      "summary": "network/chunks/ChunkTransport.js — binds the transport-agnostic chunk pipeline (ChunkFragmenter/MerkleFragments/ChunkVerifier/FlowControl/ DedupeCache) to a real peer connection (network plan §27/§28/§31/§32, previously deferred: \"Real WebRTC DataChannel transport wiring\").  Deliberately transport-agnostic at the call boundary — takes a `sendToPeer` function matching engine/collab/CollabCore.js's `sendToPeer(core, peerId, data)` signature (which already auto-chunks anything over ~60KB to dodge SCTP frame limits and reassembles transparently on the receive side, and round-trips `Uint8Array` natively via CollabCodec.js's msgpack `bin` format) rather than importing CollabCore itself. Callers feed every relevant `onOp(peerId, op)` message through `handleChunkTransportMessage` before their own app-level op handling — same pattern SyncTransport.js uses for MasterServerClient signal events.  Real credit-based backpressure (FlowControl.js's whole point): a CollabCore-style reliable-ordered data channel does NOT drop or backpressure large \"critical\" application messages on its own (see CollabCore.js's `_sendBinary` — only a handful of non-critical types like `__ping__` get dropped under buffer pressure); blasting every fragment of a multi-MB object immediately would build unbounded `bufferedAmount`. This module gates sends on an ACK-based credit window instead: a fragment's credit is only released once the receiver confirms it actually arrived (`CHUNK_FRAGMENT_ACK`), not merely once handed to the transport.",
      "exports": [
        {
          "name": "createChunkTransport",
          "kind": "function",
          "signature": "createChunkTransport({ sendToPeer, maxInFlightBytes, getChunk = async ()",
          "summary": ""
        },
        {
          "name": "requestChunkFromPeer",
          "kind": "function",
          "signature": "requestChunkFromPeer(transport, { peerId, chunkId, fragmentRoot, timeoutMs = REQUEST_TIMEOUT_MS, lane = PRIORITY_LANE.NORMAL, } = {})",
          "summary": "Ask one peer for a manifest-declared chunk and await its verified bytes."
        },
        {
          "name": "enqueueChunkSend",
          "kind": "function",
          "signature": "enqueueChunkSend(transport, { peerId, chunkId, chunkBytes, fragmentRoot, lane = PRIORITY_LANE.NORMAL, fragmentSize = DEFAULT_FRAGMENT_BYTES })",
          "summary": "Enqueue one chunk's fragments for sending to a peer. Actual sends are paced by the credit window (see module doc) — this returns immediately; fragments drain asynchronously as ACKs free up credit."
        },
        {
          "name": "handleChunkTransportMessage",
          "kind": "function",
          "signature": "handleChunkTransportMessage(transport, peerId, op)",
          "summary": "Feed every `onOp(peerId, op)` message through this (e.g. from `createCollabCore({ onOp })`). Handles fragment sends and their acks; returns false for anything that isn't a chunk-transport message so callers can safely chain their own app-level op handling after it."
        },
        {
          "name": "CHUNK_MESSAGE_TYPE",
          "kind": "constant",
          "signature": "CHUNK_MESSAGE_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/ChunkVerifier",
      "path": "engine/reference/network/chunks/ChunkVerifier.md",
      "source": "engine/network/chunks/ChunkVerifier.js",
      "import": "/engine/network/chunks/ChunkVerifier.js",
      "sourceHash": "5418977135881e995ef27f1937bf98ebd5b2051323719d7322e0c08757a7f6f4",
      "summary": "network/chunks/ChunkVerifier.js — verify received fragments/chunks against a manifest's declared hashes (network plan §31/§32).",
      "exports": [
        {
          "name": "verifyChunkFragments",
          "kind": "function",
          "signature": "async verifyChunkFragments(fragments, expectedFragmentRoot)",
          "summary": "Verify a fully-received set of fragments for one chunk against the manifest's declared fragment merkle root — before spending time/memory reassembling+hashing the whole chunk."
        },
        {
          "name": "reassembleAndVerifyChunk",
          "kind": "function",
          "signature": "async reassembleAndVerifyChunk(fragments, expectedChunkId)",
          "summary": "Reassemble fragments and verify the resulting chunk's content hash matches the manifest's declared chunkId. Returns the reassembled bytes on success, or null (fails closed) on mismatch."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/DedupeCache",
      "path": "engine/reference/network/chunks/DedupeCache.md",
      "source": "engine/network/chunks/DedupeCache.js",
      "import": "/engine/network/chunks/DedupeCache.js",
      "sourceHash": "30e612e0be70581ab3b58bce15096a6fc2e530050e50a57f6431b9a171a0bc1f",
      "summary": "network/chunks/DedupeCache.js — generic seen-packet dedupe table (network plan §29), keyed by whatever content/event/packet hash a caller chooses. Type-specific retention: callers pick the ttlMs per dedupe key type (control packets 1-5min, route announcements 5-30min, chunks/ledger events effectively forever via their own content hash, etc.) — this module just enforces \"seen within its TTL -> drop\" generically.",
      "exports": [
        {
          "name": "createDedupeCache",
          "kind": "function",
          "signature": "createDedupeCache()",
          "summary": "Create an empty dedupe cache."
        },
        {
          "name": "hasSeen",
          "kind": "function",
          "signature": "hasSeen(cache, key, now = Date.now()",
          "summary": "True if `key` was marked seen and its TTL hasn't expired yet. Expired entries are lazily evicted."
        },
        {
          "name": "markSeen",
          "kind": "function",
          "signature": "markSeen(cache, key, ttlMs, now = Date.now()",
          "summary": "Mark `key` as seen for `ttlMs` milliseconds."
        },
        {
          "name": "checkAndMark",
          "kind": "function",
          "signature": "checkAndMark(cache, key, ttlMs, now = Date.now()",
          "summary": "Convenience: check-and-mark in one call — the usual receive-path pattern (\"if already seen, drop; otherwise mark seen and process\")."
        },
        {
          "name": "pruneDedupeCache",
          "kind": "function",
          "signature": "pruneDedupeCache(cache, now = Date.now()",
          "summary": "Remove all expired entries. Returns the number removed."
        },
        {
          "name": "dedupeCacheSize",
          "kind": "function",
          "signature": "dedupeCacheSize(cache)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/FlowControl",
      "path": "engine/reference/network/chunks/FlowControl.md",
      "source": "engine/network/chunks/FlowControl.js",
      "import": "/engine/network/chunks/FlowControl.js",
      "sourceHash": "732ba36307b3b2ee51e3f43e0ccf26a9ca249c53dbe453eaa18a73732df13e4e",
      "summary": "network/chunks/FlowControl.js — credit-based flow control + priority lanes (network plan §28). QUIC-style: a receiver advertises how much in-flight data it can absorb; senders must reserve credit before sending and the receiver restores it once a fragment is verified/written.",
      "exports": [
        {
          "name": "createFlowControl",
          "kind": "function",
          "signature": "createFlowControl({ maxInFlightBytes = 16 * 1024 * 1024 } = {})",
          "summary": "Create a flow-control window."
        },
        {
          "name": "tryReserveCredit",
          "kind": "function",
          "signature": "tryReserveCredit(fc, bytes)",
          "summary": "Try to reserve `bytes` of send credit. Returns false (caller must pause) if it would exceed the window."
        },
        {
          "name": "releaseCredit",
          "kind": "function",
          "signature": "releaseCredit(fc, bytes)",
          "summary": "Restore credit after a fragment is verified/written (or dropped/timed out)."
        },
        {
          "name": "availableCredit",
          "kind": "function",
          "signature": "availableCredit(fc)",
          "summary": "Bytes of credit still available right now."
        },
        {
          "name": "createPriorityQueue",
          "kind": "function",
          "signature": "createPriorityQueue()",
          "summary": "Create an empty multi-lane priority queue."
        },
        {
          "name": "enqueue",
          "kind": "function",
          "signature": "enqueue(pq, lane, item)",
          "summary": "Enqueue an item on a priority lane (lower lane number = served first)."
        },
        {
          "name": "dequeue",
          "kind": "function",
          "signature": "dequeue(pq)",
          "summary": "Dequeue the next item, always draining the lowest non-empty lane first."
        },
        {
          "name": "isQueueEmpty",
          "kind": "function",
          "signature": "isQueueEmpty(pq)",
          "summary": "True if every lane is empty."
        },
        {
          "name": "PRIORITY_LANE",
          "kind": "constant",
          "signature": "PRIORITY_LANE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/Manifest",
      "path": "engine/reference/network/chunks/Manifest.md",
      "source": "engine/network/chunks/Manifest.js",
      "import": "/engine/network/chunks/Manifest.js",
      "sourceHash": "53acacadce5196033d917466a8242975f965807f2f678c78b7c43409bd1852e9",
      "summary": "network/chunks/Manifest.js — signed object manifests (network plan §31). A manifest describes an object as an ordered list of chunks (each with a content hash + fragment merkle root); the object itself is fetched chunk-by-chunk, possibly from many peers at once (SwarmScheduler.js).",
      "exports": [
        {
          "name": "buildManifest",
          "kind": "function",
          "signature": "async buildManifest({ objectId, scope = 'private', version = 1, chunks = [], permissions = [], encryptionEpoch = null, signer, } = {})",
          "summary": "Build + sign a manifest."
        },
        {
          "name": "verifyManifest",
          "kind": "function",
          "signature": "async verifyManifest(signedManifest)",
          "summary": "Verify a manifest's protocol/type and signature."
        },
        {
          "name": "manifestTotalSize",
          "kind": "function",
          "signature": "manifestTotalSize(signedManifest)",
          "summary": "Total object size implied by a manifest's chunk list."
        },
        {
          "name": "manifestChunkIds",
          "kind": "function",
          "signature": "manifestChunkIds(signedManifest)",
          "summary": "List of chunk ids a manifest references, in order."
        },
        {
          "name": "MAX_MANIFEST_CHUNKS",
          "kind": "constant",
          "signature": "MAX_MANIFEST_CHUNKS",
          "summary": ""
        },
        {
          "name": "MAX_MANIFEST_OBJECT_BYTES",
          "kind": "constant",
          "signature": "MAX_MANIFEST_OBJECT_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/MerkleFragments",
      "path": "engine/reference/network/chunks/MerkleFragments.md",
      "source": "engine/network/chunks/MerkleFragments.js",
      "import": "/engine/network/chunks/MerkleFragments.js",
      "sourceHash": "5f335a21c57aacddbca27d4d9b6e879364d12286a17985a55d70acadcfe3b8a0",
      "summary": "network/chunks/MerkleFragments.js — per-fragment hashing + a chunk's merkle root (network plan §32), so receivers can reject a corrupted fragment early instead of only detecting failure after the whole chunk is reassembled. Reuses the engine's existing SHA-256 content hash helper (already used for identity fingerprints elsewhere).",
      "exports": [
        {
          "name": "hashFragment",
          "kind": "function",
          "signature": "async hashFragment(fragmentBytes)",
          "summary": "SHA-256 hex hash of one fragment's raw bytes."
        },
        {
          "name": "computeChunkHash",
          "kind": "function",
          "signature": "async computeChunkHash(chunkBytes)",
          "summary": "SHA-256 hex hash of a full chunk's raw bytes (used as the chunk's content id)."
        },
        {
          "name": "computeFragmentHashes",
          "kind": "function",
          "signature": "async computeFragmentHashes(fragments)",
          "summary": "Hash every fragment of a chunk, in order."
        },
        {
          "name": "computeMerkleRoot",
          "kind": "function",
          "signature": "async computeMerkleRoot(fragmentHashes)",
          "summary": "Compute a chunk's merkle root from its (ordered) fragment hashes: pair up adjacent hashes, hash their concatenation, repeat until one root remains (odd node carries up unchanged, standard merkle tree construction)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/SwarmFetchCoordinator",
      "path": "engine/reference/network/chunks/SwarmFetchCoordinator.md",
      "source": "engine/network/chunks/SwarmFetchCoordinator.js",
      "import": "/engine/network/chunks/SwarmFetchCoordinator.js",
      "sourceHash": "1f2aa183500cc10a7e45068a253b2668dacad447990d3f71f0cb40ca437dcf3f",
      "summary": "Resolve a signed manifest from many DHT providers, retrying failed peers, verifying every content hash, and preserving manifest chunk order.",
      "exports": [
        {
          "name": "SwarmFetchError",
          "kind": "class",
          "signature": "class SwarmFetchError extends Error",
          "summary": ""
        },
        {
          "name": "fetchManifestFromSwarm",
          "kind": "function",
          "signature": "async fetchManifestFromSwarm({ signedManifest, transport, findProviders, fallbackPeers = ()",
          "summary": "Resolve a signed manifest from many DHT providers, retrying failed peers, verifying every content hash, and preserving manifest chunk order."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/SwarmScheduler",
      "path": "engine/reference/network/chunks/SwarmScheduler.md",
      "source": "engine/network/chunks/SwarmScheduler.js",
      "import": "/engine/network/chunks/SwarmScheduler.js",
      "sourceHash": "c3dfc7f3efebe126529f846afc00adebc56730077e409262f770a2d74c9265b0",
      "summary": "network/chunks/SwarmScheduler.js — spread chunk fetches across multiple providing peers (network plan §31 swarm fetching). Pure scheduling logic; the actual byte transfer happens over routes/sessions from earlier phases.",
      "exports": [
        {
          "name": "planSwarmFetch",
          "kind": "function",
          "signature": "planSwarmFetch({ chunkIds, providers, maxLanes = 4 } = {})",
          "summary": "Assign each requested chunk to one candidate provider peer, load-balancing so no single peer is asked for every chunk, then group the assignments into fetch \"lanes\" of up to `maxLanes` concurrent requests."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/chunks/index",
      "path": "engine/reference/network/chunks/index.md",
      "source": "engine/network/chunks/index.js",
      "import": "/engine/network/chunks/index.js",
      "sourceHash": "f1c585e6b4afa548d2f361696407d00821e651f717d0e69ed37871a8cc820431",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/crypto/Hpke",
      "path": "engine/reference/network/crypto/Hpke.md",
      "source": "engine/network/crypto/Hpke.js",
      "import": "/engine/network/crypto/Hpke.js",
      "sourceHash": "5c3c8bf3da8c221b1173b59ffb63777e47756ae109cdc90ce41967f451e3b5a2",
      "summary": "RFC 9180 base mode: DHKEM(P-256, HKDF-SHA256), HKDF-SHA256, AES-128-GCM. Signaling uses a fresh encapsulation for every message, so the AEAD sequence number is always zero and the base nonce is used directly.",
      "exports": [
        {
          "name": "generateHpkeKeyPair",
          "kind": "function",
          "signature": "async generateHpkeKeyPair()",
          "summary": ""
        },
        {
          "name": "hpkeSeal",
          "kind": "function",
          "signature": "async hpkeSeal(recipientPublicKeyHex, plaintext, options = {})",
          "summary": ""
        },
        {
          "name": "hpkeOpen",
          "kind": "function",
          "signature": "async hpkeOpen(recipientPrivateKey, encHex, ciphertextHex, options = {})",
          "summary": ""
        },
        {
          "name": "hpkeBytesToHex",
          "kind": "re-export",
          "signature": "hpkeBytesToHex",
          "summary": ""
        },
        {
          "name": "hpkeHexToBytes",
          "kind": "re-export",
          "signature": "hpkeHexToBytes",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/crypto/OpaqueRoute",
      "path": "engine/reference/network/crypto/OpaqueRoute.md",
      "source": "engine/network/crypto/OpaqueRoute.js",
      "import": "/engine/network/crypto/OpaqueRoute.js",
      "sourceHash": "513a9f3e3b94d8793e8533d230b1f997f630f6df370493ee079442094542a06c",
      "summary": "",
      "exports": [
        {
          "name": "deriveOpaqueRoute",
          "kind": "function",
          "signature": "async deriveOpaqueRoute({ routeSecret = null, projectId = 'default' } = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/crypto/Trust",
      "path": "engine/reference/network/crypto/Trust.md",
      "source": "engine/network/crypto/Trust.js",
      "import": "/engine/network/crypto/Trust.js",
      "sourceHash": "9353d1992431e41107807fc1e6d9ac7e525feeefaf8b4fd85cb80c42005185e6",
      "summary": "",
      "exports": [
        {
          "name": "canonicalJson",
          "kind": "function",
          "signature": "canonicalJson(value)",
          "summary": ""
        },
        {
          "name": "sha256Hex",
          "kind": "function",
          "signature": "async sha256Hex(value)",
          "summary": ""
        },
        {
          "name": "verifyRawSignature",
          "kind": "function",
          "signature": "async verifyRawSignature(publicKeyHex, bytes, signatureHex)",
          "summary": ""
        },
        {
          "name": "verifySignedManifest",
          "kind": "function",
          "signature": "async verifySignedManifest(signed, expectedPins, nowSeconds = Math.floor(Date.now()",
          "summary": ""
        },
        {
          "name": "verifySignedV3Manifest",
          "kind": "function",
          "signature": "async verifySignedV3Manifest(signed, expectedPins, nowSeconds = Math.floor(Date.now()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/crypto/index",
      "path": "engine/reference/network/crypto/index.md",
      "source": "engine/network/crypto/index.js",
      "import": "/engine/network/crypto/index.js",
      "sourceHash": "e97417713a16c64884d868d01d9572d19f2facb7e5b23131f2d3ceafbe7359d8",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/daemon/ParticleNetworkDaemon",
      "path": "engine/reference/network/daemon/ParticleNetworkDaemon.md",
      "source": "engine/network/daemon/ParticleNetworkDaemon.js",
      "import": "/engine/network/daemon/ParticleNetworkDaemon.js",
      "sourceHash": "f5f03a19193d574eca1f0130e1455841b9ba753860e97c748ba7f0a07d5fbd43",
      "summary": "Validate and normalize a V2 ICE response. Explicit direct mode is strict so a malformed or compromised response cannot smuggle relay credentials into a no-TURN client. Legacy relay responses remain accepted when they contain a real authenticated TURN URL.",
      "exports": [
        {
          "name": "ParticleNetworkDaemon",
          "kind": "class",
          "signature": "class ParticleNetworkDaemon",
          "summary": ""
        },
        {
          "name": "readParticleTrustFloor",
          "kind": "function",
          "signature": "readParticleTrustFloor(networkRootId, nodeId, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "writeParticleTrustFloor",
          "kind": "function",
          "signature": "writeParticleTrustFloor(networkRootId, nodeId, floor, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "particleIceConfigurationReport",
          "kind": "function",
          "signature": "particleIceConfigurationReport(value)",
          "summary": "Validate and normalize a V2 ICE response. Explicit direct mode is strict so a malformed or compromised response cannot smuggle relay credentials into a no-TURN client. Legacy relay responses remain accepted when they contain a real authenticated TURN URL."
        },
        {
          "name": "PARTICLE_TRUST_FLOOR_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_TRUST_FLOOR_SCHEMA",
          "summary": ""
        },
        {
          "name": "PARTICLE_TRUST_FLOOR_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "PARTICLE_TRUST_FLOOR_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/daemon/ParticleNetworkDaemonRegistry",
      "path": "engine/reference/network/daemon/ParticleNetworkDaemonRegistry.md",
      "source": "engine/network/daemon/ParticleNetworkDaemonRegistry.js",
      "import": "/engine/network/daemon/ParticleNetworkDaemonRegistry.js",
      "sourceHash": "ce3ecd4a884f7d262ab28fcfd4c2f0b1777a121eabd54f6fb8ac7026c5e2c563",
      "summary": "",
      "exports": [
        {
          "name": "acquireParticleNetworkDaemon",
          "kind": "function",
          "signature": "acquireParticleNetworkDaemon({ server, deviceSigner, onEvent = null, preferV3 = false } = {})",
          "summary": ""
        },
        {
          "name": "particleNetworkDaemonStats",
          "kind": "function",
          "signature": "particleNetworkDaemonStats()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/daemon/ParticleNetworkPreferredDaemon",
      "path": "engine/reference/network/daemon/ParticleNetworkPreferredDaemon.md",
      "source": "engine/network/daemon/ParticleNetworkPreferredDaemon.js",
      "import": "/engine/network/daemon/ParticleNetworkPreferredDaemon.js",
      "sourceHash": "a07a8c04103287ec7c253b6f2aaaffb5cc65290f4f0d85b09e29690b23c0e6b9",
      "summary": "Selects V3 only from a valid, pinned V2 advertisement. A valid advertisement with no V3 marker selects V2. Any V3 marker commits the connection attempt to V3; V3 integrity failures are forwarded and never retried as V2.",
      "exports": [
        {
          "name": "ParticleNetworkPreferredDaemon",
          "kind": "class",
          "signature": "class ParticleNetworkPreferredDaemon",
          "summary": "Selects V3 only from a valid, pinned V2 advertisement. A valid advertisement with no V3 marker selects V2. Any V3 marker commits the connection attempt to V3; V3 integrity failures are forwarded and never retried as V2."
        },
        {
          "name": "advertisesV3",
          "kind": "re-export",
          "signature": "advertisesV3",
          "summary": ""
        },
        {
          "name": "hasValidV3Advertisement",
          "kind": "re-export",
          "signature": "hasValidV3Advertisement",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/daemon/index",
      "path": "engine/reference/network/daemon/index.md",
      "source": "engine/network/daemon/index.js",
      "import": "/engine/network/daemon/index.js",
      "sourceHash": "9bc9e82076a4d0e7c1d639a5018d7cae6e731498f98d8174644458f7828e5fe5",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/dht/BootstrapSource",
      "path": "engine/reference/network/dht/BootstrapSource.md",
      "source": "engine/network/dht/BootstrapSource.js",
      "import": "/engine/network/dht/BootstrapSource.js",
      "sourceHash": "d4ee5bdc48c69bac68762c081f87f159d95c74e0e66a0d0f20241a75edd7934f",
      "summary": "network/dht/BootstrapSource.js — pluggable bootstrap sources for the no-bootstrap-is-impossible reality check (network plan §37/§47/§48): \"no pure zero-bootstrap global discovery exists\" — cached peers, LAN, invite code, DHT, radio beacon, or a seed/master server are the only starting paths. This module defines a tiny, transport-agnostic interface (`{ id, scan(), advertise(record) }`) and a registry to combine several sources into one bootstrap attempt order; it ships NO concrete transport.  Concrete adapter (wired at the OS integration layer, per this module's engine/network-stays-webgpu-os-free rule): webgpu-os/drivers/ ResidentBootstrapSource.js wraps the OS browser extension's \"resident\" node (webgpu-os/browser-extension/services/ResidentService.js, exposed via BrowserBridgeClient.resident) — a standing MV3 offscreen document that persists a device's PUBLIC identity cert and stays warm via a chrome.alarms keepalive. Kept honest in that adapter: the resident node does NOT answer presence with no OS tab open (it is a lightweight cert vault + heartbeat only, off by default) — its `scan()` returns a \"last remembered identity\" hint, not a confirmed-reachable peer.",
      "exports": [
        {
          "name": "createBootstrapSource",
          "kind": "function",
          "signature": "createBootstrapSource({ id, scan, advertise = null } = {})",
          "summary": "Wrap a bootstrap source implementation."
        },
        {
          "name": "createBootstrapRegistry",
          "kind": "function",
          "signature": "createBootstrapRegistry()",
          "summary": "Create a registry of bootstrap sources, tried in registration order."
        },
        {
          "name": "registerBootstrapSource",
          "kind": "function",
          "signature": "registerBootstrapSource(registry, source)",
          "summary": ""
        },
        {
          "name": "runBootstrap",
          "kind": "function",
          "signature": "async runBootstrap(registry)",
          "summary": "Try each registered source in order, collecting whatever records each one returns (a source throwing/timing out just contributes nothing — this never fails the whole bootstrap attempt)."
        },
        {
          "name": "flattenBootstrapResults",
          "kind": "function",
          "signature": "flattenBootstrapResults(results)",
          "summary": "Flatten runBootstrap()'s per-source results into one record list, tagged with their source."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/dht/DhtMessages",
      "path": "engine/reference/network/dht/DhtMessages.md",
      "source": "engine/network/dht/DhtMessages.js",
      "import": "/engine/network/dht/DhtMessages.js",
      "sourceHash": "e259a4dba5d1a58fba30846560c3d4796dbf80eca257bab0d8265bb6df2e1a30",
      "summary": "network/dht/DhtMessages.js — future Particle DHT message primitives (network plan §47): FIND_PEER / FIND_ROUTE / FIND_PROVIDERS / PEER_EXCHANGE ANNOUNCE_PROVIDER / ANNOUNCE_ROUTE. Low priority per the plan — these are just versioned envelope builders (protocol.js `particle-dht/1`) for a future real DHT transport; no network code lives here yet. Bootstrap is still required even with a DHT (network plan §47: cached peers/LAN/master server/invite) — see BootstrapSource.js.",
      "exports": [
        {
          "name": "makeFindPeerMessage",
          "kind": "function",
          "signature": "makeFindPeerMessage({ targetPeerId, requesterPeerId } = {})",
          "summary": ""
        },
        {
          "name": "makeFindRouteMessage",
          "kind": "function",
          "signature": "makeFindRouteMessage({ routeId, requesterPeerId } = {})",
          "summary": ""
        },
        {
          "name": "makeFindProvidersMessage",
          "kind": "function",
          "signature": "makeFindProvidersMessage({ key, requesterPeerId } = {})",
          "summary": ""
        },
        {
          "name": "makeAnnounceProviderMessage",
          "kind": "function",
          "signature": "makeAnnounceProviderMessage({ key, peerId, ttlMs } = {})",
          "summary": ""
        },
        {
          "name": "makeAnnounceRouteMessage",
          "kind": "function",
          "signature": "makeAnnounceRouteMessage({ routeId, peerId, services = [], ttlMs } = {})",
          "summary": ""
        },
        {
          "name": "makePeerExchangeMessage",
          "kind": "function",
          "signature": "makePeerExchangeMessage({ knownPeers = [] } = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/dht/DhtNode",
      "path": "engine/reference/network/dht/DhtNode.md",
      "source": "engine/network/dht/DhtNode.js",
      "import": "/engine/network/dht/DhtNode.js",
      "sourceHash": "16338f46088164efd73f1954fd48c299833b473d61e55d31cab1c8ea6e522697",
      "summary": "network/dht/DhtNode.js — a local Particle DHT node view (network plan §47, low priority/future). Combines a ProviderStore with a lightweight known- peers registry and answers FIND_PEER/FIND_ROUTE/FIND_PROVIDERS queries from LOCAL knowledge only — this phase delivers the data structures and message-handling logic; real gossip/replication across a live DHT transport is deferred (network plan §47: \"still needs bootstrap\" even once a real DHT exists — see BootstrapSource.js).",
      "exports": [
        {
          "name": "createDhtNode",
          "kind": "function",
          "signature": "createDhtNode({ selfPeerId } = {})",
          "summary": "Create a local DHT node view."
        },
        {
          "name": "rememberPeer",
          "kind": "function",
          "signature": "rememberPeer(node, peerId, { routeHints = [], reportedBy = null, direct = false } = {}, now = Date.now()",
          "summary": "Record/refresh knowledge of a peer (from PEER_EXCHANGE or any direct contact)."
        },
        {
          "name": "handleFindPeer",
          "kind": "function",
          "signature": "handleFindPeer(node, targetPeerId)",
          "summary": "Answer a local FIND_PEER query: do we know this peer, and if so, its route hints?"
        },
        {
          "name": "handleFindRoute",
          "kind": "function",
          "signature": "handleFindRoute(node, routeId, now = Date.now()",
          "summary": "Answer a local FIND_ROUTE query: any peers providing this route?"
        },
        {
          "name": "handleFindProviders",
          "kind": "function",
          "signature": "handleFindProviders(node, key, now = Date.now()",
          "summary": "Answer a local FIND_PROVIDERS query for an arbitrary key (chunk hash, service name, ...)."
        },
        {
          "name": "handleAnnounceProvider",
          "kind": "function",
          "signature": "handleAnnounceProvider(node, { key, peerId, ttlMs } = {}, now = Date.now()",
          "summary": "Ingest an ANNOUNCE_PROVIDER (route or generic key -> peer)."
        },
        {
          "name": "handlePeerExchange",
          "kind": "function",
          "signature": "handlePeerExchange(node, knownPeers = [], now = Date.now()",
          "summary": "Ingest a PEER_EXCHANGE payload (array of `{peerId, routeHints}`)."
        },
        {
          "name": "listKnownPeers",
          "kind": "function",
          "signature": "listKnownPeers(node, { limit = 64 } = {})",
          "summary": "Bounded peer summaries for authenticated PEER_EXCHANGE messages."
        },
        {
          "name": "providersMapForKeys",
          "kind": "function",
          "signature": "providersMapForKeys(node, keys, now = Date.now()",
          "summary": "Build the providers map SwarmScheduler.planSwarmFetch expects for a list of keys."
        },
        {
          "name": "pruneDhtNode",
          "kind": "function",
          "signature": "pruneDhtNode(node, { peerStaleMs = 30 * 60 * 1000 } = {}, now = Date.now()",
          "summary": "Prune expired provider records and stale peer knowledge."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/dht/DhtTransport",
      "path": "engine/reference/network/dht/DhtTransport.md",
      "source": "engine/network/dht/DhtTransport.js",
      "import": "/engine/network/dht/DhtTransport.js",
      "sourceHash": "fee03137768ea8e62051c41512f24811d6beab845411687ae6675afb710be288",
      "summary": "network/dht/DhtTransport.js — a scoped-down real transport for DhtNode.js's FIND_PEER/FIND_ROUTE/FIND_PROVIDERS queries (network plan §47, low priority). Deliberately NOT a full Kademlia DHT (no k-buckets, no XOR distance routing, no iterative closest-node lookup) — this is a minimal query/forward/respond loop over the existing mesh:  1. A query with no local answer is gossip-flooded across the mesh via CollabMeshTopology.js's existing TTL+dedupe fanout (same mechanism CarrierRelay.js uses) — reuses its per-query fingerprint (`_gossip.fp`) as this transport's queryId, so no new id scheme or message-shape changes were needed in DhtMessages.js. 2. Every node that relays a (non-duplicate) query remembers which neighbor it heard the query from (`reversePaths`) — classic flood/reverse-path relay (the same idea AODV uses), not a gossip broadcast itself. 3. Any node with a local answer (from its own DhtNode.js knowledge) sends a direct (non-gossiped) DHT_RESPONSE back along that reverse path, one hop at a time, until it reaches the original requester.  Known MVP limitation (intentional, per the plan's \"low priority\" scope): `reversePaths` entries are not proactively pruned by this module; a real deployment would want a TTL sweep alongside `pruneDhtNode()`.",
      "exports": [
        {
          "name": "createDhtTransport",
          "kind": "function",
          "signature": "createDhtTransport({ sendToPeer, topology, node, verifyControlIdentity = async ()",
          "summary": ""
        },
        {
          "name": "findPeerOverNetwork",
          "kind": "function",
          "signature": "findPeerOverNetwork(transport, targetPeerId, { timeoutMs = DEFAULT_QUERY_TIMEOUT_MS } = {})",
          "summary": "Query the mesh for a peer's route hints. Checks local knowledge first; only floods the network if we don't already know it."
        },
        {
          "name": "findRouteOverNetwork",
          "kind": "function",
          "signature": "findRouteOverNetwork(transport, routeId, { timeoutMs = DEFAULT_QUERY_TIMEOUT_MS } = {})",
          "summary": "Query the mesh for a route's live providers. Checks local knowledge first."
        },
        {
          "name": "findProvidersOverNetwork",
          "kind": "function",
          "signature": "findProvidersOverNetwork(transport, key, { timeoutMs = DEFAULT_QUERY_TIMEOUT_MS } = {})",
          "summary": "Query the mesh for an arbitrary key's providers (chunk hash, service name, ...). Checks local knowledge first."
        },
        {
          "name": "announceProviderOverNetwork",
          "kind": "function",
          "signature": "async announceProviderOverNetwork(transport, { key, ttlMs, signer } = {})",
          "summary": "Authenticated, bounded provider announcement to current mesh neighbors."
        },
        {
          "name": "announceRouteOverNetwork",
          "kind": "function",
          "signature": "async announceRouteOverNetwork(transport, { routeId, services = [], ttlMs, signer } = {})",
          "summary": "Authenticated route announcement; services are descriptive and bounded, never ambient authority."
        },
        {
          "name": "sendPeerExchangeOverNetwork",
          "kind": "function",
          "signature": "async sendPeerExchangeOverNetwork(transport, { peerId, signer, limit = MAX_PEER_EXCHANGE } = {})",
          "summary": "Send a signed, bounded sample of local peer knowledge to one connected peer."
        },
        {
          "name": "getDhtTransportHealth",
          "kind": "function",
          "signature": "getDhtTransportHealth(transport)",
          "summary": ""
        },
        {
          "name": "handleDhtMessage",
          "kind": "function",
          "signature": "handleDhtMessage(transport, fromPeerId, op)",
          "summary": "Feed every relevant `onOp(peerId, op)` message through this, alongside `ChunkTransport.js`'s and `CarrierRelay.js`'s own handlers (same \"return false if not ours\" chaining pattern)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/dht/ProviderStore",
      "path": "engine/reference/network/dht/ProviderStore.md",
      "source": "engine/network/dht/ProviderStore.js",
      "import": "/engine/network/dht/ProviderStore.js",
      "sourceHash": "5551f158a678b6bebf4e77d648206f7ffdc1da81b0d379411ce933370f7d1ee2",
      "summary": "network/dht/ProviderStore.js — local view of \"who provides what\" (network plan §47 DHT objects: network_id -> route providers, manifest_hash -> chunk providers, group_alias -> route hints, service_name -> providers). This is a LOCAL cache only — no network gossip/replication yet (that's the deferred real-DHT transport); it's what a future DHT node would populate from FIND_PROVIDERS/ANNOUNCE_PROVIDER traffic, and what SwarmScheduler.js (Phase 7) already consumes as its `providers` map.",
      "exports": [
        {
          "name": "createProviderStore",
          "kind": "function",
          "signature": "createProviderStore()",
          "summary": "Create an empty provider store."
        },
        {
          "name": "announceProvider",
          "kind": "function",
          "signature": "announceProvider(store, key, peerId, ttlMs = DEFAULT_PROVIDER_TTL_MS, now = Date.now()",
          "summary": "Announce that `peerId` provides `key` (e.g. a manifest chunk hash, route id, service name)."
        },
        {
          "name": "revokeProvider",
          "kind": "function",
          "signature": "revokeProvider(store, key, peerId)",
          "summary": "Remove one provider's record for a key."
        },
        {
          "name": "findProviders",
          "kind": "function",
          "signature": "findProviders(store, key, now = Date.now()",
          "summary": "Live (non-expired) provider peerIds for a key, or []."
        },
        {
          "name": "providersMapFor",
          "kind": "function",
          "signature": "providersMapFor(store, keys, now = Date.now()",
          "summary": "Build the `Map<key, peerId[]>` shape SwarmScheduler.planSwarmFetch expects, for a set of keys."
        },
        {
          "name": "pruneProviderStore",
          "kind": "function",
          "signature": "pruneProviderStore(store, now = Date.now()",
          "summary": "Remove all expired provider records. Returns the number of (key, peerId) pairs removed."
        },
        {
          "name": "DEFAULT_PROVIDER_TTL_MS",
          "kind": "constant",
          "signature": "DEFAULT_PROVIDER_TTL_MS",
          "summary": ""
        },
        {
          "name": "MAX_PROVIDER_TTL_MS",
          "kind": "constant",
          "signature": "MAX_PROVIDER_TTL_MS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/dht/index",
      "path": "engine/reference/network/dht/index.md",
      "source": "engine/network/dht/index.js",
      "import": "/engine/network/dht/index.js",
      "sourceHash": "0c9e539397cf04e5a094244ba6d78a347026f91e7ab885cb67dae41ad8781e41",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/endpoint/ParticleEndpointRuntime",
      "path": "engine/reference/network/endpoint/ParticleEndpointRuntime.md",
      "source": "engine/network/endpoint/ParticleEndpointRuntime.js",
      "import": "/engine/network/endpoint/ParticleEndpointRuntime.js",
      "sourceHash": "6b824e893c20d9d5021bc2ccd3be932bcacb7b67de14369d801d164f4db9373f",
      "summary": "",
      "exports": [
        {
          "name": "ParticleEndpointRuntime",
          "kind": "class",
          "signature": "class ParticleEndpointRuntime",
          "summary": ""
        },
        {
          "name": "createParticleEndpointRuntime",
          "kind": "function",
          "signature": "createParticleEndpointRuntime(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/endpoint/index",
      "path": "engine/reference/network/endpoint/index.md",
      "source": "engine/network/endpoint/index.js",
      "import": "/engine/network/endpoint/index.js",
      "sourceHash": "e0fb8f6a57a8561061de37529d74fae38b06efbca5a3973fe0c19ddc3cb67b8d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/groupCrypto/DeviceEncryptionKey",
      "path": "engine/reference/network/groupCrypto/DeviceEncryptionKey.md",
      "source": "engine/network/groupCrypto/DeviceEncryptionKey.js",
      "import": "/engine/network/groupCrypto/DeviceEncryptionKey.js",
      "sourceHash": "e80089fcef723e0738b8b2766b23d3955ff4686de369f7b1f07918be46da373d",
      "summary": "network/groupCrypto/DeviceEncryptionKey.js — per-device ECDH encryption keypair used to receive group welcome packets (network plan §14).  This is intentionally SEPARATE from the ECDSA signing identities in engine/network/identity/NetworkIdentity.js: signing proves \"who you are\"; this key only exists so other members can encrypt an epoch key TO this specific device. Reuses engine/collab/CollabCrypto.js's ECDH P-256 primitives (the same ones used for peer-to-peer session encryption).",
      "exports": [
        {
          "name": "createDeviceEncryptionKeyPair",
          "kind": "function",
          "signature": "async createDeviceEncryptionKeyPair()",
          "summary": "Generate a fresh ECDH P-256 keypair for this device to receive welcome packets. Ephemeral by design (network plan §14 \"per-device public encryption keys\") — callers that need persistence should store `publicKeyRaw`/export the private key themselves via their own storage."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/groupCrypto/GroupEpoch",
      "path": "engine/reference/network/groupCrypto/GroupEpoch.md",
      "source": "engine/network/groupCrypto/GroupEpoch.js",
      "import": "/engine/network/groupCrypto/GroupEpoch.js",
      "sourceHash": "14c13c2a152c1024269dfd92f4b6edbfba56a7291e58bddc9e6bae4a84e1e281",
      "summary": "network/groupCrypto/GroupEpoch.js — MLS-inspired group encryption epochs (network plan §14 group security / §39 route+key rotation on removal).  Each group has a sequence of \"epochs\"; each epoch has its own AES-256-GCM key. Content sealed under an epoch can only be opened by holders of that epoch's key. Removing a member rotates to a fresh epoch and CRYPTO-ERASES the old one (drops the key reference) so previously-sealed content stays unreadable to anyone who only has the new epoch's key — the removed member's copy of the old epoch key becomes useless going forward, and any FUTURE content is sealed under a key they never received.  This deliberately builds directly on `engine/state/integrity/SecureCrypto.js` (raw AES-256-GCM primitives) rather than the higher-level `SecureRetentionManager` class: welcome packets need to export/re-wrap the raw epoch key material for a specific recipient's ECDH public key, and `SecureRetentionManager` does not expose its internal CryptoKey for export. The crypto-erase SEMANTICS (drop the key reference; GCM tamper detection) are identical to `SecureRetentionManager.cryptoErase()`.",
      "exports": [
        {
          "name": "createGroupCrypto",
          "kind": "function",
          "signature": "createGroupCrypto({ groupId } = {})",
          "summary": "Create an empty group crypto state (no epochs started yet)."
        },
        {
          "name": "startEpoch",
          "kind": "function",
          "signature": "async startEpoch(gc)",
          "summary": "Start the next epoch with a fresh AES-256-GCM key. Returns the new epoch number."
        },
        {
          "name": "getCurrentEpoch",
          "kind": "function",
          "signature": "getCurrentEpoch(gc)",
          "summary": ""
        },
        {
          "name": "isEpochErased",
          "kind": "function",
          "signature": "isEpochErased(gc, epoch)",
          "summary": "True if `epoch` has no live key (never started here, or crypto-erased)."
        },
        {
          "name": "sealForEpoch",
          "kind": "function",
          "signature": "async sealForEpoch(gc, epoch, plaintext)",
          "summary": "Seal a plaintext string under a specific epoch's key."
        },
        {
          "name": "openEnvelope",
          "kind": "function",
          "signature": "async openEnvelope(gc, envelope)",
          "summary": "Open an envelope from `sealForEpoch`. Returns null (fails closed) if the epoch's key is missing/erased, the group id doesn't match, or the GCM authentication tag fails (tampering/wrong key)."
        },
        {
          "name": "rotateEpoch",
          "kind": "function",
          "signature": "async rotateEpoch(gc)",
          "summary": "Rotate to a new epoch and crypto-erase the current one (network plan §14/§39). Removed members keep whatever they already downloaded, but cannot read anything sealed after the rotation, and (once their key reference is dropped) cannot re-derive the old epoch's key either."
        },
        {
          "name": "makeWelcomePacket",
          "kind": "function",
          "signature": "async makeWelcomePacket({ gc, epoch, recipientEcdhPublicKeyRaw } = {})",
          "summary": "Build a welcome packet: an epoch's raw key, ECDH-wrapped to one recipient's device encryption public key. Only that recipient's matching private key can unwrap it."
        },
        {
          "name": "openWelcomePacket",
          "kind": "function",
          "signature": "async openWelcomePacket({ gc, welcomePacket, recipientPrivateKey } = {})",
          "summary": "Recipient side: unwrap a welcome packet with the matching device private key and import the epoch's raw key into the recipient's own GroupCrypto instance (so they can now `openEnvelope()` content sealed under it)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/groupCrypto/index",
      "path": "engine/reference/network/groupCrypto/index.md",
      "source": "engine/network/groupCrypto/index.js",
      "import": "/engine/network/groupCrypto/index.js",
      "sourceHash": "894a58c42a2fe72696b1a22f454192bad0b58cd25393a111f1ba743173ac482c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/groupLedger/GovernancePolicy",
      "path": "engine/reference/network/groupLedger/GovernancePolicy.md",
      "source": "engine/network/groupLedger/GovernancePolicy.js",
      "import": "/engine/network/groupLedger/GovernancePolicy.js",
      "sourceHash": "0e2320f1ae76ab2b9c350a7f6610967b7d82d06c2733468aa54de668c3d9b29c",
      "summary": "network/groupLedger/GovernancePolicy.js — group governance modes on top of the CSE PolicyEngine (network plan §16 \"adminless and moderatorless groups\"): unanimous / majority / threshold / founder-protected / open-capability. This module decides WHETHER a given vote/approval set is enough for a governance action to commit; GroupLedger.js decides WHAT happens once it does.",
      "exports": [
        {
          "name": "createGovernancePolicy",
          "kind": "function",
          "signature": "createGovernancePolicy({ mode = GOVERNANCE_MODES.MAJORITY, founders = ()",
          "summary": "Build a governance policy for a group."
        },
        {
          "name": "GOVERNANCE_MODES",
          "kind": "constant",
          "signature": "GOVERNANCE_MODES",
          "summary": ""
        },
        {
          "name": "IRREVERSIBLE_ACTIONS",
          "kind": "constant",
          "signature": "IRREVERSIBLE_ACTIONS",
          "summary": "Governance actions that always require approval (network plan §17 eviction/bans)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/groupLedger/GroupLedger",
      "path": "engine/reference/network/groupLedger/GroupLedger.md",
      "source": "engine/network/groupLedger/GroupLedger.js",
      "import": "/engine/network/groupLedger/GroupLedger.js",
      "sourceHash": "506884f7c41002f38d87ee75839dac5c3f8ab8c0d64c748338e509cd0ee1f24f",
      "summary": "network/groupLedger/GroupLedger.js — private append-only group governance ledger (network plan §15/§16/§17).  Reuses the Causal State Engine's `EventLog` (hash-chained append-only log, spec §13) and `CapabilityRegistry` as-is; governance approval decisions go through `GovernancePolicy.js` (PolicyEngine). Every event is a signed protocol envelope (protocol.js `particle-group-ledger/1`), so the ledger itself is a plain array of verifiable receipts — a group's current state is always the result of replaying it, never a separate source of truth.  `EventLog` is in-memory only; callers are responsible for persisting `ledger.eventLog.entries()` (e.g. via webgpu-os/storage/AppSandbox on the OS side) and rehydrating with `replayGroupLedger()` — this module does not import any OS/storage code, keeping the engine layer storage-agnostic.",
      "exports": [
        {
          "name": "createGroupLedger",
          "kind": "function",
          "signature": "createGroupLedger({ groupId, founders = [], mode = GOVERNANCE_MODES.MAJORITY, threshold = null } = {})",
          "summary": "Create a new (empty, ungenesised) group ledger."
        },
        {
          "name": "genesisGroup",
          "kind": "function",
          "signature": "async genesisGroup(ledger, { founderSigner, constitution = {} } = {})",
          "summary": "Append the GROUP_GENESIS event and register the signing founder as the first member."
        },
        {
          "name": "castVote",
          "kind": "function",
          "signature": "castVote(ledger, proposalId, voterMembershipId)",
          "summary": "Cast a vote toward approving a pending proposal (network plan §17 eviction flow)."
        },
        {
          "name": "getVotes",
          "kind": "function",
          "signature": "getVotes(ledger, proposalId)",
          "summary": "Current vote set for a pending proposal (read-only copy)."
        },
        {
          "name": "proposeGroupEvent",
          "kind": "function",
          "signature": "async proposeGroupEvent(ledger, { type, payload = {}, signer, proposalId = null } = {})",
          "summary": "Propose (and, if the governance policy allows, immediately commit) a governance event. Safe/low-risk actions commit right away; irreversible actions (MEMBER_REVOKED/MEMBER_BANNED/KEY_ROTATED/ROLE_CHANGED) require enough prior `castVote()` calls under the same `proposalId` first."
        },
        {
          "name": "verifyGroupLedger",
          "kind": "function",
          "signature": "verifyGroupLedger(ledger)",
          "summary": "True if the ledger's hash chain is intact end-to-end (tamper check)."
        },
        {
          "name": "replayGroupLedger",
          "kind": "function",
          "signature": "replayGroupLedger({ groupId, founders = [], mode = GOVERNANCE_MODES.MAJORITY, threshold = null, entries = [] } = {})",
          "summary": "Rebuild a live ledger from previously-persisted `ledger.eventLog.entries()` (network plan §15 persistence gap — see this file's header comment; OS-side storage, e.g. webgpu-os/storage/AppSandbox, is the caller's job, not this module's). Replays each entry through `EventLog.append()` (recomputing the exact same hash chain deterministically) and re-derives `members`/ `founders` via the same side-effect rules `genesisGroup`/`proposeGroupEvent` apply live, so a rehydrated ledger behaves identically to one built by replaying the same operations in real time — with one honest limitation: `EventLog` entries carry no wall-clock timestamp, and a `GROUP_GENESIS` envelope only embeds the ONE signer's public key, so a `members` entry reconstructed from genesis (unlike a later `MEMBER_ADDED`, whose payload carries full details) will have `joinedAt: null` and, for any co-founder who isn't the genesis envelope's own signer, `publicKeyHex: null`. This does NOT weaken governance security — founder-protected mode checks `ledger.founders` (a Set of principals, fully and exactly restored from the genesis payload), not the `members` map."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/groupLedger/index",
      "path": "engine/reference/network/groupLedger/index.md",
      "source": "engine/network/groupLedger/index.js",
      "import": "/engine/network/groupLedger/index.js",
      "sourceHash": "3c9e0f61a3df1dbe9597f5585fe106cf494423b2f50f4f9d1ad25ebfbf1cf157",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/identity/NetworkIdentity",
      "path": "engine/reference/network/identity/NetworkIdentity.md",
      "source": "engine/network/identity/NetworkIdentity.js",
      "import": "/engine/network/identity/NetworkIdentity.js",
      "sourceHash": "1a0bfef049ab519cbd16a269db2f5fbd78150ee1bb8798f8a194b138c22d5896",
      "summary": "network/identity/NetworkIdentity.js — profile/device/membership identity layer for the Particle Global OS Network Layer (network plan §11).  The network plan keeps several identity levels distinct: profile_id      stable user identity, portable across devices/groups device_id       per-device identity used for route/session proofs membership_id   per-group pseudonymous identity (unlinkable across groups)  engine/state/authority/Identity.js already wraps CollabIdentity (ECDSA P-256) as a generic `createSigner(principal)`, and now mints a SEPARATE persisted keypair per distinct principal string (Phase 0 audit finding — no new crypto, just named keys). This module is a thin, semantically-named layer on top of that: each helper below is just `createSigner()` with a principal string that encodes the identity level.",
      "exports": [
        {
          "name": "bindProfileIdentityProvider",
          "kind": "function",
          "signature": "bindProfileIdentityProvider(provider)",
          "summary": "Bind the OS ProfileDriver as the canonical profile/Passport identity owner. The engine retains its named-key fallback for standalone demos and tests, but an initialized OS always resolves the active profile through this provider."
        },
        {
          "name": "createDeviceIdentity",
          "kind": "function",
          "signature": "async createDeviceIdentity()",
          "summary": "This device's per-device signer — used for low-level route/session proofs with a Masterserver (HELLO/PROVE). Never used as group identity."
        },
        {
          "name": "createProfileIdentity",
          "kind": "function",
          "signature": "async createProfileIdentity(profileId = 'default')",
          "summary": "This user's stable profile signer. One profile per logical user on this device (multiple profiles are supported by passing distinct `profileId`s, e.g. for multi-account testing) — each gets its own persisted keypair."
        },
        {
          "name": "createMembershipIdentity",
          "kind": "function",
          "signature": "async createMembershipIdentity(profileId, groupId)",
          "summary": "A per-group pseudonymous membership signer for a profile. Distinct keypair per (profileId, groupId) pair, so a member's participation in one group cannot be linked to their participation in another, or to their underlying profile, by key alone."
        },
        {
          "name": "peerIdFromSigner",
          "kind": "function",
          "signature": "peerIdFromSigner(signer)",
          "summary": "Derive a stable \"peer id\" string for use in route tables / mesh topology from any signer's fingerprint (device, profile, or membership signer)."
        },
        {
          "name": "computeFingerprint",
          "kind": "constant",
          "signature": "computeFingerprint",
          "summary": "Full SHA-256 public-key fingerprint used by Realm Network identities."
        },
        {
          "name": "verifyWithKey",
          "kind": "re-export",
          "signature": "verifyWithKey",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/index",
      "path": "engine/reference/network/index.md",
      "source": "engine/network/index.js",
      "import": "/engine/network/index.js",
      "sourceHash": "c3ffbc353727cf9138a2147cf2f27474eb9e168ed358bdcb53b64f7eb34be6ad",
      "summary": "network/index.js — public barrel for the Particle Global OS Network Layer.  See C:\\Users\\btspa\\.windsurf\\plans\\particle-network-layer-2bf6f0.md for the full plan. Phase 1 (protocol foundation): versioned envelopes, canonical signing, and profile/device/membership identity + route capabilities on top of the existing engine/collab (P2P) and engine/state (CSE) modules.  Build status: [x] Phase 0 audit  [x] Phase 1 protocol foundation [x] Phase 2 dynamic routes + master server list [x] Phase 2b live Masterserver signaling client (transport/MasterServerClient.js) [x] Phase 3 invites & trust groups   [x] Phase 4 group crypto [x] Phase 5 peer tickets  [x] Phase 6 sync manager/workstations, now WIRED to live transport (syncManager/SyncTransport.js broadcasts/merges workstation CRDT ops over an attached route's MasterServerClient.signal(), gated by SyncManager.shouldSync()) — demoed live in factory/apps/network-manager's Routes tab [x] Phase 7 chunks  [x] Phase 8 carrier layer  [x] Phase 9 DHT-lite (future/low-priority scope), with a concrete BootstrapSource adapter for the browser extension's resident cert vault at webgpu-os/drivers/ResidentBootstrapSource.js (OS-layer glue, per this module's no-webgpu-os-dependency rule — read-only, honestly scoped to \"remembered identity\", not live background reachability)",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/invites/InvitePacket",
      "path": "engine/reference/network/invites/InvitePacket.md",
      "source": "engine/network/invites/InvitePacket.js",
      "import": "/engine/network/invites/InvitePacket.js",
      "sourceHash": "d63f4b877b8f58a1c6048184053d677e8804a7c0196a8a4dbb5359062610ec86",
      "summary": "network/invites/InvitePacket.js — signed, one-time, expiring invites (network plan §13).  An invite is a doorway into a group's approval process, NOT automatic membership: it just names a temporary meeting route and a role offer, and is signed by the inviter so anyone can verify who issued it. It does not itself grant route/group access — that capability is minted only after the join-request identity exchange (see JoinFlow.js), once the joiner's real principal is known. \"Base64 is not security\" (network plan §13) — the encode/decode here is just a convenient transport, the actual guarantee is the ECDSA signature over the canonical envelope (protocol.js).",
      "exports": [
        {
          "name": "makeInvite",
          "kind": "function",
          "signature": "async makeInvite({ groupId, routeId, roleOffer = 'member', oneTime = true, expiresAt = null, inviterSigner, } = {})",
          "summary": "Build + sign an invite packet."
        },
        {
          "name": "encodeInvite",
          "kind": "function",
          "signature": "encodeInvite(signedInvite)",
          "summary": "URL-safe base64 encoding of a signed invite envelope, for sharing as a code/link."
        },
        {
          "name": "decodeInvite",
          "kind": "function",
          "signature": "decodeInvite(inviteCode)",
          "summary": "Decode an invite code back into its (still-UNVERIFIED) signed envelope."
        },
        {
          "name": "verifyInvite",
          "kind": "function",
          "signature": "async verifyInvite(signedInvite, { now = Date.now()",
          "summary": "Verify a decoded invite: known protocol/type, not expired, and the signature actually matches the embedded inviter public key."
        },
        {
          "name": "createInviteRegistry",
          "kind": "function",
          "signature": "createInviteRegistry()",
          "summary": "Create a registry to track which one-time invites have already been used."
        },
        {
          "name": "isInviteConsumed",
          "kind": "function",
          "signature": "isInviteConsumed(registry, inviteId)",
          "summary": ""
        },
        {
          "name": "consumeInvite",
          "kind": "function",
          "signature": "consumeInvite(registry, inviteId)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/invites/JoinFlow",
      "path": "engine/reference/network/invites/JoinFlow.md",
      "source": "engine/network/invites/JoinFlow.js",
      "import": "/engine/network/invites/JoinFlow.js",
      "sourceHash": "83362c93f6fdb4a91dbf9081bc8aeca708f8bcee5af0b053ae368af873ff9448",
      "summary": "network/invites/JoinFlow.js — invite -> temp route -> mutual identity proof exchange -> group policy check (network plan §13 invite pipeline).  This module only establishes \"this join request is a genuine, signed response to a live, unconsumed invite\" — it does NOT decide group policy (vote thresholds, founder approval, etc). That decision belongs to GroupLedger.proposeGroupEvent('MEMBER_ADDED', ...); once that commits, call grantJoinCapability() to actually let the new member attach to the group's real route.",
      "exports": [
        {
          "name": "requestJoin",
          "kind": "function",
          "signature": "async requestJoin({ signedInvite, joinerSigner } = {})",
          "summary": "Joiner side: build a signed join request referencing a (decoded) invite."
        },
        {
          "name": "verifyJoinRequest",
          "kind": "function",
          "signature": "async verifyJoinRequest({ signedInvite, joinRequest, inviteRegistry = null, now = Date.now()",
          "summary": "Inviter/group side: validate an invite together with a join request responding to it."
        },
        {
          "name": "grantJoinCapability",
          "kind": "function",
          "signature": "grantJoinCapability({ signedInvite, joinerPrincipal, groupRouteId, inviteRegistry = null, allow = [ROUTE_ACTIONS.ATTACH, ROUTE_ACTIONS.SUBSCRIBE, ROUTE_ACTIONS.PUBLISH], } = {})",
          "summary": "After the group has approved the join (GroupLedger MEMBER_ADDED commit), mint the new member's first route capability for the group's real route and consume the invite if it was one-time."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/invites/index",
      "path": "engine/reference/network/invites/index.md",
      "source": "engine/network/invites/index.js",
      "import": "/engine/network/invites/index.js",
      "sourceHash": "ab4628d0794e7dbc76b06278ce60f378d81c2957b65d7a7529e0cc6756092903",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/peerTickets/PeerTicket",
      "path": "engine/reference/network/peerTickets/PeerTicket.md",
      "source": "engine/network/peerTickets/PeerTicket.js",
      "import": "/engine/network/peerTickets/PeerTicket.js",
      "sourceHash": "9fd9e5475a1a060ed3604b1234f29f4e97a01920df81ba4b67a580f76472476e",
      "summary": "network/peerTickets/PeerTicket.js — encrypted, remembered reconnect records (network plan §38).  A peer ticket is a signed statement \"peerId X is reachable, offers these services, at these route hints, valid until Y\" — it lets a device reconnect to known peers/groups without the discovery server, once trust has already been established once. Sealing (encrypting the ticket itself) reuses the same ECDH-wrap pattern as group welcome packets (engine/network/groupCrypto/GroupEpoch.js), OR a group's current encryption epoch directly, per network plan §38 \"encrypt to recipient device key OR group epoch key\".",
      "exports": [
        {
          "name": "makePeerTicket",
          "kind": "function",
          "signature": "async makePeerTicket({ peerId, deviceId = null, profileId = null, groupId = null, services = [], routeHints = [], expiresAt = null, routeEpoch = null, encryptionEpoch = null, issuerSigner, } = {})",
          "summary": "Build + sign a peer ticket."
        },
        {
          "name": "verifyPeerTicket",
          "kind": "function",
          "signature": "async verifyPeerTicket(signedTicket, { now = Date.now()",
          "summary": "Verify a peer ticket: known protocol/type, not expired, signature valid."
        },
        {
          "name": "sealPeerTicketToDevice",
          "kind": "function",
          "signature": "async sealPeerTicketToDevice(signedTicket, recipientEcdhPublicKeyRaw)",
          "summary": "ECDH-wrap a signed ticket so only the holder of `recipientEcdhPublicKeyRaw`'s private key can read it."
        },
        {
          "name": "openSealedPeerTicket",
          "kind": "function",
          "signature": "async openSealedPeerTicket(sealed, recipientPrivateKey)",
          "summary": "Recipient side: unwrap a device-sealed ticket. Returns null (fails closed) on any error."
        },
        {
          "name": "sealPeerTicketToEpoch",
          "kind": "function",
          "signature": "async sealPeerTicketToEpoch(groupCrypto, epoch, signedTicket)",
          "summary": "Seal a ticket under a group encryption epoch (readable by any member with that epoch's key)."
        },
        {
          "name": "openSealedPeerTicketFromEpoch",
          "kind": "function",
          "signature": "async openSealedPeerTicketFromEpoch(groupCrypto, envelope)",
          "summary": "Open an epoch-sealed ticket. Returns null if the epoch key is missing/erased or tampered."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/peerTickets/PeerTicketStore",
      "path": "engine/reference/network/peerTickets/PeerTicketStore.md",
      "source": "engine/network/peerTickets/PeerTicketStore.js",
      "import": "/engine/network/peerTickets/PeerTicketStore.js",
      "sourceHash": "38742cd36290902ebe28fe2e0b5875b8634d9d9df78f79f02f9727403b006d6c",
      "summary": "network/peerTickets/PeerTicketStore.js — local reconnect memory (network plan §38). In-memory only; callers persist via their own storage (e.g. webgpu-os/storage/AppSandbox) and rehydrate with addPeerTicket() on boot — engine/network stays storage-agnostic (see GroupLedger.js for the same pattern).",
      "exports": [
        {
          "name": "createPeerTicketStore",
          "kind": "function",
          "signature": "createPeerTicketStore()",
          "summary": "Create an empty peer ticket store."
        },
        {
          "name": "addPeerTicket",
          "kind": "function",
          "signature": "addPeerTicket(store, signedTicket)",
          "summary": "Remember a (already verified) peer ticket, keyed by its peerId. Overwrites any older ticket for the same peer."
        },
        {
          "name": "getPeerTicket",
          "kind": "function",
          "signature": "getPeerTicket(store, peerId)",
          "summary": "Look up the remembered ticket for a peer, or null."
        },
        {
          "name": "removePeerTicket",
          "kind": "function",
          "signature": "removePeerTicket(store, peerId)",
          "summary": "Forget a peer's ticket. Returns true if one existed."
        },
        {
          "name": "pruneExpiredPeerTickets",
          "kind": "function",
          "signature": "pruneExpiredPeerTickets(store, now = Date.now()",
          "summary": "Remove tickets whose payload.expiresAt has passed. Returns the removed peerIds."
        },
        {
          "name": "listPeerTicketsByFreshness",
          "kind": "function",
          "signature": "listPeerTicketsByFreshness(store)",
          "summary": "All remembered tickets, most-recently-received first (network plan §38: try freshest known peers first)."
        },
        {
          "name": "snapshotPeerTicketStore",
          "kind": "function",
          "signature": "snapshotPeerTicketStore(store)",
          "summary": "Full, JSON-serializable snapshot of a peer ticket store for OS-side persistence (network plan §38 persistence gap — see this file's header comment; storage itself, e.g. webgpu-os/storage/AppSandbox, is the caller's job). Same shape `listPeerTicketsByFreshness` already returns — exposed under its own name so the persistence contract (snapshot/hydrate pair) stays explicit even if the internal shape changes later."
        },
        {
          "name": "hydratePeerTicketStore",
          "kind": "function",
          "signature": "hydratePeerTicketStore(snapshot = [])",
          "summary": "Rebuild a peer ticket store from a previously-persisted snapshotPeerTicketStore() array."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/peerTickets/ReconnectOrder",
      "path": "engine/reference/network/peerTickets/ReconnectOrder.md",
      "source": "engine/network/peerTickets/ReconnectOrder.js",
      "import": "/engine/network/peerTickets/ReconnectOrder.js",
      "sourceHash": "5bd310a83aff6131f95ee9a03d5ef10c45ea34529425e57aa42802715fed9715",
      "summary": "network/peerTickets/ReconnectOrder.js — full device-boot reconnect order (network plan §38): cached peer tickets (freshest first) -> LAN -> group gossip -> master servers -> carrier -> DHT. Ties Phase 5 (peer tickets) onto Phase 2's `buildConnectionOrder` (routes/MasterServerList.js) without modifying it.",
      "exports": [
        {
          "name": "buildPeerReconnectOrder",
          "kind": "function",
          "signature": "buildPeerReconnectOrder(store, normalizedMasterServerList)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/peerTickets/index",
      "path": "engine/reference/network/peerTickets/index.md",
      "source": "engine/network/peerTickets/index.js",
      "import": "/engine/network/peerTickets/index.js",
      "sourceHash": "a9807fe95191ae9823d3b2c2c3597e64169c2a9c3106feb4566fabcf9eda184a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/protocol",
      "path": "engine/reference/network/protocol.md",
      "source": "engine/network/protocol.js",
      "import": "/engine/network/protocol.js",
      "sourceHash": "55eaf62a89413aa45b5b747ca8a4a28f9c7ccbe444319122efedd3cd480ab90a",
      "summary": "network/protocol.js — namespaced/versioned message envelopes for the Particle Global OS Network Layer (network plan §34).  Every message on the network carries an explicit, versioned protocol namespace (e.g. `particle-route/1`). Unversioned or unrecognized protocol strings are rejected outright — this is what lets the wire format evolve (particle-route/2, ...) without silently misparsing old/foreign traffic.  Canonical signing reuses the Causal State Engine's deterministic canonicalization (engine/state/util/canonical.js, RFC-8785-style) so that signed envelopes hash/verify identically regardless of key order or JS engine, and reuses CSE's cross-actor verification (verifyWithKey) so a receiver can verify a sender's signature from just their public key hex.",
      "exports": [
        {
          "name": "isKnownProtocol",
          "kind": "function",
          "signature": "isKnownProtocol(protocol)",
          "summary": "True when `protocol` is one of this build's known, versioned namespaces."
        },
        {
          "name": "makeEnvelope",
          "kind": "function",
          "signature": "makeEnvelope({ protocol, type, payload = null, extra = {} } = {})",
          "summary": "Build an unsigned protocol envelope. Throws if `protocol` isn't a known, versioned namespace (spec §34 rule: reject unversioned packets)."
        },
        {
          "name": "assertKnownProtocol",
          "kind": "function",
          "signature": "assertKnownProtocol(msg)",
          "summary": "Assert an inbound (possibly untrusted) message is a well-formed envelope with a known protocol namespace. Does NOT verify signatures — see `verifyEnvelope`. Throws on failure so callers fail closed."
        },
        {
          "name": "signEnvelope",
          "kind": "function",
          "signature": "async signEnvelope(envelope, signer)",
          "summary": "Sign an envelope with a CSE authority signer (engine/state/authority/Identity.js `createSigner`, itself bound to a CollabIdentity ECDSA P-256 keypair). The signature covers the canonical bytes of the envelope BEFORE the signature/signerFingerprint fields exist, so verification reconstructs the same canonical body by stripping those two fields back off."
        },
        {
          "name": "verifyEnvelope",
          "kind": "function",
          "signature": "async verifyEnvelope(signedEnvelope, signer = null)",
          "summary": "Verify a signed envelope. Pass either a `signer` (verifies against its own key — same-principal round-trip) or nothing to verify against the envelope's own embedded `signerPublicKeyHex` (cross-actor verification, the normal case when receiving from a remote peer)."
        },
        {
          "name": "PROTOCOL_VERSIONS",
          "kind": "constant",
          "signature": "PROTOCOL_VERSIONS",
          "summary": "All known/versioned protocol namespaces (network plan §34)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/AccordCapabilityV1",
      "path": "engine/reference/network/realm/accord/AccordCapabilityV1.md",
      "source": "engine/network/realm/accord/AccordCapabilityV1.js",
      "import": "/engine/network/realm/accord/AccordCapabilityV1.js",
      "sourceHash": "a815855f0850eca978e4fdf1c5bcb23f06519bc9aabb35f623e7bc2bdd72004c",
      "summary": "Signed, short-lived Accord capability discovery records.",
      "exports": [
        {
          "name": "createAccordCapabilityAdvertisement",
          "kind": "function",
          "signature": "async createAccordCapabilityAdvertisement(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordCapabilityAdvertisement",
          "kind": "function",
          "signature": "async verifyAccordCapabilityAdvertisement(record, { now = Date.now()",
          "summary": ""
        },
        {
          "name": "negotiateAccordCapability",
          "kind": "function",
          "signature": "async negotiateAccordCapability(advertisements, request, options = {})",
          "summary": "Select a verified capability that can satisfy an exact bounded request."
        },
        {
          "name": "ACCORD_CAPABILITY_ADVERTISEMENT_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_CAPABILITY_ADVERTISEMENT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ACCORD_CONTEXT_KINDS",
          "kind": "constant",
          "signature": "ACCORD_CONTEXT_KINDS",
          "summary": ""
        },
        {
          "name": "AccordCapabilityAdvertisementV1",
          "kind": "constant",
          "signature": "AccordCapabilityAdvertisementV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/AccordCrypto",
      "path": "engine/reference/network/realm/accord/AccordCrypto.md",
      "source": "engine/network/realm/accord/AccordCrypto.js",
      "import": "/engine/network/realm/accord/AccordCrypto.js",
      "sourceHash": "2e3f222d9e305573f0fe61785ffe6dd87858c868bf4c89a65b5e046c822db7a1",
      "summary": "Shared validation and domain-separated signing for the Navi Accord wire protocol.",
      "exports": [
        {
          "name": "safeInteger",
          "kind": "function",
          "signature": "safeInteger(value, name, minimum = 0, maximum = Number.MAX_SAFE_INTEGER)",
          "summary": ""
        },
        {
          "name": "boundedText",
          "kind": "function",
          "signature": "boundedText(value, name, maximum = 512)",
          "summary": ""
        },
        {
          "name": "boundedToken",
          "kind": "function",
          "signature": "boundedToken(value, name, maximum = 128)",
          "summary": ""
        },
        {
          "name": "normalizeNonce",
          "kind": "function",
          "signature": "normalizeNonce(value, name = 'nonce')",
          "summary": ""
        },
        {
          "name": "assertSecureRecordId",
          "kind": "function",
          "signature": "assertSecureRecordId(value, name = 'record ID')",
          "summary": ""
        },
        {
          "name": "normalizeTokenList",
          "kind": "function",
          "signature": "normalizeTokenList(values, name, { maximum = 128, allowEmpty = false } = {})",
          "summary": ""
        },
        {
          "name": "normalizeIdList",
          "kind": "function",
          "signature": "normalizeIdList(values, name, { maximum = 128, allowEmpty = true } = {})",
          "summary": ""
        },
        {
          "name": "assertIdentityId",
          "kind": "function",
          "signature": "assertIdentityId(value, name = 'identity ID')",
          "summary": ""
        },
        {
          "name": "normalizeWindow",
          "kind": "function",
          "signature": "normalizeWindow(input, { issuedAt = Date.now()",
          "summary": ""
        },
        {
          "name": "validateActiveWindow",
          "kind": "function",
          "signature": "validateActiveWindow(record, now = Date.now()",
          "summary": ""
        },
        {
          "name": "normalizeBudget",
          "kind": "function",
          "signature": "normalizeBudget(value, name = 'budget', { allowZero = false } = {})",
          "summary": ""
        },
        {
          "name": "budgetWithin",
          "kind": "function",
          "signature": "budgetWithin(candidate, ceiling)",
          "summary": ""
        },
        {
          "name": "normalizeScope",
          "kind": "function",
          "signature": "normalizeScope(value, name = 'scope')",
          "summary": ""
        },
        {
          "name": "scopeWithin",
          "kind": "function",
          "signature": "scopeWithin(candidate, ceiling)",
          "summary": ""
        },
        {
          "name": "assertSafePublicData",
          "kind": "function",
          "signature": "assertSafePublicData(value, name = 'public data', { maximumBytes = ACCORD_MAX_PUBLIC_BYTES } = {})",
          "summary": "Validate bounded JSON-compatible public data and reject common exfiltration containers. This is deliberately structural: unrestricted session exports, credentials, and private-memory payloads cannot be smuggled under aliases."
        },
        {
          "name": "canonicalPublicCopy",
          "kind": "function",
          "signature": "canonicalPublicCopy(value, name = 'public data', options = {})",
          "summary": ""
        },
        {
          "name": "accordSignerDescriptor",
          "kind": "function",
          "signature": "async accordSignerDescriptor(signer)",
          "summary": ""
        },
        {
          "name": "finishSignedAccordRecord",
          "kind": "function",
          "signature": "async finishSignedAccordRecord(record, idField, signer)",
          "summary": ""
        },
        {
          "name": "verifySignedAccordRecord",
          "kind": "function",
          "signature": "async verifySignedAccordRecord(record, { format, idField })",
          "summary": ""
        },
        {
          "name": "authorizeWith",
          "kind": "function",
          "signature": "async authorizeWith(adapter, record, role)",
          "summary": ""
        },
        {
          "name": "exactKeys",
          "kind": "function",
          "signature": "exactKeys(value, expected, name)",
          "summary": ""
        },
        {
          "name": "normalizedBodyMatches",
          "kind": "function",
          "signature": "normalizedBodyMatches(record, normalized)",
          "summary": ""
        },
        {
          "name": "ACCORD_MAX_LIFETIME_MS",
          "kind": "constant",
          "signature": "ACCORD_MAX_LIFETIME_MS",
          "summary": ""
        },
        {
          "name": "ACCORD_MAX_PUBLIC_BYTES",
          "kind": "constant",
          "signature": "ACCORD_MAX_PUBLIC_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/AccordDelegationV1",
      "path": "engine/reference/network/realm/accord/AccordDelegationV1.md",
      "source": "engine/network/realm/accord/AccordDelegationV1.js",
      "import": "/engine/network/realm/accord/AccordDelegationV1.js",
      "sourceHash": "8da8bbc642cbe63759ec432927ed6cb4acfe69114e4556e0795046b57a0658ad",
      "summary": "Task-bound capability delegation, revocation, and approval proofs.",
      "exports": [
        {
          "name": "AccordDelegationRegistry",
          "kind": "class",
          "signature": "class AccordDelegationRegistry",
          "summary": ""
        },
        {
          "name": "createAccordDelegation",
          "kind": "function",
          "signature": "async createAccordDelegation(task, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordDelegation",
          "kind": "function",
          "signature": "async verifyAccordDelegation(record, { task, acceptance = null, capabilityGrant, verifyCapabilityGrant, now = Date.now()",
          "summary": ""
        },
        {
          "name": "createAccordDelegationRevocation",
          "kind": "function",
          "signature": "async createAccordDelegationRevocation(delegation, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordDelegationRevocation",
          "kind": "function",
          "signature": "async verifyAccordDelegationRevocation(record, { delegation, now = Date.now()",
          "summary": ""
        },
        {
          "name": "createAccordApprovalProof",
          "kind": "function",
          "signature": "async createAccordApprovalProof(task, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordApprovalProof",
          "kind": "function",
          "signature": "async verifyAccordApprovalProof(record, { task, now = Date.now()",
          "summary": ""
        },
        {
          "name": "ACCORD_DELEGATION_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_DELEGATION_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ACCORD_DELEGATION_REVOCATION_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_DELEGATION_REVOCATION_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ACCORD_APPROVAL_PROOF_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_APPROVAL_PROOF_V1_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/AccordReplayGuard",
      "path": "engine/reference/network/realm/accord/AccordReplayGuard.md",
      "source": "engine/network/realm/accord/AccordReplayGuard.js",
      "import": "/engine/network/realm/accord/AccordReplayGuard.js",
      "sourceHash": "9a588caf973b509aec089fafc6f7ff63107ed86e273a7146d790b63b788a1e37",
      "summary": "Bounded replay and monotonic-sequence protection for verified Accord records.",
      "exports": [
        {
          "name": "AccordReplayGuard",
          "kind": "class",
          "signature": "class AccordReplayGuard",
          "summary": ""
        },
        {
          "name": "consumeReplay",
          "kind": "function",
          "signature": "consumeReplay(replayGuard, record, { idField, streamKey = null, sequence = null } = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/AccordResultV1",
      "path": "engine/reference/network/realm/accord/AccordResultV1.md",
      "source": "engine/network/realm/accord/AccordResultV1.js",
      "import": "/engine/network/realm/accord/AccordResultV1.js",
      "sourceHash": "c50acff966bdc272ef2e6f5386833241920f75c813a5d7896ef83287f60f19f2",
      "summary": "Signed Accord progress, cancellation, results, and purpose-isolated reputation evidence.",
      "exports": [
        {
          "name": "createAccordProgress",
          "kind": "function",
          "signature": "async createAccordProgress(task, acceptance, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordProgress",
          "kind": "function",
          "signature": "async verifyAccordProgress(record, { task, acceptance, now = Date.now()",
          "summary": ""
        },
        {
          "name": "createAccordCancellation",
          "kind": "function",
          "signature": "async createAccordCancellation(task, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordCancellation",
          "kind": "function",
          "signature": "async verifyAccordCancellation(record, { task, now = Date.now()",
          "summary": ""
        },
        {
          "name": "createAccordResultV1",
          "kind": "function",
          "signature": "async createAccordResultV1(task, acceptance, delegation, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordResultV1",
          "kind": "function",
          "signature": "async verifyAccordResultV1(record, { task, acceptance, delegation, capabilityGrant, verifyCapabilityGrant, contextCapsules = [], approvalProofs = [], cancellation = null, now = Date.now()",
          "summary": ""
        },
        {
          "name": "createAccordReputationEvidence",
          "kind": "function",
          "signature": "async createAccordReputationEvidence(task, result, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordReputationEvidence",
          "kind": "function",
          "signature": "async verifyAccordReputationEvidence(record, { now = Date.now()",
          "summary": ""
        },
        {
          "name": "ACCORD_PROGRESS_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_PROGRESS_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ACCORD_CANCELLATION_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_CANCELLATION_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ACCORD_RESULT_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_RESULT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ACCORD_REPUTATION_EVIDENCE_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_REPUTATION_EVIDENCE_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "AccordResultV1",
          "kind": "constant",
          "signature": "AccordResultV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/AccordTaskV1",
      "path": "engine/reference/network/realm/accord/AccordTaskV1.md",
      "source": "engine/network/realm/accord/AccordTaskV1.js",
      "import": "/engine/network/realm/accord/AccordTaskV1.js",
      "sourceHash": "9e86ee24d53027cf7a0895ef6d0f5df9e78a847d9ed42dddb38f8c2ba08174e7",
      "summary": "Requester-signed Accord tasks and executor-signed negotiated acceptance.",
      "exports": [
        {
          "name": "createAccordTask",
          "kind": "function",
          "signature": "async createAccordTask(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordTask",
          "kind": "function",
          "signature": "async verifyAccordTask(record, { now = Date.now()",
          "summary": ""
        },
        {
          "name": "createAccordTaskAcceptance",
          "kind": "function",
          "signature": "async createAccordTaskAcceptance(task, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAccordTaskAcceptance",
          "kind": "function",
          "signature": "async verifyAccordTaskAcceptance(record, { task, now = Date.now()",
          "summary": ""
        },
        {
          "name": "ACCORD_TASK_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_TASK_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ACCORD_TASK_ACCEPTANCE_V1_FORMAT",
          "kind": "constant",
          "signature": "ACCORD_TASK_ACCEPTANCE_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "AccordTaskV1",
          "kind": "constant",
          "signature": "AccordTaskV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/ContextCapsuleV1",
      "path": "engine/reference/network/realm/accord/ContextCapsuleV1.md",
      "source": "engine/network/realm/accord/ContextCapsuleV1.js",
      "import": "/engine/network/realm/accord/ContextCapsuleV1.js",
      "sourceHash": "bb811bdc6b920fd35ac733662114a17c6869f6c9328d3b9f3a1d15eb90563384",
      "summary": "Recipient-bound, allowlisted, signed context for a single Accord task.",
      "exports": [
        {
          "name": "createContextCapsuleV1",
          "kind": "function",
          "signature": "async createContextCapsuleV1(task, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyContextCapsuleV1",
          "kind": "function",
          "signature": "async verifyContextCapsuleV1(record, { task, acceptance = null, now = Date.now()",
          "summary": ""
        },
        {
          "name": "CONTEXT_CAPSULE_V1_FORMAT",
          "kind": "constant",
          "signature": "CONTEXT_CAPSULE_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ContextCapsuleV1",
          "kind": "constant",
          "signature": "ContextCapsuleV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/accord/index",
      "path": "engine/reference/network/realm/accord/index.md",
      "source": "engine/network/realm/accord/index.js",
      "import": "/engine/network/realm/accord/index.js",
      "sourceHash": "24ad9df4c6176c69089763d392b6b7f9dc08d40548b5ce148f9f6cc95459ac30",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/addressing/RealmAddress",
      "path": "engine/reference/network/realm/addressing/RealmAddress.md",
      "source": "engine/network/realm/addressing/RealmAddress.js",
      "import": "/engine/network/realm/addressing/RealmAddress.js",
      "sourceHash": "0dad5f7981b581cc5f9b8235d01b7818ab5f4bc26431f91eea28d2a66c50de9f",
      "summary": "RealmAddress.js — human aliases that resolve to location-independent IDs.",
      "exports": [
        {
          "name": "RealmAddressResolver",
          "kind": "class",
          "signature": "class RealmAddressResolver",
          "summary": "In-memory verified resolver. Persistence/discovery providers can replay records into it."
        },
        {
          "name": "parseRealmAddress",
          "kind": "function",
          "signature": "parseRealmAddress(address)",
          "summary": "Parse and canonicalize a realm:// alias or direct-ID address."
        },
        {
          "name": "realmAddressForId",
          "kind": "function",
          "signature": "realmAddressForId(realmId)",
          "summary": ""
        },
        {
          "name": "createRealmAliasRecord",
          "kind": "function",
          "signature": "async createRealmAliasRecord(input, signer)",
          "summary": "Create an attributable alias update. Aliases can move; Realm IDs cannot."
        },
        {
          "name": "verifyRealmAliasRecord",
          "kind": "function",
          "signature": "async verifyRealmAliasRecord(record, options = {})",
          "summary": ""
        },
        {
          "name": "REALM_ALIAS_FORMAT",
          "kind": "constant",
          "signature": "REALM_ALIAS_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/addressing/RealmIds",
      "path": "engine/reference/network/realm/addressing/RealmIds.md",
      "source": "engine/network/realm/addressing/RealmIds.js",
      "import": "/engine/network/realm/addressing/RealmIds.js",
      "sourceHash": "9cd53b8d5e17aba708075d74c5e63c9902f4e24770ac9eca28d7c8ae89507c76",
      "summary": "RealmIds.js — stable, typed identifiers for Realm Network resources. IDs are deliberately independent of names, hosts, routes, and storage locations.  The digest is SHA-256 over domain-separated canonical data, so the same control material always produces the same identifier while two resource types can never collide with one another.",
      "exports": [
        {
          "name": "realmKeyFingerprint",
          "kind": "function",
          "signature": "async realmKeyFingerprint(publicKey)",
          "summary": "Return the full SHA-256 fingerprint of a raw uncompressed P-256 key."
        },
        {
          "name": "createRealmId",
          "kind": "function",
          "signature": "async createRealmId(type, controlMaterial)",
          "summary": "Derive a typed stable ID from canonical control material. Callers must provide persistent material, never a location or session ID."
        },
        {
          "name": "createKeyControlledRealmId",
          "kind": "function",
          "signature": "async createKeyControlledRealmId(type, publicKey)",
          "summary": "Derive an identity controlled by a specific P-256 public key."
        },
        {
          "name": "createContentRealmId",
          "kind": "function",
          "signature": "async createContentRealmId(type, content)",
          "summary": "Derive an immutable content identity from exact bytes."
        },
        {
          "name": "parseRealmId",
          "kind": "function",
          "signature": "parseRealmId(id)",
          "summary": ""
        },
        {
          "name": "isRealmId",
          "kind": "function",
          "signature": "isRealmId(id, expectedType = null)",
          "summary": ""
        },
        {
          "name": "assertRealmId",
          "kind": "function",
          "signature": "assertRealmId(id, expectedType = null, label = 'Realm ID')",
          "summary": ""
        },
        {
          "name": "REALM_ID_FORMAT",
          "kind": "constant",
          "signature": "REALM_ID_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_ID_TYPE",
          "kind": "constant",
          "signature": "REALM_ID_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/addressing/index",
      "path": "engine/reference/network/realm/addressing/index.md",
      "source": "engine/network/realm/addressing/index.js",
      "import": "/engine/network/realm/addressing/index.js",
      "sourceHash": "e4e0dfd366c4c12367db2388a479262029f415316e7aa8013561a17b608b46e7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/atlas/AtlasProviders",
      "path": "engine/reference/network/realm/atlas/AtlasProviders.md",
      "source": "engine/network/realm/atlas/AtlasProviders.js",
      "import": "/engine/network/realm/atlas/AtlasProviders.js",
      "sourceHash": "c2a15b7b1f75719ed53c4a3a6ac2f10e5be5aea8899b3329f5ff242ccfe1c52f",
      "summary": "Feature-gated Atlas provider contracts with bounded verified in-memory stores.",
      "exports": [
        {
          "name": "AtlasRecordProvider",
          "kind": "class",
          "signature": "class AtlasRecordProvider",
          "summary": "A complete bounded provider suitable for local, direct-contact, organization, and peer-gossip adapters. Network code passes verified records into this contract; no provider becomes active until explicitly enabled."
        },
        {
          "name": "atlasProviderAllowsVisibility",
          "kind": "function",
          "signature": "atlasProviderAllowsVisibility(kind, visibility)",
          "summary": ""
        },
        {
          "name": "createLocalAtlasProvider",
          "kind": "function",
          "signature": "createLocalAtlasProvider(options)",
          "summary": ""
        },
        {
          "name": "createContactAtlasProvider",
          "kind": "function",
          "signature": "createContactAtlasProvider(options)",
          "summary": ""
        },
        {
          "name": "createOrganizationAtlasProvider",
          "kind": "function",
          "signature": "createOrganizationAtlasProvider(options)",
          "summary": ""
        },
        {
          "name": "createPeerGossipAtlasProvider",
          "kind": "function",
          "signature": "createPeerGossipAtlasProvider(options)",
          "summary": ""
        },
        {
          "name": "ATLAS_PROVIDER_KIND",
          "kind": "constant",
          "signature": "ATLAS_PROVIDER_KIND",
          "summary": ""
        },
        {
          "name": "ATLAS_PROVIDER_VISIBILITY",
          "kind": "constant",
          "signature": "ATLAS_PROVIDER_VISIBILITY",
          "summary": ""
        },
        {
          "name": "AtlasProviderV1",
          "kind": "constant",
          "signature": "AtlasProviderV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/atlas/AtlasRecordV1",
      "path": "engine/reference/network/realm/atlas/AtlasRecordV1.md",
      "source": "engine/network/realm/atlas/AtlasRecordV1.js",
      "import": "/engine/network/realm/atlas/AtlasRecordV1.js",
      "sourceHash": "9b1be1220b46f2dafd1b8a0fff1e096d5c03a7ee4c21d2a63a72b91a2d251bd4",
      "summary": "Signed, bounded Realm Atlas publication records and visibility policy.",
      "exports": [
        {
          "name": "AtlasReplayGuard",
          "kind": "class",
          "signature": "class AtlasReplayGuard",
          "summary": "Monotonic per-publisher replay guard for verified Atlas histories."
        },
        {
          "name": "createAtlasRecordV1",
          "kind": "function",
          "signature": "async createAtlasRecordV1(input, signer)",
          "summary": "Create a signed immutable AtlasRecordV1."
        },
        {
          "name": "verifyAtlasRecordV1",
          "kind": "function",
          "signature": "async verifyAtlasRecordV1(record, { now = Date.now()",
          "summary": "Verify canonical structure, SHA-256 identity, signature, freshness, and optional publisher authority."
        },
        {
          "name": "atlasVisibilitySemantics",
          "kind": "function",
          "signature": "atlasVisibilitySemantics(visibility)",
          "summary": ""
        },
        {
          "name": "canAccessAtlasRecordV1",
          "kind": "function",
          "signature": "canAccessAtlasRecordV1(record, context = {})",
          "summary": "Evaluate a viewer against the signed audience without granting entry permissions."
        },
        {
          "name": "ATLAS_RECORD_FORMAT",
          "kind": "constant",
          "signature": "ATLAS_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "ATLAS_RECORD_MAX_BYTES",
          "kind": "constant",
          "signature": "ATLAS_RECORD_MAX_BYTES",
          "summary": ""
        },
        {
          "name": "ATLAS_RECORD_MAX_TTL_MS",
          "kind": "constant",
          "signature": "ATLAS_RECORD_MAX_TTL_MS",
          "summary": ""
        },
        {
          "name": "ATLAS_RECORD_MIN_TTL_MS",
          "kind": "constant",
          "signature": "ATLAS_RECORD_MIN_TTL_MS",
          "summary": ""
        },
        {
          "name": "ATLAS_VISIBILITY",
          "kind": "constant",
          "signature": "ATLAS_VISIBILITY",
          "summary": ""
        },
        {
          "name": "AtlasRecordV1",
          "kind": "constant",
          "signature": "AtlasRecordV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/atlas/BoundedServerAtlasProvider",
      "path": "engine/reference/network/realm/atlas/BoundedServerAtlasProvider.md",
      "source": "engine/network/realm/atlas/BoundedServerAtlasProvider.js",
      "import": "/engine/network/realm/atlas/BoundedServerAtlasProvider.js",
      "sourceHash": "c23a9b910b3435ee93115c3033d0f47e137ca835509f748bbf958ca9fb9fb481",
      "summary": "Optional opaque V3 Atlas provider matching the bounded ephemeral server contract.",
      "exports": [
        {
          "name": "BoundedServerAtlasProvider",
          "kind": "class",
          "signature": "class BoundedServerAtlasProvider",
          "summary": ""
        },
        {
          "name": "deriveAtlasScopeTag",
          "kind": "function",
          "signature": "async deriveAtlasScopeTag(scopeKey)",
          "summary": ""
        },
        {
          "name": "createServerAtlasAdvertisement",
          "kind": "function",
          "signature": "async createServerAtlasAdvertisement(record, { scopeKey, signer, issuedAt = Math.floor(Date.now()",
          "summary": "Build the exact opaque advertisement accepted by the additive V3 server."
        },
        {
          "name": "verifyServerAtlasAdvertisement",
          "kind": "function",
          "signature": "async verifyServerAtlasAdvertisement(record, { now = Math.floor(Date.now()",
          "summary": ""
        },
        {
          "name": "openServerAtlasAdvertisement",
          "kind": "function",
          "signature": "async openServerAtlasAdvertisement(advertisement, { scopeKey, now = Date.now()",
          "summary": "Verify and decrypt one V3 envelope without trusting the server that stored it."
        },
        {
          "name": "SERVER_ATLAS_ADVERTISEMENT_FORMAT",
          "kind": "constant",
          "signature": "SERVER_ATLAS_ADVERTISEMENT_FORMAT",
          "summary": ""
        },
        {
          "name": "SERVER_ATLAS_MAX_TTL_SECONDS",
          "kind": "constant",
          "signature": "SERVER_ATLAS_MAX_TTL_SECONDS",
          "summary": ""
        },
        {
          "name": "SERVER_ATLAS_MAX_PAYLOAD_BYTES",
          "kind": "constant",
          "signature": "SERVER_ATLAS_MAX_PAYLOAD_BYTES",
          "summary": ""
        },
        {
          "name": "SERVER_ATLAS_MAX_QUERY_RECORDS",
          "kind": "constant",
          "signature": "SERVER_ATLAS_MAX_QUERY_RECORDS",
          "summary": ""
        },
        {
          "name": "BoundedAtlasTransportV1",
          "kind": "constant",
          "signature": "BoundedAtlasTransportV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/atlas/index",
      "path": "engine/reference/network/realm/atlas/index.md",
      "source": "engine/network/realm/atlas/index.js",
      "import": "/engine/network/realm/atlas/index.js",
      "sourceHash": "7a6ad56d9368a220befb2eb08c82b3149194ef20ac2c29c2db271dee2b3eccab",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/authority/AuthorityHandoff",
      "path": "engine/reference/network/realm/authority/AuthorityHandoff.md",
      "source": "engine/network/realm/authority/AuthorityHandoff.js",
      "import": "/engine/network/realm/authority/AuthorityHandoff.js",
      "sourceHash": "ae55204b2f378b8a1997a29cd2e1c42efb192c1163c1d7865becc4b3da7dbef6",
      "summary": "Checkpoint-backed, signed authority handoff state machine.",
      "exports": [
        {
          "name": "AuthorityHandoffCoordinator",
          "kind": "class",
          "signature": "class AuthorityHandoffCoordinator",
          "summary": ""
        },
        {
          "name": "createAuthorityHandoffMessage",
          "kind": "function",
          "signature": "async createAuthorityHandoffMessage(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAuthorityHandoffMessage",
          "kind": "function",
          "signature": "async verifyAuthorityHandoffMessage(message, options = {})",
          "summary": ""
        },
        {
          "name": "AUTHORITY_HANDOFF_FORMAT",
          "kind": "constant",
          "signature": "AUTHORITY_HANDOFF_FORMAT",
          "summary": ""
        },
        {
          "name": "AUTHORITY_HANDOFF_STAGE",
          "kind": "constant",
          "signature": "AUTHORITY_HANDOFF_STAGE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/authority/AuthorityLease",
      "path": "engine/reference/network/realm/authority/AuthorityLease.md",
      "source": "engine/network/realm/authority/AuthorityLease.js",
      "import": "/engine/network/realm/authority/AuthorityLease.js",
      "sourceHash": "44c31cf512d713e4fd0e5326c4469ed4fd4bcc69bcfd207c2426473b90772e69",
      "summary": "Signed, fenced authority leases for semantic Realm state. Leases are explicit records. They never confer authority merely because a peer has a connection, hosts a transport, or possesses a Capsule. Every mutation must present the active lease ID and its monotonically increasing fencing token.",
      "exports": [
        {
          "name": "createAuthorityLease",
          "kind": "function",
          "signature": "async createAuthorityLease(input, signer)",
          "summary": ""
        },
        {
          "name": "renewAuthorityLease",
          "kind": "function",
          "signature": "async renewAuthorityLease(previous, input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAuthorityLease",
          "kind": "function",
          "signature": "async verifyAuthorityLease(lease, options = {})",
          "summary": ""
        },
        {
          "name": "createAuthorityRevocation",
          "kind": "function",
          "signature": "async createAuthorityRevocation(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyAuthorityRevocation",
          "kind": "function",
          "signature": "async verifyAuthorityRevocation(record, options = {})",
          "summary": ""
        },
        {
          "name": "AUTHORITY_LEASE_FORMAT",
          "kind": "constant",
          "signature": "AUTHORITY_LEASE_FORMAT",
          "summary": ""
        },
        {
          "name": "AUTHORITY_REVOCATION_FORMAT",
          "kind": "constant",
          "signature": "AUTHORITY_REVOCATION_FORMAT",
          "summary": ""
        },
        {
          "name": "AUTHORITY_POLICY",
          "kind": "constant",
          "signature": "AUTHORITY_POLICY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/authority/AuthorityLeaseManager",
      "path": "engine/reference/network/realm/authority/AuthorityLeaseManager.md",
      "source": "engine/network/realm/authority/AuthorityLeaseManager.js",
      "import": "/engine/network/realm/authority/AuthorityLeaseManager.js",
      "sourceHash": "ee868e22afb858732a47acf02c832fa7a0e6202d7f77fbb956f6d2692bc90cf7",
      "summary": "In-memory authority decision engine; persistence is supplied by the caller.",
      "exports": [
        {
          "name": "AuthorityLeaseManager",
          "kind": "class",
          "signature": "class AuthorityLeaseManager",
          "summary": "In-memory authority decision engine; persistence is supplied by the caller."
        },
        {
          "name": "createAuthorityLeaseManager",
          "kind": "function",
          "signature": "createAuthorityLeaseManager(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/authority/HostMigrationQuorum",
      "path": "engine/reference/network/realm/authority/HostMigrationQuorum.md",
      "source": "engine/network/realm/authority/HostMigrationQuorum.js",
      "import": "/engine/network/realm/authority/HostMigrationQuorum.js",
      "sourceHash": "4e6a8c275c4b3080cc155b94e14a0f64f1ae480f70d0a166642b0281dd91a6ff",
      "summary": "",
      "exports": [
        {
          "name": "HostMigrationQuorum",
          "kind": "class",
          "signature": "class HostMigrationQuorum",
          "summary": ""
        },
        {
          "name": "createHostMigrationVote",
          "kind": "function",
          "signature": "async createHostMigrationVote(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyHostMigrationVote",
          "kind": "function",
          "signature": "async verifyHostMigrationVote(vote, authorizeVoter = null)",
          "summary": ""
        },
        {
          "name": "HOST_MIGRATION_VOTE_FORMAT",
          "kind": "constant",
          "signature": "HOST_MIGRATION_VOTE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/authority/SemanticReplication",
      "path": "engine/reference/network/realm/authority/SemanticReplication.md",
      "source": "engine/network/realm/authority/SemanticReplication.js",
      "import": "/engine/network/realm/authority/SemanticReplication.js",
      "sourceHash": "e6d7181a8e85d9e9155637e3f6bcc83a63fed47bfa22edd63936a498ee7dfd6e",
      "summary": "Semantic replication records, idempotent inboxes, resumable outboxes, and divergence evidence.",
      "exports": [
        {
          "name": "SemanticInbox",
          "kind": "class",
          "signature": "class SemanticInbox",
          "summary": ""
        },
        {
          "name": "SemanticOutbox",
          "kind": "class",
          "signature": "class SemanticOutbox",
          "summary": ""
        },
        {
          "name": "createSemanticRecord",
          "kind": "function",
          "signature": "createSemanticRecord(input, signer)",
          "summary": ""
        },
        {
          "name": "createSemanticDelta",
          "kind": "function",
          "signature": "createSemanticDelta(input, signer)",
          "summary": ""
        },
        {
          "name": "createSemanticCheckpoint",
          "kind": "function",
          "signature": "createSemanticCheckpoint(input, signer)",
          "summary": ""
        },
        {
          "name": "verifySemanticEnvelope",
          "kind": "function",
          "signature": "async verifySemanticEnvelope(value, options = {})",
          "summary": ""
        },
        {
          "name": "detectSemanticDivergence",
          "kind": "function",
          "signature": "detectSemanticDivergence(local, remote)",
          "summary": ""
        },
        {
          "name": "SEMANTIC_RECORD_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "SEMANTIC_DELTA_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_DELTA_FORMAT",
          "summary": ""
        },
        {
          "name": "SEMANTIC_CHECKPOINT_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_CHECKPOINT_FORMAT",
          "summary": ""
        },
        {
          "name": "SEMANTIC_ACK_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_ACK_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/authority/index",
      "path": "engine/reference/network/realm/authority/index.md",
      "source": "engine/network/realm/authority/index.js",
      "import": "/engine/network/realm/authority/index.js",
      "sourceHash": "a1c9ae805d303835fcae9dbea8354a492fc2fed104bac3554b539b9fdb5d5eee",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/branches/BranchStorage",
      "path": "engine/reference/network/realm/branches/BranchStorage.md",
      "source": "engine/network/realm/branches/BranchStorage.js",
      "import": "/engine/network/realm/branches/BranchStorage.js",
      "sourceHash": "b31f60b9064534ebf4808bd42bd9e88e25b6a5e9975599ae16bcd74ba961d6ae",
      "summary": "Bounded persistent storage adapter for branch metadata and offline queues. Capsule/blob bytes remain in the shared RealmContentStore; this adapter never duplicates content-addressed storage.",
      "exports": [
        {
          "name": "RealmBranchStorage",
          "kind": "class",
          "signature": "class RealmBranchStorage",
          "summary": "LocalStorage-compatible persistent key/value adapter."
        },
        {
          "name": "prepareRealmBranchStorageRecord",
          "kind": "function",
          "signature": "prepareRealmBranchStorageRecord(record, label = 'branch storage record')",
          "summary": ""
        },
        {
          "name": "REALM_BRANCH_STORAGE_SCHEMA",
          "kind": "constant",
          "signature": "REALM_BRANCH_STORAGE_SCHEMA",
          "summary": ""
        },
        {
          "name": "REALM_BRANCH_STORAGE_VERSION",
          "kind": "constant",
          "signature": "REALM_BRANCH_STORAGE_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/branches/MergeProposal",
      "path": "engine/reference/network/realm/branches/MergeProposal.md",
      "source": "engine/network/realm/branches/MergeProposal.js",
      "import": "/engine/network/realm/branches/MergeProposal.js",
      "sourceHash": "bb584d590f8a95631131d780526dfc05b0da89f197365ccb930289ea9b37fd35",
      "summary": "MergeProposalV1 contracts, dependency-safe decisions, and merge commits.",
      "exports": [
        {
          "name": "createMergeProposal",
          "kind": "function",
          "signature": "async createMergeProposal(input, signer)",
          "summary": "Create a signed MergeProposalV1 from a semantic comparison."
        },
        {
          "name": "verifyMergeProposal",
          "kind": "function",
          "signature": "async verifyMergeProposal(proposal, options = {})",
          "summary": "Verify proposal signature, IDs, dependency DAG, authorization, and expiry."
        },
        {
          "name": "buildDefaultMergeDecisions",
          "kind": "function",
          "signature": "buildDefaultMergeDecisions(proposal)",
          "summary": "Default policy: accept clean changes and retain conflicts on the source branch."
        },
        {
          "name": "validateMergeDecisions",
          "kind": "function",
          "signature": "validateMergeDecisions(proposal, decisions)",
          "summary": ""
        },
        {
          "name": "applyMergeProposal",
          "kind": "function",
          "signature": "async applyMergeProposal({ proposal, decisions, base, mine, theirs }, options = {})",
          "summary": "Apply accepted changes to mine; rejected/conflicting source work is untouched."
        },
        {
          "name": "createMergeCommit",
          "kind": "function",
          "signature": "async createMergeCommit(input, signer, options = {})",
          "summary": "Apply a proposal and publish the decision as a signed Chronicle event. Any rejected work receives a stable signed branch rooted at the source head."
        },
        {
          "name": "verifyMergeCommit",
          "kind": "function",
          "signature": "async verifyMergeCommit(event, options = {})",
          "summary": ""
        },
        {
          "name": "MERGE_PROPOSAL_FORMAT",
          "kind": "constant",
          "signature": "MERGE_PROPOSAL_FORMAT",
          "summary": ""
        },
        {
          "name": "MERGE_COMMIT_PAYLOAD_FORMAT",
          "kind": "constant",
          "signature": "MERGE_COMMIT_PAYLOAD_FORMAT",
          "summary": ""
        },
        {
          "name": "MergeProposalV1",
          "kind": "constant",
          "signature": "MergeProposalV1",
          "summary": "Public MergeProposalV1 contract."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/branches/OfflineOperationQueue",
      "path": "engine/reference/network/realm/branches/OfflineOperationQueue.md",
      "source": "engine/network/realm/branches/OfflineOperationQueue.js",
      "import": "/engine/network/realm/branches/OfflineOperationQueue.js",
      "sourceHash": "58fd5ee0038e0ef8536d300fc0e074b86ca72f19512c2d64f4f172efe1db2f6d",
      "summary": "Persistent, causal, resumable queue for signed offline Chronicle events.",
      "exports": [
        {
          "name": "OfflineOperationQueue",
          "kind": "class",
          "signature": "class OfflineOperationQueue",
          "summary": ""
        },
        {
          "name": "OFFLINE_QUEUE_FORMAT",
          "kind": "constant",
          "signature": "OFFLINE_QUEUE_FORMAT",
          "summary": ""
        },
        {
          "name": "OFFLINE_OPERATION_STATUS",
          "kind": "constant",
          "signature": "OFFLINE_OPERATION_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/branches/RealmBranch",
      "path": "engine/reference/network/realm/branches/RealmBranch.md",
      "source": "engine/network/realm/branches/RealmBranch.js",
      "import": "/engine/network/realm/branches/RealmBranch.js",
      "sourceHash": "81974cf9607263cd53514c7f214beeb34bb830b09bc1eb7d88db4f9f0945efec",
      "summary": "RealmBranchV1 identity, ownership, signed-head chains, and branch DAGs.",
      "exports": [
        {
          "name": "RealmBranchDAG",
          "kind": "class",
          "signature": "class RealmBranchDAG",
          "summary": "Verified in-memory projection of branch descriptors and RealmBranchRefV1 head chains. Persistence is delegated to BranchStorage.js."
        },
        {
          "name": "createRealmBranch",
          "kind": "function",
          "signature": "async createRealmBranch(input, signer)",
          "summary": "Create a stable RealmBranchV1. The label is intentionally excluded from the identity derivation, so renaming or alias changes cannot change branch IDs."
        },
        {
          "name": "verifyRealmBranch",
          "kind": "function",
          "signature": "async verifyRealmBranch(branch, options = {})",
          "summary": "Verify branch identity, controller signature, and optional owner authority."
        },
        {
          "name": "REALM_BRANCH_FORMAT",
          "kind": "constant",
          "signature": "REALM_BRANCH_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_BRANCH_PURPOSE",
          "kind": "constant",
          "signature": "REALM_BRANCH_PURPOSE",
          "summary": ""
        },
        {
          "name": "RealmBranchV1",
          "kind": "constant",
          "signature": "RealmBranchV1",
          "summary": "Public RealmBranchV1 contract."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/branches/RealmBranchCrypto",
      "path": "engine/reference/network/realm/branches/RealmBranchCrypto.md",
      "source": "engine/network/realm/branches/RealmBranchCrypto.js",
      "import": "/engine/network/realm/branches/RealmBranchCrypto.js",
      "sourceHash": "3819cc3258e549d3a2a6878d82f7fec78c0224437bc4a7052c8b0124d7707762",
      "summary": "Shared signed-record plumbing for Realm branch contracts.",
      "exports": [
        {
          "name": "withoutSignedFields",
          "kind": "function",
          "signature": "withoutSignedFields(record, idField)",
          "summary": ""
        },
        {
          "name": "signBranchRecord",
          "kind": "function",
          "signature": "async signBranchRecord(body, { idField, format }, signer)",
          "summary": ""
        },
        {
          "name": "verifyBranchRecord",
          "kind": "function",
          "signature": "async verifyBranchRecord(record, { idField, format })",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/branches/SemanticAdapters",
      "path": "engine/reference/network/realm/branches/SemanticAdapters.md",
      "source": "engine/network/realm/branches/SemanticAdapters.js",
      "import": "/engine/network/realm/branches/SemanticAdapters.js",
      "sourceHash": "aa923642ed9f2d0174372d2434a3e83744ba7ac58bb3312ba0a5cf9588bbf413",
      "summary": "Explicit semantic and confluence-proven CRDT adapters for three-way merge.",
      "exports": [
        {
          "name": "SemanticAdapterRegistry",
          "kind": "class",
          "signature": "class SemanticAdapterRegistry",
          "summary": ""
        },
        {
          "name": "normalizeSemanticSnapshot",
          "kind": "function",
          "signature": "normalizeSemanticSnapshot(value)",
          "summary": ""
        },
        {
          "name": "hashSemanticChange",
          "kind": "function",
          "signature": "async hashSemanticChange(change)",
          "summary": ""
        },
        {
          "name": "createDefaultSemanticAdapterRegistry",
          "kind": "function",
          "signature": "createDefaultSemanticAdapterRegistry()",
          "summary": ""
        },
        {
          "name": "compareSemanticSnapshots",
          "kind": "function",
          "signature": "async compareSemanticSnapshots({ base, mine, theirs }, registry = createDefaultSemanticAdapterRegistry()",
          "summary": "Produce a deterministic base/mine/theirs semantic comparison."
        },
        {
          "name": "applySemanticChange",
          "kind": "function",
          "signature": "applySemanticChange(snapshot, change, selected, registry)",
          "summary": ""
        },
        {
          "name": "orderSemanticChanges",
          "kind": "function",
          "signature": "orderSemanticChanges(changes)",
          "summary": ""
        },
        {
          "name": "SEMANTIC_COMPARISON_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_COMPARISON_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_MAP_RECORD_TYPE",
          "kind": "constant",
          "signature": "REALM_MAP_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "REALM_GSET_RECORD_TYPE",
          "kind": "constant",
          "signature": "REALM_GSET_RECORD_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/branches/index",
      "path": "engine/reference/network/realm/branches/index.md",
      "source": "engine/network/realm/branches/index.js",
      "import": "/engine/network/realm/branches/index.js",
      "sourceHash": "ded2e810f543806e25c3c0024cb717843da05609cdcd061e61f811ce36f3934a",
      "summary": "",
      "exports": [
        {
          "name": "MERGE_COMMIT_PAYLOAD_FORMAT",
          "kind": "re-export",
          "signature": "MERGE_COMMIT_PAYLOAD_FORMAT",
          "summary": ""
        },
        {
          "name": "MERGE_PROPOSAL_FORMAT",
          "kind": "re-export",
          "signature": "MERGE_PROPOSAL_FORMAT",
          "summary": ""
        },
        {
          "name": "MergeProposalV1",
          "kind": "re-export",
          "signature": "MergeProposalV1",
          "summary": ""
        },
        {
          "name": "OFFLINE_OPERATION_STATUS",
          "kind": "re-export",
          "signature": "OFFLINE_OPERATION_STATUS",
          "summary": ""
        },
        {
          "name": "OFFLINE_QUEUE_FORMAT",
          "kind": "re-export",
          "signature": "OFFLINE_QUEUE_FORMAT",
          "summary": ""
        },
        {
          "name": "OfflineOperationQueue",
          "kind": "re-export",
          "signature": "OfflineOperationQueue",
          "summary": ""
        },
        {
          "name": "REALM_BRANCH_FORMAT",
          "kind": "re-export",
          "signature": "REALM_BRANCH_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_BRANCH_PURPOSE",
          "kind": "re-export",
          "signature": "REALM_BRANCH_PURPOSE",
          "summary": ""
        },
        {
          "name": "REALM_GSET_RECORD_TYPE",
          "kind": "re-export",
          "signature": "REALM_GSET_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "REALM_MAP_RECORD_TYPE",
          "kind": "re-export",
          "signature": "REALM_MAP_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "RealmBranchDAG",
          "kind": "re-export",
          "signature": "RealmBranchDAG",
          "summary": ""
        },
        {
          "name": "RealmBranchStorage",
          "kind": "re-export",
          "signature": "RealmBranchStorage",
          "summary": ""
        },
        {
          "name": "RealmBranchV1",
          "kind": "re-export",
          "signature": "RealmBranchV1",
          "summary": ""
        },
        {
          "name": "SEMANTIC_COMPARISON_FORMAT",
          "kind": "re-export",
          "signature": "SEMANTIC_COMPARISON_FORMAT",
          "summary": ""
        },
        {
          "name": "SemanticAdapterRegistry",
          "kind": "re-export",
          "signature": "SemanticAdapterRegistry",
          "summary": ""
        },
        {
          "name": "applyMergeProposal",
          "kind": "re-export",
          "signature": "applyMergeProposal",
          "summary": ""
        },
        {
          "name": "applySemanticChange",
          "kind": "re-export",
          "signature": "applySemanticChange",
          "summary": ""
        },
        {
          "name": "buildDefaultMergeDecisions",
          "kind": "re-export",
          "signature": "buildDefaultMergeDecisions",
          "summary": ""
        },
        {
          "name": "compareSemanticSnapshots",
          "kind": "re-export",
          "signature": "compareSemanticSnapshots",
          "summary": ""
        },
        {
          "name": "createDefaultSemanticAdapterRegistry",
          "kind": "re-export",
          "signature": "createDefaultSemanticAdapterRegistry",
          "summary": ""
        },
        {
          "name": "createMergeCommit",
          "kind": "re-export",
          "signature": "createMergeCommit",
          "summary": ""
        },
        {
          "name": "createMergeProposal",
          "kind": "re-export",
          "signature": "createMergeProposal",
          "summary": ""
        },
        {
          "name": "createRealmBranch",
          "kind": "re-export",
          "signature": "createRealmBranch",
          "summary": ""
        },
        {
          "name": "hashSemanticChange",
          "kind": "re-export",
          "signature": "hashSemanticChange",
          "summary": ""
        },
        {
          "name": "normalizeSemanticSnapshot",
          "kind": "re-export",
          "signature": "normalizeSemanticSnapshot",
          "summary": ""
        },
        {
          "name": "orderSemanticChanges",
          "kind": "re-export",
          "signature": "orderSemanticChanges",
          "summary": ""
        },
        {
          "name": "validateMergeDecisions",
          "kind": "re-export",
          "signature": "validateMergeDecisions",
          "summary": ""
        },
        {
          "name": "verifyMergeCommit",
          "kind": "re-export",
          "signature": "verifyMergeCommit",
          "summary": ""
        },
        {
          "name": "verifyMergeProposal",
          "kind": "re-export",
          "signature": "verifyMergeProposal",
          "summary": ""
        },
        {
          "name": "verifyRealmBranch",
          "kind": "re-export",
          "signature": "verifyRealmBranch",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/capsule/CapsuleAssembler",
      "path": "engine/reference/network/realm/capsule/CapsuleAssembler.md",
      "source": "engine/network/realm/capsule/CapsuleAssembler.js",
      "import": "/engine/network/realm/capsule/CapsuleAssembler.js",
      "sourceHash": "5845d9ade31c91e0ad3536426e7a3ac0b164ca4ef67f473d41949f2ea58d310d",
      "summary": "",
      "exports": [
        {
          "name": "CapsuleAssembler",
          "kind": "class",
          "signature": "class CapsuleAssembler",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/capsule/CapsuleMigration",
      "path": "engine/reference/network/realm/capsule/CapsuleMigration.md",
      "source": "engine/network/realm/capsule/CapsuleMigration.js",
      "import": "/engine/network/realm/capsule/CapsuleMigration.js",
      "sourceHash": "1e5281e4f306569349e4921d48cabcd96e25277d96e314c77d5df8558ea99b0f",
      "summary": "",
      "exports": [
        {
          "name": "CapsuleMigrationRegistry",
          "kind": "class",
          "signature": "class CapsuleMigrationRegistry",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/capsule/RealmBranchRef",
      "path": "engine/reference/network/realm/capsule/RealmBranchRef.md",
      "source": "engine/network/realm/capsule/RealmBranchRef.js",
      "import": "/engine/network/realm/capsule/RealmBranchRef.js",
      "sourceHash": "4815f0b7a1410d904324d3d2ef6fffbe83e6454d150e71bf1418bc7c23863f49",
      "summary": "",
      "exports": [
        {
          "name": "hashRealmBranchRef",
          "kind": "function",
          "signature": "async hashRealmBranchRef(ref)",
          "summary": ""
        },
        {
          "name": "createRealmBranchRef",
          "kind": "function",
          "signature": "async createRealmBranchRef(input, signer, previous = null)",
          "summary": ""
        },
        {
          "name": "verifyRealmBranchRef",
          "kind": "function",
          "signature": "async verifyRealmBranchRef(ref, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/capsule/RealmCapsule",
      "path": "engine/reference/network/realm/capsule/RealmCapsule.md",
      "source": "engine/network/realm/capsule/RealmCapsule.js",
      "import": "/engine/network/realm/capsule/RealmCapsule.js",
      "sourceHash": "cf6288b176a4ab9e8f3dd4777c03da32f61da78e840ea7ac0f63d3ebe1f5682e",
      "summary": "Convert the output of PackageVerifier.parseAny()/verify() into the package input accepted by buildRealmCapsule. Package verification stays owned by the existing package stack; this adapter only binds its verified artifact bytes and roots into the Capsule.",
      "exports": [
        {
          "name": "toUint8Array",
          "kind": "function",
          "signature": "toUint8Array(value)",
          "summary": ""
        },
        {
          "name": "taggedSha256",
          "kind": "function",
          "signature": "taggedSha256(hex)",
          "summary": ""
        },
        {
          "name": "adaptVerifiedPackageArtifact",
          "kind": "function",
          "signature": "async adaptVerifiedPackageArtifact({ artifactBytes, parsedPackage, verification } = {})",
          "summary": "Convert the output of PackageVerifier.parseAny()/verify() into the package input accepted by buildRealmCapsule. Package verification stays owned by the existing package stack; this adapter only binds its verified artifact bytes and roots into the Capsule."
        },
        {
          "name": "computeCapsuleRoot",
          "kind": "function",
          "signature": "async computeCapsuleRoot(body)",
          "summary": ""
        },
        {
          "name": "prepareRealmBlob",
          "kind": "function",
          "signature": "async prepareRealmBlob(input, options = {})",
          "summary": ""
        },
        {
          "name": "buildRealmCapsule",
          "kind": "function",
          "signature": "async buildRealmCapsule(input, signer, options = {})",
          "summary": ""
        },
        {
          "name": "verifyRealmCapsule",
          "kind": "function",
          "signature": "async verifyRealmCapsule(capsule, options = {})",
          "summary": ""
        },
        {
          "name": "verifyBlobAgainstDescriptor",
          "kind": "function",
          "signature": "async verifyBlobAgainstDescriptor(bytesLike, descriptor)",
          "summary": ""
        },
        {
          "name": "bytesToBase64",
          "kind": "function",
          "signature": "bytesToBase64(bytes)",
          "summary": ""
        },
        {
          "name": "base64ToBytes",
          "kind": "function",
          "signature": "base64ToBytes(value)",
          "summary": ""
        },
        {
          "name": "createOfflineCapsuleExport",
          "kind": "function",
          "signature": "async createOfflineCapsuleExport(capsule, resolveBlob, options = {})",
          "summary": ""
        },
        {
          "name": "verifyOfflineCapsuleExport",
          "kind": "function",
          "signature": "async verifyOfflineCapsuleExport(bundle, options = {})",
          "summary": ""
        },
        {
          "name": "reassembleBlobChunks",
          "kind": "function",
          "signature": "reassembleBlobChunks(chunks)",
          "summary": ""
        },
        {
          "name": "RealmCapsuleV1",
          "kind": "constant",
          "signature": "RealmCapsuleV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/capsule/RealmCapsuleSchema",
      "path": "engine/reference/network/realm/capsule/RealmCapsuleSchema.md",
      "source": "engine/network/realm/capsule/RealmCapsuleSchema.js",
      "import": "/engine/network/realm/capsule/RealmCapsuleSchema.js",
      "sourceHash": "aa30df2ec1362e94290878285521e1f05520bce436be2e1ecf479d6416605e20",
      "summary": "",
      "exports": [
        {
          "name": "RealmCapsuleValidationError",
          "kind": "class",
          "signature": "class RealmCapsuleValidationError extends TypeError",
          "summary": ""
        },
        {
          "name": "normalizeRights",
          "kind": "function",
          "signature": "normalizeRights(value = {})",
          "summary": ""
        },
        {
          "name": "normalizeProvenance",
          "kind": "function",
          "signature": "normalizeProvenance(value = {})",
          "summary": ""
        },
        {
          "name": "normalizeCompatibility",
          "kind": "function",
          "signature": "normalizeCompatibility(value = {})",
          "summary": ""
        },
        {
          "name": "normalizeCapsuleBody",
          "kind": "function",
          "signature": "normalizeCapsuleBody(value)",
          "summary": ""
        },
        {
          "name": "validateRealmCapsuleShape",
          "kind": "function",
          "signature": "validateRealmCapsuleShape(value, { requireSignature = true } = {})",
          "summary": ""
        },
        {
          "name": "validateDependencyGraph",
          "kind": "function",
          "signature": "validateDependencyGraph(records, options = {})",
          "summary": ""
        },
        {
          "name": "isContentId",
          "kind": "function",
          "signature": "isContentId(value)",
          "summary": ""
        },
        {
          "name": "contentIdHex",
          "kind": "function",
          "signature": "contentIdHex(value)",
          "summary": ""
        },
        {
          "name": "deepFreeze",
          "kind": "function",
          "signature": "deepFreeze(value)",
          "summary": ""
        },
        {
          "name": "REALM_CAPSULE_FORMAT",
          "kind": "constant",
          "signature": "REALM_CAPSULE_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_CAPSULE_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "REALM_CAPSULE_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "REALM_CAPSULE_EXPORT_FORMAT",
          "kind": "constant",
          "signature": "REALM_CAPSULE_EXPORT_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_BRANCH_REF_FORMAT",
          "kind": "constant",
          "signature": "REALM_BRANCH_REF_FORMAT",
          "summary": ""
        },
        {
          "name": "DEPENDENCY_CLASSES",
          "kind": "constant",
          "signature": "DEPENDENCY_CLASSES",
          "summary": ""
        },
        {
          "name": "DEPENDENCY_KINDS",
          "kind": "constant",
          "signature": "DEPENDENCY_KINDS",
          "summary": ""
        },
        {
          "name": "RIGHTS_DECISIONS",
          "kind": "constant",
          "signature": "RIGHTS_DECISIONS",
          "summary": ""
        },
        {
          "name": "CAPSULE_LIMITS",
          "kind": "constant",
          "signature": "CAPSULE_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/capsule/index",
      "path": "engine/reference/network/realm/capsule/index.md",
      "source": "engine/network/realm/capsule/index.js",
      "import": "/engine/network/realm/capsule/index.js",
      "sourceHash": "bc88b01280f5c828fd86b354cb7ebacca413d55bbe99612f2eb1cb4048401a43",
      "summary": "",
      "exports": [
        {
          "name": "CAPSULE_LIMITS",
          "kind": "re-export",
          "signature": "CAPSULE_LIMITS",
          "summary": ""
        },
        {
          "name": "CapsuleAssembler",
          "kind": "re-export",
          "signature": "CapsuleAssembler",
          "summary": ""
        },
        {
          "name": "CapsuleMigrationRegistry",
          "kind": "re-export",
          "signature": "CapsuleMigrationRegistry",
          "summary": ""
        },
        {
          "name": "DEPENDENCY_CLASSES",
          "kind": "re-export",
          "signature": "DEPENDENCY_CLASSES",
          "summary": ""
        },
        {
          "name": "DEPENDENCY_KINDS",
          "kind": "re-export",
          "signature": "DEPENDENCY_KINDS",
          "summary": ""
        },
        {
          "name": "REALM_BRANCH_REF_FORMAT",
          "kind": "re-export",
          "signature": "REALM_BRANCH_REF_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_CAPSULE_EXPORT_FORMAT",
          "kind": "re-export",
          "signature": "REALM_CAPSULE_EXPORT_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_CAPSULE_FORMAT",
          "kind": "re-export",
          "signature": "REALM_CAPSULE_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_CAPSULE_SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "REALM_CAPSULE_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "RIGHTS_DECISIONS",
          "kind": "re-export",
          "signature": "RIGHTS_DECISIONS",
          "summary": ""
        },
        {
          "name": "RealmCapsuleV1",
          "kind": "re-export",
          "signature": "RealmCapsuleV1",
          "summary": ""
        },
        {
          "name": "RealmCapsuleValidationError",
          "kind": "re-export",
          "signature": "RealmCapsuleValidationError",
          "summary": ""
        },
        {
          "name": "adaptVerifiedPackageArtifact",
          "kind": "re-export",
          "signature": "adaptVerifiedPackageArtifact",
          "summary": ""
        },
        {
          "name": "base64ToBytes",
          "kind": "re-export",
          "signature": "base64ToBytes",
          "summary": ""
        },
        {
          "name": "buildRealmCapsule",
          "kind": "re-export",
          "signature": "buildRealmCapsule",
          "summary": ""
        },
        {
          "name": "bytesToBase64",
          "kind": "re-export",
          "signature": "bytesToBase64",
          "summary": ""
        },
        {
          "name": "computeCapsuleRoot",
          "kind": "re-export",
          "signature": "computeCapsuleRoot",
          "summary": ""
        },
        {
          "name": "contentIdHex",
          "kind": "re-export",
          "signature": "contentIdHex",
          "summary": ""
        },
        {
          "name": "createOfflineCapsuleExport",
          "kind": "re-export",
          "signature": "createOfflineCapsuleExport",
          "summary": ""
        },
        {
          "name": "createRealmBranchRef",
          "kind": "re-export",
          "signature": "createRealmBranchRef",
          "summary": ""
        },
        {
          "name": "deepFreeze",
          "kind": "re-export",
          "signature": "deepFreeze",
          "summary": ""
        },
        {
          "name": "hashRealmBranchRef",
          "kind": "re-export",
          "signature": "hashRealmBranchRef",
          "summary": ""
        },
        {
          "name": "isContentId",
          "kind": "re-export",
          "signature": "isContentId",
          "summary": ""
        },
        {
          "name": "normalizeCapsuleBody",
          "kind": "re-export",
          "signature": "normalizeCapsuleBody",
          "summary": ""
        },
        {
          "name": "normalizeCompatibility",
          "kind": "re-export",
          "signature": "normalizeCompatibility",
          "summary": ""
        },
        {
          "name": "normalizeProvenance",
          "kind": "re-export",
          "signature": "normalizeProvenance",
          "summary": ""
        },
        {
          "name": "normalizeRights",
          "kind": "re-export",
          "signature": "normalizeRights",
          "summary": ""
        },
        {
          "name": "prepareRealmBlob",
          "kind": "re-export",
          "signature": "prepareRealmBlob",
          "summary": ""
        },
        {
          "name": "reassembleBlobChunks",
          "kind": "re-export",
          "signature": "reassembleBlobChunks",
          "summary": ""
        },
        {
          "name": "taggedSha256",
          "kind": "re-export",
          "signature": "taggedSha256",
          "summary": ""
        },
        {
          "name": "toUint8Array",
          "kind": "re-export",
          "signature": "toUint8Array",
          "summary": ""
        },
        {
          "name": "validateDependencyGraph",
          "kind": "re-export",
          "signature": "validateDependencyGraph",
          "summary": ""
        },
        {
          "name": "validateRealmCapsuleShape",
          "kind": "re-export",
          "signature": "validateRealmCapsuleShape",
          "summary": ""
        },
        {
          "name": "verifyBlobAgainstDescriptor",
          "kind": "re-export",
          "signature": "verifyBlobAgainstDescriptor",
          "summary": ""
        },
        {
          "name": "verifyOfflineCapsuleExport",
          "kind": "re-export",
          "signature": "verifyOfflineCapsuleExport",
          "summary": ""
        },
        {
          "name": "verifyRealmBranchRef",
          "kind": "re-export",
          "signature": "verifyRealmBranchRef",
          "summary": ""
        },
        {
          "name": "verifyRealmCapsule",
          "kind": "re-export",
          "signature": "verifyRealmCapsule",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/chronicle/RealmChronicle",
      "path": "engine/reference/network/realm/chronicle/RealmChronicle.md",
      "source": "engine/network/realm/chronicle/RealmChronicle.js",
      "import": "/engine/network/realm/chronicle/RealmChronicle.js",
      "sourceHash": "d4b40473f143c289ddfa944054b890f5307030cb1c92a1075dafd0e1b4ee40b5",
      "summary": "RealmChronicle.js — signed SHA-256 causal history for a Realm branch. Chronicle events contain semantic records and state-root transitions, not simulation ticks.  The implementation is storage-agnostic so the same verification code is used for local persistence, Capsule import, and peers.",
      "exports": [
        {
          "name": "RealmChronicle",
          "kind": "class",
          "signature": "class RealmChronicle",
          "summary": ""
        },
        {
          "name": "createChronicleEvent",
          "kind": "function",
          "signature": "async createChronicleEvent(input, signer)",
          "summary": "Create a complete signed Chronicle event."
        },
        {
          "name": "verifyChronicleEvent",
          "kind": "function",
          "signature": "async verifyChronicleEvent(event, options = {})",
          "summary": "Verify content hash, event hash, signer fingerprint, signature, and optional actor binding."
        },
        {
          "name": "verifyChronicle",
          "kind": "function",
          "signature": "async verifyChronicle(value, options = {})",
          "summary": "Verify and rebuild a complete Chronicle snapshot or event list."
        },
        {
          "name": "CHRONICLE_EVENT_FORMAT",
          "kind": "constant",
          "signature": "CHRONICLE_EVENT_FORMAT",
          "summary": ""
        },
        {
          "name": "CHRONICLE_FORMAT",
          "kind": "constant",
          "signature": "CHRONICLE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/chronicle/index",
      "path": "engine/reference/network/realm/chronicle/index.md",
      "source": "engine/network/realm/chronicle/index.js",
      "import": "/engine/network/realm/chronicle/index.js",
      "sourceHash": "fb1ffbec25619cc8f6fbeaea531419199116fb0be05a1541ee9a9d16b2b0cd63",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/contracts",
      "path": "engine/reference/network/realm/contracts.md",
      "source": "engine/network/realm/contracts.js",
      "import": "/engine/network/realm/contracts.js",
      "sourceHash": "41d3156962dd71b5d89b0401947cad140fa183d11a6b9f02628f29785aedde76",
      "summary": "Stable Realm Network V1 contract descriptors. Descriptors contain references to the concrete implementations. Importing this module does not create stores, links, providers, timers, or network connections.",
      "exports": [
        {
          "name": "RealmPassportV1",
          "kind": "constant",
          "signature": "RealmPassportV1",
          "summary": ""
        },
        {
          "name": "RealmAddressV1",
          "kind": "constant",
          "signature": "RealmAddressV1",
          "summary": ""
        },
        {
          "name": "ChronicleEventV1",
          "kind": "constant",
          "signature": "ChronicleEventV1",
          "summary": ""
        },
        {
          "name": "RealmLinkV1",
          "kind": "constant",
          "signature": "RealmLinkV1",
          "summary": ""
        },
        {
          "name": "AuthorityLeaseV1",
          "kind": "constant",
          "signature": "AuthorityLeaseV1",
          "summary": ""
        },
        {
          "name": "AtlasRecordV1",
          "kind": "constant",
          "signature": "AtlasRecordV1",
          "summary": ""
        },
        {
          "name": "PresenceV1",
          "kind": "constant",
          "signature": "PresenceV1",
          "summary": ""
        },
        {
          "name": "ContinuityV1",
          "kind": "constant",
          "signature": "ContinuityV1",
          "summary": ""
        },
        {
          "name": "HealthSnapshotV1",
          "kind": "constant",
          "signature": "HealthSnapshotV1",
          "summary": ""
        },
        {
          "name": "REALM_NETWORK_PUBLIC_CONTRACTS_V1",
          "kind": "constant",
          "signature": "REALM_NETWORK_PUBLIC_CONTRACTS_V1",
          "summary": ""
        },
        {
          "name": "REALM_NETWORK_PUBLIC_CONTRACT_NAMES_V1",
          "kind": "constant",
          "signature": "REALM_NETWORK_PUBLIC_CONTRACT_NAMES_V1",
          "summary": ""
        },
        {
          "name": "AccordResultV1",
          "kind": "re-export",
          "signature": "AccordResultV1",
          "summary": ""
        },
        {
          "name": "AccordTaskV1",
          "kind": "re-export",
          "signature": "AccordTaskV1",
          "summary": ""
        },
        {
          "name": "CapabilityGrantV1",
          "kind": "re-export",
          "signature": "CapabilityGrantV1",
          "summary": ""
        },
        {
          "name": "ContextCapsuleV1",
          "kind": "re-export",
          "signature": "ContextCapsuleV1",
          "summary": ""
        },
        {
          "name": "GatePlanV1",
          "kind": "re-export",
          "signature": "GatePlanV1",
          "summary": ""
        },
        {
          "name": "MergeProposalV1",
          "kind": "re-export",
          "signature": "MergeProposalV1",
          "summary": ""
        },
        {
          "name": "OrganizationV1",
          "kind": "re-export",
          "signature": "OrganizationV1",
          "summary": ""
        },
        {
          "name": "RealmBranchV1",
          "kind": "re-export",
          "signature": "RealmBranchV1",
          "summary": ""
        },
        {
          "name": "RealmCapsuleV1",
          "kind": "re-export",
          "signature": "RealmCapsuleV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/gate/GatePlanV1",
      "path": "engine/reference/network/realm/gate/GatePlanV1.md",
      "source": "engine/network/realm/gate/GatePlanV1.js",
      "import": "/engine/network/realm/gate/GatePlanV1.js",
      "sourceHash": "7e169d4ade6166a1da781c988b99eb2cf2e036b672ad49cec655951582200b5d",
      "summary": "Fail-closed Realm entry planning over verified identity, content, and policy evidence.",
      "exports": [
        {
          "name": "RealmGate",
          "kind": "class",
          "signature": "class RealmGate",
          "summary": "Runtime Gate evaluator. It owns no persistence and performs no entry itself; it only emits a short-lived signed plan that Shield can enforce."
        },
        {
          "name": "deriveGateOutcome",
          "kind": "function",
          "signature": "deriveGateOutcome(checks)",
          "summary": ""
        },
        {
          "name": "createGatePlan",
          "kind": "function",
          "signature": "async createGatePlan(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyGatePlan",
          "kind": "function",
          "signature": "async verifyGatePlan(record, options = {})",
          "summary": ""
        },
        {
          "name": "GATE_PLAN_V1_FORMAT",
          "kind": "constant",
          "signature": "GATE_PLAN_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "GATE_OUTCOME",
          "kind": "constant",
          "signature": "GATE_OUTCOME",
          "summary": ""
        },
        {
          "name": "GATE_ACTION",
          "kind": "constant",
          "signature": "GATE_ACTION",
          "summary": ""
        },
        {
          "name": "GATE_CHECK",
          "kind": "constant",
          "signature": "GATE_CHECK",
          "summary": ""
        },
        {
          "name": "GatePlanV1",
          "kind": "constant",
          "signature": "GatePlanV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/gate/index",
      "path": "engine/reference/network/realm/gate/index.md",
      "source": "engine/network/realm/gate/index.js",
      "import": "/engine/network/realm/gate/index.js",
      "sourceHash": "a3acad02ca0c1c652a8b8249afee26e0485b4195e05ba2d4f068c41d7c357c1b",
      "summary": "",
      "exports": [
        {
          "name": "GATE_ACTION",
          "kind": "re-export",
          "signature": "GATE_ACTION",
          "summary": ""
        },
        {
          "name": "GATE_CHECK",
          "kind": "re-export",
          "signature": "GATE_CHECK",
          "summary": ""
        },
        {
          "name": "GATE_OUTCOME",
          "kind": "re-export",
          "signature": "GATE_OUTCOME",
          "summary": ""
        },
        {
          "name": "GATE_PLAN_V1_FORMAT",
          "kind": "re-export",
          "signature": "GATE_PLAN_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "GatePlanV1",
          "kind": "re-export",
          "signature": "GatePlanV1",
          "summary": ""
        },
        {
          "name": "RealmGate",
          "kind": "re-export",
          "signature": "RealmGate",
          "summary": ""
        },
        {
          "name": "createGatePlan",
          "kind": "re-export",
          "signature": "createGatePlan",
          "summary": ""
        },
        {
          "name": "deriveGateOutcome",
          "kind": "re-export",
          "signature": "deriveGateOutcome",
          "summary": ""
        },
        {
          "name": "verifyGatePlan",
          "kind": "re-export",
          "signature": "verifyGatePlan",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/governance/CapabilityGrantV1",
      "path": "engine/reference/network/realm/governance/CapabilityGrantV1.md",
      "source": "engine/network/realm/governance/CapabilityGrantV1.js",
      "import": "/engine/network/realm/governance/CapabilityGrantV1.js",
      "sourceHash": "138f60c95a6e102b69ff02b033bba767f7217e6c1f4c97cd0e9ca1acd352176a",
      "summary": "Scoped, attenuable, delegable, revocable CapabilityGrantV1 contracts.",
      "exports": [
        {
          "name": "RealmCapabilityRegistry",
          "kind": "class",
          "signature": "class RealmCapabilityRegistry",
          "summary": "Runtime registry with online revocation and dynamic membership/role checks."
        },
        {
          "name": "createCapabilityGrant",
          "kind": "function",
          "signature": "async createCapabilityGrant(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyCapabilityGrant",
          "kind": "function",
          "signature": "async verifyCapabilityGrant(record, options = {})",
          "summary": ""
        },
        {
          "name": "attenuateCapabilityGrant",
          "kind": "function",
          "signature": "async attenuateCapabilityGrant(parentRecord, input, signer)",
          "summary": ""
        },
        {
          "name": "recoverCapabilityGrant",
          "kind": "function",
          "signature": "async recoverCapabilityGrant(previousRecord, input, signer)",
          "summary": ""
        },
        {
          "name": "createCapabilityRevocation",
          "kind": "function",
          "signature": "async createCapabilityRevocation(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyCapabilityRevocation",
          "kind": "function",
          "signature": "async verifyCapabilityRevocation(record, options = {})",
          "summary": ""
        },
        {
          "name": "createCapabilityAuditReceipt",
          "kind": "function",
          "signature": "async createCapabilityAuditReceipt(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyCapabilityAuditReceipt",
          "kind": "function",
          "signature": "async verifyCapabilityAuditReceipt(record, options = {})",
          "summary": ""
        },
        {
          "name": "CAPABILITY_GRANT_V1_FORMAT",
          "kind": "constant",
          "signature": "CAPABILITY_GRANT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "CAPABILITY_REVOCATION_V1_FORMAT",
          "kind": "constant",
          "signature": "CAPABILITY_REVOCATION_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "CAPABILITY_AUDIT_RECEIPT_V1_FORMAT",
          "kind": "constant",
          "signature": "CAPABILITY_AUDIT_RECEIPT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "CapabilityGrantV1",
          "kind": "constant",
          "signature": "CapabilityGrantV1",
          "summary": "Public contract descriptor for callers that discover schemas dynamically."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/governance/GovernanceCrypto",
      "path": "engine/reference/network/realm/governance/GovernanceCrypto.md",
      "source": "engine/network/realm/governance/GovernanceCrypto.js",
      "import": "/engine/network/realm/governance/GovernanceCrypto.js",
      "sourceHash": "5a26102258b7ba992b8ac90e77cee4c8466200a185352dd3017b21a4678fcdee",
      "summary": "Shared signing primitives for Realm organization and capability records.",
      "exports": [
        {
          "name": "signerDescriptor",
          "kind": "function",
          "signature": "async signerDescriptor(signer)",
          "summary": ""
        },
        {
          "name": "finishSignedRecord",
          "kind": "function",
          "signature": "async finishSignedRecord(record, idField, signer)",
          "summary": ""
        },
        {
          "name": "verifySignedRecord",
          "kind": "function",
          "signature": "async verifySignedRecord(record, { format, idField })",
          "summary": ""
        },
        {
          "name": "boundedInteger",
          "kind": "function",
          "signature": "boundedInteger(value, name, minimum = 0)",
          "summary": ""
        },
        {
          "name": "boundedToken",
          "kind": "function",
          "signature": "boundedToken(value, name, maximum = 128, { wildcard = false } = {})",
          "summary": ""
        },
        {
          "name": "boundedText",
          "kind": "function",
          "signature": "boundedText(value, name, maximum = 512)",
          "summary": ""
        },
        {
          "name": "uniqueSorted",
          "kind": "function",
          "signature": "uniqueSorted(values, name, normalize, maximum = 128)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/governance/OrganizationLedger",
      "path": "engine/reference/network/realm/governance/OrganizationLedger.md",
      "source": "engine/network/realm/governance/OrganizationLedger.js",
      "import": "/engine/network/realm/governance/OrganizationLedger.js",
      "sourceHash": "da86b71a128bcd5aa9fe3e15d0c3c340c230081138b9bf1bb60e4630b827618c",
      "summary": "Cryptographically verified organization history. The ledger uses the same contextual verifier for live persistence and replay. A proposal freezes its eligible membership set and quorum at its epoch; later joins cannot vote, while revoked members and superseded keys fail immediately.",
      "exports": [
        {
          "name": "RealmOrganizationLedger",
          "kind": "class",
          "signature": "class RealmOrganizationLedger",
          "summary": ""
        },
        {
          "name": "createGovernanceEnvelope",
          "kind": "function",
          "signature": "async createGovernanceEnvelope(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyGovernanceEnvelope",
          "kind": "function",
          "signature": "async verifyGovernanceEnvelope(record)",
          "summary": ""
        },
        {
          "name": "replayOrganizationLedger",
          "kind": "function",
          "signature": "async replayOrganizationLedger(organizationRecord, envelopes, options = {})",
          "summary": ""
        },
        {
          "name": "GOVERNANCE_ENVELOPE_FORMAT",
          "kind": "constant",
          "signature": "GOVERNANCE_ENVELOPE_FORMAT",
          "summary": ""
        },
        {
          "name": "GOVERNANCE_ENVELOPE_KIND",
          "kind": "constant",
          "signature": "GOVERNANCE_ENVELOPE_KIND",
          "summary": ""
        },
        {
          "name": "ORGANIZATION_ACTION",
          "kind": "constant",
          "signature": "ORGANIZATION_ACTION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/governance/OrganizationV1",
      "path": "engine/reference/network/realm/governance/OrganizationV1.md",
      "source": "engine/network/realm/governance/OrganizationV1.js",
      "import": "/engine/network/realm/governance/OrganizationV1.js",
      "sourceHash": "f5f6e8ea4b06cfb40b83fbff9022537d625682870ba4f4bf8d76eaf39fe92dae",
      "summary": "Signed OrganizationV1 root contract and its fixed governance vocabulary.",
      "exports": [
        {
          "name": "createOrganizationV1",
          "kind": "function",
          "signature": "async createOrganizationV1(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyOrganizationV1",
          "kind": "function",
          "signature": "async verifyOrganizationV1(record)",
          "summary": ""
        },
        {
          "name": "ORGANIZATION_V1_FORMAT",
          "kind": "constant",
          "signature": "ORGANIZATION_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "ORGANIZATION_POWER",
          "kind": "constant",
          "signature": "ORGANIZATION_POWER",
          "summary": ""
        },
        {
          "name": "DEFAULT_ORGANIZATION_ROLES",
          "kind": "constant",
          "signature": "DEFAULT_ORGANIZATION_ROLES",
          "summary": ""
        },
        {
          "name": "OrganizationV1",
          "kind": "constant",
          "signature": "OrganizationV1",
          "summary": "Public contract descriptor for callers that discover schemas dynamically."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/governance/index",
      "path": "engine/reference/network/realm/governance/index.md",
      "source": "engine/network/realm/governance/index.js",
      "import": "/engine/network/realm/governance/index.js",
      "sourceHash": "5a55c50d48cd975774812bd0457868da3f24fabdc79e33b32e3f9a7f99d3ab1f",
      "summary": "",
      "exports": [
        {
          "name": "CAPABILITY_AUDIT_RECEIPT_V1_FORMAT",
          "kind": "re-export",
          "signature": "CAPABILITY_AUDIT_RECEIPT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "CAPABILITY_GRANT_V1_FORMAT",
          "kind": "re-export",
          "signature": "CAPABILITY_GRANT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "CAPABILITY_REVOCATION_V1_FORMAT",
          "kind": "re-export",
          "signature": "CAPABILITY_REVOCATION_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "CapabilityGrantV1",
          "kind": "re-export",
          "signature": "CapabilityGrantV1",
          "summary": ""
        },
        {
          "name": "DEFAULT_ORGANIZATION_ROLES",
          "kind": "re-export",
          "signature": "DEFAULT_ORGANIZATION_ROLES",
          "summary": ""
        },
        {
          "name": "GOVERNANCE_ENVELOPE_FORMAT",
          "kind": "re-export",
          "signature": "GOVERNANCE_ENVELOPE_FORMAT",
          "summary": ""
        },
        {
          "name": "GOVERNANCE_ENVELOPE_KIND",
          "kind": "re-export",
          "signature": "GOVERNANCE_ENVELOPE_KIND",
          "summary": ""
        },
        {
          "name": "ORGANIZATION_ACTION",
          "kind": "re-export",
          "signature": "ORGANIZATION_ACTION",
          "summary": ""
        },
        {
          "name": "ORGANIZATION_POWER",
          "kind": "re-export",
          "signature": "ORGANIZATION_POWER",
          "summary": ""
        },
        {
          "name": "ORGANIZATION_V1_FORMAT",
          "kind": "re-export",
          "signature": "ORGANIZATION_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "OrganizationV1",
          "kind": "re-export",
          "signature": "OrganizationV1",
          "summary": ""
        },
        {
          "name": "RealmCapabilityRegistry",
          "kind": "re-export",
          "signature": "RealmCapabilityRegistry",
          "summary": ""
        },
        {
          "name": "RealmOrganizationLedger",
          "kind": "re-export",
          "signature": "RealmOrganizationLedger",
          "summary": ""
        },
        {
          "name": "attenuateCapabilityGrant",
          "kind": "re-export",
          "signature": "attenuateCapabilityGrant",
          "summary": ""
        },
        {
          "name": "createCapabilityAuditReceipt",
          "kind": "re-export",
          "signature": "createCapabilityAuditReceipt",
          "summary": ""
        },
        {
          "name": "createCapabilityGrant",
          "kind": "re-export",
          "signature": "createCapabilityGrant",
          "summary": ""
        },
        {
          "name": "createCapabilityRevocation",
          "kind": "re-export",
          "signature": "createCapabilityRevocation",
          "summary": ""
        },
        {
          "name": "createGovernanceEnvelope",
          "kind": "re-export",
          "signature": "createGovernanceEnvelope",
          "summary": ""
        },
        {
          "name": "createOrganizationV1",
          "kind": "re-export",
          "signature": "createOrganizationV1",
          "summary": ""
        },
        {
          "name": "recoverCapabilityGrant",
          "kind": "re-export",
          "signature": "recoverCapabilityGrant",
          "summary": ""
        },
        {
          "name": "replayOrganizationLedger",
          "kind": "re-export",
          "signature": "replayOrganizationLedger",
          "summary": ""
        },
        {
          "name": "verifyCapabilityAuditReceipt",
          "kind": "re-export",
          "signature": "verifyCapabilityAuditReceipt",
          "summary": ""
        },
        {
          "name": "verifyCapabilityGrant",
          "kind": "re-export",
          "signature": "verifyCapabilityGrant",
          "summary": ""
        },
        {
          "name": "verifyCapabilityRevocation",
          "kind": "re-export",
          "signature": "verifyCapabilityRevocation",
          "summary": ""
        },
        {
          "name": "verifyGovernanceEnvelope",
          "kind": "re-export",
          "signature": "verifyGovernanceEnvelope",
          "summary": ""
        },
        {
          "name": "verifyOrganizationV1",
          "kind": "re-export",
          "signature": "verifyOrganizationV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/health/HealthSnapshot",
      "path": "engine/reference/network/realm/health/HealthSnapshot.md",
      "source": "engine/network/realm/health/HealthSnapshot.js",
      "import": "/engine/network/realm/health/HealthSnapshot.js",
      "sourceHash": "6b19a2a8cb45e013592c0b258d852a4002524b6031f90f511041ab0d5b318a28",
      "summary": "Record a RealmLink snapshot without exposing identities, keys, or payloads.",
      "exports": [
        {
          "name": "createHealthMonitor",
          "kind": "function",
          "signature": "createHealthMonitor({ realmId = null, branchId = null, now = ()",
          "summary": ""
        },
        {
          "name": "recordHealthComponent",
          "kind": "function",
          "signature": "recordHealthComponent(monitor, componentId, { status, reason = null, metrics = {}, ttlMs = 60_000, } = {})",
          "summary": ""
        },
        {
          "name": "removeHealthComponent",
          "kind": "function",
          "signature": "removeHealthComponent(monitor, componentId)",
          "summary": ""
        },
        {
          "name": "subscribeHealth",
          "kind": "function",
          "signature": "subscribeHealth(monitor, subscriber)",
          "summary": ""
        },
        {
          "name": "buildHealthSnapshotV1",
          "kind": "function",
          "signature": "buildHealthSnapshotV1(monitor)",
          "summary": ""
        },
        {
          "name": "observeRealmLinkHealth",
          "kind": "function",
          "signature": "observeRealmLinkHealth(monitor, linkSnapshot, { ttlMs = 30_000 } = {})",
          "summary": "Record a RealmLink snapshot without exposing identities, keys, or payloads."
        },
        {
          "name": "observeDiscoveryHealth",
          "kind": "function",
          "signature": "observeDiscoveryHealth(monitor, providerStatuses, { ttlMs = 60_000 } = {})",
          "summary": ""
        },
        {
          "name": "observePresenceHealth",
          "kind": "function",
          "signature": "observePresenceHealth(monitor, { activeActors = 0, rejected = 0, sequenceGaps = 0 } = {}, { ttlMs = 60_000 } = {})",
          "summary": ""
        },
        {
          "name": "HEALTH_SCHEMA",
          "kind": "constant",
          "signature": "HEALTH_SCHEMA",
          "summary": ""
        },
        {
          "name": "HEALTH_STATUS",
          "kind": "constant",
          "signature": "HEALTH_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/health/ReachabilityProjection",
      "path": "engine/reference/network/realm/health/ReachabilityProjection.md",
      "source": "engine/network/realm/health/ReachabilityProjection.js",
      "import": "/engine/network/realm/health/ReachabilityProjection.js",
      "sourceHash": "d36c4b7e7bcf5582d8cacb26a7c71c556284ae4962c7cb00644fa8d2145d3764",
      "summary": "Build a secret-free reachability projection from locally observed evidence.",
      "exports": [
        {
          "name": "projectEndpointReachability",
          "kind": "function",
          "signature": "projectEndpointReachability({ residentActive = false, routeCount = 0, masterservers = [], peers = [], observedAt = Date.now()",
          "summary": "Build a secret-free reachability projection from locally observed evidence."
        },
        {
          "name": "ENDPOINT_REACHABILITY",
          "kind": "constant",
          "signature": "ENDPOINT_REACHABILITY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/health/index",
      "path": "engine/reference/network/realm/health/index.md",
      "source": "engine/network/realm/health/index.js",
      "import": "/engine/network/realm/health/index.js",
      "sourceHash": "78d8045b0250cdea5bfc7f5ef30e2dce6a56baa4ef92f55870da2d4d8b9d8e41",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/identity/RealmPassport",
      "path": "engine/reference/network/realm/identity/RealmPassport.md",
      "source": "engine/network/realm/identity/RealmPassport.js",
      "import": "/engine/network/realm/identity/RealmPassport.js",
      "sourceHash": "9e8d810bcb980b79d88b6ee6414532166850e3290ce72c00dcddec23ba80f7ee",
      "summary": "RealmPassport.js — portable, signed public identity records. This module owns no keys and performs no persistence.  It consumes the existing signer interface and produces canonical records that can be stored, copied, and independently verified by any Realm Network peer.",
      "exports": [
        {
          "name": "createPassportLineage",
          "kind": "function",
          "signature": "async createPassportLineage({ passportId, createdAt = Date.now()",
          "summary": "Create a self-signed genesis lineage. The Passport ID is bound to its root key."
        },
        {
          "name": "appendPassportRotation",
          "kind": "function",
          "signature": "appendPassportRotation(lineage, newSigner, previousSigner, options = {})",
          "summary": ""
        },
        {
          "name": "appendPassportRecovery",
          "kind": "function",
          "signature": "appendPassportRecovery(lineage, newSigner, previousSigner, options = {})",
          "summary": ""
        },
        {
          "name": "appendPassportRevocation",
          "kind": "function",
          "signature": "async appendPassportRevocation(lineage, currentSigner, options = {})",
          "summary": "Append a terminal, signed key-revocation record."
        },
        {
          "name": "verifyPassportLineage",
          "kind": "function",
          "signature": "async verifyPassportLineage(lineage)",
          "summary": "Verify every digest, key fingerprint, link, and signature in a lineage."
        },
        {
          "name": "createDeviceGrant",
          "kind": "function",
          "signature": "async createDeviceGrant(input, passportSigner)",
          "summary": ""
        },
        {
          "name": "verifyDeviceGrant",
          "kind": "function",
          "signature": "async verifyDeviceGrant(grant, options = {})",
          "summary": ""
        },
        {
          "name": "createDeviceRevocation",
          "kind": "function",
          "signature": "async createDeviceRevocation(input, passportSigner)",
          "summary": ""
        },
        {
          "name": "verifyDeviceRevocation",
          "kind": "function",
          "signature": "async verifyDeviceRevocation(record, options = {})",
          "summary": ""
        },
        {
          "name": "createRecoveryPolicy",
          "kind": "function",
          "signature": "async createRecoveryPolicy(input, passportSigner)",
          "summary": ""
        },
        {
          "name": "verifyRecoveryPolicy",
          "kind": "function",
          "signature": "async verifyRecoveryPolicy(policy)",
          "summary": ""
        },
        {
          "name": "createRecoveryRecord",
          "kind": "function",
          "signature": "async createRecoveryRecord(input, passportSigner)",
          "summary": ""
        },
        {
          "name": "verifyRecoveryRecord",
          "kind": "function",
          "signature": "async verifyRecoveryRecord(record, options = {})",
          "summary": ""
        },
        {
          "name": "createRealmPassport",
          "kind": "function",
          "signature": "async createRealmPassport(input, passportSigner)",
          "summary": "Build a signed, allowlisted public Passport projection."
        },
        {
          "name": "verifyRealmPassport",
          "kind": "function",
          "signature": "async verifyRealmPassport(passport)",
          "summary": ""
        },
        {
          "name": "PASSPORT_FORMAT",
          "kind": "constant",
          "signature": "PASSPORT_FORMAT",
          "summary": ""
        },
        {
          "name": "PASSPORT_LINEAGE_FORMAT",
          "kind": "constant",
          "signature": "PASSPORT_LINEAGE_FORMAT",
          "summary": ""
        },
        {
          "name": "PASSPORT_EVENT_FORMAT",
          "kind": "constant",
          "signature": "PASSPORT_EVENT_FORMAT",
          "summary": ""
        },
        {
          "name": "DEVICE_GRANT_FORMAT",
          "kind": "constant",
          "signature": "DEVICE_GRANT_FORMAT",
          "summary": ""
        },
        {
          "name": "DEVICE_REVOCATION_FORMAT",
          "kind": "constant",
          "signature": "DEVICE_REVOCATION_FORMAT",
          "summary": ""
        },
        {
          "name": "RECOVERY_POLICY_FORMAT",
          "kind": "constant",
          "signature": "RECOVERY_POLICY_FORMAT",
          "summary": ""
        },
        {
          "name": "RECOVERY_RECORD_FORMAT",
          "kind": "constant",
          "signature": "RECOVERY_RECORD_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/identity/index",
      "path": "engine/reference/network/realm/identity/index.md",
      "source": "engine/network/realm/identity/index.js",
      "import": "/engine/network/realm/identity/index.js",
      "sourceHash": "036cbdb09f13136e820c76a4352323ac114824da7c0cf936efc2223e1a616f1d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/index",
      "path": "engine/reference/network/realm/index.md",
      "source": "engine/network/realm/index.js",
      "import": "/engine/network/realm/index.js",
      "sourceHash": "375f6bf7b884191f4fcc297e3b13d1d9666c0a612f8392ba538ffcfdd5c63736",
      "summary": "Explicit exports win over same-named subsystem descriptors and keep the public V1 contract surface stable while subsystem APIs remain available.",
      "exports": [
        {
          "name": "AccordResultV1",
          "kind": "re-export",
          "signature": "AccordResultV1",
          "summary": ""
        },
        {
          "name": "AccordTaskV1",
          "kind": "re-export",
          "signature": "AccordTaskV1",
          "summary": ""
        },
        {
          "name": "AtlasRecordV1",
          "kind": "re-export",
          "signature": "AtlasRecordV1",
          "summary": ""
        },
        {
          "name": "AuthorityLeaseV1",
          "kind": "re-export",
          "signature": "AuthorityLeaseV1",
          "summary": ""
        },
        {
          "name": "CapabilityGrantV1",
          "kind": "re-export",
          "signature": "CapabilityGrantV1",
          "summary": ""
        },
        {
          "name": "ChronicleEventV1",
          "kind": "re-export",
          "signature": "ChronicleEventV1",
          "summary": ""
        },
        {
          "name": "ContextCapsuleV1",
          "kind": "re-export",
          "signature": "ContextCapsuleV1",
          "summary": ""
        },
        {
          "name": "ContinuityV1",
          "kind": "re-export",
          "signature": "ContinuityV1",
          "summary": ""
        },
        {
          "name": "GatePlanV1",
          "kind": "re-export",
          "signature": "GatePlanV1",
          "summary": ""
        },
        {
          "name": "HealthSnapshotV1",
          "kind": "re-export",
          "signature": "HealthSnapshotV1",
          "summary": ""
        },
        {
          "name": "MergeProposalV1",
          "kind": "re-export",
          "signature": "MergeProposalV1",
          "summary": ""
        },
        {
          "name": "OrganizationV1",
          "kind": "re-export",
          "signature": "OrganizationV1",
          "summary": ""
        },
        {
          "name": "PresenceV1",
          "kind": "re-export",
          "signature": "PresenceV1",
          "summary": ""
        },
        {
          "name": "REALM_NETWORK_PUBLIC_CONTRACTS_V1",
          "kind": "re-export",
          "signature": "REALM_NETWORK_PUBLIC_CONTRACTS_V1",
          "summary": ""
        },
        {
          "name": "REALM_NETWORK_PUBLIC_CONTRACT_NAMES_V1",
          "kind": "re-export",
          "signature": "REALM_NETWORK_PUBLIC_CONTRACT_NAMES_V1",
          "summary": ""
        },
        {
          "name": "RealmAddressV1",
          "kind": "re-export",
          "signature": "RealmAddressV1",
          "summary": ""
        },
        {
          "name": "RealmBranchV1",
          "kind": "re-export",
          "signature": "RealmBranchV1",
          "summary": ""
        },
        {
          "name": "RealmCapsuleV1",
          "kind": "re-export",
          "signature": "RealmCapsuleV1",
          "summary": ""
        },
        {
          "name": "RealmLinkV1",
          "kind": "re-export",
          "signature": "RealmLinkV1",
          "summary": ""
        },
        {
          "name": "RealmPassportV1",
          "kind": "re-export",
          "signature": "RealmPassportV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/link/ContinuityStore",
      "path": "engine/reference/network/realm/link/ContinuityStore.md",
      "source": "engine/network/realm/link/ContinuityStore.js",
      "import": "/engine/network/realm/link/ContinuityStore.js",
      "sourceHash": "aae6e0e12aa87b09db4c5721b2feb15760d8dfef121673880956dbb836ea8406",
      "summary": "Storage-agnostic continuity records for reconnect and verified transfer resume. Raw reconnect tokens are deliberately rejected: callers persist an opaque credential only after sealing it with the OS/profile storage layer.",
      "exports": [
        {
          "name": "validateContinuityRecord",
          "kind": "function",
          "signature": "validateContinuityRecord(record)",
          "summary": ""
        },
        {
          "name": "createContinuityRecord",
          "kind": "function",
          "signature": "createContinuityRecord({ linkId, realmId, branchId, localPeerId, remotePeerId = null, sessionEpoch = 0, lastSentSequence = 0, remoteMaxSequence = 0, remoteSeenSequences = [], sealedReconnectCredential = null, peerTicket = null, routeHints = [], transfers = [], updatedAt = Date.now()",
          "summary": ""
        },
        {
          "name": "continuityStorageKey",
          "kind": "function",
          "signature": "continuityStorageKey({ realmId, branchId, linkId })",
          "summary": ""
        },
        {
          "name": "createMemoryContinuityAdapter",
          "kind": "function",
          "signature": "createMemoryContinuityAdapter()",
          "summary": "In-memory adapter for tests and ephemeral sessions; durable OS storage is injected with the same interface."
        },
        {
          "name": "createContinuityStore",
          "kind": "function",
          "signature": "createContinuityStore({ adapter = createMemoryContinuityAdapter()",
          "summary": ""
        },
        {
          "name": "saveContinuity",
          "kind": "function",
          "signature": "async saveContinuity(store, record)",
          "summary": ""
        },
        {
          "name": "loadContinuity",
          "kind": "function",
          "signature": "async loadContinuity(store, ids)",
          "summary": ""
        },
        {
          "name": "removeContinuity",
          "kind": "function",
          "signature": "async removeContinuity(store, ids)",
          "summary": ""
        },
        {
          "name": "updateTransferProgress",
          "kind": "function",
          "signature": "updateTransferProgress(record, update, now = Date.now()",
          "summary": "Update one transfer monotonically; completed/cancelled records cannot be reopened."
        },
        {
          "name": "CONTINUITY_SCHEMA",
          "kind": "constant",
          "signature": "CONTINUITY_SCHEMA",
          "summary": ""
        },
        {
          "name": "TRANSFER_STATE",
          "kind": "constant",
          "signature": "TRANSFER_STATE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/link/DiscoveryProvider",
      "path": "engine/reference/network/realm/link/DiscoveryProvider.md",
      "source": "engine/network/realm/link/DiscoveryProvider.js",
      "import": "/engine/network/realm/link/DiscoveryProvider.js",
      "sourceHash": "d218c7b04f7477a1ec7dfbbb779d812d197fe64e245d5fd8379edf43ee21ce0d",
      "summary": "Realm discovery is an orchestration contract, not a new discovery network. Providers adapt the existing bootstrap, DHT, invite, contact, peer-ticket, and Masterserver mechanisms into one bounded result shape.",
      "exports": [
        {
          "name": "normalizeDiscoveryCandidate",
          "kind": "function",
          "signature": "normalizeDiscoveryCandidate(candidate, { sourceId, now = Date.now()",
          "summary": "Normalize an untrusted provider result into the Realm discovery shape."
        },
        {
          "name": "createDiscoveryProvider",
          "kind": "function",
          "signature": "createDiscoveryProvider({ id, kind = DISCOVERY_KIND.CUSTOM, priority = 0, discover, advertise = null, revoke = null, health = null, } = {})",
          "summary": "Define one discovery provider. Network algorithms remain in the adapted subsystem."
        },
        {
          "name": "createDiscoveryRegistry",
          "kind": "function",
          "signature": "createDiscoveryRegistry({ now = ()",
          "summary": ""
        },
        {
          "name": "registerDiscoveryProvider",
          "kind": "function",
          "signature": "registerDiscoveryProvider(registry, provider)",
          "summary": ""
        },
        {
          "name": "unregisterDiscoveryProvider",
          "kind": "function",
          "signature": "unregisterDiscoveryProvider(registry, providerId)",
          "summary": ""
        },
        {
          "name": "discoverRealmPeers",
          "kind": "function",
          "signature": "async discoverRealmPeers(registry, query = {}, { timeoutMs = 5000, correlationId = null } = {})",
          "summary": "Query all enabled providers concurrently; one provider failure never erases valid peer results."
        },
        {
          "name": "discoveryProviderStatus",
          "kind": "function",
          "signature": "discoveryProviderStatus(registry)",
          "summary": ""
        },
        {
          "name": "createBootstrapRegistryProvider",
          "kind": "function",
          "signature": "createBootstrapRegistryProvider({ id = 'bootstrap', registry, priority = 10 } = {})",
          "summary": "Adapt the existing ordered bootstrap registry without reproducing its scan logic."
        },
        {
          "name": "createPeerTicketDiscoveryProvider",
          "kind": "function",
          "signature": "createPeerTicketDiscoveryProvider({ id = 'peer-tickets', store, priority = 100 } = {})",
          "summary": "Adapt the existing signed peer-ticket store into discovery hints."
        },
        {
          "name": "createDhtDiscoveryProvider",
          "kind": "function",
          "signature": "createDhtDiscoveryProvider({ id = 'dht', transport, priority = 20 } = {})",
          "summary": "Adapt the existing mesh DHT query transport; callers choose exactly one query key."
        },
        {
          "name": "DISCOVERY_KIND",
          "kind": "constant",
          "signature": "DISCOVERY_KIND",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/link/RealmLink",
      "path": "engine/reference/network/realm/link/RealmLink.md",
      "source": "engine/network/realm/link/RealmLink.js",
      "import": "/engine/network/realm/link/RealmLink.js",
      "sourceHash": "91b068c708007eed1d8cb17c9324805b57f7bb902078c69281257013a736be1c",
      "summary": "Create one transport-independent logical link. `verifyIdentity` is required so cryptographic key ownership is also checked against Passport/device authorization rather than trusted from an embedded public key.",
      "exports": [
        {
          "name": "createRealmLink",
          "kind": "function",
          "signature": "createRealmLink({ linkId, realmId, branchId, localIdentity, signer, verifyIdentity, supportedCapabilities = [], authorizeCapabilities = async ({ requested, supported })",
          "summary": "Create one transport-independent logical link. `verifyIdentity` is required so cryptographic key ownership is also checked against Passport/device authorization rather than trusted from an embedded public key."
        },
        {
          "name": "attachRealmLinkTransport",
          "kind": "function",
          "signature": "async attachRealmLinkTransport(link, session, { initiate = true } = {})",
          "summary": "Attach an existing transport session and optionally initiate the authenticated handshake."
        },
        {
          "name": "handleRealmLinkFrame",
          "kind": "function",
          "signature": "async handleRealmLinkFrame(link, frame, { binding = null } = {})",
          "summary": "Verify, deduplicate, authorize, and dispatch one inbound Realm Link frame."
        },
        {
          "name": "sendRealmLinkData",
          "kind": "function",
          "signature": "async sendRealmLinkData(link, kind, payload, { capability = null } = {})",
          "summary": ""
        },
        {
          "name": "upgradeRealmLinkTransport",
          "kind": "function",
          "signature": "async upgradeRealmLinkTransport(link, candidateSession)",
          "summary": "Attempt a higher-priority channel while the current one remains live."
        },
        {
          "name": "snapshotRealmLink",
          "kind": "function",
          "signature": "snapshotRealmLink(link)",
          "summary": ""
        },
        {
          "name": "realmLinkContinuityRecord",
          "kind": "function",
          "signature": "realmLinkContinuityRecord(link, overrides = {})",
          "summary": ""
        },
        {
          "name": "persistRealmLinkContinuity",
          "kind": "function",
          "signature": "async persistRealmLinkContinuity(link, overrides = {})",
          "summary": ""
        },
        {
          "name": "markRealmLinkDisconnected",
          "kind": "function",
          "signature": "async markRealmLinkDisconnected(link, reason = 'transport-disconnected')",
          "summary": ""
        },
        {
          "name": "closeRealmLink",
          "kind": "function",
          "signature": "async closeRealmLink(link, reason = 'local-close')",
          "summary": ""
        },
        {
          "name": "realmLinkEvidence",
          "kind": "function",
          "signature": "realmLinkEvidence(link)",
          "summary": "Canonical digest input for diagnostics/evidence without exposing keys or payloads."
        },
        {
          "name": "REALM_LINK_STATE",
          "kind": "constant",
          "signature": "REALM_LINK_STATE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/link/RealmLinkProtocol",
      "path": "engine/reference/network/realm/link/RealmLinkProtocol.md",
      "source": "engine/network/realm/link/RealmLinkProtocol.js",
      "import": "/engine/network/realm/link/RealmLinkProtocol.js",
      "sourceHash": "cb039d55962b77aaf9d3da910bf8cfee1c0e75aaf4fda1b46426e6c97e49dd80",
      "summary": "Build and sign one control/data frame using the existing authority signer.",
      "exports": [
        {
          "name": "unsignedRealmLinkFrame",
          "kind": "function",
          "signature": "unsignedRealmLinkFrame(frame)",
          "summary": ""
        },
        {
          "name": "signRealmLinkFrame",
          "kind": "function",
          "signature": "async signRealmLinkFrame({ linkId, realmId, branchId, senderPeerId, sessionEpoch, sequence, messageId, issuedAt, type, payload = null, signer, } = {})",
          "summary": "Build and sign one control/data frame using the existing authority signer."
        },
        {
          "name": "verifyRealmLinkFrame",
          "kind": "function",
          "signature": "async verifyRealmLinkFrame(frame, { linkId, realmId, branchId, now = Date.now()",
          "summary": "Cryptographically validate a frame. Passport/device authorization is a separate required hook."
        },
        {
          "name": "createRealmLinkReplayWindow",
          "kind": "function",
          "signature": "createRealmLinkReplayWindow({ width = 256, maxSequence = 0, seen = [] } = {})",
          "summary": "Sliding sequence window supports limited cross-transport reordering while rejecting replay."
        },
        {
          "name": "acceptRealmLinkReplay",
          "kind": "function",
          "signature": "acceptRealmLinkReplay(window, frame, { now = Date.now()",
          "summary": ""
        },
        {
          "name": "snapshotRealmLinkReplayWindow",
          "kind": "function",
          "signature": "snapshotRealmLinkReplayWindow(window)",
          "summary": ""
        },
        {
          "name": "REALM_LINK_PROTOCOL",
          "kind": "constant",
          "signature": "REALM_LINK_PROTOCOL",
          "summary": ""
        },
        {
          "name": "REALM_LINK_FRAME",
          "kind": "constant",
          "signature": "REALM_LINK_FRAME",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/link/TransportProvider",
      "path": "engine/reference/network/realm/link/TransportProvider.md",
      "source": "engine/network/realm/link/TransportProvider.js",
      "import": "/engine/network/realm/link/TransportProvider.js",
      "sourceHash": "faf61dfccb510baea9e2c5d90cf3ee23831f1998f35b75f7062f484de95b5b20",
      "summary": "Realm transport providers adapt existing channels. They do not implement WebRTC, relays, WebSockets, LAN sockets, or encryption themselves.",
      "exports": [
        {
          "name": "assertRealmTransportSession",
          "kind": "function",
          "signature": "assertRealmTransportSession(session)",
          "summary": "Validate the minimal bidirectional channel RealmLink consumes."
        },
        {
          "name": "createTransportProvider",
          "kind": "function",
          "signature": "createTransportProvider({ id, kind = TRANSPORT_KIND.CUSTOM, priority = null, canConnect = ()",
          "summary": ""
        },
        {
          "name": "createTransportRegistry",
          "kind": "function",
          "signature": "createTransportRegistry({ now = ()",
          "summary": ""
        },
        {
          "name": "registerTransportProvider",
          "kind": "function",
          "signature": "registerTransportProvider(registry, provider)",
          "summary": ""
        },
        {
          "name": "unregisterTransportProvider",
          "kind": "function",
          "signature": "unregisterTransportProvider(registry, providerId)",
          "summary": ""
        },
        {
          "name": "connectRealmTransport",
          "kind": "function",
          "signature": "async connectRealmTransport(registry, target, opts = {})",
          "summary": "Try compatible providers in priority order. A failed direct path naturally falls through to an existing relay/WebSocket provider."
        },
        {
          "name": "transportProviderStatus",
          "kind": "function",
          "signature": "transportProviderStatus(registry)",
          "summary": ""
        },
        {
          "name": "isPreferredTransport",
          "kind": "function",
          "signature": "isPreferredTransport(candidate, current)",
          "summary": "True when a candidate session is a meaningful relay-to-direct upgrade."
        },
        {
          "name": "TRANSPORT_KIND",
          "kind": "constant",
          "signature": "TRANSPORT_KIND",
          "summary": ""
        },
        {
          "name": "DEFAULT_TRANSPORT_PRIORITY",
          "kind": "constant",
          "signature": "DEFAULT_TRANSPORT_PRIORITY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/link/index",
      "path": "engine/reference/network/realm/link/index.md",
      "source": "engine/network/realm/link/index.js",
      "import": "/engine/network/realm/link/index.js",
      "sourceHash": "cc645d46a4eabae5ba70283065f0108f5292a6a0695febead05cad652b6cd14d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/presence/PresenceV1",
      "path": "engine/reference/network/realm/presence/PresenceV1.md",
      "source": "engine/network/realm/presence/PresenceV1.js",
      "import": "/engine/network/realm/presence/PresenceV1.js",
      "sourceHash": "877487bca81f833dae83bc12b48b2a25f245d6d56fd5fdbb366d84e752fba327",
      "summary": "Verify signature, expiry, and Passport/device key authorization.",
      "exports": [
        {
          "name": "createPresenceV1",
          "kind": "function",
          "signature": "createPresenceV1({ realmId, branchId, actorId, deviceId, sessionId, sequence, status = PRESENCE_STATUS.ONLINE, activity = null, location = null, issuedAt = Date.now()",
          "summary": ""
        },
        {
          "name": "signPresenceV1",
          "kind": "function",
          "signature": "async signPresenceV1(record, signer)",
          "summary": ""
        },
        {
          "name": "verifyPresenceV1",
          "kind": "function",
          "signature": "async verifyPresenceV1(record, { authorizeKey, now = Date.now()",
          "summary": "Verify signature, expiry, and Passport/device key authorization."
        },
        {
          "name": "createPresenceTracker",
          "kind": "function",
          "signature": "createPresenceTracker({ authorizeKey, now = ()",
          "summary": ""
        },
        {
          "name": "ingestPresence",
          "kind": "function",
          "signature": "async ingestPresence(tracker, record)",
          "summary": "Accept each signed session sequence once; a gap is surfaced but does not invent missing state."
        },
        {
          "name": "pruneExpiredPresence",
          "kind": "function",
          "signature": "pruneExpiredPresence(tracker, now = tracker.now()",
          "summary": ""
        },
        {
          "name": "presenceSnapshot",
          "kind": "function",
          "signature": "presenceSnapshot(tracker, { realmId = null, branchId = null } = {})",
          "summary": ""
        },
        {
          "name": "PRESENCE_PROTOCOL",
          "kind": "constant",
          "signature": "PRESENCE_PROTOCOL",
          "summary": ""
        },
        {
          "name": "PRESENCE_SCHEMA",
          "kind": "constant",
          "signature": "PRESENCE_SCHEMA",
          "summary": ""
        },
        {
          "name": "PRESENCE_STATUS",
          "kind": "constant",
          "signature": "PRESENCE_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/presence/index",
      "path": "engine/reference/network/realm/presence/index.md",
      "source": "engine/network/realm/presence/index.js",
      "import": "/engine/network/realm/presence/index.js",
      "sourceHash": "875341afaffb927032e7b4f145096f7503e21ad4953c10fd5b31a525c3bb2cb2",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/publishing/RealmJourneyJournal",
      "path": "engine/reference/network/realm/publishing/RealmJourneyJournal.md",
      "source": "engine/network/realm/publishing/RealmJourneyJournal.js",
      "import": "/engine/network/realm/publishing/RealmJourneyJournal.js",
      "sourceHash": "aea615f86818b20762e6f2886d9a6b94f852c3b21f0aa652b941e6bb8e31ff24",
      "summary": "Signed publish/inspect/enter/leave history with exact branch-aware returns.",
      "exports": [
        {
          "name": "RealmJourneyJournal",
          "kind": "class",
          "signature": "class RealmJourneyJournal",
          "summary": "An append-only signed journal. Entry transitions are replayed locally; no network or storage side effects occur until a caller persists its snapshot."
        },
        {
          "name": "normalizeRealmLocation",
          "kind": "function",
          "signature": "normalizeRealmLocation(value, name = 'Realm location')",
          "summary": ""
        },
        {
          "name": "createJourneyEvent",
          "kind": "function",
          "signature": "async createJourneyEvent(input, signer)",
          "summary": ""
        },
        {
          "name": "verifyJourneyEvent",
          "kind": "function",
          "signature": "async verifyJourneyEvent(record, options = {})",
          "summary": ""
        },
        {
          "name": "verifyJourneyJournal",
          "kind": "function",
          "signature": "async verifyJourneyJournal(events, options = {})",
          "summary": ""
        },
        {
          "name": "REALM_JOURNEY_EVENT_V1_FORMAT",
          "kind": "constant",
          "signature": "REALM_JOURNEY_EVENT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_JOURNEY_SNAPSHOT_V1_FORMAT",
          "kind": "constant",
          "signature": "REALM_JOURNEY_SNAPSHOT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_JOURNEY_ACTION",
          "kind": "constant",
          "signature": "REALM_JOURNEY_ACTION",
          "summary": ""
        },
        {
          "name": "RealmJourneyJournalV1",
          "kind": "constant",
          "signature": "RealmJourneyJournalV1",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/publishing/index",
      "path": "engine/reference/network/realm/publishing/index.md",
      "source": "engine/network/realm/publishing/index.js",
      "import": "/engine/network/realm/publishing/index.js",
      "sourceHash": "a73f5eca44e3d648086fad516a8fa2e51007f32f71c01394419d1f1d18593eb6",
      "summary": "",
      "exports": [
        {
          "name": "REALM_JOURNEY_ACTION",
          "kind": "re-export",
          "signature": "REALM_JOURNEY_ACTION",
          "summary": ""
        },
        {
          "name": "REALM_JOURNEY_EVENT_V1_FORMAT",
          "kind": "re-export",
          "signature": "REALM_JOURNEY_EVENT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "REALM_JOURNEY_SNAPSHOT_V1_FORMAT",
          "kind": "re-export",
          "signature": "REALM_JOURNEY_SNAPSHOT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "RealmJourneyJournal",
          "kind": "re-export",
          "signature": "RealmJourneyJournal",
          "summary": ""
        },
        {
          "name": "RealmJourneyJournalV1",
          "kind": "re-export",
          "signature": "RealmJourneyJournalV1",
          "summary": ""
        },
        {
          "name": "createJourneyEvent",
          "kind": "re-export",
          "signature": "createJourneyEvent",
          "summary": ""
        },
        {
          "name": "normalizeRealmLocation",
          "kind": "re-export",
          "signature": "normalizeRealmLocation",
          "summary": ""
        },
        {
          "name": "verifyJourneyEvent",
          "kind": "re-export",
          "signature": "verifyJourneyEvent",
          "summary": ""
        },
        {
          "name": "verifyJourneyJournal",
          "kind": "re-export",
          "signature": "verifyJourneyJournal",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/shield/RealmShield",
      "path": "engine/reference/network/realm/shield/RealmShield.md",
      "source": "engine/network/realm/shield/RealmShield.js",
      "import": "/engine/network/realm/shield/RealmShield.js",
      "sourceHash": "26c45db6e76e4ce929ecca556498c09245052721c32bc7c678a26888f2b73768",
      "summary": "Runtime isolation, quotas, moderation, and tamper-evident audit for Realm entry.",
      "exports": [
        {
          "name": "RealmShield",
          "kind": "class",
          "signature": "class RealmShield",
          "summary": "Realm Shield is deliberately local. It applies signed Gate plans but stores no Realm authority and performs no server-side enforcement."
        },
        {
          "name": "verifyShieldAuditTrail",
          "kind": "function",
          "signature": "async verifyShieldAuditTrail(events)",
          "summary": ""
        },
        {
          "name": "SHIELD_AUDIT_V1_FORMAT",
          "kind": "constant",
          "signature": "SHIELD_AUDIT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "SHIELD_REPORT_V1_FORMAT",
          "kind": "constant",
          "signature": "SHIELD_REPORT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "SHIELD_SNAPSHOT_V1_FORMAT",
          "kind": "constant",
          "signature": "SHIELD_SNAPSHOT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "SHIELD_RESOURCE",
          "kind": "constant",
          "signature": "SHIELD_RESOURCE",
          "summary": ""
        },
        {
          "name": "SHIELD_ACTION",
          "kind": "constant",
          "signature": "SHIELD_ACTION",
          "summary": ""
        },
        {
          "name": "SHIELD_MODERATION_ACTION",
          "kind": "constant",
          "signature": "SHIELD_MODERATION_ACTION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/realm/shield/index",
      "path": "engine/reference/network/realm/shield/index.md",
      "source": "engine/network/realm/shield/index.js",
      "import": "/engine/network/realm/shield/index.js",
      "sourceHash": "e2644ed633df4c0be2b5bafcd52d2953f60f6338d77885c6207965af1a226f36",
      "summary": "",
      "exports": [
        {
          "name": "RealmShield",
          "kind": "re-export",
          "signature": "RealmShield",
          "summary": ""
        },
        {
          "name": "SHIELD_ACTION",
          "kind": "re-export",
          "signature": "SHIELD_ACTION",
          "summary": ""
        },
        {
          "name": "SHIELD_AUDIT_V1_FORMAT",
          "kind": "re-export",
          "signature": "SHIELD_AUDIT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "SHIELD_MODERATION_ACTION",
          "kind": "re-export",
          "signature": "SHIELD_MODERATION_ACTION",
          "summary": ""
        },
        {
          "name": "SHIELD_REPORT_V1_FORMAT",
          "kind": "re-export",
          "signature": "SHIELD_REPORT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "SHIELD_RESOURCE",
          "kind": "re-export",
          "signature": "SHIELD_RESOURCE",
          "summary": ""
        },
        {
          "name": "SHIELD_SNAPSHOT_V1_FORMAT",
          "kind": "re-export",
          "signature": "SHIELD_SNAPSHOT_V1_FORMAT",
          "summary": ""
        },
        {
          "name": "verifyShieldAuditTrail",
          "kind": "re-export",
          "signature": "verifyShieldAuditTrail",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/MasterServerList",
      "path": "engine/reference/network/routes/MasterServerList.md",
      "source": "engine/network/routes/MasterServerList.js",
      "import": "/engine/network/routes/MasterServerList.js",
      "sourceHash": "e384f76070eb04ca2a3aa64950c3f702a3dd1e3839871c5296f7544317e1c5ea",
      "summary": "network/routes/MasterServerList.js — client-shipped master server list + connection fallback ordering (network plan §4).  A master server is a meeting place, not an authority: it introduces peers and forwards signaling, nothing more (network plan §4/§6). This module only normalizes/validates the list shape and computes connection attempt order; it does not open any sockets (that is the signaling tier, Phase 2b/Phase A).",
      "exports": [
        {
          "name": "defaultParticleMasterServers",
          "kind": "function",
          "signature": "defaultParticleMasterServers()",
          "summary": "A fresh, mutable copy of the client-shipped production bootstrap list."
        },
        {
          "name": "readParticleMasterServerRecord",
          "kind": "function",
          "signature": "readParticleMasterServerRecord(storage = globalThis.localStorage)",
          "summary": "Strict read used by writers to quarantine unsupported/corrupt records."
        },
        {
          "name": "loadParticleMasterServers",
          "kind": "function",
          "signature": "loadParticleMasterServers(storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "saveParticleMasterServers",
          "kind": "function",
          "signature": "saveParticleMasterServers(list, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "normalizeMasterServerList",
          "kind": "function",
          "signature": "normalizeMasterServerList(config = {})",
          "summary": "Validate + normalize a client master-server-list config (network plan §4). Unknown/malformed servers are dropped rather than throwing, so a bad entry in a self-hosted community list can't break the whole client."
        },
        {
          "name": "pickNextMasterServer",
          "kind": "function",
          "signature": "pickNextMasterServer(masterServers, { excluded = [] } = {})",
          "summary": "Pick the next enabled master server to try, in priority order, skipping any whose url is in `excluded` (e.g. servers that just failed this round)."
        },
        {
          "name": "buildConnectionOrder",
          "kind": "function",
          "signature": "buildConnectionOrder(normalized)",
          "summary": "Build the full connection attempt order (network plan §4): cached peers -> LAN -> group gossip -> master servers (by priority) -> carrier -> DHT -> relay. Stages disabled via `fallbacks` (or with no master servers configured) are omitted."
        },
        {
          "name": "FALLBACK_STAGES",
          "kind": "constant",
          "signature": "FALLBACK_STAGES",
          "summary": "Fallback stages other than master servers themselves, in priority order (§4)."
        },
        {
          "name": "PARTICLE_MASTER_SERVERS_KEY",
          "kind": "constant",
          "signature": "PARTICLE_MASTER_SERVERS_KEY",
          "summary": ""
        },
        {
          "name": "PARTICLE_MASTER_SERVER_LIST_FORMAT",
          "kind": "constant",
          "signature": "PARTICLE_MASTER_SERVER_LIST_FORMAT",
          "summary": ""
        },
        {
          "name": "PARTICLE_MASTER_SERVER_LIST_VERSION",
          "kind": "constant",
          "signature": "PARTICLE_MASTER_SERVER_LIST_VERSION",
          "summary": ""
        },
        {
          "name": "PARTICLE_PRODUCTION_V2_URL",
          "kind": "constant",
          "signature": "PARTICLE_PRODUCTION_V2_URL",
          "summary": ""
        },
        {
          "name": "PARTICLE_PRODUCTION_V1_URL",
          "kind": "constant",
          "signature": "PARTICLE_PRODUCTION_V1_URL",
          "summary": ""
        },
        {
          "name": "PARTICLE_PRODUCTION_SERVER_KEY_PIN",
          "kind": "constant",
          "signature": "PARTICLE_PRODUCTION_SERVER_KEY_PIN",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/NodeRoleProtocol",
      "path": "engine/reference/network/routes/NodeRoleProtocol.md",
      "source": "engine/network/routes/NodeRoleProtocol.js",
      "import": "/engine/network/routes/NodeRoleProtocol.js",
      "sourceHash": "494bdcd8467bf90115022989b15d722aba2592fed2a987548357318d2763e61f",
      "summary": "Build a signed, expiring role announcement for one route.",
      "exports": [
        {
          "name": "signNodeRoleAnnouncement",
          "kind": "function",
          "signature": "async signNodeRoleAnnouncement({ routeId, nodeId, sequence, availability = 'foreground', roles = ['resident'], capabilities = [], ttlMs = NODE_ROLE_MAX_TTL_MS, signer, now = Date.now()",
          "summary": "Build a signed, expiring role announcement for one route."
        },
        {
          "name": "verifyNodeRoleAnnouncement",
          "kind": "function",
          "signature": "async verifyNodeRoleAnnouncement(message, { routeId, peerId, lastSequence = 0, now = Date.now()",
          "summary": "Verify signature, device-key binding, route scope, freshness, and ordering."
        },
        {
          "name": "NODE_ROLE_MESSAGE_TYPE",
          "kind": "constant",
          "signature": "NODE_ROLE_MESSAGE_TYPE",
          "summary": ""
        },
        {
          "name": "NODE_ROLE_MAX_TTL_MS",
          "kind": "constant",
          "signature": "NODE_ROLE_MAX_TTL_MS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/OsNetworkSession",
      "path": "engine/reference/network/routes/OsNetworkSession.md",
      "source": "engine/network/routes/OsNetworkSession.js",
      "import": "/engine/network/routes/OsNetworkSession.js",
      "sourceHash": "2b14bb708a2e5064d760b7ce058f059bc03b7a4010d5bdcd697ac0d241e9e05b",
      "summary": "network/routes/OsNetworkSession.js — the concrete `createSession(routeId, opts)` factory `RouteSessionManager.js` was designed to take (network plan Phase 2 note: \"typically a thin wrapper around `createCollabCore({ projectId: routeId, ... })`\"). This was the one piece of the plan's own architecture that was designed but never actually instantiated — Phase 2b shipped the simpler Masterserver-relay-as-direct- transport shortcut (`syncManager/SyncTransport.js`) for V1 sync, which left `ChunkTransport.js`/`CarrierRelay.js`/`DhtTransport.js` (all three built against a real peer-addressed `sendToPeer` + `CollabMeshTopology`) with no live mesh to run on. This module closes that gap.  `CollabCore.js`'s Tier 4 signaling (see `CollabSignal.js`'s header comment) already reads `os.network.masterServers` from localStorage and lazily acquires the shared pinned V2 ParticleNetworkDaemon itself. Explicit compatibility endpoints may still use the shared V1 registry. Therefore `createCollabCore({ projectId: routeId })` gets real cross-internet WebRTC signaling over the same Masterserver config the Control Panel manages.  Deliberately skips CollabCore's own peer-identity/ECDH handshake (`publicKeyRaw`/`identityProof`/`ecdhPublicKeyRaw`/`ecdhPrivateKey`, `encrypt: true`): that machinery expects raw `CollabIdentity.js` keys (ECDH keypair + identity proof), which is a different, lower-level API than the CSE-wrapped `createSigner()` this layer's identity/ signers use (see `engine/network/identity/NetworkIdentity.js`'s own header comment). This is not a security gap — every OS-level payload carried over this session already brings its own crypto/verification: `ChunkVerifier.js` content hashes, `SealedPacket.js` onion ECDH, `GroupEpoch.js` AES-GCM, signed `GroupLedger.js`/`PeerTicket.js` envelopes. CollabCore here is used purely as a WebRTC *transport* (data channels + DTLS), the same way `ChunkTransport.js` et al. were written to treat any `sendToPeer`.",
      "exports": [
        {
          "name": "createOsNetworkSession",
          "kind": "function",
          "signature": "createOsNetworkSession(routeId, opts = {})",
          "summary": ""
        },
        {
          "name": "addSessionOpHandler",
          "kind": "function",
          "signature": "addSessionOpHandler(session, handlerFn)",
          "summary": "Register an op handler (e.g. `ChunkTransport.js`'s `handleChunkTransportMessage`, `CarrierRelay.js`'s `handleCarrierRelayMessage`, `DhtTransport.js`'s `handleDhtMessage` — all follow the same `(peerId, op) => boolean` \"handled?\" chaining pattern). Handlers are tried in registration order; the first one that returns `true` consumes the message."
        },
        {
          "name": "registerSessionProtocol",
          "kind": "function",
          "signature": "registerSessionProtocol(session, descriptor)",
          "summary": "Register a bounded, version-aware route protocol handler."
        },
        {
          "name": "sessionSendToPeer",
          "kind": "function",
          "signature": "sessionSendToPeer(session, peerId, data)",
          "summary": "This session's `sendToPeer(peerId, data)` — the exact shape ChunkTransport/CarrierRelay/DhtTransport expect."
        },
        {
          "name": "sessionSendProtocol",
          "kind": "function",
          "signature": "sessionSendProtocol(session, peerId, data, { requireAdvertised = false } = {})",
          "summary": "Send a versioned protocol envelope, optionally requiring peer advertisement."
        },
        {
          "name": "sessionBroadcast",
          "kind": "function",
          "signature": "sessionBroadcast(session, data)",
          "summary": "Broadcast one application op to every connected direct mesh neighbor."
        },
        {
          "name": "sessionBroadcastProtocol",
          "kind": "function",
          "signature": "sessionBroadcastProtocol(session, data, { requireAdvertised = false } = {})",
          "summary": "Broadcast a versioned envelope only to compatible or pre-catalog peers."
        },
        {
          "name": "sessionPeerIds",
          "kind": "function",
          "signature": "sessionPeerIds(session)",
          "summary": "Connected peer IDs for routing and role coordination."
        },
        {
          "name": "sessionTopologyStats",
          "kind": "function",
          "signature": "sessionTopologyStats(session)",
          "summary": "Mesh topology stats for UI display (mode, neighbor count, supernode status, gossip counters)."
        },
        {
          "name": "sessionPeerMetrics",
          "kind": "function",
          "signature": "sessionPeerMetrics(session)",
          "summary": "Locally measured, secret-free peer transport observations."
        },
        {
          "name": "sessionProtocolStatus",
          "kind": "function",
          "signature": "sessionProtocolStatus(session)",
          "summary": "Protocol catalog, peer negotiation, and bounded dispatch counters."
        },
        {
          "name": "destroyOsNetworkSession",
          "kind": "function",
          "signature": "destroyOsNetworkSession(session)",
          "summary": "Tear down a session's WebRTC connections, signaling, and topology timers."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/ReconnectBackoff",
      "path": "engine/reference/network/routes/ReconnectBackoff.md",
      "source": "engine/network/routes/ReconnectBackoff.js",
      "import": "/engine/network/routes/ReconnectBackoff.js",
      "sourceHash": "0f02c92fb693b4022ae6fc032046fc9dd26292fcc01c97a4d892441715cb2016",
      "summary": "network/routes/ReconnectBackoff.js — exponential reconnect backoff with jitter (network plan §8: \"0.5s -> 1s -> 2s -> 4s -> 8s -> max 30s, with random jitter\"). Mirrors the constants already used by engine/collab/CollabCore.js (RECONNECT_BASE_MS=1000, RECONNECT_MAX_MS=30000, MAX_RECONNECT_ATTEMPTS=8) so route-level and WebRTC-level reconnects behave consistently.",
      "exports": [
        {
          "name": "createReconnectBackoff",
          "kind": "function",
          "signature": "createReconnectBackoff(cfg = {})",
          "summary": "Create a reconnect backoff sequence."
        },
        {
          "name": "nextBackoffDelay",
          "kind": "function",
          "signature": "nextBackoffDelay(backoff)",
          "summary": "Compute the next delay (ms) and advance the attempt counter."
        },
        {
          "name": "isBackoffExhausted",
          "kind": "function",
          "signature": "isBackoffExhausted(backoff)",
          "summary": "True once `maxAttempts` has been exceeded (0 = never exhausted). Matches nextBackoffDelay's `exhausted` flag."
        },
        {
          "name": "resetBackoff",
          "kind": "function",
          "signature": "resetBackoff(backoff)",
          "summary": "Reset the attempt counter after a successful (re)connect."
        },
        {
          "name": "DEFAULT_BACKOFF_BASE_MS",
          "kind": "constant",
          "signature": "DEFAULT_BACKOFF_BASE_MS",
          "summary": ""
        },
        {
          "name": "DEFAULT_BACKOFF_MAX_MS",
          "kind": "constant",
          "signature": "DEFAULT_BACKOFF_MAX_MS",
          "summary": ""
        },
        {
          "name": "DEFAULT_BACKOFF_MAX_ATTEMPTS",
          "kind": "constant",
          "signature": "DEFAULT_BACKOFF_MAX_ATTEMPTS",
          "summary": ""
        },
        {
          "name": "DEFAULT_BACKOFF_JITTER_RATIO",
          "kind": "constant",
          "signature": "DEFAULT_BACKOFF_JITTER_RATIO",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/RouteProtocolRegistry",
      "path": "engine/reference/network/routes/RouteProtocolRegistry.md",
      "source": "engine/network/routes/RouteProtocolRegistry.js",
      "import": "/engine/network/routes/RouteProtocolRegistry.js",
      "sourceHash": "6a15e8a54892c149ea2d673af7f23644e4d9784436fb8f25a15032e1bf0aaf55",
      "summary": "Dispatch one route operation. Protocol-bearing traffic always fails closed.",
      "exports": [
        {
          "name": "createRouteProtocolRegistry",
          "kind": "function",
          "signature": "createRouteProtocolRegistry({ now = ()",
          "summary": ""
        },
        {
          "name": "registerRouteProtocol",
          "kind": "function",
          "signature": "registerRouteProtocol(registry, { id, protocols = [], matches = null, handle, authorize = null, validate = null, priority = 0, maxBytes = null, } = {})",
          "summary": ""
        },
        {
          "name": "unregisterRouteProtocol",
          "kind": "function",
          "signature": "unregisterRouteProtocol(registry, descriptorId)",
          "summary": ""
        },
        {
          "name": "routeProtocolCatalog",
          "kind": "function",
          "signature": "routeProtocolCatalog(registry)",
          "summary": ""
        },
        {
          "name": "createRouteProtocolCatalogOp",
          "kind": "function",
          "signature": "createRouteProtocolCatalogOp(registry)",
          "summary": ""
        },
        {
          "name": "forgetRouteProtocolPeer",
          "kind": "function",
          "signature": "forgetRouteProtocolPeer(registry, peerId)",
          "summary": ""
        },
        {
          "name": "peerSupportsRouteProtocol",
          "kind": "function",
          "signature": "peerSupportsRouteProtocol(registry, peerId, protocol)",
          "summary": ""
        },
        {
          "name": "dispatchRouteProtocol",
          "kind": "function",
          "signature": "async dispatchRouteProtocol(registry, peerId, op, context = {})",
          "summary": "Dispatch one route operation. Protocol-bearing traffic always fails closed."
        },
        {
          "name": "routeProtocolRegistryStatus",
          "kind": "function",
          "signature": "routeProtocolRegistryStatus(registry)",
          "summary": ""
        },
        {
          "name": "ROUTE_PROTOCOL_CONTROL",
          "kind": "constant",
          "signature": "ROUTE_PROTOCOL_CONTROL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/RouteSessionManager",
      "path": "engine/reference/network/routes/RouteSessionManager.md",
      "source": "engine/network/routes/RouteSessionManager.js",
      "import": "/engine/network/routes/RouteSessionManager.js",
      "sourceHash": "7587e533c7af021f6c9d2682be9f1138a9b3f4dc82645695d0a89a4220fb2078",
      "summary": "network/routes/RouteSessionManager.js — orchestrates one P2P session per attached route/group.  Phase 0 audit finding: engine/collab/CollabCore.js is built around a single projectId/roomPassword session. The network layer needs many concurrent routes/groups at once, so rather than rewriting CollabCore.js (which would risk existing game-collab call sites), this manager holds N session instances behind a pluggable factory — callers pass in `createSession(routeId, opts) => session` (typically a thin wrapper around `createCollabCore({ projectId: routeId, ... })`) and this module just tracks lifecycle (one session per routeId, created on demand, torn down explicitly or when the route's last local lease is dropped).",
      "exports": [
        {
          "name": "createRouteSessionManager",
          "kind": "function",
          "signature": "createRouteSessionManager({ createSession, destroySession = null } = {})",
          "summary": ""
        },
        {
          "name": "ensureRouteSession",
          "kind": "function",
          "signature": "ensureRouteSession(manager, routeId, opts = {})",
          "summary": "Get the session for `routeId`, creating it via the factory if it doesn't exist yet."
        },
        {
          "name": "acquireRouteSession",
          "kind": "function",
          "signature": "acquireRouteSession(manager, routeId, opts = {})",
          "summary": "Acquire one local consumer lease for a route. The first lease creates the session. The final release tears it down after a bounded idle grace period."
        },
        {
          "name": "releaseRouteSession",
          "kind": "function",
          "signature": "releaseRouteSession(manager, routeId, options = {})",
          "summary": "Release one local route lease without affecting other consumers."
        },
        {
          "name": "routeSessionLeaseStatus",
          "kind": "function",
          "signature": "routeSessionLeaseStatus(manager, routeId)",
          "summary": "Inspect lease ownership without exposing route secrets or session internals."
        },
        {
          "name": "getRouteSession",
          "kind": "function",
          "signature": "getRouteSession(manager, routeId)",
          "summary": "Get an existing session, or null. Does NOT create one."
        },
        {
          "name": "teardownRouteSession",
          "kind": "function",
          "signature": "teardownRouteSession(manager, routeId, options = {})",
          "summary": "Tear down and forget a route's session (calls `destroySession` if provided)."
        },
        {
          "name": "listRouteSessions",
          "kind": "function",
          "signature": "listRouteSessions(manager)",
          "summary": "List routeIds with a live session."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/RouteTable",
      "path": "engine/reference/network/routes/RouteTable.md",
      "source": "engine/network/routes/RouteTable.js",
      "import": "/engine/network/routes/RouteTable.js",
      "sourceHash": "55f92bd54c42af3c6976f771e2993de457eba2b62d1e215be37b5ec77bcb0bfc",
      "summary": "network/routes/RouteTable.js — dynamic, capability-gated routes for the Particle Global OS Network Layer (network plan §9 \"dynamic routes instead of rooms\" + §10 capability checks).  A route is NOT server-owned: it exists in this local table only while a capability-holding principal has attached to it and kept its lease alive via heartbeats. There is no createRoute() — attachRoute() both creates the local entry (if absent) and joins it. Leases expire on their own; nothing here talks to a network — this is pure local bookkeeping that the Masterserver signaling tier (Phase 2b) and per-route session manager below will drive.",
      "exports": [
        {
          "name": "createRouteTable",
          "kind": "function",
          "signature": "createRouteTable(cfg = {})",
          "summary": "Create an empty route table."
        },
        {
          "name": "attachRoute",
          "kind": "function",
          "signature": "attachRoute(table, { routeId, principal, capability, ttlMs = DEFAULT_ROUTE_TTL_MS, meta = {} } = {})",
          "summary": "Attach to a route. Validates the capability authorizes `route/attach` for (principal, routeId) right now; if the route doesn't exist locally yet it is created (this is what \"routes appear when clients attach\" means — there is no separate creation step). Re-attaching refreshes the lease."
        },
        {
          "name": "heartbeatRoute",
          "kind": "function",
          "signature": "heartbeatRoute(table, { routeId, principal, ttlMs = DEFAULT_ROUTE_TTL_MS } = {})",
          "summary": "Refresh a principal's lease on a route (heartbeat). Re-checks the capability so a revoked capability cannot keep renewing its lease."
        },
        {
          "name": "detachRoute",
          "kind": "function",
          "signature": "detachRoute(table, { routeId, principal } = {})",
          "summary": "Detach a principal from a route. Removes the route entirely once empty."
        },
        {
          "name": "pruneExpiredRoutes",
          "kind": "function",
          "signature": "pruneExpiredRoutes(table, now = _now()",
          "summary": "Remove all expired subscriber leases (and any routes left with zero subscribers). Call this periodically (e.g. alongside heartbeat ticks)."
        },
        {
          "name": "isRouteAttached",
          "kind": "function",
          "signature": "isRouteAttached(table, routeId)",
          "summary": "True if `routeId` currently has at least one live subscriber."
        },
        {
          "name": "getRoute",
          "kind": "function",
          "signature": "getRoute(table, routeId)",
          "summary": "Snapshot of a route's subscribers, or null."
        },
        {
          "name": "listRoutes",
          "kind": "function",
          "signature": "listRoutes(table)",
          "summary": "List all currently-live routes (opaque summaries only — no capability objects)."
        },
        {
          "name": "DEFAULT_ROUTE_TTL_MS",
          "kind": "constant",
          "signature": "DEFAULT_ROUTE_TTL_MS",
          "summary": "Default route lease TTL (network plan §9/§35: ~90s)."
        },
        {
          "name": "DEFAULT_HEARTBEAT_MS",
          "kind": "constant",
          "signature": "DEFAULT_HEARTBEAT_MS",
          "summary": "Default heartbeat interval to keep a lease alive (network plan §8: 25-30s)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/routes/index",
      "path": "engine/reference/network/routes/index.md",
      "source": "engine/network/routes/index.js",
      "import": "/engine/network/routes/index.js",
      "sourceHash": "951b88710ae74d0609e8055cb7697f6b85d3730549498ff3e16413dcecdbb290",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/BroadcastStateChannelTransport",
      "path": "engine/reference/network/stateChannels/BroadcastStateChannelTransport.md",
      "source": "engine/network/stateChannels/BroadcastStateChannelTransport.js",
      "import": "/engine/network/stateChannels/BroadcastStateChannelTransport.js",
      "sourceHash": "d8fd0b8632534365cfa988ae8992fee09fe93a0f3b1588e3fd337e0d4154a7a0",
      "summary": "",
      "exports": [
        {
          "name": "BroadcastStateChannelTransport",
          "kind": "class",
          "signature": "class BroadcastStateChannelTransport",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/InProcessStateChannelTransport",
      "path": "engine/reference/network/stateChannels/InProcessStateChannelTransport.md",
      "source": "engine/network/stateChannels/InProcessStateChannelTransport.js",
      "import": "/engine/network/stateChannels/InProcessStateChannelTransport.js",
      "sourceHash": "324393b3d8cc1fec1bcd92900f5342e9a24be07b5fdd358cd284ce2eeb6517ae",
      "summary": "",
      "exports": [
        {
          "name": "InProcessStateChannelTransport",
          "kind": "class",
          "signature": "class InProcessStateChannelTransport",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/MeshStateChannelTransport",
      "path": "engine/reference/network/stateChannels/MeshStateChannelTransport.md",
      "source": "engine/network/stateChannels/MeshStateChannelTransport.js",
      "import": "/engine/network/stateChannels/MeshStateChannelTransport.js",
      "sourceHash": "7be30f8d1f57a0cb9b2f3a18754d2b6c57b8eb5d37dc6cc045f93b1a3a84b743",
      "summary": "State Channel transport over browser-to-browser WebRTC mesh messages.",
      "exports": [
        {
          "name": "MeshStateChannelTransport",
          "kind": "class",
          "signature": "class MeshStateChannelTransport",
          "summary": "State Channel transport over browser-to-browser WebRTC mesh messages."
        },
        {
          "name": "MESH_STATE_CHANNEL_ENVELOPE_TYPE",
          "kind": "constant",
          "signature": "MESH_STATE_CHANNEL_ENVELOPE_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/ParticleSignalStateChannelTransport",
      "path": "engine/reference/network/stateChannels/ParticleSignalStateChannelTransport.md",
      "source": "engine/network/stateChannels/ParticleSignalStateChannelTransport.js",
      "import": "/engine/network/stateChannels/ParticleSignalStateChannelTransport.js",
      "sourceHash": "85ff6070d5c4ab975d6fed51fbd2cdf4d2c7fc6e6572281560b8f8eea440d908",
      "summary": "",
      "exports": [
        {
          "name": "ParticleSignalStateChannelTransport",
          "kind": "class",
          "signature": "class ParticleSignalStateChannelTransport",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/SseStateChannelTransport",
      "path": "engine/reference/network/stateChannels/SseStateChannelTransport.md",
      "source": "engine/network/stateChannels/SseStateChannelTransport.js",
      "import": "/engine/network/stateChannels/SseStateChannelTransport.js",
      "sourceHash": "7b6ac6015820191ff255b2a048b256ca0856d3d9b48ff6ace1ba866941541ec8",
      "summary": "Default standard transport: SSE projections/receipts down, HTTP intents up.",
      "exports": [
        {
          "name": "SseStateChannelTransport",
          "kind": "class",
          "signature": "class SseStateChannelTransport",
          "summary": "Default standard transport: SSE projections/receipts down, HTTP intents up."
        },
        {
          "name": "createDefaultStateChannelTransport",
          "kind": "function",
          "signature": "createDefaultStateChannelTransport(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/StateChannelAuthority",
      "path": "engine/reference/network/stateChannels/StateChannelAuthority.md",
      "source": "engine/network/stateChannels/StateChannelAuthority.js",
      "import": "/engine/network/stateChannels/StateChannelAuthority.js",
      "sourceHash": "3989938e0fef2635815440c350e228ce35b23141e02a3debb3cd45d2093a1c24",
      "summary": "",
      "exports": [
        {
          "name": "StateChannelAuthority",
          "kind": "class",
          "signature": "class StateChannelAuthority",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/StateChannelAuthorityCoordinator",
      "path": "engine/reference/network/stateChannels/StateChannelAuthorityCoordinator.md",
      "source": "engine/network/stateChannels/StateChannelAuthorityCoordinator.js",
      "import": "/engine/network/stateChannels/StateChannelAuthorityCoordinator.js",
      "sourceHash": "af9e7f97980122a64f38e2a222de061d6bac4dc949b926b49adff2901b29dbfb",
      "summary": "Browser authority lifecycle with signed heartbeats, replicated checkpoints, deterministic takeover, and fencing. It never makes the discovery server an authority and can be attached to any MeshStateChannelTransport.",
      "exports": [
        {
          "name": "StateChannelAuthorityCoordinator",
          "kind": "class",
          "signature": "class StateChannelAuthorityCoordinator",
          "summary": "Browser authority lifecycle with signed heartbeats, replicated checkpoints, deterministic takeover, and fencing. It never makes the discovery server an authority and can be attached to any MeshStateChannelTransport."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/StateChannelClient",
      "path": "engine/reference/network/stateChannels/StateChannelClient.md",
      "source": "engine/network/stateChannels/StateChannelClient.js",
      "import": "/engine/network/stateChannels/StateChannelClient.js",
      "sourceHash": "dc2a139249bd4447465bbcb2c1e212dadbbe2a94b4596034a2c4d5af01030f03",
      "summary": "",
      "exports": [
        {
          "name": "StateChannelClient",
          "kind": "class",
          "signature": "class StateChannelClient",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/StateChannelContract",
      "path": "engine/reference/network/stateChannels/StateChannelContract.md",
      "source": "engine/network/stateChannels/StateChannelContract.js",
      "import": "/engine/network/stateChannels/StateChannelContract.js",
      "sourceHash": "cb26f8181eb249b9990a0f2aa6c757d530a34dee396f0a16526ba6cf32618685",
      "summary": "",
      "exports": [
        {
          "name": "defineStateChannelContract",
          "kind": "function",
          "signature": "defineStateChannelContract(input = {})",
          "summary": ""
        },
        {
          "name": "createStateIntent",
          "kind": "function",
          "signature": "createStateIntent(channelId, action, payload, options = {})",
          "summary": ""
        },
        {
          "name": "createStateProjection",
          "kind": "function",
          "signature": "createStateProjection(channelId, projection, options = {})",
          "summary": ""
        },
        {
          "name": "createStateReceipt",
          "kind": "function",
          "signature": "createStateReceipt(intent, options = {})",
          "summary": ""
        },
        {
          "name": "validateStateChannelMessage",
          "kind": "function",
          "signature": "validateStateChannelMessage(message, channelId = null)",
          "summary": ""
        },
        {
          "name": "readStateChannelMessage",
          "kind": "function",
          "signature": "readStateChannelMessage(message, channelId = null)",
          "summary": ""
        },
        {
          "name": "negotiateStateChannelVersion",
          "kind": "function",
          "signature": "negotiateStateChannelVersion(peerVersions, localVersions = STATE_CHANNEL_SUPPORTED_VERSIONS)",
          "summary": ""
        },
        {
          "name": "applyStateProjection",
          "kind": "function",
          "signature": "applyStateProjection(currentState, message)",
          "summary": ""
        },
        {
          "name": "createMergePatch",
          "kind": "function",
          "signature": "createMergePatch(previous, next)",
          "summary": ""
        },
        {
          "name": "applyMergePatch",
          "kind": "function",
          "signature": "applyMergePatch(target, patch)",
          "summary": ""
        },
        {
          "name": "jsonClone",
          "kind": "function",
          "signature": "jsonClone(value)",
          "summary": ""
        },
        {
          "name": "STATE_CHANNEL_VERSION",
          "kind": "constant",
          "signature": "STATE_CHANNEL_VERSION",
          "summary": ""
        },
        {
          "name": "STATE_CHANNEL_LATEST_VERSION",
          "kind": "constant",
          "signature": "STATE_CHANNEL_LATEST_VERSION",
          "summary": ""
        },
        {
          "name": "STATE_CHANNEL_SUPPORTED_VERSIONS",
          "kind": "constant",
          "signature": "STATE_CHANNEL_SUPPORTED_VERSIONS",
          "summary": ""
        },
        {
          "name": "STATE_CHANNEL_MESSAGE_FORMAT",
          "kind": "constant",
          "signature": "STATE_CHANNEL_MESSAGE_FORMAT",
          "summary": ""
        },
        {
          "name": "DEFAULT_STATE_CHANNEL_TRANSPORT",
          "kind": "constant",
          "signature": "DEFAULT_STATE_CHANNEL_TRANSPORT",
          "summary": ""
        },
        {
          "name": "STATE_CHANNEL_TRANSPORT",
          "kind": "constant",
          "signature": "STATE_CHANNEL_TRANSPORT",
          "summary": ""
        },
        {
          "name": "STATE_CHANNEL_MESSAGE",
          "kind": "constant",
          "signature": "STATE_CHANNEL_MESSAGE",
          "summary": ""
        },
        {
          "name": "STATE_CHANNEL_PROJECTION",
          "kind": "constant",
          "signature": "STATE_CHANNEL_PROJECTION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/StateChannelTransportResolver",
      "path": "engine/reference/network/stateChannels/StateChannelTransportResolver.md",
      "source": "engine/network/stateChannels/StateChannelTransportResolver.js",
      "import": "/engine/network/stateChannels/StateChannelTransportResolver.js",
      "sourceHash": "c49bdb6dda18104df86e79f95e6f73f21cb226e91c29f9562e7eaf7216a189c2",
      "summary": "Resolve transport from authority location. Server-backed channels remain SSE by default; peer authority explicitly selects the WebRTC mesh.",
      "exports": [
        {
          "name": "resolveStateChannelTransport",
          "kind": "function",
          "signature": "resolveStateChannelTransport(options = {})",
          "summary": "Resolve transport from authority location. Server-backed channels remain SSE by default; peer authority explicitly selects the WebRTC mesh."
        },
        {
          "name": "STATE_CHANNEL_AUTHORITY_LOCATION",
          "kind": "constant",
          "signature": "STATE_CHANNEL_AUTHORITY_LOCATION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/stateChannels/index",
      "path": "engine/reference/network/stateChannels/index.md",
      "source": "engine/network/stateChannels/index.js",
      "import": "/engine/network/stateChannels/index.js",
      "sourceHash": "b96f9a6a4e021df6878463299ab1ebd5ac841be69ce239a3adf8f7aef56742c7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/syncManager/SyncCategory",
      "path": "engine/reference/network/syncManager/SyncCategory.md",
      "source": "engine/network/syncManager/SyncCategory.js",
      "import": "/engine/network/syncManager/SyncCategory.js",
      "sourceHash": "c19ebaca3e9c6a9337eed0c2a62032e7baccefb54e63afae2b2b3d7ae2a45fd3",
      "summary": "network/syncManager/SyncCategory.js — sync categories + target scopes (network plan §20 Sync Manager).",
      "exports": [
        {
          "name": "SYNC_SCOPE",
          "kind": "constant",
          "signature": "SYNC_SCOPE",
          "summary": "What a synced value may fan out to."
        },
        {
          "name": "SYNC_CATEGORIES",
          "kind": "constant",
          "signature": "SYNC_CATEGORIES",
          "summary": "The category groupings a profile's Sync Manager governs (network plan §20)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/syncManager/SyncManager",
      "path": "engine/reference/network/syncManager/SyncManager.md",
      "source": "engine/network/syncManager/SyncManager.js",
      "import": "/engine/network/syncManager/SyncManager.js",
      "sourceHash": "2cb0ae405b8afd459b6eff702576fb02dd5aace3d9bb66ea1eb76db4cde35d22",
      "summary": "network/syncManager/SyncManager.js — per-profile sync rules (network plan §20). This module only decides WHAT should sync WHERE (rules + gating); it does not move any bytes — actual transport goes through the routes/ group crypto layers built in earlier phases. Rules are local, in-memory config; callers persist them via their own storage.",
      "exports": [
        {
          "name": "createSyncManager",
          "kind": "function",
          "signature": "createSyncManager({ rules = {} } = {})",
          "summary": "Create a sync manager with sensible defaults (network plan §20 examples: \"sync AI memory only to my devices\", \"never sync private keys\" — private keys simply have no category here at all, by design)."
        },
        {
          "name": "setSyncRule",
          "kind": "function",
          "signature": "setSyncRule(manager, category, { scope, enabled, targetDeviceIds } = {})",
          "summary": "Set/update a category's sync rule."
        },
        {
          "name": "getSyncRule",
          "kind": "function",
          "signature": "getSyncRule(manager, category)",
          "summary": "Get a category's current rule, or null if unset."
        },
        {
          "name": "listSyncRules",
          "kind": "function",
          "signature": "listSyncRules(manager)",
          "summary": "All rules as a flat array of `{ category, scope, enabled, ... }`."
        },
        {
          "name": "shouldSync",
          "kind": "function",
          "signature": "shouldSync(manager, category, targetScope)",
          "summary": "Should `category` currently sync to `targetScope` right now? Used as a gate before a caller pushes an update over a route/group."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/syncManager/SyncTransport",
      "path": "engine/reference/network/syncManager/SyncTransport.md",
      "source": "engine/network/syncManager/SyncTransport.js",
      "import": "/engine/network/syncManager/SyncTransport.js",
      "sourceHash": "89cbe6ed1a6ed6ffb6801dde34681749041738a8acd7bf6ac43c52c51c229def",
      "summary": "network/syncManager/SyncTransport.js — moves the group-workstation CRDT bytes that SyncManager.js only ever decided WHETHER to send (network plan §20, plus §18/§19's workstation CRDT). Reuses a caller-owned, already connected + already route-attached Particle daemon or explicitly enabled legacy client as the wire: local ops use `client.signal(routeId, ...)` to every other session attached to the route, and incoming SIGNAL events for that routeId are folded in via CRDT join (`mergeWorkstationState`). CRDTs are commutative/idempotent by construction, so no ordering, ack, or conflict-resolution logic is needed here — this is intentionally the entire transport.  This module owns no socket/timer of its own; it is pure glue between SyncManager's gate (`shouldSync`), Workstation's CRDT state, and whatever Particle signaling session + opaque route tag the caller has brought up (e.g. factory/apps/network-manager's Routes tab, or a future group app).",
      "exports": [
        {
          "name": "serializeWorkstationState",
          "kind": "function",
          "signature": "serializeWorkstationState(state)",
          "summary": "Serialize a WorkstationState.js state object into a JSON-safe wire payload."
        },
        {
          "name": "deserializeWorkstationState",
          "kind": "function",
          "signature": "deserializeWorkstationState(wire)",
          "summary": "Inverse of serializeWorkstationState — reconstructs real CRDT instances (not plain values)."
        },
        {
          "name": "createSyncTransport",
          "kind": "function",
          "signature": "createSyncTransport({ client, routeId, syncManager, category, targetScope, getWorkstation, setWorkstation })",
          "summary": "Wire a live group workstation to a connected + route-attached MasterServerClient. Both push (outgoing) and handleEvent (incoming) are gated by the same `shouldSync` check, so disabling a category locally stops us from both broadcasting AND accepting that category's updates."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/syncManager/index",
      "path": "engine/reference/network/syncManager/index.md",
      "source": "engine/network/syncManager/index.js",
      "import": "/engine/network/syncManager/index.js",
      "sourceHash": "3df903799f703106d898c1f5ae2a625d2fae53c59454fecc1f7054a03b778da9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/transport/MasterServerClient",
      "path": "engine/reference/network/transport/MasterServerClient.md",
      "source": "engine/network/transport/MasterServerClient.js",
      "import": "/engine/network/transport/MasterServerClient.js",
      "sourceHash": "f9ced496c38583e9c7513abbeeac3f83df4f1243431866fd56f6bef81e07d1d6",
      "summary": "network/transport/MasterServerClient.js — live WebSocket signaling client for a single Masterserver (network plan §7/§8/§12, Phase 2b). Speaks the tiny HELLO -> PROVE -> PING/PONG -> DISCOVER wire protocol implemented by Masterserver/app/routes.py. All outgoing envelopes use the `particle-discovery/1` namespace — the server validates `protocol` and `type` independently (Masterserver/app/protocol.py validate_envelope), so a single namespace for every message type from this client is sufficient and matches the confirmed-live wire format.  PROVE requires signing the exact raw challenge bytes the server issued (Masterserver/app/session_crypto.py verifies a raw P1363 ECDSA signature over those bytes) — NOT a stringified/hex-encoded form of them. This is why deviceSigner.signRaw() (engine/state/authority/Identity.js) is used here instead of the string-based signer.sign().",
      "exports": [
        {
          "name": "createMasterServerClient",
          "kind": "function",
          "signature": "createMasterServerClient({ url, deviceSigner = null, onEvent = null } = {})",
          "summary": "Create a live client for one Masterserver. Does not auto-connect — call `connect()` explicitly."
        },
        {
          "name": "MS_CLIENT_STATE",
          "kind": "constant",
          "signature": "MS_CLIENT_STATE",
          "summary": "Connection lifecycle states surfaced via onEvent()."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/transport/MasterServerRegistry",
      "path": "engine/reference/network/transport/MasterServerRegistry.md",
      "source": "engine/network/transport/MasterServerRegistry.js",
      "import": "/engine/network/transport/MasterServerRegistry.js",
      "sourceHash": "f9f361f0e75d53b89c9c1525e70d7595b46af3351519b6d44b2f739a18c914a4",
      "summary": "network/transport/MasterServerRegistry.js — shared, ref-counted transport/MasterServerClient.js registry (network plan §4/§7/§8/§12).  Multiple independent OS consumers can each want a live session to the same Masterserver URL at the same time — e.g. SecureMesh's signaling tier (engine/collab/CollabSignal.js Tier 4) and the Particle Network control panel's live inspector (factory/apps/network-manager/NetworkManagerApp.js). Without this, each would open its own redundant WebSocket + HELLO/PROVE handshake to the same server. This module multiplexes N listeners onto ONE underlying MasterServerClient connection per URL, connecting on first acquire and disconnecting only once every consumer has released it.  A Masterserver route/session concept is per-connection, not per-consumer — sharing one session is exactly what \"a master server introduces peers and forwards signaling\" (README.md's can/cannot boundary) assumes: any number of local app-level features can ride the same proven session and attach their own routes on it independently (ATTACH_ROUTE is additive; a session can be attached to many routes at once).",
      "exports": [
        {
          "name": "acquireSharedMasterServerClient",
          "kind": "function",
          "signature": "acquireSharedMasterServerClient({ url, deviceSigner = null, onEvent = null } = {})",
          "summary": "Acquire a shared, ref-counted MasterServerClient for `url`, connecting it if this is the first consumer. Every event the underlying client emits is fanned out to every registered listener — consumers are expected to filter for events relevant to them (by routeId/message shape), same as they would with their own private client."
        },
        {
          "name": "hasSharedMasterServerClient",
          "kind": "function",
          "signature": "hasSharedMasterServerClient(url)",
          "summary": "True if a shared client for this url already exists (connecting or connected)."
        },
        {
          "name": "sharedMasterServerClientStats",
          "kind": "function",
          "signature": "sharedMasterServerClientStats(url)",
          "summary": "Current listener/ref count for a url's shared client, or null if none exists. Diagnostics only."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/transport/index",
      "path": "engine/reference/network/transport/index.md",
      "source": "engine/network/transport/index.js",
      "import": "/engine/network/transport/index.js",
      "sourceHash": "3dc1089d2cf154591f2eb4eab4af0a06205116f1835ce323d1aa4416e1173a2d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/workstation/Workstation",
      "path": "engine/reference/network/workstation/Workstation.md",
      "source": "engine/network/workstation/Workstation.js",
      "import": "/engine/network/workstation/Workstation.js",
      "sourceHash": "84aeae0082573599524b4d808cdd5c9924aa7cf0bf79f96c1384e9aa73cae93a",
      "summary": "network/workstation/Workstation.js — a group's shared OS surface (network plan §18), distinct from any member's personal desktop. Wraps WorkstationState.js (the CRDT layer) with a groupId and a checkpoint-payload builder for GroupLedger's WORKSTATION_CHECKPOINTED event (network plan §19: \"the governance ledger periodically checkpoints collaborative state\" — the ledger stores authority decisions plus a hash of live state, not every live edit).",
      "exports": [
        {
          "name": "createWorkstation",
          "kind": "function",
          "signature": "createWorkstation({ groupId } = {})",
          "summary": "Create a new (empty) group workstation."
        },
        {
          "name": "mergeWorkstation",
          "kind": "function",
          "signature": "mergeWorkstation(workstation, otherState)",
          "summary": "Merge in another replica's CRDT state (order-independent)."
        },
        {
          "name": "computeWorkstationStateRoot",
          "kind": "function",
          "signature": "computeWorkstationStateRoot(workstation)",
          "summary": "Stable content hash of the current workstation state (\"desktopStateRoot\")."
        },
        {
          "name": "buildWorkstationCheckpointPayload",
          "kind": "function",
          "signature": "buildWorkstationCheckpointPayload(workstation, { governanceHead, appRegistryHash = null, manifestRoot = null } = {})",
          "summary": "Build the payload for a WORKSTATION_CHECKPOINTED governance event (network plan §19). Pass the result straight into GroupLedger's `proposeGroupEvent(ledger, { type: 'WORKSTATION_CHECKPOINTED', payload, signer })`."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/workstation/WorkstationState",
      "path": "engine/reference/network/workstation/WorkstationState.md",
      "source": "engine/network/workstation/WorkstationState.js",
      "import": "/engine/network/workstation/WorkstationState.js",
      "sourceHash": "d7f04cd83579b763eb99ec0ad60b17862d6fba1343b270dc402c59a918417bf6",
      "summary": "network/workstation/WorkstationState.js — CRDT-backed group workstation surface (network plan §18/§19: shared desktop layout, app registry, folders, agents — distinct from any member's personal desktop).  Reuses the Causal State Engine's approved CRDT types (ORSet for pinned-apps/folders/agents membership, LWWRegister for per-window layout and wallpaper) unmodified: every mutation returns a NEW state object (non-mutating join algebra), so replicas that exchange state in any order converge without coordination.",
      "exports": [
        {
          "name": "createWorkstationState",
          "kind": "function",
          "signature": "createWorkstationState()",
          "summary": "Create an empty workstation CRDT state."
        },
        {
          "name": "pinApp",
          "kind": "function",
          "signature": "pinApp(state, appId)",
          "summary": ""
        },
        {
          "name": "unpinApp",
          "kind": "function",
          "signature": "unpinApp(state, appId)",
          "summary": ""
        },
        {
          "name": "addFolder",
          "kind": "function",
          "signature": "addFolder(state, folderId)",
          "summary": ""
        },
        {
          "name": "removeFolder",
          "kind": "function",
          "signature": "removeFolder(state, folderId)",
          "summary": ""
        },
        {
          "name": "addAgent",
          "kind": "function",
          "signature": "addAgent(state, agentId)",
          "summary": ""
        },
        {
          "name": "removeAgent",
          "kind": "function",
          "signature": "removeAgent(state, agentId)",
          "summary": ""
        },
        {
          "name": "setWindowLayout",
          "kind": "function",
          "signature": "setWindowLayout(state, windowId, layout, ts, node = '')",
          "summary": "Set a window's layout (LWW: highest (ts, node) wins on merge)."
        },
        {
          "name": "getWindowLayout",
          "kind": "function",
          "signature": "getWindowLayout(state, windowId)",
          "summary": ""
        },
        {
          "name": "setWallpaper",
          "kind": "function",
          "signature": "setWallpaper(state, wallpaper, ts, node = '')",
          "summary": ""
        },
        {
          "name": "mergeWorkstationState",
          "kind": "function",
          "signature": "mergeWorkstationState(a, b)",
          "summary": "Join two workstation states (CRDT merge — order-independent, convergent)."
        },
        {
          "name": "snapshotWorkstationState",
          "kind": "function",
          "signature": "snapshotWorkstationState(state)",
          "summary": "Plain, JSON-serializable snapshot (for hashing/checkpointing/transport)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "network/workstation/index",
      "path": "engine/reference/network/workstation/index.md",
      "source": "engine/network/workstation/index.js",
      "import": "/engine/network/workstation/index.js",
      "sourceHash": "e29ee59b612a9a8b6dd423b55be0c29f0fc07d7731bb0c00f2445e93aa7fdb1a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/CameraMath",
      "path": "engine/reference/render/CameraMath.md",
      "source": "engine/render/CameraMath.js",
      "import": "/engine/render/CameraMath.js",
      "sourceHash": "68be32e7582d28c4a3f78d350802f2513398a90c4c86f763d7a6785c94cc9118",
      "summary": "Compute perspective projection matrix.",
      "exports": [
        {
          "name": "computePerspectiveProjection",
          "kind": "function",
          "signature": "computePerspectiveProjection(camera, aspectFallback, options = {})",
          "summary": "Compute perspective projection matrix."
        },
        {
          "name": "computeOrthographicProjection",
          "kind": "function",
          "signature": "computeOrthographicProjection(camera, viewHeight, aspectFallback)",
          "summary": ""
        },
        {
          "name": "computeViewMatrixFromTransform",
          "kind": "function",
          "signature": "computeViewMatrixFromTransform(transform)",
          "summary": ""
        },
        {
          "name": "computeViewProjMatrix",
          "kind": "function",
          "signature": "computeViewProjMatrix(camera, transform, viewportWidth, viewportHeight)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/DrawHelpers",
      "path": "engine/reference/render/DrawHelpers.md",
      "source": "engine/render/DrawHelpers.js",
      "import": "/engine/render/DrawHelpers.js",
      "sourceHash": "a837c689a0ff6f9491ec181c63ee8846f230d4ed09f920c090d5da9bd2930e03",
      "summary": "Draw a mesh with the given bind group and uniforms.",
      "exports": [
        {
          "name": "drawMesh",
          "kind": "function",
          "signature": "drawMesh(pass, mesh, bindGroup)",
          "summary": "Draw a mesh with the given bind group and uniforms."
        },
        {
          "name": "encodeIndexedMeshClusterCulling",
          "kind": "function",
          "signature": "encodeIndexedMeshClusterCulling(commandEncoder, viewProj, meshes)",
          "summary": ""
        },
        {
          "name": "drawMeshes",
          "kind": "function",
          "signature": "drawMeshes(pass, meshEntries)",
          "summary": "Draw multiple meshes efficiently."
        },
        {
          "name": "beginStandardRenderPass",
          "kind": "function",
          "signature": "beginStandardRenderPass(encoder, options)",
          "summary": "Create a render pass with standard settings."
        },
        {
          "name": "ensureDepthTexture",
          "kind": "function",
          "signature": "ensureDepthTexture(device, current, width, height)",
          "summary": "Ensure depth texture matches canvas size, recreating if needed."
        },
        {
          "name": "ensureSceneColorTexture",
          "kind": "function",
          "signature": "ensureSceneColorTexture(device, current, width, height, format = \"bgra8unorm\")",
          "summary": "Ensure scene color texture matches canvas size, recreating if needed. Used for screen-space water refraction which needs to sample the rendered scene."
        },
        {
          "name": "buildViewProjData",
          "kind": "function",
          "signature": "buildViewProjData(projection, view, multiply, out = null)",
          "summary": "Build viewProj matrix data for a frame buffer."
        },
        {
          "name": "renderParticleBillboards",
          "kind": "function",
          "signature": "renderParticleBillboards(renderPass, particles, options)",
          "summary": "Render particle billboards or points in an existing render pass. Automatically detects point-list vs triangle-list topology."
        },
        {
          "name": "renderVolumetricSmoke",
          "kind": "function",
          "signature": "renderVolumetricSmoke(encoder, swapView, smoke, options)",
          "summary": "Render volumetric smoke in a separate pass after the main render pass."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/DualModeRenderer",
      "path": "engine/reference/render/DualModeRenderer.md",
      "source": "engine/render/DualModeRenderer.js",
      "import": "/engine/render/DualModeRenderer.js",
      "sourceHash": "249e97f6bd096c059590fe7479cb65102d5a21825f856879920e4c7983848abf",
      "summary": "Map velocity to color",
      "exports": [
        {
          "name": "ParticleRenderer",
          "kind": "class",
          "signature": "class ParticleRenderer",
          "summary": ""
        },
        {
          "name": "DualModeRenderer",
          "kind": "class",
          "signature": "class DualModeRenderer",
          "summary": ""
        },
        {
          "name": "velocityToColor",
          "kind": "function",
          "signature": "velocityToColor(vx, vy, vz, scale = 0.1)",
          "summary": "Map velocity to color"
        },
        {
          "name": "generateInstanceData",
          "kind": "function",
          "signature": "generateInstanceData(positions, velocities, particleSize = 1.0, colorScale = 0.1)",
          "summary": "Generate particle instance data from positions and velocities"
        },
        {
          "name": "ViewMode",
          "kind": "constant",
          "signature": "ViewMode",
          "summary": "View modes"
        },
        {
          "name": "LOD_THRESHOLDS",
          "kind": "constant",
          "signature": "LOD_THRESHOLDS",
          "summary": "LOD distance thresholds"
        },
        {
          "name": "ParticleStyle",
          "kind": "constant",
          "signature": "ParticleStyle",
          "summary": "Particle rendering styles"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/IndexedClusterCuller",
      "path": "engine/reference/render/IndexedClusterCuller.md",
      "source": "engine/render/IndexedClusterCuller.js",
      "import": "/engine/render/IndexedClusterCuller.js",
      "sourceHash": "2126dc39b04679ae9c5257b50ebe17ba7f49c4795dece7511da9abd0eafba530",
      "summary": "",
      "exports": [
        {
          "name": "IndexedClusterCuller",
          "kind": "class",
          "signature": "class IndexedClusterCuller",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/LightManager",
      "path": "engine/reference/render/LightManager.md",
      "source": "engine/render/LightManager.js",
      "import": "/engine/render/LightManager.js",
      "sourceHash": "0b711d14fcc20186a62f289f04b45b759686e1def5ef09dc902794ef1b19d9a0",
      "summary": "LightManager.js - Collects ECS Light entities and uploads to GPU Queries all entities with Light + Transform components each frame, builds a GPU uniform buffer, and exposes a bind group for renderers. GPU Layout (std140-aligned): vec3 ambientColor + f32 ambientIntensity        (16 bytes) vec3 sunDirection + f32 sunIntensity             (16 bytes) vec3 sunColor     + u32 lightCount               (16 bytes) f32  globalBrightness + f32 enableDiffuse + f32 enableSun + f32 _pad (16 bytes) Light[16] array                                   (16 * 48 = 768 bytes) Total: 64 + 768 = 832 bytes Each Light (48 bytes, 12 floats): vec3 position  + u32 lightType     (16 bytes) vec3 color     + f32 intensity     (16 bytes) vec3 direction + f32 range         (16 bytes)",
      "exports": [
        {
          "name": "LightManager",
          "kind": "class",
          "signature": "class LightManager",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/Mesh",
      "path": "engine/reference/render/Mesh.md",
      "source": "engine/render/Mesh.js",
      "import": "/engine/render/Mesh.js",
      "sourceHash": "42b3b7969deae78f8c937a899d4378a09d127d695f6e683678cb40d01428cd9b",
      "summary": "",
      "exports": [
        {
          "name": "computeBoundsFromInterleavedPositions",
          "kind": "function",
          "signature": "computeBoundsFromInterleavedPositions(vertexData, strideFloats, positionOffsetFloats = 0)",
          "summary": ""
        },
        {
          "name": "createMesh",
          "kind": "function",
          "signature": "createMesh(device, description)",
          "summary": ""
        },
        {
          "name": "createScreenQuadMesh",
          "kind": "function",
          "signature": "createScreenQuadMesh(device, options = {})",
          "summary": ""
        },
        {
          "name": "createSphereMesh",
          "kind": "function",
          "signature": "createSphereMesh(device, options = {})",
          "summary": ""
        },
        {
          "name": "getVertexBufferLayoutForMesh",
          "kind": "function",
          "signature": "getVertexBufferLayoutForMesh(mesh, slot = 0)",
          "summary": ""
        },
        {
          "name": "createUnitCubeMesh",
          "kind": "function",
          "signature": "createUnitCubeMesh(device, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/MinimapRenderer",
      "path": "engine/reference/render/MinimapRenderer.md",
      "source": "engine/render/MinimapRenderer.js",
      "import": "/engine/render/MinimapRenderer.js",
      "sourceHash": "9a0eb47d8e4bba28bdaab04fdfe5cb0900fbfc1a791dd428e90b9001eb1f34b8",
      "summary": "MinimapRenderer.js - Top-Down Minimap System Renders a 2D top-down view of the terrain showing: - Terrain colors based on block types - Player position and direction indicator - Chunk boundaries (optional) - Points of interest markers",
      "exports": [
        {
          "name": "MinimapRenderer",
          "kind": "class",
          "signature": "class MinimapRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/PlanetPreviewRenderer",
      "path": "engine/reference/render/PlanetPreviewRenderer.md",
      "source": "engine/render/PlanetPreviewRenderer.js",
      "import": "/engine/render/PlanetPreviewRenderer.js",
      "sourceHash": "af9bd935b64b683c814a4a98c69332e2254119a761acfaa620207968df29c3a0",
      "summary": "",
      "exports": [
        {
          "name": "PlanetPreviewRenderer",
          "kind": "class",
          "signature": "class PlanetPreviewRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/RenderBundleManager",
      "path": "engine/reference/render/RenderBundleManager.md",
      "source": "engine/render/RenderBundleManager.js",
      "import": "/engine/render/RenderBundleManager.js",
      "sourceHash": "4f1f60c3093f327f236cdfabea8524822be40eed1532c0ff705809dcdd067cef",
      "summary": "Render Bundle Manager - Pre-record draw commands for massive CPU overhead reduction Based on WebGPU best practices from Toji.dev Reduces draw call overhead by 10x for repeated rendering",
      "exports": [
        {
          "name": "RenderBundleManager",
          "kind": "class",
          "signature": "class RenderBundleManager",
          "summary": "Render Bundle Manager - Pre-record draw commands for massive CPU overhead reduction Based on WebGPU best practices from Toji.dev Reduces draw call overhead by 10x for repeated rendering"
        },
        {
          "name": "ParticleRenderBundleCache",
          "kind": "class",
          "signature": "class ParticleRenderBundleCache",
          "summary": "Particle-specific render bundle optimization Pre-records particle billboard rendering for massive performance gains"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/RenderingInit",
      "path": "engine/reference/render/RenderingInit.md",
      "source": "engine/render/RenderingInit.js",
      "import": "/engine/render/RenderingInit.js",
      "sourceHash": "5dd02ba833d628e28dccb78e44b1529d935c643171296744aa5b0cd176d50176",
      "summary": "Initialize particle simulation and renderer.",
      "exports": [
        {
          "name": "initParticleSystem",
          "kind": "function",
          "signature": "async initParticleSystem(options)",
          "summary": "Initialize particle simulation and renderer."
        },
        {
          "name": "initSmokeRenderer",
          "kind": "function",
          "signature": "async initSmokeRenderer(options)",
          "summary": "Initialize volumetric smoke renderer (fluid sim is lazy)."
        },
        {
          "name": "initSimulationRendering",
          "kind": "function",
          "signature": "async initSimulationRendering(options)",
          "summary": "Initialize particle system and optionally smoke renderer."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/SceneRenderer",
      "path": "engine/reference/render/SceneRenderer.md",
      "source": "engine/render/SceneRenderer.js",
      "import": "/engine/render/SceneRenderer.js",
      "sourceHash": "bb7b5116135e718adb1b29b66d517e6c6e00b9fb77a4dfcf90a98656c032b08b",
      "summary": "Render all spawned ECS entities.",
      "exports": [
        {
          "name": "encodeEntitiesClusterCulling",
          "kind": "function",
          "signature": "encodeEntitiesClusterCulling(options)",
          "summary": ""
        },
        {
          "name": "renderEntities",
          "kind": "function",
          "signature": "renderEntities(options)",
          "summary": "Render all spawned ECS entities."
        },
        {
          "name": "renderRoom",
          "kind": "function",
          "signature": "renderRoom(options)",
          "summary": "Render room geometry (floor, walls, ceiling)."
        },
        {
          "name": "renderLightCube",
          "kind": "function",
          "signature": "renderLightCube(options)",
          "summary": "Render a light cube at a position."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/VolumetricRaymarch",
      "path": "engine/reference/render/VolumetricRaymarch.md",
      "source": "engine/render/VolumetricRaymarch.js",
      "import": "/engine/render/VolumetricRaymarch.js",
      "sourceHash": "fbeef4ee7755edb8b16bee88dc09a0d5ff4bdd2020fba7e578fdf0e922347bb7",
      "summary": "Default raymarch parameters",
      "exports": [
        {
          "name": "VolumetricRaymarcher",
          "kind": "class",
          "signature": "class VolumetricRaymarcher",
          "summary": ""
        },
        {
          "name": "DEFAULT_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_PARAMS",
          "summary": "Default raymarch parameters"
        },
        {
          "name": "RenderMode",
          "kind": "constant",
          "signature": "RenderMode",
          "summary": "Render modes"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/World3DPreviewRenderer",
      "path": "engine/reference/render/World3DPreviewRenderer.md",
      "source": "engine/render/World3DPreviewRenderer.js",
      "import": "/engine/render/World3DPreviewRenderer.js",
      "sourceHash": "601259fe329aee026b0c6691c1538476e7ae4e65793fe21b18b5512dbd29f82f",
      "summary": "",
      "exports": [
        {
          "name": "World3DPreviewRenderer",
          "kind": "class",
          "signature": "class World3DPreviewRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/WorldParticleRenderer",
      "path": "engine/reference/render/WorldParticleRenderer.md",
      "source": "engine/render/WorldParticleRenderer.js",
      "import": "/engine/render/WorldParticleRenderer.js",
      "sourceHash": "216e1d7887bc14006447f1139b73447e4e08cfdbd988d8170158de44f2d6bf77",
      "summary": "",
      "exports": [
        {
          "name": "WorldParticleRenderer",
          "kind": "class",
          "signature": "class WorldParticleRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/AerialPerspective",
      "path": "engine/reference/render/atmosphere/AerialPerspective.md",
      "source": "engine/render/atmosphere/AerialPerspective.js",
      "import": "/engine/render/atmosphere/AerialPerspective.js",
      "sourceHash": "92cf90646ed56b80f880d6d553df45a6577d1461939e82717ec85afe14b094af",
      "summary": "AerialPerspective - Distance-based color shifting",
      "exports": [
        {
          "name": "AerialPerspective",
          "kind": "class",
          "signature": "class AerialPerspective",
          "summary": "AerialPerspective - Distance-based color shifting"
        },
        {
          "name": "AERIAL_PERSPECTIVE_WGSL",
          "kind": "constant",
          "signature": "AERIAL_PERSPECTIVE_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/AtmosphereUtils",
      "path": "engine/reference/render/atmosphere/AtmosphereUtils.md",
      "source": "engine/render/atmosphere/AtmosphereUtils.js",
      "import": "/engine/render/atmosphere/AtmosphereUtils.js",
      "sourceHash": "823b09a986e3069d324027bd91e45e5ee6cc9a79251524d84d02f0e4b42c29d5",
      "summary": "Calculate recommended Mie asymmetry based on visibility",
      "exports": [
        {
          "name": "getMieAsymmetryFromVisibility",
          "kind": "function",
          "signature": "getMieAsymmetryFromVisibility(visibility)",
          "summary": "Calculate recommended Mie asymmetry based on visibility"
        },
        {
          "name": "getAdaptiveStepMultiplier",
          "kind": "function",
          "signature": "getAdaptiveStepMultiplier(opticalDepth)",
          "summary": "Get step size recommendation based on optical depth"
        },
        {
          "name": "ATMOSPHERE_UTILS_WGSL",
          "kind": "constant",
          "signature": "ATMOSPHERE_UTILS_WGSL",
          "summary": ""
        },
        {
          "name": "MIE_ASYMMETRY",
          "kind": "constant",
          "signature": "MIE_ASYMMETRY",
          "summary": ""
        },
        {
          "name": "ADAPTIVE_STEPS",
          "kind": "constant",
          "signature": "ADAPTIVE_STEPS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/AtmosphericScattering",
      "path": "engine/reference/render/atmosphere/AtmosphericScattering.md",
      "source": "engine/render/atmosphere/AtmosphericScattering.js",
      "import": "/engine/render/atmosphere/AtmosphericScattering.js",
      "sourceHash": "936770afae28b4ea376ddf39ccbf2404dd6ffb955ba5d5098f1f8e6b736d80bf",
      "summary": "AtmosphericScattering - Physical atmosphere simulation",
      "exports": [
        {
          "name": "AtmosphericScattering",
          "kind": "class",
          "signature": "class AtmosphericScattering",
          "summary": "AtmosphericScattering - Physical atmosphere simulation"
        },
        {
          "name": "ATMOSPHERIC_SCATTERING_WGSL",
          "kind": "constant",
          "signature": "ATMOSPHERIC_SCATTERING_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/AuroraPass",
      "path": "engine/reference/render/atmosphere/AuroraPass.md",
      "source": "engine/render/atmosphere/AuroraPass.js",
      "import": "/engine/render/atmosphere/AuroraPass.js",
      "sourceHash": "b7b6b31b380933e5da816fb720f5b8ffe19b6972545b12054a2a1de77a8bec49",
      "summary": "AuroraPass - Volumetric aurora rendering pass",
      "exports": [
        {
          "name": "AuroraPass",
          "kind": "class",
          "signature": "class AuroraPass",
          "summary": "AuroraPass - Volumetric aurora rendering pass"
        },
        {
          "name": "AURORA_WGSL",
          "kind": "constant",
          "signature": "AURORA_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/BlueNoise",
      "path": "engine/reference/render/atmosphere/BlueNoise.md",
      "source": "engine/render/atmosphere/BlueNoise.js",
      "import": "/engine/render/atmosphere/BlueNoise.js",
      "sourceHash": "8985836a5b825213bf6bfcfa1bd6f66dd4abf67dc4a438ff17d4adade01a2587",
      "summary": "BlueNoiseTexture - GPU blue noise texture manager",
      "exports": [
        {
          "name": "BlueNoiseTexture",
          "kind": "class",
          "signature": "class BlueNoiseTexture",
          "summary": "BlueNoiseTexture - GPU blue noise texture manager"
        },
        {
          "name": "BLUE_NOISE_WGSL",
          "kind": "constant",
          "signature": "BLUE_NOISE_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/CelestialMoon",
      "path": "engine/reference/render/atmosphere/CelestialMoon.md",
      "source": "engine/render/atmosphere/CelestialMoon.js",
      "import": "/engine/render/atmosphere/CelestialMoon.js",
      "sourceHash": "1ce6fe609ee24fafcc48ec2f4c2825850bdabe40bea8bacb5d932a5388da311e",
      "summary": "Moon class for orbital mechanics and state management",
      "exports": [
        {
          "name": "Moon",
          "kind": "class",
          "signature": "class Moon",
          "summary": "Moon class for orbital mechanics and state management"
        },
        {
          "name": "MoonSystem",
          "kind": "class",
          "signature": "class MoonSystem",
          "summary": "MoonSystem - Manages multiple moons"
        },
        {
          "name": "MoonType",
          "kind": "constant",
          "signature": "MoonType",
          "summary": ""
        },
        {
          "name": "MoonDefaults",
          "kind": "constant",
          "signature": "MoonDefaults",
          "summary": "Default configurations for different moon types"
        },
        {
          "name": "MoonPresets",
          "kind": "constant",
          "signature": "MoonPresets",
          "summary": "Preset moon configurations for the world"
        },
        {
          "name": "MoonWGSL",
          "kind": "constant",
          "signature": "MoonWGSL",
          "summary": "WGSL shader code for moon rendering"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/CelestialStars",
      "path": "engine/reference/render/atmosphere/CelestialStars.md",
      "source": "engine/render/atmosphere/CelestialStars.js",
      "import": "/engine/render/atmosphere/CelestialStars.js",
      "sourceHash": "f31ba9fa7337306109486c828375ad5c22905af5b4f9214cdaf9c13a62f3f54d",
      "summary": "StarField class for managing star rendering",
      "exports": [
        {
          "name": "StarField",
          "kind": "class",
          "signature": "class StarField",
          "summary": "StarField class for managing star rendering"
        },
        {
          "name": "StarSystem",
          "kind": "class",
          "signature": "class StarSystem",
          "summary": "StarSystem - Complete star management system"
        },
        {
          "name": "StarLayer",
          "kind": "constant",
          "signature": "StarLayer",
          "summary": "Star layer types - for different visual effects"
        },
        {
          "name": "StarDefaults",
          "kind": "constant",
          "signature": "StarDefaults",
          "summary": "Star field configuration defaults"
        },
        {
          "name": "StarLayerPresets",
          "kind": "constant",
          "signature": "StarLayerPresets",
          "summary": "Star layer presets"
        },
        {
          "name": "Constellations",
          "kind": "constant",
          "signature": "Constellations",
          "summary": "Constellation definitions (named star patterns)"
        },
        {
          "name": "StarsWGSL",
          "kind": "constant",
          "signature": "StarsWGSL",
          "summary": "WGSL shader code for star rendering"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/CelestialSun",
      "path": "engine/reference/render/atmosphere/CelestialSun.md",
      "source": "engine/render/atmosphere/CelestialSun.js",
      "import": "/engine/render/atmosphere/CelestialSun.js",
      "sourceHash": "caa37f8fe8d521f2118e9f8ef6e5b3d15eae879839cfac499cf1a56f4ef329b0",
      "summary": "Sun class for orbital mechanics and state management",
      "exports": [
        {
          "name": "Sun",
          "kind": "class",
          "signature": "class Sun",
          "summary": "Sun class for orbital mechanics and state management"
        },
        {
          "name": "SunDefaults",
          "kind": "constant",
          "signature": "SunDefaults",
          "summary": ""
        },
        {
          "name": "SunWGSL",
          "kind": "constant",
          "signature": "SunWGSL",
          "summary": "WGSL shader code for sun rendering"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/DistanceFog",
      "path": "engine/reference/render/atmosphere/DistanceFog.md",
      "source": "engine/render/atmosphere/DistanceFog.js",
      "import": "/engine/render/atmosphere/DistanceFog.js",
      "sourceHash": "b2d65a455568a53ba9c0191cb8db20b1be07dc3859f09e8f4397b911fcaef537",
      "summary": "DistanceFog - Distance-based fog system",
      "exports": [
        {
          "name": "DistanceFog",
          "kind": "class",
          "signature": "class DistanceFog",
          "summary": "DistanceFog - Distance-based fog system"
        },
        {
          "name": "FOG_TYPE",
          "kind": "constant",
          "signature": "FOG_TYPE",
          "summary": ""
        },
        {
          "name": "FOG_WGSL",
          "kind": "constant",
          "signature": "FOG_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/HillaireLUT",
      "path": "engine/reference/render/atmosphere/HillaireLUT.md",
      "source": "engine/render/atmosphere/HillaireLUT.js",
      "import": "/engine/render/atmosphere/HillaireLUT.js",
      "sourceHash": "010aa9d03b1a6a7a68f2a08189bb55eefcc55f09f7fb2082a4eb6d29971bb26c",
      "summary": "HillaireLUT - Main class for Hillaire-style atmospheric LUT system",
      "exports": [
        {
          "name": "HillaireLUT",
          "kind": "class",
          "signature": "class HillaireLUT",
          "summary": "HillaireLUT - Main class for Hillaire-style atmospheric LUT system"
        },
        {
          "name": "TRANSMITTANCE_COMPUTE_WGSL",
          "kind": "constant",
          "signature": "TRANSMITTANCE_COMPUTE_WGSL",
          "summary": ""
        },
        {
          "name": "MULTISCATTER_COMPUTE_WGSL",
          "kind": "constant",
          "signature": "MULTISCATTER_COMPUTE_WGSL",
          "summary": ""
        },
        {
          "name": "SKYVIEW_COMPUTE_WGSL",
          "kind": "constant",
          "signature": "SKYVIEW_COMPUTE_WGSL",
          "summary": ""
        },
        {
          "name": "AERIAL_PERSPECTIVE_COMPUTE_WGSL",
          "kind": "constant",
          "signature": "AERIAL_PERSPECTIVE_COMPUTE_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/PlanetCurvature",
      "path": "engine/reference/render/atmosphere/PlanetCurvature.md",
      "source": "engine/render/atmosphere/PlanetCurvature.js",
      "import": "/engine/render/atmosphere/PlanetCurvature.js",
      "sourceHash": "e5bcf52a5f2edd1a46d16e17d25299ff2c339d7daafc0fb06cc6e463940d4efe",
      "summary": "PlanetCurvature - Planetary curvature simulation",
      "exports": [
        {
          "name": "PlanetCurvature",
          "kind": "class",
          "signature": "class PlanetCurvature",
          "summary": "PlanetCurvature - Planetary curvature simulation"
        },
        {
          "name": "PLANET_CURVATURE_WGSL",
          "kind": "constant",
          "signature": "PLANET_CURVATURE_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/ProceduralSky",
      "path": "engine/reference/render/atmosphere/ProceduralSky.md",
      "source": "engine/render/atmosphere/ProceduralSky.js",
      "import": "/engine/render/atmosphere/ProceduralSky.js",
      "sourceHash": "78ee2a7008c0754c4222462f17730896a662190bb84b812dfb1847023a3b5263",
      "summary": "ProceduralSky - Complete sky system",
      "exports": [
        {
          "name": "ProceduralSky",
          "kind": "class",
          "signature": "class ProceduralSky",
          "summary": "ProceduralSky - Complete sky system"
        },
        {
          "name": "SUN_PHASE",
          "kind": "constant",
          "signature": "SUN_PHASE",
          "summary": ""
        },
        {
          "name": "PROCEDURAL_SKY_WGSL",
          "kind": "constant",
          "signature": "PROCEDURAL_SKY_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/Space",
      "path": "engine/reference/render/atmosphere/Space.md",
      "source": "engine/render/atmosphere/Space.js",
      "import": "/engine/render/atmosphere/Space.js",
      "sourceHash": "6cbed31af4f7286decf8ab612e220dbc2c455955f907729dbfd2338b0d0a85d6",
      "summary": "",
      "exports": [
        {
          "name": "SpaceWGSL",
          "kind": "constant",
          "signature": "SpaceWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/SpectralWeather",
      "path": "engine/reference/render/atmosphere/SpectralWeather.md",
      "source": "engine/render/atmosphere/SpectralWeather.js",
      "import": "/engine/render/atmosphere/SpectralWeather.js",
      "sourceHash": "82739323ab36b7d0ac4b5af6fc35e00944607096c710ad4c95043a806f892bac",
      "summary": "SpectralWeather - T21 spectral weather simulation",
      "exports": [
        {
          "name": "SpectralWeather",
          "kind": "class",
          "signature": "class SpectralWeather",
          "summary": "SpectralWeather - T21 spectral weather simulation"
        },
        {
          "name": "SPECTRAL_WEATHER_WGSL",
          "kind": "constant",
          "signature": "SPECTRAL_WEATHER_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/TemporalAccumulation",
      "path": "engine/reference/render/atmosphere/TemporalAccumulation.md",
      "source": "engine/render/atmosphere/TemporalAccumulation.js",
      "import": "/engine/render/atmosphere/TemporalAccumulation.js",
      "sourceHash": "8d5c01fb45cb2c6d68f636e63fa3329923ea59de5da2e830d145ffda9da7ea49",
      "summary": "TemporalAccumulation - TAA pass for atmosphere",
      "exports": [
        {
          "name": "TemporalAccumulation",
          "kind": "class",
          "signature": "class TemporalAccumulation",
          "summary": "TemporalAccumulation - TAA pass for atmosphere"
        },
        {
          "name": "TEMPORAL_ACCUMULATION_WGSL",
          "kind": "constant",
          "signature": "TEMPORAL_ACCUMULATION_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/index",
      "path": "engine/reference/render/atmosphere/index.md",
      "source": "engine/render/atmosphere/index.js",
      "import": "/engine/render/atmosphere/index.js",
      "sourceHash": "61292cc150decf22960dcfa60aff4239a8d6e54b183403c2be635d7f545ac328",
      "summary": "",
      "exports": [
        {
          "name": "ADAPTIVE_STEPS",
          "kind": "re-export",
          "signature": "ADAPTIVE_STEPS",
          "summary": ""
        },
        {
          "name": "AERIAL_PERSPECTIVE_COMPUTE_WGSL",
          "kind": "re-export",
          "signature": "AERIAL_PERSPECTIVE_COMPUTE_WGSL",
          "summary": ""
        },
        {
          "name": "ATMOSPHERE_UTILS_WGSL",
          "kind": "re-export",
          "signature": "ATMOSPHERE_UTILS_WGSL",
          "summary": ""
        },
        {
          "name": "AURORA_WGSL",
          "kind": "re-export",
          "signature": "AURORA_WGSL",
          "summary": ""
        },
        {
          "name": "AuroraPass",
          "kind": "re-export",
          "signature": "AuroraPass",
          "summary": ""
        },
        {
          "name": "BLUE_NOISE_WGSL",
          "kind": "re-export",
          "signature": "BLUE_NOISE_WGSL",
          "summary": ""
        },
        {
          "name": "BlueNoiseTexture",
          "kind": "re-export",
          "signature": "BlueNoiseTexture",
          "summary": ""
        },
        {
          "name": "HillaireLUT",
          "kind": "re-export",
          "signature": "HillaireLUT",
          "summary": ""
        },
        {
          "name": "MIE_ASYMMETRY",
          "kind": "re-export",
          "signature": "MIE_ASYMMETRY",
          "summary": ""
        },
        {
          "name": "MULTISCATTER_COMPUTE_WGSL",
          "kind": "re-export",
          "signature": "MULTISCATTER_COMPUTE_WGSL",
          "summary": ""
        },
        {
          "name": "SKYVIEW_COMPUTE_WGSL",
          "kind": "re-export",
          "signature": "SKYVIEW_COMPUTE_WGSL",
          "summary": ""
        },
        {
          "name": "SPECTRAL_WEATHER_WGSL",
          "kind": "re-export",
          "signature": "SPECTRAL_WEATHER_WGSL",
          "summary": ""
        },
        {
          "name": "SpectralWeather",
          "kind": "re-export",
          "signature": "SpectralWeather",
          "summary": ""
        },
        {
          "name": "TEMPORAL_ACCUMULATION_WGSL",
          "kind": "re-export",
          "signature": "TEMPORAL_ACCUMULATION_WGSL",
          "summary": ""
        },
        {
          "name": "TRANSMITTANCE_COMPUTE_WGSL",
          "kind": "re-export",
          "signature": "TRANSMITTANCE_COMPUTE_WGSL",
          "summary": ""
        },
        {
          "name": "TemporalAccumulation",
          "kind": "re-export",
          "signature": "TemporalAccumulation",
          "summary": ""
        },
        {
          "name": "getAdaptiveStepMultiplier",
          "kind": "re-export",
          "signature": "getAdaptiveStepMultiplier",
          "summary": ""
        },
        {
          "name": "getMieAsymmetryFromVisibility",
          "kind": "re-export",
          "signature": "getMieAsymmetryFromVisibility",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/atmosphere/sky/index",
      "path": "engine/reference/render/atmosphere/sky/index.md",
      "source": "engine/render/atmosphere/sky/index.js",
      "import": "/engine/render/atmosphere/sky/index.js",
      "sourceHash": "2ca4c1d1f4c4e69ef40ffddd78105b13c1126ceb2f20dd80ae2180600cd89c37",
      "summary": "",
      "exports": [
        {
          "name": "CelestialBodiesWGSL",
          "kind": "constant",
          "signature": "CelestialBodiesWGSL",
          "summary": ""
        },
        {
          "name": "Constellations",
          "kind": "re-export",
          "signature": "Constellations",
          "summary": ""
        },
        {
          "name": "Moon",
          "kind": "re-export",
          "signature": "Moon",
          "summary": ""
        },
        {
          "name": "MoonDefaults",
          "kind": "re-export",
          "signature": "MoonDefaults",
          "summary": ""
        },
        {
          "name": "MoonPresets",
          "kind": "re-export",
          "signature": "MoonPresets",
          "summary": ""
        },
        {
          "name": "MoonSystem",
          "kind": "re-export",
          "signature": "MoonSystem",
          "summary": ""
        },
        {
          "name": "MoonType",
          "kind": "re-export",
          "signature": "MoonType",
          "summary": ""
        },
        {
          "name": "MoonWGSL",
          "kind": "re-export",
          "signature": "MoonWGSL",
          "summary": ""
        },
        {
          "name": "SpaceWGSL",
          "kind": "re-export",
          "signature": "SpaceWGSL",
          "summary": ""
        },
        {
          "name": "StarDefaults",
          "kind": "re-export",
          "signature": "StarDefaults",
          "summary": ""
        },
        {
          "name": "StarField",
          "kind": "re-export",
          "signature": "StarField",
          "summary": ""
        },
        {
          "name": "StarLayer",
          "kind": "re-export",
          "signature": "StarLayer",
          "summary": ""
        },
        {
          "name": "StarLayerPresets",
          "kind": "re-export",
          "signature": "StarLayerPresets",
          "summary": ""
        },
        {
          "name": "StarSystem",
          "kind": "re-export",
          "signature": "StarSystem",
          "summary": ""
        },
        {
          "name": "StarsWGSL",
          "kind": "re-export",
          "signature": "StarsWGSL",
          "summary": ""
        },
        {
          "name": "Sun",
          "kind": "re-export",
          "signature": "Sun",
          "summary": ""
        },
        {
          "name": "SunDefaults",
          "kind": "re-export",
          "signature": "SunDefaults",
          "summary": ""
        },
        {
          "name": "SunWGSL",
          "kind": "re-export",
          "signature": "SunWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/debug/GridRenderer",
      "path": "engine/reference/render/debug/GridRenderer.md",
      "source": "engine/render/debug/GridRenderer.js",
      "import": "/engine/render/debug/GridRenderer.js",
      "sourceHash": "7e5cb9a7a7f108cdb038e89edb56754b9a89e5fe0e5406c33c250f6c57799477",
      "summary": "GridRenderer - Infinite grid for 3D viewport Now powered by vGPU driver",
      "exports": [
        {
          "name": "GridRenderer",
          "kind": "class",
          "signature": "class GridRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/debug/PhysicsLineRenderer",
      "path": "engine/reference/render/debug/PhysicsLineRenderer.md",
      "source": "engine/render/debug/PhysicsLineRenderer.js",
      "import": "/engine/render/debug/PhysicsLineRenderer.js",
      "sourceHash": "0284b3f8694744e5f2090e3da55a157d28ab7182f8a4d1f7b0408ebda511f9d5",
      "summary": "PhysicsLineRenderer.js - GPU Line Rendering for Physics Objects Renders ropes, wires, hair strands, and chain links using GPU instancing. Supports both line primitives and tube geometry for thicker cables.",
      "exports": [
        {
          "name": "PhysicsLineRenderer",
          "kind": "class",
          "signature": "class PhysicsLineRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/debug/WireframeBoxRenderer",
      "path": "engine/reference/render/debug/WireframeBoxRenderer.md",
      "source": "engine/render/debug/WireframeBoxRenderer.js",
      "import": "/engine/render/debug/WireframeBoxRenderer.js",
      "sourceHash": "2a9eeb31dccabedffbea5f1f4d87e73b83fc56c8b8e12902ccf2310507d9390f",
      "summary": "WireframeBoxRenderer - Renders wireframe boxes for debug visualization Used to visualize voxel colliders in the editor Now powered by vGPU driver",
      "exports": [
        {
          "name": "WireframeBoxRenderer",
          "kind": "class",
          "signature": "class WireframeBoxRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/debug/index",
      "path": "engine/reference/render/debug/index.md",
      "source": "engine/render/debug/index.js",
      "import": "/engine/render/debug/index.js",
      "sourceHash": "7036d4b6e1e10925aba41df41de5c15b55ba5e58422af3e793a744a53cface94",
      "summary": "Debug Renderers - GPU debug visualization tools These renderers are useful for both editor and runtime debug visualization.",
      "exports": [
        {
          "name": "GridRenderer",
          "kind": "re-export",
          "signature": "GridRenderer",
          "summary": ""
        },
        {
          "name": "PhysicsLineRenderer",
          "kind": "re-export",
          "signature": "PhysicsLineRenderer",
          "summary": ""
        },
        {
          "name": "WireframeBoxRenderer",
          "kind": "re-export",
          "signature": "WireframeBoxRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/CapsuleGeometry",
      "path": "engine/reference/render/geometry/CapsuleGeometry.md",
      "source": "engine/render/geometry/CapsuleGeometry.js",
      "import": "/engine/render/geometry/CapsuleGeometry.js",
      "sourceHash": "6062ab7e9d7e3e1c7feb4e7aaa5b7798e0a2d7e36ab87a9f5fbf3089efd16f7b",
      "summary": "",
      "exports": [
        {
          "name": "createCapsuleGeometry",
          "kind": "function",
          "signature": "createCapsuleGeometry(radius = 0.3, height = 1.0, radialSegments = 16, hemisphereSegments = 8)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/ConeGeometry",
      "path": "engine/reference/render/geometry/ConeGeometry.md",
      "source": "engine/render/geometry/ConeGeometry.js",
      "import": "/engine/render/geometry/ConeGeometry.js",
      "sourceHash": "1a3b41c03df5fca87278f7eef74e887974f85922cb0574800ac3145891fe8930",
      "summary": "",
      "exports": [
        {
          "name": "createConeGeometry",
          "kind": "function",
          "signature": "createConeGeometry(radius = 0.5, height = 1.0, segments = 16)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/CubeGeometry",
      "path": "engine/reference/render/geometry/CubeGeometry.md",
      "source": "engine/render/geometry/CubeGeometry.js",
      "import": "/engine/render/geometry/CubeGeometry.js",
      "sourceHash": "60b32149ef420964144828f817bb4435cf9b5105e5acd76415287e154643a6ed",
      "summary": "",
      "exports": [
        {
          "name": "createCubeGeometry",
          "kind": "function",
          "signature": "createCubeGeometry(size = 1)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/CylinderGeometry",
      "path": "engine/reference/render/geometry/CylinderGeometry.md",
      "source": "engine/render/geometry/CylinderGeometry.js",
      "import": "/engine/render/geometry/CylinderGeometry.js",
      "sourceHash": "de08c510ef08f59d630bca95beb5d232861e4d7a87af5303815143a94cdeba2e",
      "summary": "",
      "exports": [
        {
          "name": "createHollowCylinderGeometry",
          "kind": "function",
          "signature": "createHollowCylinderGeometry(outerRadius = 0.5, innerRadius = 0.4, height = 1.0, radialSegments = 24,)",
          "summary": ""
        },
        {
          "name": "createCylinderGeometry",
          "kind": "function",
          "signature": "createCylinderGeometry(radius = 0.5, height = 1.0, radialSegments = 16, heightSegments = 1,)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/GroundGeometry",
      "path": "engine/reference/render/geometry/GroundGeometry.md",
      "source": "engine/render/geometry/GroundGeometry.js",
      "import": "/engine/render/geometry/GroundGeometry.js",
      "sourceHash": "4b852fef0ba874c4ec600f8cea763dbcdc83ae40b50e156b07493599901f6404",
      "summary": "",
      "exports": [
        {
          "name": "createGroundGeometry",
          "kind": "function",
          "signature": "createGroundGeometry(size = 30)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/PlaneGeometry",
      "path": "engine/reference/render/geometry/PlaneGeometry.md",
      "source": "engine/render/geometry/PlaneGeometry.js",
      "import": "/engine/render/geometry/PlaneGeometry.js",
      "sourceHash": "ccc29d54ea661fc458686f010638ebe282f1a96d9615d8840271e3f7e55b359f",
      "summary": "",
      "exports": [
        {
          "name": "createPlaneGeometry",
          "kind": "function",
          "signature": "createPlaneGeometry(size = 10, y = 0)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/PrimitiveGeometry",
      "path": "engine/reference/render/geometry/PrimitiveGeometry.md",
      "source": "engine/render/geometry/PrimitiveGeometry.js",
      "import": "/engine/render/geometry/PrimitiveGeometry.js",
      "sourceHash": "d78db203f9aecc7ce8e03bf89bcbe21921a01b0412bd5fbef030a086003e5dda",
      "summary": "Barrel export file for primitive geometry generators Re-exports all geometry modules for convenient importing",
      "exports": [
        {
          "name": "createCapsuleGeometry",
          "kind": "re-export",
          "signature": "createCapsuleGeometry",
          "summary": ""
        },
        {
          "name": "createConeGeometry",
          "kind": "re-export",
          "signature": "createConeGeometry",
          "summary": ""
        },
        {
          "name": "createCubeGeometry",
          "kind": "re-export",
          "signature": "createCubeGeometry",
          "summary": ""
        },
        {
          "name": "createCylinderGeometry",
          "kind": "re-export",
          "signature": "createCylinderGeometry",
          "summary": ""
        },
        {
          "name": "createGroundGeometry",
          "kind": "re-export",
          "signature": "createGroundGeometry",
          "summary": ""
        },
        {
          "name": "createHollowCylinderGeometry",
          "kind": "re-export",
          "signature": "createHollowCylinderGeometry",
          "summary": ""
        },
        {
          "name": "createPlaneGeometry",
          "kind": "re-export",
          "signature": "createPlaneGeometry",
          "summary": ""
        },
        {
          "name": "createSkyboxGeometry",
          "kind": "re-export",
          "signature": "createSkyboxGeometry",
          "summary": ""
        },
        {
          "name": "createSphereGeometry",
          "kind": "re-export",
          "signature": "createSphereGeometry",
          "summary": ""
        },
        {
          "name": "createTorusGeometry",
          "kind": "re-export",
          "signature": "createTorusGeometry",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/SkyboxGeometry",
      "path": "engine/reference/render/geometry/SkyboxGeometry.md",
      "source": "engine/render/geometry/SkyboxGeometry.js",
      "import": "/engine/render/geometry/SkyboxGeometry.js",
      "sourceHash": "8b4b1e8702104594a58fc580035de057d314ca973c868e831d83d110307c2616",
      "summary": "",
      "exports": [
        {
          "name": "createSkyboxGeometry",
          "kind": "function",
          "signature": "createSkyboxGeometry(size = 50)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/SphereGeometry",
      "path": "engine/reference/render/geometry/SphereGeometry.md",
      "source": "engine/render/geometry/SphereGeometry.js",
      "import": "/engine/render/geometry/SphereGeometry.js",
      "sourceHash": "fd4d824f4bcf3984e887455bd880f1a305e89c7f9084511238dd3a70e5d2dac3",
      "summary": "",
      "exports": [
        {
          "name": "createSphereGeometry",
          "kind": "function",
          "signature": "createSphereGeometry(radius = 0.5, widthSegments = 16, heightSegments = 12)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/StaticMeshBuilder",
      "path": "engine/reference/render/geometry/StaticMeshBuilder.md",
      "source": "engine/render/geometry/StaticMeshBuilder.js",
      "import": "/engine/render/geometry/StaticMeshBuilder.js",
      "sourceHash": "caedd5db47352d8b0b695e6e21d162b6770ccb1e9140d6f9987ed8863a07cea1",
      "summary": "",
      "exports": [
        {
          "name": "staticMeshVertexLayoutForGeometry",
          "kind": "function",
          "signature": "staticMeshVertexLayoutForGeometry(geometry)",
          "summary": ""
        },
        {
          "name": "staticMeshVertexDataFromGeometry",
          "kind": "function",
          "signature": "staticMeshVertexDataFromGeometry(geometry)",
          "summary": ""
        },
        {
          "name": "buildStaticMeshFromGeometry",
          "kind": "function",
          "signature": "buildStaticMeshFromGeometry(device, geometry, label, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/geometry/TorusGeometry",
      "path": "engine/reference/render/geometry/TorusGeometry.md",
      "source": "engine/render/geometry/TorusGeometry.js",
      "import": "/engine/render/geometry/TorusGeometry.js",
      "sourceHash": "f14de78134f776b6d649b6e10617c1ee4ca039c165d2cf0884589a38c48e4262",
      "summary": "",
      "exports": [
        {
          "name": "createTorusGeometry",
          "kind": "function",
          "signature": "createTorusGeometry(majorRadius = 0.4, minorRadius = 0.15, majorSegments = 24, minorSegments = 12)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/gpu/IndirectDrawSystem",
      "path": "engine/reference/render/gpu/IndirectDrawSystem.md",
      "source": "engine/render/gpu/IndirectDrawSystem.js",
      "import": "/engine/render/gpu/IndirectDrawSystem.js",
      "sourceHash": "04a76570c357f074f07a0d264654dd0278ce58badfb4b3b63cd111fec422ed39",
      "summary": "",
      "exports": [
        {
          "name": "IndirectDrawSystem",
          "kind": "class",
          "signature": "class IndirectDrawSystem",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/index",
      "path": "engine/reference/render/index.md",
      "source": "engine/render/index.js",
      "import": "/engine/render/index.js",
      "sourceHash": "0f5f50532d86bf6a44a78e5837037ddf315629c37b22b4f1f448ae515b40c7e6",
      "summary": "Engine Render Modules Exports all render-related utilities from subfolders",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/lighting/RealtimeGI",
      "path": "engine/reference/render/lighting/RealtimeGI.md",
      "source": "engine/render/lighting/RealtimeGI.js",
      "import": "/engine/render/lighting/RealtimeGI.js",
      "sourceHash": "7b44666a07d441c4cdd2a91bb4f834a5381e8c64f9a902670132912c4a236cc0",
      "summary": "",
      "exports": [
        {
          "name": "RealtimeGI",
          "kind": "class",
          "signature": "class RealtimeGI",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/AnimatedMaterialSystem",
      "path": "engine/reference/render/materials/AnimatedMaterialSystem.md",
      "source": "engine/render/materials/AnimatedMaterialSystem.js",
      "import": "/engine/render/materials/AnimatedMaterialSystem.js",
      "sourceHash": "aeff82e937099ba15870230f4703a379569ac2ad0faa5f7febc05487e4b32a30",
      "summary": "AnimatedMaterialSystem.js Per-frame evaluation of animated material node graphs. Materials with Time nodes in their graph get evaluated every frame, producing live PBR values (baseColor, metallic, roughness, emissive) that the viewport renderer uses instead of static material definitions.",
      "exports": [
        {
          "name": "initAnimatedMaterials",
          "kind": "function",
          "signature": "async initAnimatedMaterials(materialLibrary)",
          "summary": "Initialize the animated material system. Scans all materials for animated node graphs and caches them."
        },
        {
          "name": "tickAnimatedMaterials",
          "kind": "function",
          "signature": "tickAnimatedMaterials()",
          "summary": "Evaluate all animated material graphs for this frame. Call once per frame before rendering entities."
        },
        {
          "name": "getAnimatedPBR",
          "kind": "function",
          "signature": "getAnimatedPBR(materialId)",
          "summary": "Get the current-frame animated PBR values for a material. Returns null if the material is not animated."
        },
        {
          "name": "isAnimatedMaterial",
          "kind": "function",
          "signature": "isAnimatedMaterial(materialId)",
          "summary": "Check if a material is registered as animated."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/BindGroupManager",
      "path": "engine/reference/render/materials/BindGroupManager.md",
      "source": "engine/render/materials/BindGroupManager.js",
      "import": "/engine/render/materials/BindGroupManager.js",
      "sourceHash": "847bbcbda58f2ff535ec4694ab546e60ac7995aae2d7c3dad537e38ebfd1cb41",
      "summary": "BindGroupLayoutBuilder - Fluent API for building bind group layouts",
      "exports": [
        {
          "name": "BindGroupLayoutBuilder",
          "kind": "class",
          "signature": "class BindGroupLayoutBuilder",
          "summary": "BindGroupLayoutBuilder - Fluent API for building bind group layouts"
        },
        {
          "name": "FrameBindGroup",
          "kind": "class",
          "signature": "class FrameBindGroup",
          "summary": "FrameBindGroup - Manages Group 0 (per-frame global data)"
        },
        {
          "name": "MaterialBindGroup",
          "kind": "class",
          "signature": "class MaterialBindGroup",
          "summary": "MaterialBindGroup - Manages Group 1 (per-material data)"
        },
        {
          "name": "ObjectBindGroup",
          "kind": "class",
          "signature": "class ObjectBindGroup",
          "summary": "ObjectBindGroup - Manages Group 2 (per-object data like transforms)"
        },
        {
          "name": "BindGroupCache",
          "kind": "class",
          "signature": "class BindGroupCache",
          "summary": "BindGroupCache - Caches bind groups to avoid recreation"
        },
        {
          "name": "createVoxelBindGroupLayouts",
          "kind": "function",
          "signature": "createVoxelBindGroupLayouts(device)",
          "summary": "Create the standard voxel renderer bind group layouts"
        },
        {
          "name": "BIND_GROUP_FREQUENCY",
          "kind": "constant",
          "signature": "BIND_GROUP_FREQUENCY",
          "summary": "Bind group frequency tiers"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/MaterialLibrary",
      "path": "engine/reference/render/materials/MaterialLibrary.md",
      "source": "engine/render/materials/MaterialLibrary.js",
      "import": "/engine/render/materials/MaterialLibrary.js",
      "sourceHash": "da56fe8b87daaedec0f3ef7f8880727b951c41185917b2f231ac25386fa994bd",
      "summary": "MaterialLibrary.js - Material CRUD & Persistence Manages a collection of PBR material definitions. Each material has: - PBR scalar properties (metallic, roughness, emissive intensity) - Color values (baseColor, emissiveColor) - Texture slot paths (albedo, normal, metallicRoughness, emissive, ao) - Metadata (id, label, tags) Persists to localStorage and can export/import JSON.",
      "exports": [
        {
          "name": "readMaterialLibraryRecord",
          "kind": "function",
          "signature": "readMaterialLibraryRecord(storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "writeMaterialLibraryRecord",
          "kind": "function",
          "signature": "writeMaterialLibraryRecord(materials, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "normalizeMaterial",
          "kind": "function",
          "signature": "normalizeMaterial(input)",
          "summary": "Normalize a material descriptor, filling missing fields with defaults."
        },
        {
          "name": "createMaterialLibrary",
          "kind": "function",
          "signature": "createMaterialLibrary(storage = globalThis.localStorage)",
          "summary": "Create a MaterialLibrary instance."
        },
        {
          "name": "MATERIAL_LIBRARY_SCHEMA",
          "kind": "constant",
          "signature": "MATERIAL_LIBRARY_SCHEMA",
          "summary": ""
        },
        {
          "name": "MATERIAL_LIBRARY_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "MATERIAL_LIBRARY_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/MaterialSystem",
      "path": "engine/reference/render/materials/MaterialSystem.md",
      "source": "engine/render/materials/MaterialSystem.js",
      "import": "/engine/render/materials/MaterialSystem.js",
      "sourceHash": "0efbdaf20e183c1b1a7632887511bea6745287c2386178b75b181b6c1efab815",
      "summary": "",
      "exports": [
        {
          "name": "normalizeMaterialDescriptor",
          "kind": "function",
          "signature": "normalizeMaterialDescriptor(input)",
          "summary": ""
        },
        {
          "name": "createMaterialSystem",
          "kind": "function",
          "signature": "createMaterialSystem(device, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/PipelineCache",
      "path": "engine/reference/render/materials/PipelineCache.md",
      "source": "engine/render/materials/PipelineCache.js",
      "import": "/engine/render/materials/PipelineCache.js",
      "sourceHash": "b210e97a7906b46d028552d0c10240a2572363a58d44c76729e80f0e9206dc3d",
      "summary": "PipelineCache.js - WebGPU Pipeline Caching and Specialization Implements: 1. Pipeline caching with composite keys (shader + overrides + render state) 2. Async pipeline compilation to prevent frame hitches 3. Pipeline specialization via override constants 4. Automatic pipeline invalidation on shader changes",
      "exports": [
        {
          "name": "RenderStateDescriptor",
          "kind": "class",
          "signature": "class RenderStateDescriptor",
          "summary": "RenderStateDescriptor - Describes render pipeline state"
        },
        {
          "name": "PipelineDescriptor",
          "kind": "class",
          "signature": "class PipelineDescriptor",
          "summary": "PipelineDescriptor - Complete pipeline configuration"
        },
        {
          "name": "ComputePipelineDescriptor",
          "kind": "class",
          "signature": "class ComputePipelineDescriptor",
          "summary": ""
        },
        {
          "name": "PipelineCache",
          "kind": "class",
          "signature": "class PipelineCache",
          "summary": "PipelineCache - Caches compiled pipelines"
        },
        {
          "name": "ComputePipelineCache",
          "kind": "class",
          "signature": "class ComputePipelineCache",
          "summary": ""
        },
        {
          "name": "ShaderModuleCache",
          "kind": "class",
          "signature": "class ShaderModuleCache",
          "summary": "ShaderModuleCache - Caches compiled shader modules"
        },
        {
          "name": "MaterialPipelineManager",
          "kind": "class",
          "signature": "class MaterialPipelineManager",
          "summary": "MaterialPipelineManager - High-level material-to-pipeline management"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/ShaderComposer",
      "path": "engine/reference/render/materials/ShaderComposer.md",
      "source": "engine/render/materials/ShaderComposer.js",
      "import": "/engine/render/materials/ShaderComposer.js",
      "sourceHash": "241e9acad1aa0f4ca5a84d42cbee32d3b4a4fe50154ac75a4d593be608670d3e",
      "summary": "ShaderChunkRegistry - Central registry for shader code chunks",
      "exports": [
        {
          "name": "ShaderChunkRegistry",
          "kind": "class",
          "signature": "class ShaderChunkRegistry",
          "summary": "ShaderChunkRegistry - Central registry for shader code chunks"
        },
        {
          "name": "PipelineOverrides",
          "kind": "class",
          "signature": "class PipelineOverrides",
          "summary": "PipelineOverrides - Manage WGSL override constants WGSL override constants allow compile-time specialization: ```wgsl override USE_NORMAL_MAP: bool = false; override ALPHA_CUTOFF: f32 = 0.5; ```"
        },
        {
          "name": "ShaderVariant",
          "kind": "class",
          "signature": "class ShaderVariant",
          "summary": "ShaderVariant - A specific configuration of a shader"
        },
        {
          "name": "UberShaderBuilder",
          "kind": "class",
          "signature": "class UberShaderBuilder",
          "summary": "UberShaderBuilder - Build ubershaders with feature toggles"
        },
        {
          "name": "createDefaultRegistry",
          "kind": "function",
          "signature": "createDefaultRegistry()",
          "summary": "Create a default shader chunk registry with standard chunks"
        },
        {
          "name": "STANDARD_CHUNKS",
          "kind": "constant",
          "signature": "STANDARD_CHUNKS",
          "summary": "Standard WGSL chunks for voxel rendering"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/Std140Layout",
      "path": "engine/reference/render/materials/Std140Layout.md",
      "source": "engine/render/materials/Std140Layout.js",
      "import": "/engine/render/materials/Std140Layout.js",
      "sourceHash": "b302a6d42b557f2538074fbd90dd56c4c53e42df3c3042a0bd1880f3b41c3261",
      "summary": "Std140StructBuilder - Build CPU-side structs that match GPU layout exactly",
      "exports": [
        {
          "name": "Std140StructBuilder",
          "kind": "class",
          "signature": "class Std140StructBuilder",
          "summary": "Std140StructBuilder - Build CPU-side structs that match GPU layout exactly"
        },
        {
          "name": "Std140StructLayout",
          "kind": "class",
          "signature": "class Std140StructLayout",
          "summary": "Std140StructLayout - Immutable layout definition with write methods"
        },
        {
          "name": "alignOffset",
          "kind": "function",
          "signature": "alignOffset(currentOffset, alignment)",
          "summary": "Calculate aligned offset for a field"
        },
        {
          "name": "createFrameUniformsLayout",
          "kind": "function",
          "signature": "createFrameUniformsLayout()",
          "summary": "Create a FrameUniforms layout matching the VoxelRenderer"
        },
        {
          "name": "createChunkUniformsLayout",
          "kind": "function",
          "signature": "createChunkUniformsLayout()",
          "summary": "Create a ChunkUniforms layout"
        },
        {
          "name": "createPBRMaterialLayout",
          "kind": "function",
          "signature": "createPBRMaterialLayout()",
          "summary": "Create a MaterialUniforms layout for PBR materials"
        },
        {
          "name": "STD140_TYPES",
          "kind": "constant",
          "signature": "STD140_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/TextureManager",
      "path": "engine/reference/render/materials/TextureManager.md",
      "source": "engine/render/materials/TextureManager.js",
      "import": "/engine/render/materials/TextureManager.js",
      "sourceHash": "f3af0fb1e7d010e34a4b56151e64068398a8c91994e25047151001cfc15670f5",
      "summary": "Create a TextureManager instance.",
      "exports": [
        {
          "name": "createTextureManager",
          "kind": "function",
          "signature": "createTextureManager(device, options = {})",
          "summary": "Create a TextureManager instance."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/VoxelMaterial",
      "path": "engine/reference/render/materials/VoxelMaterial.md",
      "source": "engine/render/materials/VoxelMaterial.js",
      "import": "/engine/render/materials/VoxelMaterial.js",
      "sourceHash": "5bb14e08250cb9bf9e85eb226a0b8d6cb6cb6bf3df74ee76049da4d0347a5379",
      "summary": "VoxelMaterial.js - Production Voxel Material Implementation Now powered by vGPU driver Demonstrates the complete material system architecture: - Frequency-based bind groups (Frame/Material/Chunk) - std140-compliant uniform layouts - Pipeline specialization with override constants - Modular shader composition",
      "exports": [
        {
          "name": "VoxelMaterial",
          "kind": "class",
          "signature": "class VoxelMaterial",
          "summary": "VoxelMaterial - Complete material implementation for voxel rendering"
        },
        {
          "name": "createVoxelFrameLayout",
          "kind": "function",
          "signature": "createVoxelFrameLayout()",
          "summary": "Create the Frame uniforms layout (Group 0)"
        },
        {
          "name": "createVoxelMaterialLayout",
          "kind": "function",
          "signature": "createVoxelMaterialLayout()",
          "summary": "Create the Material uniforms layout (Group 1)"
        },
        {
          "name": "createVoxelChunkLayout",
          "kind": "function",
          "signature": "createVoxelChunkLayout()",
          "summary": "Create the Chunk uniforms layout (Group 2)"
        },
        {
          "name": "VOXEL_VERTEX_LAYOUT",
          "kind": "constant",
          "signature": "VOXEL_VERTEX_LAYOUT",
          "summary": "Standard voxel vertex buffer layout"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/VoxelMaterialIntegration",
      "path": "engine/reference/render/materials/VoxelMaterialIntegration.md",
      "source": "engine/render/materials/VoxelMaterialIntegration.js",
      "import": "/engine/render/materials/VoxelMaterialIntegration.js",
      "sourceHash": "93e4962749e0688a62fe44404f57f136c37e25d969710a85cb1ad823942f5f70",
      "summary": "VoxelMaterialManager - Manages voxel materials with the new system",
      "exports": [
        {
          "name": "VoxelMaterialManager",
          "kind": "class",
          "signature": "class VoxelMaterialManager",
          "summary": "VoxelMaterialManager - Manages voxel materials with the new system"
        },
        {
          "name": "createVoxelFrameUniformsLayout",
          "kind": "function",
          "signature": "createVoxelFrameUniformsLayout()",
          "summary": "Create validated Frame uniforms layout matching VoxelRenderer shader"
        },
        {
          "name": "createVoxelChunkUniformsLayout",
          "kind": "function",
          "signature": "createVoxelChunkUniformsLayout()",
          "summary": "Create validated Chunk uniforms layout"
        },
        {
          "name": "createDefaultVoxelOverrides",
          "kind": "function",
          "signature": "createDefaultVoxelOverrides()",
          "summary": "Create default voxel pipeline overrides"
        },
        {
          "name": "createLowQualityOverrides",
          "kind": "function",
          "signature": "createLowQualityOverrides()",
          "summary": "Create low-quality overrides for performance"
        },
        {
          "name": "integrateWithVoxelRenderer",
          "kind": "function",
          "signature": "integrateWithVoxelRenderer(renderer, device)",
          "summary": "Integrate material system with existing VoxelRenderer"
        },
        {
          "name": "createValidatedFrameUniformsBuffer",
          "kind": "function",
          "signature": "createValidatedFrameUniformsBuffer(device)",
          "summary": "Create frame uniforms buffer with validated layout"
        },
        {
          "name": "createValidatedChunkUniformsBuffer",
          "kind": "function",
          "signature": "createValidatedChunkUniformsBuffer(device)",
          "summary": "Create chunk uniforms buffer with validated layout"
        },
        {
          "name": "VOXEL_FEATURES",
          "kind": "constant",
          "signature": "VOXEL_FEATURES",
          "summary": "Voxel shader features that can be toggled via overrides"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/materials/index",
      "path": "engine/reference/render/materials/index.md",
      "source": "engine/render/materials/index.js",
      "import": "/engine/render/materials/index.js",
      "sourceHash": "d5cbf10dc5a31e76ef0db245c541932218072c4ab989722337a84b5c162c34e6",
      "summary": "Create a complete material system for voxel rendering",
      "exports": [
        {
          "name": "createVoxelMaterialSystem",
          "kind": "function",
          "signature": "createVoxelMaterialSystem(device)",
          "summary": "Create a complete material system for voxel rendering"
        },
        {
          "name": "BIND_GROUP_FREQUENCY",
          "kind": "re-export",
          "signature": "BIND_GROUP_FREQUENCY",
          "summary": ""
        },
        {
          "name": "BindGroupCache",
          "kind": "re-export",
          "signature": "BindGroupCache",
          "summary": ""
        },
        {
          "name": "BindGroupLayoutBuilder",
          "kind": "re-export",
          "signature": "BindGroupLayoutBuilder",
          "summary": ""
        },
        {
          "name": "ComputePipelineCache",
          "kind": "re-export",
          "signature": "ComputePipelineCache",
          "summary": ""
        },
        {
          "name": "ComputePipelineDescriptor",
          "kind": "re-export",
          "signature": "ComputePipelineDescriptor",
          "summary": ""
        },
        {
          "name": "FrameBindGroup",
          "kind": "re-export",
          "signature": "FrameBindGroup",
          "summary": ""
        },
        {
          "name": "MaterialBindGroup",
          "kind": "re-export",
          "signature": "MaterialBindGroup",
          "summary": ""
        },
        {
          "name": "MaterialPipelineManager",
          "kind": "re-export",
          "signature": "MaterialPipelineManager",
          "summary": ""
        },
        {
          "name": "ObjectBindGroup",
          "kind": "re-export",
          "signature": "ObjectBindGroup",
          "summary": ""
        },
        {
          "name": "PipelineCache",
          "kind": "re-export",
          "signature": "PipelineCache",
          "summary": ""
        },
        {
          "name": "PipelineDescriptor",
          "kind": "re-export",
          "signature": "PipelineDescriptor",
          "summary": ""
        },
        {
          "name": "PipelineOverrides",
          "kind": "re-export",
          "signature": "PipelineOverrides",
          "summary": ""
        },
        {
          "name": "RenderStateDescriptor",
          "kind": "re-export",
          "signature": "RenderStateDescriptor",
          "summary": ""
        },
        {
          "name": "STANDARD_CHUNKS",
          "kind": "re-export",
          "signature": "STANDARD_CHUNKS",
          "summary": ""
        },
        {
          "name": "STD140_TYPES",
          "kind": "re-export",
          "signature": "STD140_TYPES",
          "summary": ""
        },
        {
          "name": "ShaderChunkRegistry",
          "kind": "re-export",
          "signature": "ShaderChunkRegistry",
          "summary": ""
        },
        {
          "name": "ShaderModuleCache",
          "kind": "re-export",
          "signature": "ShaderModuleCache",
          "summary": ""
        },
        {
          "name": "ShaderVariant",
          "kind": "re-export",
          "signature": "ShaderVariant",
          "summary": ""
        },
        {
          "name": "Std140StructBuilder",
          "kind": "re-export",
          "signature": "Std140StructBuilder",
          "summary": ""
        },
        {
          "name": "Std140StructLayout",
          "kind": "re-export",
          "signature": "Std140StructLayout",
          "summary": ""
        },
        {
          "name": "UberShaderBuilder",
          "kind": "re-export",
          "signature": "UberShaderBuilder",
          "summary": ""
        },
        {
          "name": "VOXEL_FEATURES",
          "kind": "re-export",
          "signature": "VOXEL_FEATURES",
          "summary": ""
        },
        {
          "name": "VoxelMaterialManager",
          "kind": "re-export",
          "signature": "VoxelMaterialManager",
          "summary": ""
        },
        {
          "name": "alignOffset",
          "kind": "re-export",
          "signature": "alignOffset",
          "summary": ""
        },
        {
          "name": "createChunkUniformsLayout",
          "kind": "re-export",
          "signature": "createChunkUniformsLayout",
          "summary": ""
        },
        {
          "name": "createDefaultRegistry",
          "kind": "re-export",
          "signature": "createDefaultRegistry",
          "summary": ""
        },
        {
          "name": "createDefaultVoxelOverrides",
          "kind": "re-export",
          "signature": "createDefaultVoxelOverrides",
          "summary": ""
        },
        {
          "name": "createFrameUniformsLayout",
          "kind": "re-export",
          "signature": "createFrameUniformsLayout",
          "summary": ""
        },
        {
          "name": "createLowQualityOverrides",
          "kind": "re-export",
          "signature": "createLowQualityOverrides",
          "summary": ""
        },
        {
          "name": "createMaterialLibrary",
          "kind": "re-export",
          "signature": "createMaterialLibrary",
          "summary": ""
        },
        {
          "name": "createMaterialSystem",
          "kind": "re-export",
          "signature": "createMaterialSystem",
          "summary": ""
        },
        {
          "name": "createPBRMaterialLayout",
          "kind": "re-export",
          "signature": "createPBRMaterialLayout",
          "summary": ""
        },
        {
          "name": "createTextureManager",
          "kind": "re-export",
          "signature": "createTextureManager",
          "summary": ""
        },
        {
          "name": "createValidatedChunkUniformsBuffer",
          "kind": "re-export",
          "signature": "createValidatedChunkUniformsBuffer",
          "summary": ""
        },
        {
          "name": "createValidatedFrameUniformsBuffer",
          "kind": "re-export",
          "signature": "createValidatedFrameUniformsBuffer",
          "summary": ""
        },
        {
          "name": "createVoxelBindGroupLayouts",
          "kind": "re-export",
          "signature": "createVoxelBindGroupLayouts",
          "summary": ""
        },
        {
          "name": "createVoxelChunkUniformsLayout",
          "kind": "re-export",
          "signature": "createVoxelChunkUniformsLayout",
          "summary": ""
        },
        {
          "name": "createVoxelFrameUniformsLayout",
          "kind": "re-export",
          "signature": "createVoxelFrameUniformsLayout",
          "summary": ""
        },
        {
          "name": "integrateWithVoxelRenderer",
          "kind": "re-export",
          "signature": "integrateWithVoxelRenderer",
          "summary": ""
        },
        {
          "name": "normalizeMaterial",
          "kind": "re-export",
          "signature": "normalizeMaterial",
          "summary": ""
        },
        {
          "name": "normalizeMaterialDescriptor",
          "kind": "re-export",
          "signature": "normalizeMaterialDescriptor",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/ClothMeshRenderer",
      "path": "engine/reference/render/mesh/ClothMeshRenderer.md",
      "source": "engine/render/mesh/ClothMeshRenderer.js",
      "import": "/engine/render/mesh/ClothMeshRenderer.js",
      "sourceHash": "df5205d002a6f32f0e755c3ff6f638b8fce929ced06570c8ff6619299980d376",
      "summary": "ClothMeshRenderer.js - GPU Cloth Mesh Rendering Renders cloth simulations as triangle meshes with proper shading. Reads particle positions from GPU buffer and generates mesh on the fly.",
      "exports": [
        {
          "name": "ClothMeshRenderer",
          "kind": "class",
          "signature": "class ClothMeshRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/CustomMeshRegistry",
      "path": "engine/reference/render/mesh/CustomMeshRegistry.md",
      "source": "engine/render/mesh/CustomMeshRegistry.js",
      "import": "/engine/render/mesh/CustomMeshRegistry.js",
      "sourceHash": "09896bc5b783e59ff67753e2f9d11b30340a2d0b646a1d694bb300d416194c3f",
      "summary": "============================================================================ CustomMeshRegistry.js - Store imported mesh geometry for custom models ============================================================================",
      "exports": [
        {
          "name": "registerCustomMesh",
          "kind": "function",
          "signature": "registerCustomMesh(meshKey, geo)",
          "summary": "Register a custom mesh geometry."
        },
        {
          "name": "unregisterCustomMesh",
          "kind": "function",
          "signature": "unregisterCustomMesh(meshKey)",
          "summary": "Unregister a custom mesh."
        },
        {
          "name": "getCustomMesh",
          "kind": "function",
          "signature": "getCustomMesh(meshKey)",
          "summary": "Get geometry data for a custom mesh."
        },
        {
          "name": "isCustomMesh",
          "kind": "function",
          "signature": "isCustomMesh(meshType)",
          "summary": "Check if a meshType is a custom (imported) mesh."
        },
        {
          "name": "getRegisteredMeshTypes",
          "kind": "function",
          "signature": "getRegisteredMeshTypes()",
          "summary": "Get all registered custom mesh keys."
        },
        {
          "name": "onMeshRegistered",
          "kind": "function",
          "signature": "onMeshRegistered(fn)",
          "summary": "Subscribe to mesh registration events. Callback: (meshKey, geo) => void"
        },
        {
          "name": "getCustomMeshCount",
          "kind": "function",
          "signature": "getCustomMeshCount()",
          "summary": "Get count of registered custom meshes."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/EntityMeshRenderer",
      "path": "engine/reference/render/mesh/EntityMeshRenderer.md",
      "source": "engine/render/mesh/EntityMeshRenderer.js",
      "import": "/engine/render/mesh/EntityMeshRenderer.js",
      "sourceHash": "4c596adc351c3e2126ff808d7094db220c2bdacdee3efad9da959e2ede5a61bb",
      "summary": "",
      "exports": [
        {
          "name": "EntityMeshRenderer",
          "kind": "class",
          "signature": "class EntityMeshRenderer",
          "summary": ""
        },
        {
          "name": "entityMaterialParamsData",
          "kind": "function",
          "signature": "entityMaterialParamsData(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/GPUSkinning",
      "path": "engine/reference/render/mesh/GPUSkinning.md",
      "source": "engine/render/mesh/GPUSkinning.js",
      "import": "/engine/render/mesh/GPUSkinning.js",
      "sourceHash": "8d9afd01100c42fbe1f1c544b3fce3fc21e1ae59996e54210ff8b1356e485a95",
      "summary": "============================================================================ GPUSkinning.js — Compute-shader skeletal skinning  Moves vertex skinning from CPU to GPU. Per skinned mesh: Static buffers (uploaded once):  bind-pose positions+normals+tangents, UVs, joint indices, joint weights Dynamic buffer (per frame):       skin matrices (jointCount × mat4x4) Output:                           interleaved vertex buffer (pos3+norm3+uv2+tangent4) with STORAGE|VERTEX usage so the existing render pipeline reads it directly.  The compute shader skins all vertices in parallel (workgroup_size=64). ============================================================================",
      "exports": [
        {
          "name": "GPUSkinning",
          "kind": "class",
          "signature": "class GPUSkinning",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/ProceduralSkeleton",
      "path": "engine/reference/render/mesh/ProceduralSkeleton.md",
      "source": "engine/render/mesh/ProceduralSkeleton.js",
      "import": "/engine/render/mesh/ProceduralSkeleton.js",
      "sourceHash": "b0fffec3d355091069957c1d9c828eeaf9645dbd5077d9d23114ef0edcaeac03",
      "summary": "============================================================================ ProceduralSkeleton.js — Auto-generate skeleton + skin weights for arbitrary meshes  Uses PCA to find principal axes, places bones along them, and computes smooth distance-based vertex weights (4 influences per vertex). Output format matches glTF import so it plugs directly into registerSkinnedMesh() / SkeletalAnimation.js. ============================================================================",
      "exports": [
        {
          "name": "generateProceduralSkeleton",
          "kind": "function",
          "signature": "generateProceduralSkeleton(positions, normals, options = {})",
          "summary": "Generate a procedural skeleton for an arbitrary mesh. Algorithm: 1. Compute mesh centroid + covariance matrix 2. PCA via Jacobi iteration → 3 principal axes sorted by extent 3. Place bones along principal axis (chain), with optional branches along secondary axis if mesh is wide enough 4. Compute per-vertex weights: 4 nearest bones, inverse-distance 5. Build inverse bind matrices (identity rotation, translation only)"
        },
        {
          "name": "augmentGeoWithSkeleton",
          "kind": "function",
          "signature": "augmentGeoWithSkeleton(geo, options)",
          "summary": "Convenience: generate skeleton AND augment geo object in-place. Returns the skeleton object for passing to registerSkinnedMesh."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/RopeMeshRenderer",
      "path": "engine/reference/render/mesh/RopeMeshRenderer.md",
      "source": "engine/render/mesh/RopeMeshRenderer.js",
      "import": "/engine/render/mesh/RopeMeshRenderer.js",
      "sourceHash": "4267285e542d7ae57b7055f634c1f37c4cd56203678896fd19961af15b860617",
      "summary": "RopeMeshRenderer.js - GPU Rope Mesh Rendering with Anisotropic Fiber Shading Renders rope simulations as smooth tube meshes with Marschner hair shading model. Supports twist, color blending, and material properties for realistic fiber appearance.",
      "exports": [
        {
          "name": "RopeMeshRenderer",
          "kind": "class",
          "signature": "class RopeMeshRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/SkeletalAnimation",
      "path": "engine/reference/render/mesh/SkeletalAnimation.md",
      "source": "engine/render/mesh/SkeletalAnimation.js",
      "import": "/engine/render/mesh/SkeletalAnimation.js",
      "sourceHash": "4b4bff67cacdb1d683e8b968483b7d34e57d74e1077bd5e49d264b219b52820d",
      "summary": "============================================================================ SkeletalAnimation.js - CPU skeletal animation + skinning for imported models  Evaluates glTF animations per-frame, computes joint world matrices, and skins vertex positions/normals/tangents on CPU. Updates the GPU vertex buffer via EntityMeshRenderer. ============================================================================",
      "exports": [
        {
          "name": "registerSkinnedMesh",
          "kind": "function",
          "signature": "registerSkinnedMesh(meshKey, geo, skeleton, animations)",
          "summary": "Register a skinned mesh for animation playback."
        },
        {
          "name": "unregisterSkinnedMesh",
          "kind": "function",
          "signature": "unregisterSkinnedMesh(meshKey)",
          "summary": "Unregister a skinned mesh."
        },
        {
          "name": "getSkinnedMesh",
          "kind": "function",
          "signature": "getSkinnedMesh(meshKey)",
          "summary": "Get a skinned mesh instance."
        },
        {
          "name": "tickSkeletalAnimations",
          "kind": "function",
          "signature": "tickSkeletalAnimations(dt)",
          "summary": "Tick all active skinned meshes. Call once per frame before rendering."
        },
        {
          "name": "registerModelNodeAnimation",
          "kind": "function",
          "signature": "registerModelNodeAnimation(modelInstanceId, graph, animations, playbackState = null)",
          "summary": "Register ordinary glTF node animation once per model entity instance."
        },
        {
          "name": "unregisterModelNodeAnimation",
          "kind": "function",
          "signature": "unregisterModelNodeAnimation(modelInstanceId)",
          "summary": ""
        },
        {
          "name": "getModelNodeAnimation",
          "kind": "function",
          "signature": "getModelNodeAnimation(modelInstanceId)",
          "summary": ""
        },
        {
          "name": "getModelNodeAnimationState",
          "kind": "function",
          "signature": "getModelNodeAnimationState(modelInstanceId)",
          "summary": ""
        },
        {
          "name": "getModelNodeAnimationDescriptor",
          "kind": "function",
          "signature": "getModelNodeAnimationDescriptor(modelInstanceId)",
          "summary": ""
        },
        {
          "name": "setModelNodeAnimationState",
          "kind": "function",
          "signature": "setModelNodeAnimationState(modelInstanceId, playbackState)",
          "summary": ""
        },
        {
          "name": "getModelNodeWorldMatrix",
          "kind": "function",
          "signature": "getModelNodeWorldMatrix(modelInstanceId, nodeIndex)",
          "summary": ""
        },
        {
          "name": "getModelNodeAnimationKeys",
          "kind": "function",
          "signature": "getModelNodeAnimationKeys()",
          "summary": ""
        },
        {
          "name": "consumeModelNodeAnimationDirty",
          "kind": "function",
          "signature": "consumeModelNodeAnimationDirty(modelInstanceId)",
          "summary": ""
        },
        {
          "name": "bindSkinnedMeshNodeAnimation",
          "kind": "function",
          "signature": "bindSkinnedMeshNodeAnimation(meshKey, modelInstanceId)",
          "summary": ""
        },
        {
          "name": "isSkinnedMesh",
          "kind": "function",
          "signature": "isSkinnedMesh(meshKey)",
          "summary": "Check if a meshKey has skeletal animation."
        },
        {
          "name": "getSkinnedGeometry",
          "kind": "function",
          "signature": "getSkinnedGeometry(meshKey)",
          "summary": "Get the current skinned positions/normals/tangents for a mesh. Returns null if not a skinned mesh."
        },
        {
          "name": "getSkinnedBounds",
          "kind": "function",
          "signature": "getSkinnedBounds(meshKey)",
          "summary": "Compute current local-space skinned bounds from bind vertices and live skin matrices. This remains authoritative when GPU skinning intentionally leaves CPU outputs stale."
        },
        {
          "name": "getCachedSkinnedBounds",
          "kind": "function",
          "signature": "getCachedSkinnedBounds(meshKey)",
          "summary": "Get the current bounds already refreshed by the animation/ragdoll tick."
        },
        {
          "name": "getMorphWeights",
          "kind": "function",
          "signature": "getMorphWeights(meshKey)",
          "summary": ""
        },
        {
          "name": "setMorphWeights",
          "kind": "function",
          "signature": "setMorphWeights(meshKey, weights)",
          "summary": ""
        },
        {
          "name": "getMorphTargetCount",
          "kind": "function",
          "signature": "getMorphTargetCount(meshKey)",
          "summary": ""
        },
        {
          "name": "getModelMorphState",
          "kind": "function",
          "signature": "getModelMorphState(parts)",
          "summary": ""
        },
        {
          "name": "getModelMorphDescriptor",
          "kind": "function",
          "signature": "getModelMorphDescriptor(parts)",
          "summary": ""
        },
        {
          "name": "setModelMorphState",
          "kind": "function",
          "signature": "setModelMorphState(parts, state)",
          "summary": ""
        },
        {
          "name": "getSkinnedMeshKeys",
          "kind": "function",
          "signature": "getSkinnedMeshKeys()",
          "summary": "Get all registered skinned mesh keys."
        },
        {
          "name": "getBoneCapsules",
          "kind": "function",
          "signature": "getBoneCapsules(meshKey)",
          "summary": "Get per-bone capsule dimensions computed from vertex weights. Returns cached data computed once at registration time."
        },
        {
          "name": "getAnimatedBoneShapes",
          "kind": "function",
          "signature": "getAnimatedBoneShapes(meshKey, entityPos)",
          "summary": "Get ANIMATED bone shapes for visual overlay rendering. Returns current-frame bone positions/rotations with mesh-measured capsule sizes. Uses the CURRENT animated worldMatrices so capsules track the animation exactly. This is the PRIMARY API for the visual bone overlay in Viewport.js. Each bone returns: - pos: world position (midpoint between bone and first child) - rot: quaternion aligning Y-axis with bone direction - radius: mesh-measured perpendicular distance (90th percentile) - halfHeight: half the bone length minus radius - name: bone name for debug/classification - parentIndex: parent bone index (-1 for roots) - isTerminal: true for end/nub bones (skip rendering)"
        },
        {
          "name": "getBindPoseBones",
          "kind": "function",
          "signature": "getBindPoseBones(meshKey, entityPos)",
          "summary": "Get bind-pose bone data WITHOUT modifying state (no ragdoll, no animation stop). Used for edit-mode SDF collider visualization preview."
        },
        {
          "name": "enableRagdoll",
          "kind": "function",
          "signature": "enableRagdoll(meshKey, entityPos)",
          "summary": "Enable ragdoll mode for a skinned mesh. Stops animation and returns bind-pose bone world positions + hierarchy for creating physics bodies."
        },
        {
          "name": "setRagdollBoneTransforms",
          "kind": "function",
          "signature": "setRagdollBoneTransforms(meshKey, boneWorldMatrices)",
          "summary": "Update bone world matrices from ragdoll physics transforms, then reskin."
        },
        {
          "name": "disableRagdoll",
          "kind": "function",
          "signature": "disableRagdoll(meshKey)",
          "summary": "Disable ragdoll mode, resuming animation."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/VirtualGeometrySystem",
      "path": "engine/reference/render/mesh/VirtualGeometrySystem.md",
      "source": "engine/render/mesh/VirtualGeometrySystem.js",
      "import": "/engine/render/mesh/VirtualGeometrySystem.js",
      "sourceHash": "e357de7c40817d095e56143d5abde6ea61b1b7ef4df4a030f02d4f3db2886a18",
      "summary": "",
      "exports": [
        {
          "name": "VirtualGeometrySystem",
          "kind": "class",
          "signature": "class VirtualGeometrySystem",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/mesh/index",
      "path": "engine/reference/render/mesh/index.md",
      "source": "engine/render/mesh/index.js",
      "import": "/engine/render/mesh/index.js",
      "sourceHash": "a1a44fa691c576dc2e6235c36b911fd552a8dfb45876e44463a77443226b704b",
      "summary": "Mesh Renderers - GPU mesh rendering utilities",
      "exports": [
        {
          "name": "ClothMeshRenderer",
          "kind": "re-export",
          "signature": "ClothMeshRenderer",
          "summary": ""
        },
        {
          "name": "EntityMeshRenderer",
          "kind": "re-export",
          "signature": "EntityMeshRenderer",
          "summary": ""
        },
        {
          "name": "RopeMeshRenderer",
          "kind": "re-export",
          "signature": "RopeMeshRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/assets/MorphAssetCodec",
      "path": "engine/reference/render/morphfield/assets/MorphAssetCodec.md",
      "source": "engine/render/morphfield/assets/MorphAssetCodec.js",
      "import": "/engine/render/morphfield/assets/MorphAssetCodec.js",
      "sourceHash": "0bbd5e27ba6414d4b92606e64c4e8ff950d6129acbd9ec6de602e2517bbab11d",
      "summary": "",
      "exports": [
        {
          "name": "encodeMorphAsset",
          "kind": "function",
          "signature": "async encodeMorphAsset(sceneInput, options = {})",
          "summary": ""
        },
        {
          "name": "decodeMorphAsset",
          "kind": "function",
          "signature": "async decodeMorphAsset(input, options = {})",
          "summary": ""
        },
        {
          "name": "loadMorphAsset",
          "kind": "function",
          "signature": "async loadMorphAsset(source, options = {})",
          "summary": ""
        },
        {
          "name": "writeMorphAsset",
          "kind": "constant",
          "signature": "writeMorphAsset",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/assets/MorphAssetFormat",
      "path": "engine/reference/render/morphfield/assets/MorphAssetFormat.md",
      "source": "engine/render/morphfield/assets/MorphAssetFormat.js",
      "import": "/engine/render/morphfield/assets/MorphAssetFormat.js",
      "sourceHash": "e7445cceb4685d4faba9713be4d96acde50da3eaecb6aeb5683d554df602752d",
      "summary": "",
      "exports": [
        {
          "name": "fourCCToUint32",
          "kind": "function",
          "signature": "fourCCToUint32(value)",
          "summary": ""
        },
        {
          "name": "uint32ToFourCC",
          "kind": "function",
          "signature": "uint32ToFourCC(value)",
          "summary": ""
        },
        {
          "name": "MORPH_ASSET_MAGIC",
          "kind": "constant",
          "signature": "MORPH_ASSET_MAGIC",
          "summary": ""
        },
        {
          "name": "MORPH_ASSET_HEADER_BYTES",
          "kind": "constant",
          "signature": "MORPH_ASSET_HEADER_BYTES",
          "summary": ""
        },
        {
          "name": "MORPH_ASSET_DIRECTORY_ENTRY_BYTES",
          "kind": "constant",
          "signature": "MORPH_ASSET_DIRECTORY_ENTRY_BYTES",
          "summary": ""
        },
        {
          "name": "MORPH_ASSET_VERSION",
          "kind": "constant",
          "signature": "MORPH_ASSET_VERSION",
          "summary": ""
        },
        {
          "name": "MORPH_HEADER_FLAG",
          "kind": "constant",
          "signature": "MORPH_HEADER_FLAG",
          "summary": ""
        },
        {
          "name": "MORPH_HEADER_FLAG_MASK",
          "kind": "constant",
          "signature": "MORPH_HEADER_FLAG_MASK",
          "summary": ""
        },
        {
          "name": "MORPH_CHUNK_FLAG",
          "kind": "constant",
          "signature": "MORPH_CHUNK_FLAG",
          "summary": ""
        },
        {
          "name": "MORPH_CHUNK_FLAG_MASK",
          "kind": "constant",
          "signature": "MORPH_CHUNK_FLAG_MASK",
          "summary": ""
        },
        {
          "name": "MORPH_COMPRESSION",
          "kind": "constant",
          "signature": "MORPH_COMPRESSION",
          "summary": ""
        },
        {
          "name": "MORPH_COMPRESSION_NAME",
          "kind": "constant",
          "signature": "MORPH_COMPRESSION_NAME",
          "summary": ""
        },
        {
          "name": "MORPH_CHUNK_TYPE",
          "kind": "constant",
          "signature": "MORPH_CHUNK_TYPE",
          "summary": ""
        },
        {
          "name": "MORPH_KNOWN_CHUNK_TYPES",
          "kind": "constant",
          "signature": "MORPH_KNOWN_CHUNK_TYPES",
          "summary": ""
        },
        {
          "name": "MORPH_ASSET_LIMITS",
          "kind": "constant",
          "signature": "MORPH_ASSET_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/assets/index",
      "path": "engine/reference/render/morphfield/assets/index.md",
      "source": "engine/render/morphfield/assets/index.js",
      "import": "/engine/render/morphfield/assets/index.js",
      "sourceHash": "dfaeada42bc84e4b921ef4f66848840bad244faeddc29f5787e3b8829300f09c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/assets/selfTest",
      "path": "engine/reference/render/morphfield/assets/selfTest.md",
      "source": "engine/render/morphfield/assets/selfTest.js",
      "import": "/engine/render/morphfield/assets/selfTest.js",
      "sourceHash": "874c17b28dcf9c996dc3624585306313b94b13918e6444836021eacfb80c0bd2",
      "summary": "",
      "exports": [
        {
          "name": "runMorphAssetSelfTests",
          "kind": "function",
          "signature": "async runMorphAssetSelfTests()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/AabbBvh",
      "path": "engine/reference/render/morphfield/core/AabbBvh.md",
      "source": "engine/render/morphfield/core/AabbBvh.js",
      "import": "/engine/render/morphfield/core/AabbBvh.js",
      "sourceHash": "6a7a10f7e837d3fd73244cbceb19b805aee604c467663080650d12352a2c059f",
      "summary": "",
      "exports": [
        {
          "name": "AabbBvh",
          "kind": "class",
          "signature": "class AabbBvh",
          "summary": ""
        },
        {
          "name": "buildAabbBvh",
          "kind": "function",
          "signature": "buildAabbBvh(leaves)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/FieldletAbi",
      "path": "engine/reference/render/morphfield/core/FieldletAbi.md",
      "source": "engine/render/morphfield/core/FieldletAbi.js",
      "import": "/engine/render/morphfield/core/FieldletAbi.js",
      "sourceHash": "69d5f798feae1331d13bc63ac99bcb2fb38241f875550b5eb7de3743d1f1e954",
      "summary": "",
      "exports": [
        {
          "name": "createOutwardF32Bounds",
          "kind": "function",
          "signature": "createOutwardF32Bounds(bounds, expansion = 0)",
          "summary": ""
        },
        {
          "name": "packFieldletMeta",
          "kind": "function",
          "signature": "packFieldletMeta({ subtype = 0, family = 0, queryMask = 0, flags = 0 } = {})",
          "summary": ""
        },
        {
          "name": "unpackFieldletMeta",
          "kind": "function",
          "signature": "unpackFieldletMeta(meta)",
          "summary": ""
        },
        {
          "name": "createFieldletHeader",
          "kind": "function",
          "signature": "createFieldletHeader({ boundsRef, payloadRef, meta, certificateRef = INVALID_REF })",
          "summary": ""
        },
        {
          "name": "writeFieldletHeader",
          "kind": "function",
          "signature": "writeFieldletHeader(view, byteOffset, header)",
          "summary": ""
        },
        {
          "name": "readFieldletHeader",
          "kind": "function",
          "signature": "readFieldletHeader(view, byteOffset = 0)",
          "summary": ""
        },
        {
          "name": "createCertificateBundle",
          "kind": "function",
          "signature": "createCertificateBundle({ surfaceRef = INVALID_REF, mediumRef = INVALID_REF, motionRef = INVALID_REF, collisionRef = INVALID_REF, } = {})",
          "summary": ""
        },
        {
          "name": "createSurfaceCertificate",
          "kind": "function",
          "signature": "createSurfaceCertificate({ fieldValueErrorMax = 0, lipschitzMax, fallbackBand = 0, motionRadiusMax = 0, })",
          "summary": ""
        },
        {
          "name": "createMediumCertificate",
          "kind": "function",
          "signature": "createMediumCertificate({ densityMax = 0, extinctionMax = 0, emissionLuminanceMax = 0, motionRadiusMax = 0, } = {})",
          "summary": ""
        },
        {
          "name": "createMotionCertificate",
          "kind": "function",
          "signature": "createMotionCertificate({ displacementMax = 0, speedMax = 0, accelerationMax = 0, validDuration = 0, } = {})",
          "summary": ""
        },
        {
          "name": "createCollisionCertificate",
          "kind": "function",
          "signature": "createCollisionCertificate({ fieldValueErrorMax = 0, lipschitzMax, contactOffset, contactSlop = 0, motionRadiusMax = 0, })",
          "summary": ""
        },
        {
          "name": "safeCertifiedStep",
          "kind": "function",
          "signature": "safeCertifiedStep(fieldEstimate, certificate)",
          "summary": ""
        },
        {
          "name": "validateFieldletAbi",
          "kind": "function",
          "signature": "validateFieldletAbi()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/MeshTopologyValidation",
      "path": "engine/reference/render/morphfield/core/MeshTopologyValidation.md",
      "source": "engine/render/morphfield/core/MeshTopologyValidation.js",
      "import": "/engine/render/morphfield/core/MeshTopologyValidation.js",
      "sourceHash": "3874c1d485cfa1edc782a9998870ffb6337d56d3b3b56a5e176da14e73c62516",
      "summary": "Validate finite indexed triangle geometry and, when requested, prove an oriented closed 2-manifold index topology. This is shared by authored indexed Nexels and extracted surface-cache publication.",
      "exports": [
        {
          "name": "validateIndexedTriangleMesh",
          "kind": "function",
          "signature": "validateIndexedTriangleMesh(mesh, options = {})",
          "summary": "Validate finite indexed triangle geometry and, when requested, prove an oriented closed 2-manifold index topology. This is shared by authored indexed Nexels and extracted surface-cache publication."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/MorphFieldCompiler",
      "path": "engine/reference/render/morphfield/core/MorphFieldCompiler.md",
      "source": "engine/render/morphfield/core/MorphFieldCompiler.js",
      "import": "/engine/render/morphfield/core/MorphFieldCompiler.js",
      "sourceHash": "f30c828239cc9ff5ebdfc6a61b415022bc627ef8200fa6e7f356c4b8209959d6",
      "summary": "Qualify a structured-cloned/worker result by deterministically recompiling its authoritative semantic snapshot and comparing every executable ABI byte. This is the cross-realm path; normal same-realm compiler output uses the private registry above and does not pay for a second compilation.",
      "exports": [
        {
          "name": "MorphFieldCompiler",
          "kind": "class",
          "signature": "class MorphFieldCompiler",
          "summary": ""
        },
        {
          "name": "isCompilerProducedCompiledScene",
          "kind": "function",
          "signature": "isCompilerProducedCompiledScene(value)",
          "summary": ""
        },
        {
          "name": "verifyCompiledSceneProvenance",
          "kind": "function",
          "signature": "verifyCompiledSceneProvenance(value)",
          "summary": "Qualify a structured-cloned/worker result by deterministically recompiling its authoritative semantic snapshot and comparing every executable ABI byte. This is the cross-realm path; normal same-realm compiler output uses the private registry above and does not pay for a second compilation."
        },
        {
          "name": "inspectNexelCompilerFeasibility",
          "kind": "function",
          "signature": "inspectNexelCompilerFeasibility(input)",
          "summary": "Run the compiler's exact isolated-descriptor admission gates synchronously. Capability inspection uses this probe so it cannot claim a direct GPU path for a descriptor that compilation would later reject."
        },
        {
          "name": "createMorphFieldCompiler",
          "kind": "function",
          "signature": "createMorphFieldCompiler(options)",
          "summary": ""
        },
        {
          "name": "compileMorphFieldScene",
          "kind": "function",
          "signature": "async compileMorphFieldScene(scene, options)",
          "summary": ""
        },
        {
          "name": "COMPILED_PATCH_SCHEMA",
          "kind": "re-export",
          "signature": "COMPILED_PATCH_SCHEMA",
          "summary": ""
        },
        {
          "name": "COMPILED_SCENE_SCHEMA",
          "kind": "re-export",
          "signature": "COMPILED_SCENE_SCHEMA",
          "summary": ""
        },
        {
          "name": "RUNTIME_DELTA_SCHEMA",
          "kind": "re-export",
          "signature": "RUNTIME_DELTA_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/NexelScene",
      "path": "engine/reference/render/morphfield/core/NexelScene.md",
      "source": "engine/render/morphfield/core/NexelScene.js",
      "import": "/engine/render/morphfield/core/NexelScene.js",
      "sourceHash": "c96f3e0e5dc1e6eb51606550ad58c272e4125e6316aea2ad155cb4680ef3fa69",
      "summary": "",
      "exports": [
        {
          "name": "NexelScene",
          "kind": "class",
          "signature": "class NexelScene",
          "summary": ""
        },
        {
          "name": "normalizeNexelPatch",
          "kind": "function",
          "signature": "normalizeNexelPatch(input)",
          "summary": ""
        },
        {
          "name": "createNexelScene",
          "kind": "function",
          "signature": "createNexelScene(options)",
          "summary": ""
        },
        {
          "name": "isNexelScene",
          "kind": "function",
          "signature": "isNexelScene(value)",
          "summary": ""
        },
        {
          "name": "NEXEL_PATCH_SCHEMA",
          "kind": "re-export",
          "signature": "NEXEL_PATCH_SCHEMA",
          "summary": ""
        },
        {
          "name": "NEXEL_SCENE_SCHEMA",
          "kind": "re-export",
          "signature": "NEXEL_SCENE_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/ReferenceQueries",
      "path": "engine/reference/render/morphfield/core/ReferenceQueries.md",
      "source": "engine/render/morphfield/core/ReferenceQueries.js",
      "import": "/engine/render/morphfield/core/ReferenceQueries.js",
      "sourceHash": "0dfdeb837f906c5cb597751cb91b03172d35ad36b296e91b25ab820a0f531581",
      "summary": "",
      "exports": [
        {
          "name": "MorphFieldReferenceEvaluator",
          "kind": "class",
          "signature": "class MorphFieldReferenceEvaluator",
          "summary": ""
        },
        {
          "name": "evaluateSourceDistance",
          "kind": "function",
          "signature": "evaluateSourceDistance(source, pointValue)",
          "summary": ""
        },
        {
          "name": "evaluateNexelDistance",
          "kind": "function",
          "signature": "evaluateNexelDistance(nexelValue, pointValue)",
          "summary": ""
        },
        {
          "name": "createMorphFieldReferenceEvaluator",
          "kind": "function",
          "signature": "createMorphFieldReferenceEvaluator(sceneOrCompiled)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/Transform",
      "path": "engine/reference/render/morphfield/core/Transform.md",
      "source": "engine/render/morphfield/core/Transform.js",
      "import": "/engine/render/morphfield/core/Transform.js",
      "sourceHash": "b86e4be3c9d2ec8af42a442579bbccf0683dda261b4c83b6c4d354b37a48aded",
      "summary": "",
      "exports": [
        {
          "name": "normalizeVector3",
          "kind": "function",
          "signature": "normalizeVector3(value, path = 'vector', fallback = [0, 0, 0])",
          "summary": ""
        },
        {
          "name": "normalizeQuaternion",
          "kind": "function",
          "signature": "normalizeQuaternion(value, path = 'rotation')",
          "summary": ""
        },
        {
          "name": "matrixFromRigidUniformTransform",
          "kind": "function",
          "signature": "matrixFromRigidUniformTransform(translation, rotation, scale)",
          "summary": ""
        },
        {
          "name": "normalizeTransform",
          "kind": "function",
          "signature": "normalizeTransform(input = undefined, path = 'transform')",
          "summary": ""
        },
        {
          "name": "isIdentityTransform",
          "kind": "function",
          "signature": "isIdentityTransform(transform)",
          "summary": ""
        },
        {
          "name": "transformPoint",
          "kind": "function",
          "signature": "transformPoint(matrix, point)",
          "summary": ""
        },
        {
          "name": "transformDirection",
          "kind": "function",
          "signature": "transformDirection(matrix, direction)",
          "summary": ""
        },
        {
          "name": "transformAabb",
          "kind": "function",
          "signature": "transformAabb(bounds, transform)",
          "summary": ""
        },
        {
          "name": "composeTransforms",
          "kind": "function",
          "signature": "composeTransforms(parent, child)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/constants",
      "path": "engine/reference/render/morphfield/core/constants.md",
      "source": "engine/render/morphfield/core/constants.js",
      "import": "/engine/render/morphfield/core/constants.js",
      "sourceHash": "922ff6ecd178ff759bab70df00d42539551e54380a5f1fa133a231ecf83a9c45",
      "summary": "",
      "exports": [
        {
          "name": "queryMaskForKind",
          "kind": "function",
          "signature": "queryMaskForKind(kind)",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "MORPHFIELD_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "FIELDLET_FAMILY",
          "kind": "constant",
          "signature": "FIELDLET_FAMILY",
          "summary": ""
        },
        {
          "name": "FIELDLET_FAMILY_NAME",
          "kind": "constant",
          "signature": "FIELDLET_FAMILY_NAME",
          "summary": ""
        },
        {
          "name": "FIELDLET_SUBTYPE",
          "kind": "constant",
          "signature": "FIELDLET_SUBTYPE",
          "summary": ""
        },
        {
          "name": "QUERY_KIND",
          "kind": "constant",
          "signature": "QUERY_KIND",
          "summary": ""
        },
        {
          "name": "QUERY_MASK",
          "kind": "constant",
          "signature": "QUERY_MASK",
          "summary": ""
        },
        {
          "name": "FIELDLET_FLAG",
          "kind": "constant",
          "signature": "FIELDLET_FLAG",
          "summary": ""
        },
        {
          "name": "META_LAYOUT",
          "kind": "constant",
          "signature": "META_LAYOUT",
          "summary": ""
        },
        {
          "name": "INVALID_REF",
          "kind": "constant",
          "signature": "INVALID_REF",
          "summary": ""
        },
        {
          "name": "FIELDLET_HEADER_BYTES",
          "kind": "constant",
          "signature": "FIELDLET_HEADER_BYTES",
          "summary": ""
        },
        {
          "name": "FIELDLET_HEADER_WORDS",
          "kind": "constant",
          "signature": "FIELDLET_HEADER_WORDS",
          "summary": ""
        },
        {
          "name": "CERTIFICATE_BUNDLE_BYTES",
          "kind": "constant",
          "signature": "CERTIFICATE_BUNDLE_BYTES",
          "summary": ""
        },
        {
          "name": "CERTIFICATE_RECORD_BYTES",
          "kind": "constant",
          "signature": "CERTIFICATE_RECORD_BYTES",
          "summary": ""
        },
        {
          "name": "FIELDLET_HEADER_WORD",
          "kind": "constant",
          "signature": "FIELDLET_HEADER_WORD",
          "summary": ""
        },
        {
          "name": "CERTIFICATE_BUNDLE_WORD",
          "kind": "constant",
          "signature": "CERTIFICATE_BUNDLE_WORD",
          "summary": ""
        },
        {
          "name": "ANALYTIC_OPCODE",
          "kind": "constant",
          "signature": "ANALYTIC_OPCODE",
          "summary": ""
        },
        {
          "name": "PAYLOAD_SHAPE",
          "kind": "constant",
          "signature": "PAYLOAD_SHAPE",
          "summary": ""
        },
        {
          "name": "ANALYTIC_LIMITS",
          "kind": "constant",
          "signature": "ANALYTIC_LIMITS",
          "summary": ""
        },
        {
          "name": "ANALYTIC_GPU_PARAMETER_MINIMUM",
          "kind": "constant",
          "signature": "ANALYTIC_GPU_PARAMETER_MINIMUM",
          "summary": ""
        },
        {
          "name": "NEXEL_LIMITS",
          "kind": "constant",
          "signature": "NEXEL_LIMITS",
          "summary": ""
        },
        {
          "name": "SOURCE_KIND",
          "kind": "constant",
          "signature": "SOURCE_KIND",
          "summary": ""
        },
        {
          "name": "CSG_OPERATION",
          "kind": "constant",
          "signature": "CSG_OPERATION",
          "summary": ""
        },
        {
          "name": "UPDATE_CLASS",
          "kind": "constant",
          "signature": "UPDATE_CLASS",
          "summary": ""
        },
        {
          "name": "TOPOLOGY_REQUIREMENT",
          "kind": "constant",
          "signature": "TOPOLOGY_REQUIREMENT",
          "summary": ""
        },
        {
          "name": "FEATURE_MODE",
          "kind": "constant",
          "signature": "FEATURE_MODE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/errors",
      "path": "engine/reference/render/morphfield/core/errors.md",
      "source": "engine/render/morphfield/core/errors.js",
      "import": "/engine/render/morphfield/core/errors.js",
      "sourceHash": "533330a8f55988171313011c0a7052d9a5ec18b7ca44239d91c872fb08f5fde1",
      "summary": "",
      "exports": [
        {
          "name": "MorphFieldError",
          "kind": "class",
          "signature": "class MorphFieldError extends Error",
          "summary": ""
        },
        {
          "name": "failMorphField",
          "kind": "function",
          "signature": "failMorphField(code, message, details = undefined)",
          "summary": ""
        },
        {
          "name": "invariant",
          "kind": "function",
          "signature": "invariant(condition, code, message, details = undefined)",
          "summary": ""
        },
        {
          "name": "asMorphFieldError",
          "kind": "function",
          "signature": "asMorphFieldError(error, code, message, details = undefined)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/index",
      "path": "engine/reference/render/morphfield/core/index.md",
      "source": "engine/render/morphfield/core/index.js",
      "import": "/engine/render/morphfield/core/index.js",
      "sourceHash": "53a4ac433583e78c18ea7680cf24bb4e9f722ec5112bd32f95c778e934775629",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/selfTest",
      "path": "engine/reference/render/morphfield/core/selfTest.md",
      "source": "engine/render/morphfield/core/selfTest.js",
      "import": "/engine/render/morphfield/core/selfTest.js",
      "sourceHash": "252515dd36ce7197d17b634a7cbf02d8317989720cd938cc757db1dd3a956016",
      "summary": "",
      "exports": [
        {
          "name": "runMorphFieldCoreSelfTests",
          "kind": "function",
          "signature": "async runMorphFieldCoreSelfTests()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/serialization",
      "path": "engine/reference/render/morphfield/core/serialization.md",
      "source": "engine/render/morphfield/core/serialization.js",
      "import": "/engine/render/morphfield/core/serialization.js",
      "sourceHash": "3fd1e9aa583b9962d5079d5db9f7b4b6ae63d9b96e334d6c27bc09ff7853904a",
      "summary": "Compare identifiers by ECMAScript UTF-16 code-unit order. Unlike localeCompare(), this ordering is independent of the host locale and ICU version, so packed Fieldlet indices remain reproducible across machines.",
      "exports": [
        {
          "name": "isPlainObject",
          "kind": "function",
          "signature": "isPlainObject(value)",
          "summary": ""
        },
        {
          "name": "compareCanonicalStrings",
          "kind": "function",
          "signature": "compareCanonicalStrings(left, right)",
          "summary": "Compare identifiers by ECMAScript UTF-16 code-unit order. Unlike localeCompare(), this ordering is independent of the host locale and ICU version, so packed Fieldlet indices remain reproducible across machines."
        },
        {
          "name": "canonicalize",
          "kind": "function",
          "signature": "canonicalize(value, path = '$', options = {})",
          "summary": ""
        },
        {
          "name": "canonicalStringify",
          "kind": "function",
          "signature": "canonicalStringify(value, options = {})",
          "summary": ""
        },
        {
          "name": "canonicalParse",
          "kind": "function",
          "signature": "canonicalParse(text, options = {})",
          "summary": ""
        },
        {
          "name": "deepFreeze",
          "kind": "function",
          "signature": "deepFreeze(value, visited = new WeakSet()",
          "summary": ""
        },
        {
          "name": "cloneCanonical",
          "kind": "function",
          "signature": "cloneCanonical(value)",
          "summary": ""
        },
        {
          "name": "utf8Encode",
          "kind": "function",
          "signature": "utf8Encode(text)",
          "summary": ""
        },
        {
          "name": "utf8Decode",
          "kind": "function",
          "signature": "utf8Decode(bytes, options = {})",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_CANONICAL_LIMITS",
          "kind": "constant",
          "signature": "MORPHFIELD_CANONICAL_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/core/validation",
      "path": "engine/reference/render/morphfield/core/validation.md",
      "source": "engine/render/morphfield/core/validation.js",
      "import": "/engine/render/morphfield/core/validation.js",
      "sourceHash": "4978d7f3cb256e8c36df8109264d64f50a79f2941884070167bfd2fb176d2f64",
      "summary": "",
      "exports": [
        {
          "name": "normalizeBounds",
          "kind": "function",
          "signature": "normalizeBounds(value, path = 'bounds')",
          "summary": ""
        },
        {
          "name": "normalizeSource",
          "kind": "function",
          "signature": "normalizeSource(input, path = 'source', depth = 0, options = {})",
          "summary": ""
        },
        {
          "name": "validateMaterialF32Channels",
          "kind": "function",
          "signature": "validateMaterialF32Channels(material, path = 'material')",
          "summary": ""
        },
        {
          "name": "validateNexelId",
          "kind": "function",
          "signature": "validateNexelId(value, path = 'id')",
          "summary": ""
        },
        {
          "name": "normalizeNexelDescriptor",
          "kind": "function",
          "signature": "normalizeNexelDescriptor(input, path = 'nexel')",
          "summary": ""
        },
        {
          "name": "planRepresentation",
          "kind": "function",
          "signature": "planRepresentation(source)",
          "summary": ""
        },
        {
          "name": "computeSourceBounds",
          "kind": "function",
          "signature": "computeSourceBounds(source)",
          "summary": ""
        },
        {
          "name": "computeNexelBounds",
          "kind": "function",
          "signature": "computeNexelBounds(nexel)",
          "summary": ""
        },
        {
          "name": "computeNexelQueryMask",
          "kind": "function",
          "signature": "computeNexelQueryMask(nexel)",
          "summary": ""
        },
        {
          "name": "sourceContainsLocalTransforms",
          "kind": "function",
          "signature": "sourceContainsLocalTransforms(source)",
          "summary": ""
        },
        {
          "name": "countAnalyticInstructions",
          "kind": "function",
          "signature": "countAnalyticInstructions(source)",
          "summary": ""
        },
        {
          "name": "maximumAnalyticStackDepth",
          "kind": "function",
          "signature": "maximumAnalyticStackDepth(source)",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_F32_MAX",
          "kind": "constant",
          "signature": "MORPHFIELD_F32_MAX",
          "summary": ""
        },
        {
          "name": "ORIENTED_KERNEL_SUPPORT_SQUARED_RADIUS",
          "kind": "constant",
          "signature": "ORIENTED_KERNEL_SUPPORT_SQUARED_RADIUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/index",
      "path": "engine/reference/render/morphfield/index.md",
      "source": "engine/render/morphfield/index.js",
      "import": "/engine/render/morphfield/index.js",
      "sourceHash": "6fbe91a745a7d5298b89c516e1a2377d651a56bc01799221c5dd89ebe94b3d60",
      "summary": "Create a device-independent semantic Nexel scene.",
      "exports": [
        {
          "name": "createScene",
          "kind": "function",
          "signature": "createScene(options)",
          "summary": "Create a device-independent semantic Nexel scene."
        },
        {
          "name": "createCompiler",
          "kind": "function",
          "signature": "createCompiler(options)",
          "summary": "Create a deterministic device-independent MorphField compiler."
        },
        {
          "name": "encodeAsset",
          "kind": "function",
          "signature": "encodeAsset(scene, options)",
          "summary": "Encode a semantic scene into a bounded, checksummed MOR2 container."
        },
        {
          "name": "loadAsset",
          "kind": "function",
          "signature": "async loadAsset(source, options)",
          "summary": "Load a MOR2 container and return its authoritative semantic Nexel scene. Use inspectAsset() when chunk metadata or provenance is also required."
        },
        {
          "name": "inspectAsset",
          "kind": "function",
          "signature": "inspectAsset(source, options)",
          "summary": "Decode a MOR2 container while retaining provenance and optional chunks."
        },
        {
          "name": "createRenderer",
          "kind": "function",
          "signature": "createRenderer(options)",
          "summary": "Create an external-encoder renderer that borrows its host GPUDevice."
        },
        {
          "name": "createPathTracer",
          "kind": "function",
          "signature": "createPathTracer(options)",
          "summary": "Create the bounded-queue progressive compute path tracer."
        },
        {
          "name": "createMicrostructureRenderer",
          "kind": "function",
          "signature": "createMicrostructureRenderer(options)",
          "summary": "Create the portable u32 render-cluster decoder on a borrowed GPU device."
        },
        {
          "name": "createAffineBrickRenderer",
          "kind": "function",
          "signature": "createAffineBrickRenderer(options)",
          "summary": "Create the direct 32-byte AFFINE4 brick decoder on a borrowed GPU device."
        },
        {
          "name": "MorphField",
          "kind": "constant",
          "signature": "MorphField",
          "summary": "Stable public namespace used by Engine.MorphField and bundled window.PE. Internal implementation groups remain inspectable without flattening conflicting ABI aliases into the public method surface."
        },
        {
          "name": "MORPHFIELD_LOGICAL_PHASES",
          "kind": "re-export",
          "signature": "MORPHFIELD_LOGICAL_PHASES",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_QUALITY_TIERS",
          "kind": "re-export",
          "signature": "MORPHFIELD_QUALITY_TIERS",
          "summary": ""
        },
        {
          "name": "MorphFieldQueryEncoder",
          "kind": "re-export",
          "signature": "MorphFieldQueryEncoder",
          "summary": ""
        },
        {
          "name": "MorphFieldRenderer",
          "kind": "re-export",
          "signature": "MorphFieldRenderer",
          "summary": ""
        },
        {
          "name": "MorphFieldWavefrontPathTracer",
          "kind": "re-export",
          "signature": "MorphFieldWavefrontPathTracer",
          "summary": ""
        },
        {
          "name": "NexelAffineBrickRenderer",
          "kind": "re-export",
          "signature": "NexelAffineBrickRenderer",
          "summary": ""
        },
        {
          "name": "NexelMicrostructureRenderer",
          "kind": "re-export",
          "signature": "NexelMicrostructureRenderer",
          "summary": ""
        },
        {
          "name": "canonicalizeCompiledScene",
          "kind": "re-export",
          "signature": "canonicalizeCompiledScene",
          "summary": ""
        },
        {
          "name": "createNexelAffineBrickRenderer",
          "kind": "re-export",
          "signature": "createNexelAffineBrickRenderer",
          "summary": ""
        },
        {
          "name": "createNexelMicrostructureRenderer",
          "kind": "re-export",
          "signature": "createNexelMicrostructureRenderer",
          "summary": ""
        },
        {
          "name": "createWavefrontPathTracer",
          "kind": "re-export",
          "signature": "createWavefrontPathTracer",
          "summary": ""
        },
        {
          "name": "inspectDeviceCapabilities",
          "kind": "re-export",
          "signature": "inspectDeviceCapabilities",
          "summary": ""
        },
        {
          "name": "inspectNexelComputeCapabilities",
          "kind": "re-export",
          "signature": "inspectNexelComputeCapabilities",
          "summary": ""
        },
        {
          "name": "validateBorrowedDevice",
          "kind": "re-export",
          "signature": "validateBorrowedDevice",
          "summary": ""
        },
        {
          "name": "validateCompiledSceneAbi",
          "kind": "re-export",
          "signature": "validateCompiledSceneAbi",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/AdaptiveQualityGovernor",
      "path": "engine/reference/render/morphfield/runtime/AdaptiveQualityGovernor.md",
      "source": "engine/render/morphfield/runtime/AdaptiveQualityGovernor.js",
      "import": "/engine/render/morphfield/runtime/AdaptiveQualityGovernor.js",
      "sourceHash": "909f4ea54d5aa39a4e8c5a355c948be07789461ddea1d2349b4f80e6e790e914",
      "summary": "",
      "exports": [
        {
          "name": "normalizeQualityDecision",
          "kind": "function",
          "signature": "normalizeQualityDecision(decision, fallback, options = {})",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_QUALITY_TIERS",
          "kind": "constant",
          "signature": "MORPHFIELD_QUALITY_TIERS",
          "summary": ""
        },
        {
          "name": "AdaptiveQualityGovernor",
          "kind": "re-export",
          "signature": "AdaptiveQualityGovernor",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/MorphFieldRenderer",
      "path": "engine/reference/render/morphfield/runtime/MorphFieldRenderer.md",
      "source": "engine/render/morphfield/runtime/MorphFieldRenderer.js",
      "import": "/engine/render/morphfield/runtime/MorphFieldRenderer.js",
      "sourceHash": "c3eef7dc3c65f61b9864d77c133b1000ac5bb572ee462af31cf8bbffac776258",
      "summary": "",
      "exports": [
        {
          "name": "MorphFieldRenderer",
          "kind": "class",
          "signature": "class MorphFieldRenderer",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_LOGICAL_PHASES",
          "kind": "re-export",
          "signature": "MORPHFIELD_LOGICAL_PHASES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/NexelAffineBrickRenderer",
      "path": "engine/reference/render/morphfield/runtime/NexelAffineBrickRenderer.md",
      "source": "engine/render/morphfield/runtime/NexelAffineBrickRenderer.js",
      "import": "/engine/render/morphfield/runtime/NexelAffineBrickRenderer.js",
      "sourceHash": "2e44dde5c6ca2951530ee7c30dac61f494774cbb01b885d4e260a50865da9df8",
      "summary": "Directly expands 32-byte AFFINE4 morphology payloads into render-only cells. Simulation/collision remains attached to the authoritative MorphField scene.",
      "exports": [
        {
          "name": "NexelAffineBrickRenderer",
          "kind": "class",
          "signature": "class NexelAffineBrickRenderer",
          "summary": "Directly expands 32-byte AFFINE4 morphology payloads into render-only cells. Simulation/collision remains attached to the authoritative MorphField scene."
        },
        {
          "name": "createNexelAffineBrickRenderer",
          "kind": "function",
          "signature": "createNexelAffineBrickRenderer(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/NexelAffineBrickShaders",
      "path": "engine/reference/render/morphfield/runtime/NexelAffineBrickShaders.md",
      "source": "engine/render/morphfield/runtime/NexelAffineBrickShaders.js",
      "import": "/engine/render/morphfield/runtime/NexelAffineBrickShaders.js",
      "sourceHash": "83edf0228f426022de2f3636f986de264d0e9b4590673899a9fcdc41e95938be",
      "summary": "Direct GPU expansion of a 32-byte, sixty-four-microcube AFFINE4 payload.",
      "exports": [
        {
          "name": "NEXEL_AFFINE_BRICK_SHADER_WGSL",
          "kind": "constant",
          "signature": "NEXEL_AFFINE_BRICK_SHADER_WGSL",
          "summary": "Direct GPU expansion of a 32-byte, sixty-four-microcube AFFINE4 payload."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/NexelMicrostructureRenderer",
      "path": "engine/reference/render/morphfield/runtime/NexelMicrostructureRenderer.md",
      "source": "engine/render/morphfield/runtime/NexelMicrostructureRenderer.js",
      "import": "/engine/render/morphfield/runtime/NexelMicrostructureRenderer.js",
      "sourceHash": "24d588ca09b699e4839bcc59197e5d77e91fc020044912ccab4b7e5b1b3213f9",
      "summary": "A borrowed-device, external-encoder renderer. Each 32-byte parent Nexel is decoded directly in WGSL into at most eight render-only samples.",
      "exports": [
        {
          "name": "NexelMicrostructureRenderer",
          "kind": "class",
          "signature": "class NexelMicrostructureRenderer",
          "summary": "A borrowed-device, external-encoder renderer. Each 32-byte parent Nexel is decoded directly in WGSL into at most eight render-only samples."
        },
        {
          "name": "createNexelMicrostructureRenderer",
          "kind": "function",
          "signature": "createNexelMicrostructureRenderer(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/NexelMicrostructureShaders",
      "path": "engine/reference/render/morphfield/runtime/NexelMicrostructureShaders.md",
      "source": "engine/render/morphfield/runtime/NexelMicrostructureShaders.js",
      "import": "/engine/render/morphfield/runtime/NexelMicrostructureShaders.js",
      "sourceHash": "967ac5f1a526d125366c003242bf9e30a3e86585ff6bb03bed3168c364159369",
      "summary": "Portable u32 direct-decode renderer for RM(1,3) Nexel clusters.",
      "exports": [
        {
          "name": "NEXEL_MICROSTRUCTURE_SHADER_WGSL",
          "kind": "constant",
          "signature": "NEXEL_MICROSTRUCTURE_SHADER_WGSL",
          "summary": "Portable u32 direct-decode renderer for RM(1,3) Nexel clusters."
        },
        {
          "name": "NEXEL_AFFINE_SHADER_PLAN_SIGNATURE",
          "kind": "re-export",
          "signature": "NEXEL_AFFINE_SHADER_PLAN_SIGNATURE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/NexelPresentationRuntime",
      "path": "engine/reference/render/morphfield/runtime/NexelPresentationRuntime.md",
      "source": "engine/render/morphfield/runtime/NexelPresentationRuntime.js",
      "import": "/engine/render/morphfield/runtime/NexelPresentationRuntime.js",
      "sourceHash": "a18cd7f36ae3a3923227fed97f0afe5867ba7544824516e0e21172d4fc6529de",
      "summary": "",
      "exports": [
        {
          "name": "finiteNexelNumber",
          "kind": "function",
          "signature": "finiteNexelNumber(value, fallback = 0)",
          "summary": ""
        },
        {
          "name": "clampNexelNumber",
          "kind": "function",
          "signature": "clampNexelNumber(value, minimum, maximum)",
          "summary": ""
        },
        {
          "name": "checkedNexelU32",
          "kind": "function",
          "signature": "checkedNexelU32(value, label)",
          "summary": ""
        },
        {
          "name": "finiteNexelVector",
          "kind": "function",
          "signature": "finiteNexelVector(value, length, label)",
          "summary": ""
        },
        {
          "name": "packNexelRgba8",
          "kind": "function",
          "signature": "packNexelRgba8(color)",
          "summary": ""
        },
        {
          "name": "nextNexelCapacity",
          "kind": "function",
          "signature": "nextNexelCapacity(required, maximum)",
          "summary": ""
        },
        {
          "name": "assertNexelShaderCompiles",
          "kind": "function",
          "signature": "async assertNexelShaderCompiles(module, label)",
          "summary": ""
        },
        {
          "name": "writeNexelFrameUniforms",
          "kind": "function",
          "signature": "writeNexelFrameUniforms(target, { camera, viewport, time, frameCount, quality, pointGain, projectionScale, opacity, } = {})",
          "summary": ""
        },
        {
          "name": "createNexelOverlayPassDescriptor",
          "kind": "function",
          "signature": "createNexelOverlayPassDescriptor(label, target, depthFormat)",
          "summary": ""
        },
        {
          "name": "NEXEL_FRAME_UNIFORM_BYTES",
          "kind": "constant",
          "signature": "NEXEL_FRAME_UNIFORM_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/NexelShaderPlan",
      "path": "engine/reference/render/morphfield/runtime/NexelShaderPlan.md",
      "source": "engine/render/morphfield/runtime/NexelShaderPlan.js",
      "import": "/engine/render/morphfield/runtime/NexelShaderPlan.js",
      "sourceHash": "5bb707bba078bb2d314f0ba9d700d637d35015dae526411f48887f4c64693a29",
      "summary": "Root-Algebra-style immutable execution plan shared by every Nexel shader.",
      "exports": [
        {
          "name": "NEXEL_AFFINE_SHADER_PLAN_SIGNATURE",
          "kind": "constant",
          "signature": "NEXEL_AFFINE_SHADER_PLAN_SIGNATURE",
          "summary": ""
        },
        {
          "name": "NEXEL_AFFINE_DECODER_WGSL",
          "kind": "constant",
          "signature": "NEXEL_AFFINE_DECODER_WGSL",
          "summary": "Root-Algebra-style immutable execution plan shared by every Nexel shader."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/QueryEncoder",
      "path": "engine/reference/render/morphfield/runtime/QueryEncoder.md",
      "source": "engine/render/morphfield/runtime/QueryEncoder.js",
      "import": "/engine/render/morphfield/runtime/QueryEncoder.js",
      "sourceHash": "9e7739f619a66fb05d3ceb5b0793173bed9d3041c06b8549755a7dd331dac055",
      "summary": "",
      "exports": [
        {
          "name": "MorphFieldQueryEncoder",
          "kind": "class",
          "signature": "class MorphFieldQueryEncoder",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/ResourceOwnershipTracker",
      "path": "engine/reference/render/morphfield/runtime/ResourceOwnershipTracker.md",
      "source": "engine/render/morphfield/runtime/ResourceOwnershipTracker.js",
      "import": "/engine/render/morphfield/runtime/ResourceOwnershipTracker.js",
      "sourceHash": "57c2f817d361f3d270229d3d8bb01d807771dfdab0eb5748a7334700c5983ba3",
      "summary": "",
      "exports": [
        {
          "name": "ResourceOwnershipTracker",
          "kind": "class",
          "signature": "class ResourceOwnershipTracker",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/RuntimeShaders",
      "path": "engine/reference/render/morphfield/runtime/RuntimeShaders.md",
      "source": "engine/render/morphfield/runtime/RuntimeShaders.js",
      "import": "/engine/render/morphfield/runtime/RuntimeShaders.js",
      "sourceHash": "010d0db982a29a0c1a5d125eaed3a364444dbedd6b8387aa2fe23cba240f7b3e",
      "summary": "",
      "exports": [
        {
          "name": "FRAME_UNIFORMS_WGSL",
          "kind": "constant",
          "signature": "FRAME_UNIFORMS_WGSL",
          "summary": ""
        },
        {
          "name": "FIELDLET_SCENE_WGSL",
          "kind": "constant",
          "signature": "FIELDLET_SCENE_WGSL",
          "summary": ""
        },
        {
          "name": "FIELDLET_SCENE_LINEAR_WGSL",
          "kind": "constant",
          "signature": "FIELDLET_SCENE_LINEAR_WGSL",
          "summary": ""
        },
        {
          "name": "FIELDLET_SCENE_TILE_LINEAR_WGSL",
          "kind": "constant",
          "signature": "FIELDLET_SCENE_TILE_LINEAR_WGSL",
          "summary": ""
        },
        {
          "name": "TRACE_SHADER_WGSL",
          "kind": "constant",
          "signature": "TRACE_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "TRACE_LINEAR_SHADER_WGSL",
          "kind": "constant",
          "signature": "TRACE_LINEAR_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "TRACE_TILE_BVH_SHADER_WGSL",
          "kind": "constant",
          "signature": "TRACE_TILE_BVH_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "TILE_BVH_BIN_SHADER_WGSL",
          "kind": "constant",
          "signature": "TILE_BVH_BIN_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "PHASE_SHADER_WGSL",
          "kind": "constant",
          "signature": "PHASE_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "ACCUMULATION_SHADER_WGSL",
          "kind": "constant",
          "signature": "ACCUMULATION_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_RESOLVE_SHADER_WGSL",
          "kind": "constant",
          "signature": "WAVEFRONT_RESOLVE_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "COMPOSITE_SHADER_WGSL",
          "kind": "constant",
          "signature": "COMPOSITE_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "QUERY_SHADER_WGSL",
          "kind": "constant",
          "signature": "QUERY_SHADER_WGSL",
          "summary": ""
        },
        {
          "name": "QUERY_LINEAR_SHADER_WGSL",
          "kind": "constant",
          "signature": "QUERY_LINEAR_SHADER_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/SceneBufferUploader",
      "path": "engine/reference/render/morphfield/runtime/SceneBufferUploader.md",
      "source": "engine/render/morphfield/runtime/SceneBufferUploader.js",
      "import": "/engine/render/morphfield/runtime/SceneBufferUploader.js",
      "sourceHash": "a96b919792bdade5c69730a2e9f5458eeacea525e28892f00fc3adbed18dc5b1",
      "summary": "Validate the compiler-to-runtime binary contract without granting runtime trust.  This is intentionally useful for diagnostics and fuzzing; renderer activation separately requires the private compiler-origin registry.",
      "exports": [
        {
          "name": "SceneBufferUploader",
          "kind": "class",
          "signature": "class SceneBufferUploader",
          "summary": ""
        },
        {
          "name": "validateCompiledSceneAbi",
          "kind": "function",
          "signature": "validateCompiledSceneAbi(scene)",
          "summary": "Validate the compiler-to-runtime binary contract without granting runtime trust.  This is intentionally useful for diagnostics and fuzzing; renderer activation separately requires the private compiler-origin registry."
        },
        {
          "name": "normalizeCompiledScene",
          "kind": "function",
          "signature": "normalizeCompiledScene(scene)",
          "summary": ""
        },
        {
          "name": "packSpatialRecords",
          "kind": "function",
          "signature": "packSpatialRecords(canonical)",
          "summary": "Pack Fieldlet bounds, compiler BVH nodes, per-Fieldlet collision metadata, and one validated scene trailer in a single storage binding. WebGPU guarantees only eight storage buffers per shader stage on the portable baseline, so tracing and queries cannot add separate spatial or collision bindings to the existing scene ABI."
        },
        {
          "name": "FIELDLET_FAMILY",
          "kind": "constant",
          "signature": "FIELDLET_FAMILY",
          "summary": ""
        },
        {
          "name": "ANALYTIC_SUBTYPE",
          "kind": "constant",
          "signature": "ANALYTIC_SUBTYPE",
          "summary": ""
        },
        {
          "name": "FIELDLET_SUBTYPE",
          "kind": "constant",
          "signature": "FIELDLET_SUBTYPE",
          "summary": ""
        },
        {
          "name": "QUERY_KIND",
          "kind": "constant",
          "signature": "QUERY_KIND",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/capabilities",
      "path": "engine/reference/render/morphfield/runtime/capabilities.md",
      "source": "engine/render/morphfield/runtime/capabilities.js",
      "import": "/engine/render/morphfield/runtime/capabilities.js",
      "sourceHash": "a030419dd4c8a377f0d0875b75973911faf51cbb70dd975dbb6ddb171c462843",
      "summary": "Reports optional compute paths separately from the portable u32 baseline. Support is not evidence that a pipeline selected or used a feature; callers must record those two states alongside benchmark results.",
      "exports": [
        {
          "name": "bufferUsage",
          "kind": "function",
          "signature": "bufferUsage(...names)",
          "summary": ""
        },
        {
          "name": "textureUsage",
          "kind": "function",
          "signature": "textureUsage(...names)",
          "summary": ""
        },
        {
          "name": "shaderStages",
          "kind": "function",
          "signature": "shaderStages(...names)",
          "summary": ""
        },
        {
          "name": "validateBorrowedDevice",
          "kind": "function",
          "signature": "validateBorrowedDevice(device)",
          "summary": ""
        },
        {
          "name": "validateExternalEncoder",
          "kind": "function",
          "signature": "validateExternalEncoder(encoder)",
          "summary": ""
        },
        {
          "name": "inspectDeviceCapabilities",
          "kind": "function",
          "signature": "inspectDeviceCapabilities(device)",
          "summary": ""
        },
        {
          "name": "inspectNexelComputeCapabilities",
          "kind": "function",
          "signature": "inspectNexelComputeCapabilities(device, { wgslLanguageFeatures } = {})",
          "summary": "Reports optional compute paths separately from the portable u32 baseline. Support is not evidence that a pipeline selected or used a feature; callers must record those two states alongside benchmark results."
        },
        {
          "name": "positiveExtent",
          "kind": "function",
          "signature": "positiveExtent(value, maximum)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/index",
      "path": "engine/reference/render/morphfield/runtime/index.md",
      "source": "engine/render/morphfield/runtime/index.js",
      "import": "/engine/render/morphfield/runtime/index.js",
      "sourceHash": "509b437fe307177f1c9c1dd49539e757e0bbb127c826764cf10a65be4df8422b",
      "summary": "Validates and detaches the canonical typed-array ABI published by this realm's MorphFieldCompiler. Authored object Fieldlets and cloned certificate arrays are not a certification boundary and are rejected.",
      "exports": [
        {
          "name": "createRenderer",
          "kind": "function",
          "signature": "async createRenderer(options)",
          "summary": ""
        },
        {
          "name": "canonicalizeCompiledScene",
          "kind": "function",
          "signature": "canonicalizeCompiledScene(scene)",
          "summary": "Validates and detaches the canonical typed-array ABI published by this realm's MorphFieldCompiler. Authored object Fieldlets and cloned certificate arrays are not a certification boundary and are rejected."
        },
        {
          "name": "ANALYTIC_SUBTYPE",
          "kind": "re-export",
          "signature": "ANALYTIC_SUBTYPE",
          "summary": ""
        },
        {
          "name": "AdaptiveQualityGovernor",
          "kind": "re-export",
          "signature": "AdaptiveQualityGovernor",
          "summary": ""
        },
        {
          "name": "FIELDLET_FAMILY",
          "kind": "re-export",
          "signature": "FIELDLET_FAMILY",
          "summary": ""
        },
        {
          "name": "FIELDLET_SUBTYPE",
          "kind": "re-export",
          "signature": "FIELDLET_SUBTYPE",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_LOGICAL_PHASES",
          "kind": "re-export",
          "signature": "MORPHFIELD_LOGICAL_PHASES",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_QUALITY_TIERS",
          "kind": "re-export",
          "signature": "MORPHFIELD_QUALITY_TIERS",
          "summary": ""
        },
        {
          "name": "MorphFieldQueryEncoder",
          "kind": "re-export",
          "signature": "MorphFieldQueryEncoder",
          "summary": ""
        },
        {
          "name": "MorphFieldRenderer",
          "kind": "re-export",
          "signature": "MorphFieldRenderer",
          "summary": ""
        },
        {
          "name": "MorphFieldWavefrontPathTracer",
          "kind": "re-export",
          "signature": "MorphFieldWavefrontPathTracer",
          "summary": ""
        },
        {
          "name": "NexelAffineBrickRenderer",
          "kind": "re-export",
          "signature": "NexelAffineBrickRenderer",
          "summary": ""
        },
        {
          "name": "NexelMicrostructureRenderer",
          "kind": "re-export",
          "signature": "NexelMicrostructureRenderer",
          "summary": ""
        },
        {
          "name": "QUERY_KIND",
          "kind": "re-export",
          "signature": "QUERY_KIND",
          "summary": ""
        },
        {
          "name": "createNexelAffineBrickRenderer",
          "kind": "re-export",
          "signature": "createNexelAffineBrickRenderer",
          "summary": ""
        },
        {
          "name": "createNexelMicrostructureRenderer",
          "kind": "re-export",
          "signature": "createNexelMicrostructureRenderer",
          "summary": ""
        },
        {
          "name": "createWavefrontPathTracer",
          "kind": "re-export",
          "signature": "createWavefrontPathTracer",
          "summary": ""
        },
        {
          "name": "inspectDeviceCapabilities",
          "kind": "re-export",
          "signature": "inspectDeviceCapabilities",
          "summary": ""
        },
        {
          "name": "inspectNexelComputeCapabilities",
          "kind": "re-export",
          "signature": "inspectNexelComputeCapabilities",
          "summary": ""
        },
        {
          "name": "validateBorrowedDevice",
          "kind": "re-export",
          "signature": "validateBorrowedDevice",
          "summary": ""
        },
        {
          "name": "validateCompiledSceneAbi",
          "kind": "re-export",
          "signature": "validateCompiledSceneAbi",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/wavefront/MorphFieldWavefrontPathTracer",
      "path": "engine/reference/render/morphfield/runtime/wavefront/MorphFieldWavefrontPathTracer.md",
      "source": "engine/render/morphfield/runtime/wavefront/MorphFieldWavefrontPathTracer.js",
      "import": "/engine/render/morphfield/runtime/wavefront/MorphFieldWavefrontPathTracer.js",
      "sourceHash": "6580cdd8f0f0a896d1c03f4660e0fa0e3ca68974cdeb2a6b65fd5c0617ed9321",
      "summary": "Buffer-only compute wavefront path tracer for compiled MorphField scenes. It borrows every host object, records only into the supplied encoder, and owns only its pipelines, queue/state buffers, uniforms, and accumulation.",
      "exports": [
        {
          "name": "MorphFieldWavefrontPathTracer",
          "kind": "class",
          "signature": "class MorphFieldWavefrontPathTracer",
          "summary": "Buffer-only compute wavefront path tracer for compiled MorphField scenes. It borrows every host object, records only into the supplied encoder, and owns only its pipelines, queue/state buffers, uniforms, and accumulation."
        },
        {
          "name": "createWavefrontPathTracer",
          "kind": "function",
          "signature": "async createWavefrontPathTracer(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/wavefront/WavefrontShaders",
      "path": "engine/reference/render/morphfield/runtime/wavefront/WavefrontShaders.md",
      "source": "engine/render/morphfield/runtime/wavefront/WavefrontShaders.js",
      "import": "/engine/render/morphfield/runtime/wavefront/WavefrontShaders.js",
      "sourceHash": "ed597e806e04668ed95acc506a092699d4300feed1f17740b5e81fd969daf7d0",
      "summary": "",
      "exports": [
        {
          "name": "WAVEFRONT_GENERATE_WGSL",
          "kind": "constant",
          "signature": "WAVEFRONT_GENERATE_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_INTERSECT_WGSL",
          "kind": "constant",
          "signature": "WAVEFRONT_INTERSECT_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SHADE_WGSL",
          "kind": "constant",
          "signature": "WAVEFRONT_SHADE_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SHADOW_WGSL",
          "kind": "constant",
          "signature": "WAVEFRONT_SHADOW_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_FINALIZE_WGSL",
          "kind": "constant",
          "signature": "WAVEFRONT_FINALIZE_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SHADER_SOURCES",
          "kind": "constant",
          "signature": "WAVEFRONT_SHADER_SOURCES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/wavefront/constants",
      "path": "engine/reference/render/morphfield/runtime/wavefront/constants.md",
      "source": "engine/render/morphfield/runtime/wavefront/constants.js",
      "import": "/engine/render/morphfield/runtime/wavefront/constants.js",
      "sourceHash": "31678f569559164161e0e8c2295748ba531e67c175d350651ec5ee8859ed3ad4",
      "summary": "Packs one extension record per material as [transmissionFactor, ior, clearcoatFactor, clearcoatRoughness].",
      "exports": [
        {
          "name": "queueByteSize",
          "kind": "function",
          "signature": "queueByteSize(capacity, recordBytes)",
          "summary": ""
        },
        {
          "name": "packMaterialExtensions",
          "kind": "function",
          "signature": "packMaterialExtensions(descriptors = [])",
          "summary": "Packs one extension record per material as [transmissionFactor, ior, clearcoatFactor, clearcoatRoughness]."
        },
        {
          "name": "WAVEFRONT_WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "WAVEFRONT_WORKGROUP_SIZE",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_MAX_BOUNCES",
          "kind": "constant",
          "signature": "WAVEFRONT_MAX_BOUNCES",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_MAX_TRACE_STEPS",
          "kind": "constant",
          "signature": "WAVEFRONT_MAX_TRACE_STEPS",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_RECORD_BYTES",
          "kind": "constant",
          "signature": "WAVEFRONT_RECORD_BYTES",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_OUTPUT_ENCODING",
          "kind": "constant",
          "signature": "WAVEFRONT_OUTPUT_ENCODING",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SCENE_BUFFER_ABI",
          "kind": "constant",
          "signature": "WAVEFRONT_SCENE_BUFFER_ABI",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_LIMITATIONS",
          "kind": "constant",
          "signature": "WAVEFRONT_LIMITATIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/wavefront/index",
      "path": "engine/reference/render/morphfield/runtime/wavefront/index.md",
      "source": "engine/render/morphfield/runtime/wavefront/index.js",
      "import": "/engine/render/morphfield/runtime/wavefront/index.js",
      "sourceHash": "f682c6b16b96a24b0557be031adf7293f8e5cd13b27edcdc2c2ca94b4c3fcf53",
      "summary": "",
      "exports": [
        {
          "name": "MorphFieldWavefrontPathTracer",
          "kind": "re-export",
          "signature": "MorphFieldWavefrontPathTracer",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_FINALIZE_WGSL",
          "kind": "re-export",
          "signature": "WAVEFRONT_FINALIZE_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_GENERATE_WGSL",
          "kind": "re-export",
          "signature": "WAVEFRONT_GENERATE_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_INTERSECT_WGSL",
          "kind": "re-export",
          "signature": "WAVEFRONT_INTERSECT_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_LIMITATIONS",
          "kind": "re-export",
          "signature": "WAVEFRONT_LIMITATIONS",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_MAX_BOUNCES",
          "kind": "re-export",
          "signature": "WAVEFRONT_MAX_BOUNCES",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_MAX_TRACE_STEPS",
          "kind": "re-export",
          "signature": "WAVEFRONT_MAX_TRACE_STEPS",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_OUTPUT_ENCODING",
          "kind": "re-export",
          "signature": "WAVEFRONT_OUTPUT_ENCODING",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_RECORD_BYTES",
          "kind": "re-export",
          "signature": "WAVEFRONT_RECORD_BYTES",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SCENE_BUFFER_ABI",
          "kind": "re-export",
          "signature": "WAVEFRONT_SCENE_BUFFER_ABI",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SHADER_SOURCES",
          "kind": "re-export",
          "signature": "WAVEFRONT_SHADER_SOURCES",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SHADE_WGSL",
          "kind": "re-export",
          "signature": "WAVEFRONT_SHADE_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_SHADOW_WGSL",
          "kind": "re-export",
          "signature": "WAVEFRONT_SHADOW_WGSL",
          "summary": ""
        },
        {
          "name": "WAVEFRONT_WORKGROUP_SIZE",
          "kind": "re-export",
          "signature": "WAVEFRONT_WORKGROUP_SIZE",
          "summary": ""
        },
        {
          "name": "createWavefrontPathTracer",
          "kind": "re-export",
          "signature": "createWavefrontPathTracer",
          "summary": ""
        },
        {
          "name": "packMaterialExtensions",
          "kind": "re-export",
          "signature": "packMaterialExtensions",
          "summary": ""
        },
        {
          "name": "queueByteSize",
          "kind": "re-export",
          "signature": "queueByteSize",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/runtime/wavefront/selfTest",
      "path": "engine/reference/render/morphfield/runtime/wavefront/selfTest.md",
      "source": "engine/render/morphfield/runtime/wavefront/selfTest.js",
      "import": "/engine/render/morphfield/runtime/wavefront/selfTest.js",
      "sourceHash": "ab3bdc5ce4d8b77fc5a7c2bcbc10c03bed8b9c2bae6c47b50009c08cfcb16eb9",
      "summary": "",
      "exports": [
        {
          "name": "runWavefrontSelfTest",
          "kind": "function",
          "signature": "async runWavefrontSelfTest({ realWebGpu = false, device = null } = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/schemas/ids",
      "path": "engine/reference/render/morphfield/schemas/ids.md",
      "source": "engine/render/morphfield/schemas/ids.js",
      "import": "/engine/render/morphfield/schemas/ids.js",
      "sourceHash": "34de4173a36bdf6b5777d9a344fba2e5110ccf850e6c00c3766f81e206d2183e",
      "summary": "",
      "exports": [
        {
          "name": "MORPHFIELD_JSON_SCHEMA_DIALECT",
          "kind": "constant",
          "signature": "MORPHFIELD_JSON_SCHEMA_DIALECT",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_SCHEMA_IDS",
          "kind": "constant",
          "signature": "MORPHFIELD_SCHEMA_IDS",
          "summary": ""
        },
        {
          "name": "MORPHFIELD_SCHEMA_FILES",
          "kind": "constant",
          "signature": "MORPHFIELD_SCHEMA_FILES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/schemas/index",
      "path": "engine/reference/render/morphfield/schemas/index.md",
      "source": "engine/render/morphfield/schemas/index.js",
      "import": "/engine/render/morphfield/schemas/index.js",
      "sourceHash": "dd5c75ee43bdabd404765ef314cb85996bab911920c0ac5db9f09c259a761f19",
      "summary": "Normalize one semantic Nexel and report the execution/query capabilities the current R2 implementation can honestly provide for it.",
      "exports": [
        {
          "name": "inspectNexelCapabilities",
          "kind": "function",
          "signature": "inspectNexelCapabilities(input)",
          "summary": "Normalize one semantic Nexel and report the execution/query capabilities the current R2 implementation can honestly provide for it."
        },
        {
          "name": "NEXEL_COMPILER_MODE",
          "kind": "constant",
          "signature": "NEXEL_COMPILER_MODE",
          "summary": ""
        },
        {
          "name": "NEXEL_GPU_QUERY_MODE",
          "kind": "constant",
          "signature": "NEXEL_GPU_QUERY_MODE",
          "summary": ""
        },
        {
          "name": "NEXEL_CAPABILITY_PROFILE",
          "kind": "constant",
          "signature": "NEXEL_CAPABILITY_PROFILE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/EngineSimulationAdapters",
      "path": "engine/reference/render/morphfield/systems/EngineSimulationAdapters.md",
      "source": "engine/render/morphfield/systems/EngineSimulationAdapters.js",
      "import": "/engine/render/morphfield/systems/EngineSimulationAdapters.js",
      "sourceHash": "5a7b16a009c1208eda606e148adf60b9172bc1bdd053e639f42669ecbd6a9b20",
      "summary": "Adapt the existing particle world to the shared host encoder.",
      "exports": [
        {
          "name": "createParticleWorldAdapter",
          "kind": "function",
          "signature": "createParticleWorldAdapter(world, options = {})",
          "summary": "Adapt the existing particle world to the shared host encoder."
        },
        {
          "name": "createFluidWorldAdapter",
          "kind": "function",
          "signature": "createFluidWorldAdapter(world, options = {})",
          "summary": "Adapt the existing external-encoder fluid grid."
        },
        {
          "name": "createVolumeSystemAdapter",
          "kind": "function",
          "signature": "createVolumeSystemAdapter(volumeSystem, options = {})",
          "summary": "Adapt an existing volume system exposing update(encoder, camera)."
        },
        {
          "name": "createGpuSimulationAdapter",
          "kind": "function",
          "signature": "createGpuSimulationAdapter(descriptor)",
          "summary": "Generic bridge for a caller-owned GPU simulation. It deliberately does not invent domain-specific solver names or resource ownership."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/KernelMedia",
      "path": "engine/reference/render/morphfield/systems/KernelMedia.md",
      "source": "engine/render/morphfield/systems/KernelMedia.js",
      "import": "/engine/render/morphfield/systems/KernelMedia.js",
      "sourceHash": "72577f511465fbb1384366529237afe81554397edd654557aa13ba27ff52c7f8",
      "summary": "CPU reference and bin-builder for semantic anisotropic oriented kernels.",
      "exports": [
        {
          "name": "OrientedKernelSet",
          "kind": "class",
          "signature": "class OrientedKernelSet",
          "summary": "CPU reference and bin-builder for semantic anisotropic oriented kernels."
        },
        {
          "name": "LayeredOITAccumulator",
          "kind": "class",
          "signature": "class LayeredOITAccumulator",
          "summary": "Four exact sorted layers followed by a bounded weighted-blended tail."
        },
        {
          "name": "integrateMedium",
          "kind": "function",
          "signature": "integrateMedium(ray, evaluateMedium, options = {})",
          "summary": "Deterministic reference integrator using a certified extinction majorant."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/NexelMicrostructure",
      "path": "engine/reference/render/morphfield/systems/NexelMicrostructure.md",
      "source": "engine/render/morphfield/systems/NexelMicrostructure.js",
      "import": "/engine/render/morphfield/systems/NexelMicrostructure.js",
      "sourceHash": "4286af7c5032f82315cd6517898c6b1249f6bd7be256af084a14dc7be698b77f",
      "summary": "Portable binary microstructure tools for Nexel render clusters and voxel bricks. These helpers describe local storage and verification only; they do not replace a chunk CRC/authentication tag or an outer error-correcting code.",
      "exports": [
        {
          "name": "compileNexelAffineDecodePlan",
          "kind": "function",
          "signature": "compileNexelAffineDecodePlan()",
          "summary": "Compile the eight affine Boolean equations into one u32 of nibble masks, then exhaustively prove the branch-free parity plan against the reducer. This follows Root Algebra Lab's validated-plan discipline without adopting its deliberately research-only carry/sign multiplier."
        },
        {
          "name": "compileNexelDictionary",
          "kind": "function",
          "signature": "compileNexelDictionary(dictionary = [])",
          "summary": "Compile an immutable exact dictionary and reverse lookup once per codebook."
        },
        {
          "name": "affineCubeSample",
          "kind": "function",
          "signature": "affineCubeSample(morphology, corner)",
          "summary": "Evaluate one corner of an RM(1,3) affine microcube."
        },
        {
          "name": "expandAffineCube",
          "kind": "function",
          "signature": "expandAffineCube(morphology)",
          "summary": "Expand an affine morphology into its exact eight-bit occupancy mask."
        },
        {
          "name": "decodeAffineCube",
          "kind": "function",
          "signature": "decodeAffineCube(pattern)",
          "summary": "Return the affine morphology for a pattern, or null for a non-codeword."
        },
        {
          "name": "affineFaceParitySyndrome",
          "kind": "function",
          "signature": "affineFaceParitySyndrome(pattern)",
          "summary": "Six-bit local face-parity syndrome ordered x0,x1,y0,y1,z0,z1. A valid RM(1,3) word has zero syndrome; another valid word can still evade it."
        },
        {
          "name": "inspectAffineCube",
          "kind": "function",
          "signature": "inspectAffineCube(pattern)",
          "summary": ""
        },
        {
          "name": "countSetBits8",
          "kind": "function",
          "signature": "countSetBits8(value)",
          "summary": ""
        },
        {
          "name": "hammingDistance8",
          "kind": "function",
          "signature": "hammingDistance8(left, right)",
          "summary": ""
        },
        {
          "name": "packNexelMorton3D5",
          "kind": "function",
          "signature": "packNexelMorton3D5(x, y, z)",
          "summary": "Interleave three five-bit coordinates into the descriptor's 15-bit Morton field."
        },
        {
          "name": "unpackNexelMorton3D5",
          "kind": "function",
          "signature": "unpackNexelMorton3D5(mortonCoordinate)",
          "summary": ""
        },
        {
          "name": "encodeNexelMicrocube",
          "kind": "function",
          "signature": "encodeNexelMicrocube(pattern, { dictionary } = {})",
          "summary": "Choose the smallest lossless local mode under the supplied dictionary."
        },
        {
          "name": "decodeNexelMicrocube",
          "kind": "function",
          "signature": "decodeNexelMicrocube(encoded, { dictionary } = {})",
          "summary": ""
        },
        {
          "name": "packNexelDescriptor",
          "kind": "function",
          "signature": "packNexelDescriptor({ mortonCoordinate = 0, material = 0, morphology = 0, state = 0, lod = 0, flags = 0, } = {})",
          "summary": "Pack the research descriptor: 15/6/4/3/2/2 exact integer fields."
        },
        {
          "name": "unpackNexelDescriptor",
          "kind": "function",
          "signature": "unpackNexelDescriptor(word)",
          "summary": ""
        },
        {
          "name": "packAffine4Brick",
          "kind": "function",
          "signature": "packAffine4Brick(patterns)",
          "summary": "Pack sixty-four affine microcubes into eight u32 words (32 bytes)."
        },
        {
          "name": "packAffine4Morphologies",
          "kind": "function",
          "signature": "packAffine4Morphologies(morphologies)",
          "summary": "Pack already-proven morphology nibbles without expanding and re-decoding."
        },
        {
          "name": "unpackAffine4Brick",
          "kind": "function",
          "signature": "unpackAffine4Brick(words)",
          "summary": ""
        },
        {
          "name": "crc32Bytes",
          "kind": "function",
          "signature": "crc32Bytes(bytes)",
          "summary": ""
        },
        {
          "name": "computeAffineBrickFaceSignatures",
          "kind": "function",
          "signature": "computeAffineBrickFaceSignatures(patterns)",
          "summary": ""
        },
        {
          "name": "createAffineNexelBrick",
          "kind": "function",
          "signature": "createAffineNexelBrick(patterns, options = {})",
          "summary": ""
        },
        {
          "name": "createAffineNexelBrickFromMorphologies",
          "kind": "function",
          "signature": "createAffineNexelBrickFromMorphologies(morphologies, options = {})",
          "summary": "Build a brick directly from its sixty-four affine morphology nibbles."
        },
        {
          "name": "verifyAffineNexelBrick",
          "kind": "function",
          "signature": "verifyAffineNexelBrick(brick)",
          "summary": "Recompute every local brick invariant without trusting stored TypedArrays."
        },
        {
          "name": "nexelClusterCornerOrder",
          "kind": "function",
          "signature": "nexelClusterCornerOrder(seed = 0)",
          "summary": "Return a deterministic, exact permutation of the eight microcube corners."
        },
        {
          "name": "NEXEL_MICROCUBE_MODE",
          "kind": "constant",
          "signature": "NEXEL_MICROCUBE_MODE",
          "summary": ""
        },
        {
          "name": "NEXEL_DESCRIPTOR_LAYOUT",
          "kind": "constant",
          "signature": "NEXEL_DESCRIPTOR_LAYOUT",
          "summary": ""
        },
        {
          "name": "NEXEL_CLUSTER_CORNER_ORDER",
          "kind": "constant",
          "signature": "NEXEL_CLUSTER_CORNER_ORDER",
          "summary": ""
        },
        {
          "name": "NEXEL_AFFINE_DECODE_PLAN",
          "kind": "constant",
          "signature": "NEXEL_AFFINE_DECODE_PLAN",
          "summary": ""
        },
        {
          "name": "NEXEL_AFFINE_OCCUPANCY_LUT",
          "kind": "constant",
          "signature": "NEXEL_AFFINE_OCCUPANCY_LUT",
          "summary": ""
        },
        {
          "name": "NEXEL_ACTIVE_CORNER_LUT",
          "kind": "constant",
          "signature": "NEXEL_ACTIVE_CORNER_LUT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/NexelPbdCollisionAdapter",
      "path": "engine/reference/render/morphfield/systems/NexelPbdCollisionAdapter.md",
      "source": "engine/render/morphfield/systems/NexelPbdCollisionAdapter.js",
      "import": "/engine/render/morphfield/systems/NexelPbdCollisionAdapter.js",
      "sourceHash": "cdde9454a1d1cdc88417dc5c3a0dbc003cec79a1bf2c6fcd571b045ad30c6b75",
      "summary": "Compile semantic static Nexels into PBDSolver collider inputs. PBDSolver's contactRadius remains a predictive OGC shell, while the solver geometry is inset by contactOffset-restOffset so the rendered and collision surfaces settle at the requested restOffset (zero by default).",
      "exports": [
        {
          "name": "NexelPbdCollisionAdapter",
          "kind": "class",
          "signature": "class NexelPbdCollisionAdapter",
          "summary": ""
        },
        {
          "name": "compileNexelPbdColliderSet",
          "kind": "function",
          "signature": "compileNexelPbdColliderSet(descriptorInput, { contactOffset = 0.002, restOffset = 0, friction = 0.36, } = {})",
          "summary": "Compile semantic static Nexels into PBDSolver collider inputs. PBDSolver's contactRadius remains a predictive OGC shell, while the solver geometry is inset by contactOffset-restOffset so the rendered and collision surfaces settle at the requested restOffset (zero by default)."
        },
        {
          "name": "applyNexelPbdColliderSet",
          "kind": "function",
          "signature": "applyNexelPbdColliderSet(solver, colliderSet)",
          "summary": "Apply a compiled collider set without taking ownership of the solver."
        },
        {
          "name": "createNexelPbdCollisionAdapter",
          "kind": "function",
          "signature": "createNexelPbdCollisionAdapter(options)",
          "summary": ""
        },
        {
          "name": "NEXEL_PBD_COLLIDER_KIND",
          "kind": "re-export",
          "signature": "NEXEL_PBD_COLLIDER_KIND",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/ParticleChainNexelAdapter",
      "path": "engine/reference/render/morphfield/systems/ParticleChainNexelAdapter.md",
      "source": "engine/render/morphfield/systems/ParticleChainNexelAdapter.js",
      "import": "/engine/render/morphfield/systems/ParticleChainNexelAdapter.js",
      "sourceHash": "3f0ba2452ac9658dfe4b788c0b6f5f4882d3bceafc19a67a136ad532764e564f",
      "summary": "Convert a caller-owned particle-chain snapshot into stable sphere/capsule Nexels. The simulation remains authoritative; this adapter performs no stepping, GPU readback, queue submission, or resource ownership transfer. Editor PhysicsChain component `links`, CPU PBD `particles`, and ordinary `[x,y,z]` arrays intentionally share this one input contract.",
      "exports": [
        {
          "name": "createParticleChainNexelDescriptors",
          "kind": "function",
          "signature": "createParticleChainNexelDescriptors(snapshot, options = {})",
          "summary": "Convert a caller-owned particle-chain snapshot into stable sphere/capsule Nexels. The simulation remains authoritative; this adapter performs no stepping, GPU readback, queue submission, or resource ownership transfer. Editor PhysicsChain component `links`, CPU PBD `particles`, and ordinary `[x,y,z]` arrays intentionally share this one input contract."
        },
        {
          "name": "createParticleChainNexelPatch",
          "kind": "function",
          "signature": "createParticleChainNexelPatch(scene, snapshot, options = {})",
          "summary": "Build an incremental scene patch while preserving stable chain IDs."
        },
        {
          "name": "PARTICLE_CHAIN_NEXEL_LIMITS",
          "kind": "constant",
          "signature": "PARTICLE_CHAIN_NEXEL_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/QefSolver",
      "path": "engine/reference/render/morphfield/systems/QefSolver.md",
      "source": "engine/render/morphfield/systems/QefSolver.js",
      "import": "/engine/render/morphfield/systems/QefSolver.js",
      "sourceHash": "0a5338dc2576bae0609dc43d06438fdea79710e0678950e82d7171120ff98b8e",
      "summary": "Rank-aware QEF solver using a Jacobi eigendecomposition of the local normal covariance and a truncated pseudoinverse. Coordinates are translated to the cell center before solving to preserve f32-compatible numerical scale.",
      "exports": [
        {
          "name": "solveQef",
          "kind": "function",
          "signature": "solveQef(intersections, normals, bounds, options = {})",
          "summary": "Rank-aware QEF solver using a Jacobi eigendecomposition of the local normal covariance and a truncated pseudoinverse. Coordinates are translated to the cell center before solving to preserve f32-compatible numerical scale."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/RepresentationPlanner",
      "path": "engine/reference/render/morphfield/systems/RepresentationPlanner.md",
      "source": "engine/render/morphfield/systems/RepresentationPlanner.js",
      "import": "/engine/render/morphfield/systems/RepresentationPlanner.js",
      "sourceHash": "6ed000dffdb613adb9727a573e9ea7a5fb327ffcf2eef8a1a16aa9e4331cecb3",
      "summary": "Stable top-level MorphField execution families.",
      "exports": [
        {
          "name": "RepresentationPlanner",
          "kind": "class",
          "signature": "class RepresentationPlanner",
          "summary": "Deterministic representation planner. Source semantics and certificates are authoritative; performance history can only promote an eligible surface to a disposable cache."
        },
        {
          "name": "selectSurfaceExtractor",
          "kind": "function",
          "signature": "selectSurfaceExtractor(intent = {}, capabilities = {})",
          "summary": "Selects a single extractor for an entire connected seam domain. The selector intentionally returns direct rendering when a requested topology guarantee cannot be supported by certified Hermite data."
        },
        {
          "name": "EXECUTION_FAMILY",
          "kind": "constant",
          "signature": "EXECUTION_FAMILY",
          "summary": "Stable top-level MorphField execution families."
        },
        {
          "name": "SURFACE_EXTRACTOR",
          "kind": "constant",
          "signature": "SURFACE_EXTRACTOR",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/ResidualHierarchy",
      "path": "engine/reference/render/morphfield/systems/ResidualHierarchy.md",
      "source": "engine/render/morphfield/systems/ResidualHierarchy.js",
      "import": "/engine/render/morphfield/systems/ResidualHierarchy.js",
      "sourceHash": "009e61bee560637fc050c6a454b1f07cefef0cac7654ce52162e26e2cc8e4619",
      "summary": "Certified scalar residual brick with deterministic trilinear sampling.",
      "exports": [
        {
          "name": "CertifiedResidualBrick",
          "kind": "class",
          "signature": "class CertifiedResidualBrick",
          "summary": "Certified scalar residual brick with deterministic trilinear sampling."
        },
        {
          "name": "ResidualHierarchy",
          "kind": "class",
          "signature": "class ResidualHierarchy",
          "summary": "Revisioned, fixed-budget residual residency manager. The coarsest level is pinned, so every accepted source always has a certified fallback."
        },
        {
          "name": "composeResidualCertificate",
          "kind": "function",
          "signature": "composeResidualCertificate(analytic, residual)",
          "summary": "Compose analytic and residual surface certificates conservatively."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/SimulationScheduler",
      "path": "engine/reference/render/morphfield/systems/SimulationScheduler.md",
      "source": "engine/render/morphfield/systems/SimulationScheduler.js",
      "import": "/engine/render/morphfield/systems/SimulationScheduler.js",
      "sourceHash": "e2edf166ba796f1dc8542c72726fa13512ca3871fd0accd9a7e42e0e1ac3c7b6",
      "summary": "Fixed-step scheduler for external-encoder simulation domains.",
      "exports": [
        {
          "name": "FixedStepSimulationScheduler",
          "kind": "class",
          "signature": "class FixedStepSimulationScheduler",
          "summary": "Fixed-step scheduler for external-encoder simulation domains."
        },
        {
          "name": "createExternalEncoderAdapter",
          "kind": "function",
          "signature": "createExternalEncoderAdapter({ id, authority = 'authoritative', encode, interpolate, updateStride = 1 })",
          "summary": "Wrap an existing external-encoder simulation API without changing its name."
        },
        {
          "name": "createKinematicAdapter",
          "kind": "function",
          "signature": "createKinematicAdapter({ id, sample, apply, authority = 'authoritative' })",
          "summary": "Kinematic adapter that advances a caller-owned transform source."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/SurfaceCacheExtractor",
      "path": "engine/reference/render/morphfield/systems/SurfaceCacheExtractor.md",
      "source": "engine/render/morphfield/systems/SurfaceCacheExtractor.js",
      "import": "/engine/render/morphfield/systems/SurfaceCacheExtractor.js",
      "sourceHash": "9c100ec2a6c7efacb49414a4f6517549dc577c465046991bfab45c205d13eeff",
      "summary": "Device-independent surface cache extractor and validation boundary.",
      "exports": [
        {
          "name": "SurfaceCacheExtractor",
          "kind": "class",
          "signature": "class SurfaceCacheExtractor",
          "summary": "Device-independent surface cache extractor and validation boundary."
        },
        {
          "name": "SurfaceCacheManager",
          "kind": "class",
          "signature": "class SurfaceCacheManager",
          "summary": "Stages complete connected domains and atomically replaces validated entries."
        },
        {
          "name": "validateMesh",
          "kind": "function",
          "signature": "validateMesh(mesh, topologyRequirement = 'unspecified')",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/index",
      "path": "engine/reference/render/morphfield/systems/index.md",
      "source": "engine/render/morphfield/systems/index.js",
      "import": "/engine/render/morphfield/systems/index.js",
      "sourceHash": "d1d3fed255b00b41e3bba384a4cab3720796db00ba91f31f64b0510468ef2686",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/transitions/TransitionBoundary",
      "path": "engine/reference/render/morphfield/systems/transitions/TransitionBoundary.md",
      "source": "engine/render/morphfield/systems/transitions/TransitionBoundary.js",
      "import": "/engine/render/morphfield/systems/transitions/TransitionBoundary.js",
      "sourceHash": "ce86119135f06a253962865bdb9f88d6f41703bc0ed95c5aa3ac02a2aadcb4fc",
      "summary": "Build canonical signatures from the open edges of a transition mesh. Signatures contain complete sorted segment records as well as a compact hash; comparisons therefore never rely on hash equality alone.  World-space quantization makes opposite local face orientations compare identically.",
      "exports": [
        {
          "name": "createTransitionBoundarySignatures",
          "kind": "function",
          "signature": "createTransitionBoundarySignatures(mesh, options = {})",
          "summary": "Build canonical signatures from the open edges of a transition mesh. Signatures contain complete sorted segment records as well as a compact hash; comparisons therefore never rely on hash equality alone.  World-space quantization makes opposite local face orientations compare identically."
        },
        {
          "name": "compareTransitionBoundarySignatures",
          "kind": "function",
          "signature": "compareTransitionBoundarySignatures(left, right)",
          "summary": ""
        },
        {
          "name": "compareTransitionBoundaries",
          "kind": "function",
          "signature": "compareTransitionBoundaries(left, leftFace, right, rightFace)",
          "summary": ""
        },
        {
          "name": "assertTransitionBoundaryMatch",
          "kind": "function",
          "signature": "assertTransitionBoundaryMatch(left, leftFace, right, rightFace)",
          "summary": ""
        },
        {
          "name": "TRANSITION_BOUNDARY_SCHEMA",
          "kind": "constant",
          "signature": "TRANSITION_BOUNDARY_SCHEMA",
          "summary": ""
        },
        {
          "name": "TRANSITION_FACE",
          "kind": "constant",
          "signature": "TRANSITION_FACE",
          "summary": ""
        },
        {
          "name": "TRANSITION_FACE_ORDER",
          "kind": "constant",
          "signature": "TRANSITION_FACE_ORDER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/transitions/TransitionCellExtractor",
      "path": "engine/reference/render/morphfield/systems/transitions/TransitionCellExtractor.md",
      "source": "engine/render/morphfield/systems/transitions/TransitionCellExtractor.js",
      "import": "/engine/render/morphfield/systems/transitions/TransitionCellExtractor.js",
      "sourceHash": "7564d754a463aa532798fb67b2f684bca3cda6228b6027ecfa6aebcffe7613b3",
      "summary": "Extract a deterministic transition slab for one exact-2:1 grid pair.",
      "exports": [
        {
          "name": "TransitionExtractionError",
          "kind": "class",
          "signature": "class TransitionExtractionError extends Error",
          "summary": ""
        },
        {
          "name": "TransitionCellExtractor",
          "kind": "class",
          "signature": "class TransitionCellExtractor",
          "summary": ""
        },
        {
          "name": "validateExact2To1GridPair",
          "kind": "function",
          "signature": "validateExact2To1GridPair(fineInput, coarseInput)",
          "summary": ""
        },
        {
          "name": "extractTransitionInterface",
          "kind": "function",
          "signature": "extractTransitionInterface(input)",
          "summary": "Extract a deterministic transition slab for one exact-2:1 grid pair."
        },
        {
          "name": "TRANSITION_INTERFACE_SCHEMA",
          "kind": "constant",
          "signature": "TRANSITION_INTERFACE_SCHEMA",
          "summary": ""
        },
        {
          "name": "TRANSITION_LIMITS",
          "kind": "constant",
          "signature": "TRANSITION_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/transitions/TransitionValidation",
      "path": "engine/reference/render/morphfield/systems/transitions/TransitionValidation.md",
      "source": "engine/render/morphfield/systems/transitions/TransitionValidation.js",
      "import": "/engine/render/morphfield/systems/transitions/TransitionValidation.js",
      "sourceHash": "f4240952d698cc53b3d8ee8d50cf8bb494dd45513c62eeded2122d7ab4f727cb",
      "summary": "Validate geometry, local manifoldness, winding, exact-2:1 metadata, and all recorded boundary signatures.  Open edges are valid only on one of the six transition-prism faces.",
      "exports": [
        {
          "name": "validateTransitionInterface",
          "kind": "function",
          "signature": "validateTransitionInterface(mesh, options = {})",
          "summary": "Validate geometry, local manifoldness, winding, exact-2:1 metadata, and all recorded boundary signatures.  Open edges are valid only on one of the six transition-prism faces."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/transitions/index",
      "path": "engine/reference/render/morphfield/systems/transitions/index.md",
      "source": "engine/render/morphfield/systems/transitions/index.js",
      "import": "/engine/render/morphfield/systems/transitions/index.js",
      "sourceHash": "6c12fbd148381d590846bcc0c70666f3340bb87dd70193b5b3688b2378a89e60",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/morphfield/systems/transitions/selfTest",
      "path": "engine/reference/render/morphfield/systems/transitions/selfTest.md",
      "source": "engine/render/morphfield/systems/transitions/selfTest.js",
      "import": "/engine/render/morphfield/systems/transitions/selfTest.js",
      "sourceHash": "756a525930d025f1f4daa6e4f3b0d1141dde54fc2342debd095992c60734f4e6",
      "summary": "",
      "exports": [
        {
          "name": "runMorphFieldTransitionSelfTests",
          "kind": "function",
          "signature": "runMorphFieldTransitionSelfTests()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/CustomParticleEffect",
      "path": "engine/reference/render/particles/CustomParticleEffect.md",
      "source": "engine/render/particles/CustomParticleEffect.js",
      "import": "/engine/render/particles/CustomParticleEffect.js",
      "sourceHash": "dd1cfce2edd82e360cae0c47d839fd4313cd98cd3abb2d6f60370fcaa0beba95",
      "summary": "CustomParticleEffect.js - Unified Particle Effect System KEY PRINCIPLE: ONE SDF function defines BOTH: 1. Visual rendering (raymarching in fragment shader) 2. Collision detection (compute shader physics) This ensures particle appearance ALWAYS matches collision shape.",
      "exports": [
        {
          "name": "createCustomEffectId",
          "kind": "function",
          "signature": "createCustomEffectId()",
          "summary": ""
        },
        {
          "name": "createCustomEffectCloneId",
          "kind": "function",
          "signature": "createCustomEffectCloneId(effectId)",
          "summary": ""
        },
        {
          "name": "createImportedEffectId",
          "kind": "function",
          "signature": "createImportedEffectId(effectId)",
          "summary": ""
        },
        {
          "name": "generateVisualShader",
          "kind": "function",
          "signature": "generateVisualShader(effect, options = {})",
          "summary": "Generate visual raymarching shader from effect"
        },
        {
          "name": "generateCollisionShader",
          "kind": "function",
          "signature": "generateCollisionShader(effect)",
          "summary": "Generate collision compute shader from effect"
        },
        {
          "name": "validateEffect",
          "kind": "function",
          "signature": "validateEffect(effect)",
          "summary": "Validate effect WGSL code"
        },
        {
          "name": "compileEffect",
          "kind": "function",
          "signature": "async compileEffect(device, effect)",
          "summary": "Compile effect shaders on device (validates WGSL syntax)"
        },
        {
          "name": "createEffect",
          "kind": "function",
          "signature": "createEffect(options = {})",
          "summary": "Create a new custom effect from template"
        },
        {
          "name": "cloneEffect",
          "kind": "function",
          "signature": "cloneEffect(effect, newId)",
          "summary": "Clone an existing effect"
        },
        {
          "name": "getPresets",
          "kind": "function",
          "signature": "getPresets()",
          "summary": "Get all built-in presets as array"
        },
        {
          "name": "getPreset",
          "kind": "function",
          "signature": "getPreset(id)",
          "summary": "Get preset by ID"
        },
        {
          "name": "CUSTOM_PARTICLE_SPARKLE_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "CUSTOM_PARTICLE_SPARKLE_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "SDF_HELPERS_WGSL",
          "kind": "constant",
          "signature": "SDF_HELPERS_WGSL",
          "summary": ""
        },
        {
          "name": "EFFECT_PRESETS",
          "kind": "constant",
          "signature": "EFFECT_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/CustomParticleEffectIntegration",
      "path": "engine/reference/render/particles/CustomParticleEffectIntegration.md",
      "source": "engine/render/particles/CustomParticleEffectIntegration.js",
      "import": "/engine/render/particles/CustomParticleEffectIntegration.js",
      "sourceHash": "6dd0acdcd19a076833ee7879b27654d6b03f07852f9d6a87d653160358276e39",
      "summary": "CustomParticleEffectIntegration.js - Integration Layer Wires the custom particle effect system into the engine: - Initializes registry on engine startup - Provides utilities for applying effects to emitters - Connects visual effects to collision system",
      "exports": [
        {
          "name": "initCustomParticleEffects",
          "kind": "function",
          "signature": "async initCustomParticleEffects(device)",
          "summary": "Initialize the custom particle effect system Call this during engine initialization"
        },
        {
          "name": "getCompiledEffect",
          "kind": "function",
          "signature": "async getCompiledEffect(device, effectId)",
          "summary": "Get compiled effect shaders for an effect ID"
        },
        {
          "name": "getCollisionSDFSystem",
          "kind": "function",
          "signature": "getCollisionSDFSystem()",
          "summary": "Get the collision SDF system"
        },
        {
          "name": "applyEffectToEmitter",
          "kind": "function",
          "signature": "applyEffectToEmitter(emitterComponent, effectId, params = null)",
          "summary": "Apply a custom effect to a particle emitter component"
        },
        {
          "name": "getEffectForRendering",
          "kind": "function",
          "signature": "getEffectForRendering(effectId)",
          "summary": "Get effect data for rendering"
        },
        {
          "name": "createEffectParamsData",
          "kind": "function",
          "signature": "createEffectParamsData(emitter)",
          "summary": "Create effect parameters buffer data for GPU Returns a reusable Float32Array - DO NOT modify after passing to GPU"
        },
        {
          "name": "getParticleSDF",
          "kind": "function",
          "signature": "getParticleSDF(effectId)",
          "summary": "Get the effective SDF for a particle (for collision queries) Returns a function that evaluates the SDF at a local position"
        },
        {
          "name": "isCustomEffectsInitialized",
          "kind": "function",
          "signature": "isCustomEffectsInitialized()",
          "summary": "Check if custom effects system is initialized"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleAgeRenderer",
      "path": "engine/reference/render/particles/ParticleAgeRenderer.md",
      "source": "engine/render/particles/ParticleAgeRenderer.js",
      "import": "/engine/render/particles/ParticleAgeRenderer.js",
      "sourceHash": "6fde28bc1fa07d51d587a5722effacc7056ecec30aa08c490a4544be24ed41ed",
      "summary": "",
      "exports": [
        {
          "name": "createParticleAgeRenderer",
          "kind": "function",
          "signature": "async createParticleAgeRenderer(options)",
          "summary": ""
        },
        {
          "name": "createParticleAgeDataBindGroup",
          "kind": "function",
          "signature": "createParticleAgeDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": ""
        },
        {
          "name": "setParticleAgeParams",
          "kind": "function",
          "signature": "setParticleAgeParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleAlbedoRenderer",
      "path": "engine/reference/render/particles/ParticleAlbedoRenderer.md",
      "source": "engine/render/particles/ParticleAlbedoRenderer.js",
      "import": "/engine/render/particles/ParticleAlbedoRenderer.js",
      "sourceHash": "db404a9004fd4728bc8c66e8b95dbd5ce5caad99d1237a97353f88b2a63fa5b7",
      "summary": "Create particle albedo pass renderer",
      "exports": [
        {
          "name": "createParticleAlbedoRenderer",
          "kind": "function",
          "signature": "async createParticleAlbedoRenderer(options)",
          "summary": "Create particle albedo pass renderer"
        },
        {
          "name": "createParticleAlbedoDataBindGroup",
          "kind": "function",
          "signature": "createParticleAlbedoDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": "Create data bind group for albedo pass"
        },
        {
          "name": "setParticleAlbedoParams",
          "kind": "function",
          "signature": "setParticleAlbedoParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": "Update albedo pass parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleBeamRenderer",
      "path": "engine/reference/render/particles/ParticleBeamRenderer.md",
      "source": "engine/render/particles/ParticleBeamRenderer.js",
      "import": "/engine/render/particles/ParticleBeamRenderer.js",
      "sourceHash": "177fd3e2b45bff5e7846b9c9d4bf2a78f055ec7891ec0f2e2e81f48c5bd91d10",
      "summary": "ParticleBeamRenderer.js - Beam / Lightning Particle Renderer (GAP 14) Renders connected line segments between sequential particles as thick beams. Supports: - Chain mode: connect particles in sequence (particle 0→1→2→3...) - Source mode: connect all particles to a single source point - Lightning mode: chain + per-segment jitter for electric arcs Each beam segment is a camera-facing quad strip (2 triangles per segment). Width can vary per particle (from meta.w size) and taper at ends. Usage: const beam = await createParticleBeamRenderer(device, { format }); renderBeamParticles(pass, beam, world, { viewProj, instanceCount });",
      "exports": [
        {
          "name": "createParticleBeamRenderer",
          "kind": "function",
          "signature": "async createParticleBeamRenderer(device, options = {})",
          "summary": "Create a particle beam renderer."
        },
        {
          "name": "bindBeamParticleData",
          "kind": "function",
          "signature": "bindBeamParticleData(renderer, world)",
          "summary": "Bind particle data from a particle world."
        },
        {
          "name": "renderBeamParticles",
          "kind": "function",
          "signature": "renderBeamParticles(pass, renderer, options = {})",
          "summary": "Render beam particles."
        },
        {
          "name": "setBeamParams",
          "kind": "function",
          "signature": "setBeamParams(renderer, params = {})",
          "summary": "Update beam parameters."
        },
        {
          "name": "destroyParticleBeamRenderer",
          "kind": "function",
          "signature": "destroyParticleBeamRenderer(renderer)",
          "summary": "Destroy the beam renderer."
        },
        {
          "name": "BEAM_MODE_CHAIN",
          "kind": "constant",
          "signature": "BEAM_MODE_CHAIN",
          "summary": ""
        },
        {
          "name": "BEAM_MODE_SOURCE",
          "kind": "constant",
          "signature": "BEAM_MODE_SOURCE",
          "summary": ""
        },
        {
          "name": "BEAM_MODE_LIGHTNING",
          "kind": "constant",
          "signature": "BEAM_MODE_LIGHTNING",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleBillboardRenderer",
      "path": "engine/reference/render/particles/ParticleBillboardRenderer.md",
      "source": "engine/render/particles/ParticleBillboardRenderer.js",
      "import": "/engine/render/particles/ParticleBillboardRenderer.js",
      "sourceHash": "5e9913adcf6d458591938ae829fb077d5572899bb243fd68f6f2467f6410a861",
      "summary": "Creates a particle point renderer (spheres instead of flat billboards). This renders particles as actual points with spherical falloff.",
      "exports": [
        {
          "name": "createParticlePointRenderer",
          "kind": "function",
          "signature": "async createParticlePointRenderer(options)",
          "summary": "Creates a particle point renderer (spheres instead of flat billboards). This renders particles as actual points with spherical falloff."
        },
        {
          "name": "createParticleBillboardRenderer",
          "kind": "function",
          "signature": "async createParticleBillboardRenderer(options)",
          "summary": "Creates a particle billboard renderer. This is a pure rendering module - it does not own particle simulation."
        },
        {
          "name": "createParticleBillboardDataBindGroup",
          "kind": "function",
          "signature": "createParticleBillboardDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer, uvBuffer, albedoTextureView, albedoSampler)",
          "summary": "Creates a data bind group for a specific particle world. Call this once per particle world you want to render."
        },
        {
          "name": "setParticleBillboardParams",
          "kind": "function",
          "signature": "setParticleBillboardParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0, rotationRate = 0, useColorGradient = false, stretchFactor = 0, facingMode = 0, })",
          "summary": "Updates particle rendering parameters including quality settings."
        },
        {
          "name": "setParticleBillboardDepth",
          "kind": "function",
          "signature": "setParticleBillboardDepth(renderer, depthTextureView, aliveListBuffer)",
          "summary": "Create or update the scene depth + alive list bind group (GAP 17 + 18). Call this when the depth texture changes (e.g. on resize) or when connecting the alive list from IndirectDispatch for GPU indirect draw."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleBlackbodyRenderer",
      "path": "engine/reference/render/particles/ParticleBlackbodyRenderer.md",
      "source": "engine/render/particles/ParticleBlackbodyRenderer.js",
      "import": "/engine/render/particles/ParticleBlackbodyRenderer.js",
      "sourceHash": "40c5027bab6af922823b77aa23eebd9c776d2b590f5a6395f4609b476ebcc253",
      "summary": "ParticleBlackbodyRenderer.js - Blackbody Radiation Renderer (GAP 39) Creates and manages the 1D blackbody LUT texture. Provides bind group for particle fragment shaders to sample temperature → color. Integrates with existing billboard and SDF renderers. Usage: const bb = createBlackbodySystem(device); const bindGroup = getBlackbodyBindGroup(bb); // Set as additional bind group in particle render pass",
      "exports": [
        {
          "name": "createBlackbodySystem",
          "kind": "function",
          "signature": "createBlackbodySystem(device, options = {})",
          "summary": "Create the blackbody rendering system with LUT texture."
        },
        {
          "name": "createBlackbodyBindGroupLayout",
          "kind": "function",
          "signature": "createBlackbodyBindGroupLayout(device)",
          "summary": "Create a bind group layout for blackbody resources. Typically bound as an additional group in particle render pipelines."
        },
        {
          "name": "getBlackbodyBindGroup",
          "kind": "function",
          "signature": "getBlackbodyBindGroup(system, layout)",
          "summary": "Create the bind group for blackbody resources."
        },
        {
          "name": "setBlackbodyEmission",
          "kind": "function",
          "signature": "setBlackbodyEmission(system, strength)",
          "summary": "Update emission strength at runtime."
        },
        {
          "name": "destroyBlackbodySystem",
          "kind": "function",
          "signature": "destroyBlackbodySystem(system)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleBondRenderer",
      "path": "engine/reference/render/particles/ParticleBondRenderer.md",
      "source": "engine/render/particles/ParticleBondRenderer.js",
      "import": "/engine/render/particles/ParticleBondRenderer.js",
      "sourceHash": "b291e93541019f010779b60822f481c29004e6a2bd655deed4f1cfbad7a451b7",
      "summary": "ParticleBondRenderer.js - Bond Line / Stick Renderer (GAP 41) Renders molecular bonds as camera-facing quads between bonded particle pairs. Reads a bond buffer (vec4<u32> per bond: particleA, particleB, bondType, bondOrder). Color blends between element CPK colors at each endpoint. Supports covalent (solid), ionic (dashed), metallic (thick), hydrogen (dotted). Usage: const br = createBondRenderer(device, format); initBondRendererBindGroups(br, device, posBuffer, velBuffer, bondBuffer, colorLutBuffer, elementBuffer); uploadBonds(br, device, bondArray); renderBonds(pass, br, viewProj, cameraPos, viewRight, viewUp, bondCount);",
      "exports": [
        {
          "name": "createBondRenderer",
          "kind": "function",
          "signature": "createBondRenderer(device, format)",
          "summary": "Create the bond renderer."
        },
        {
          "name": "initBondRendererBindGroups",
          "kind": "function",
          "signature": "initBondRendererBindGroups(renderer, device, positionBuffer, velocityBuffer, metaBuffer, thermalBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "uploadBonds",
          "kind": "function",
          "signature": "uploadBonds(renderer, device, bondData, bondCount)",
          "summary": "Upload bond data from CPU."
        },
        {
          "name": "renderBonds",
          "kind": "function",
          "signature": "renderBonds(pass, renderer, viewProj, cameraPos, viewRight, viewUp)",
          "summary": "Render bonds in the given render pass."
        },
        {
          "name": "destroyBondRenderer",
          "kind": "function",
          "signature": "destroyBondRenderer(renderer)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleCollisionSDF",
      "path": "engine/reference/render/particles/ParticleCollisionSDF.md",
      "source": "engine/render/particles/ParticleCollisionSDF.js",
      "import": "/engine/render/particles/ParticleCollisionSDF.js",
      "sourceHash": "f75a833456fa3eb3c1212bc0608d0f3578d1d7b0d482ca640418d7e8ada3c659",
      "summary": "ParticleCollisionSDF.js - Custom SDF Collision Integration Integrates custom particle effect SDFs into the collision system. The same SDF code used for visual rendering is used for collision detection. This module: 1. Generates collision compute shaders with custom SDFs 2. Manages effect-to-index mapping for GPU dispatch 3. Provides collision evaluation utilities",
      "exports": [
        {
          "name": "ParticleCollisionSDFSystem",
          "kind": "class",
          "signature": "class ParticleCollisionSDFSystem",
          "summary": ""
        },
        {
          "name": "registerEffectForCollision",
          "kind": "function",
          "signature": "registerEffectForCollision(effectId)",
          "summary": "Register an effect for collision (assigns an index)"
        },
        {
          "name": "getEffectIndex",
          "kind": "function",
          "signature": "getEffectIndex(effectId)",
          "summary": "Get effect index (0 if not registered)"
        },
        {
          "name": "getEffectByIndex",
          "kind": "function",
          "signature": "getEffectByIndex(index)",
          "summary": "Get effect by index"
        },
        {
          "name": "generateMultiEffectCollisionShader",
          "kind": "function",
          "signature": "generateMultiEffectCollisionShader(registeredEffects)",
          "summary": "Generate the multi-effect collision shader This shader supports switching between different SDFs based on effectId"
        },
        {
          "name": "createCollisionPipeline",
          "kind": "function",
          "signature": "createCollisionPipeline(device, options = {})",
          "summary": "Create collision compute pipeline with custom SDFs"
        },
        {
          "name": "createParticleCollisionSDFSystem",
          "kind": "function",
          "signature": "createParticleCollisionSDFSystem(device)",
          "summary": "Create a particle collision SDF system"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleDecalRenderer",
      "path": "engine/reference/render/particles/ParticleDecalRenderer.md",
      "source": "engine/render/particles/ParticleDecalRenderer.js",
      "import": "/engine/render/particles/ParticleDecalRenderer.js",
      "sourceHash": "4b5e0f5b28037ab94357b71933213e3a091db8e16f3de1e699d6a819a19a5d7a",
      "summary": "ParticleDecalRenderer.js - Render projected decals from particle collisions Renders decal quads at particle impact points (scorch marks, frost patches, wet splats). Reads from ParticleDecalSpawner's CPU-side pool each frame. Pipeline: 1. ParticleDecalSpawner (sim/) creates decal descriptors from collision events 2. This renderer uploads active decals to a GPU storage buffer 3. Instanced draw: each decal = screen-aligned quad projected onto surface 4. Blends onto scene with src-alpha / one-minus-src-alpha Decal data per instance (12 floats): [posX, posY, posZ, size, normX, normY, normZ, age/lifetime, r, g, b, a]",
      "exports": [
        {
          "name": "createDecalRenderer",
          "kind": "function",
          "signature": "createDecalRenderer(device, format)",
          "summary": "Create a decal rendering system"
        },
        {
          "name": "uploadDecals",
          "kind": "function",
          "signature": "uploadDecals(renderer, decals)",
          "summary": "Upload active decals from the CPU-side spawner pool to GPU"
        },
        {
          "name": "renderDecals",
          "kind": "function",
          "signature": "renderDecals(pass, renderer, frameData)",
          "summary": "Render decals into the current render pass"
        },
        {
          "name": "destroyDecalRenderer",
          "kind": "function",
          "signature": "destroyDecalRenderer(renderer)",
          "summary": "Destroy decal renderer resources"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleDepthRenderer",
      "path": "engine/reference/render/particles/ParticleDepthRenderer.md",
      "source": "engine/render/particles/ParticleDepthRenderer.js",
      "import": "/engine/render/particles/ParticleDepthRenderer.js",
      "sourceHash": "bf78f8ccc20f2dff968ffc7f5f93d81803a8b0ecd6a7fcd5044cd4da006388a3",
      "summary": "Create particle depth pass renderer",
      "exports": [
        {
          "name": "createParticleDepthRenderer",
          "kind": "function",
          "signature": "async createParticleDepthRenderer(options)",
          "summary": "Create particle depth pass renderer"
        },
        {
          "name": "createParticleDepthDataBindGroup",
          "kind": "function",
          "signature": "createParticleDepthDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": "Create data bind group for depth pass"
        },
        {
          "name": "setParticleDepthParams",
          "kind": "function",
          "signature": "setParticleDepthParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": "Update depth pass parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleDistortionRenderer",
      "path": "engine/reference/render/particles/ParticleDistortionRenderer.md",
      "source": "engine/render/particles/ParticleDistortionRenderer.js",
      "import": "/engine/render/particles/ParticleDistortionRenderer.js",
      "sourceHash": "8a637fb3f6a3bbc3b227bf260e200dec5be12b634bce71861a80627da112f125",
      "summary": "ParticleDistortionRenderer.js - Heat haze / distortion from particles PopcornFX/Niagara parity: particles can distort the scene behind them. Hot particles, explosions, and magic effects create screen-space UV offsets. Pipeline: 1. Render distortion-emitting particles to an RG16float texture (UV offset) 2. Composite pass samples scene color with distorted UVs The distortion texture stores per-pixel UV offset (R=deltaU, G=deltaV). Particles contribute based on temperature/emissive strength.",
      "exports": [
        {
          "name": "createParticleDistortionRenderer",
          "kind": "function",
          "signature": "createParticleDistortionRenderer(device, sceneFormat, width, height)",
          "summary": "Create the particle distortion rendering system"
        },
        {
          "name": "initDistortionBindGroups",
          "kind": "function",
          "signature": "initDistortionBindGroups(renderer, particleWorld, sceneColorView)",
          "summary": "Create bind groups for the distortion pass (call once when particle buffers are ready)"
        },
        {
          "name": "setDistortionParams",
          "kind": "function",
          "signature": "setDistortionParams(renderer, params = {})",
          "summary": "Update distortion params"
        },
        {
          "name": "renderDistortionPass",
          "kind": "function",
          "signature": "renderDistortionPass(encoder, renderer, instanceCount, frameData)",
          "summary": "Render distortion pass: accumulate UV offsets from hot particles"
        },
        {
          "name": "compositeDistortion",
          "kind": "function",
          "signature": "compositeDistortion(pass, renderer)",
          "summary": "Composite distortion onto scene (fullscreen triangle)"
        },
        {
          "name": "resizeDistortionRenderer",
          "kind": "function",
          "signature": "resizeDistortionRenderer(renderer, width, height)",
          "summary": "Resize distortion texture when viewport changes"
        },
        {
          "name": "destroyDistortionRenderer",
          "kind": "function",
          "signature": "destroyDistortionRenderer(renderer)",
          "summary": "Destroy distortion renderer resources"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleEffectRegistry",
      "path": "engine/reference/render/particles/ParticleEffectRegistry.md",
      "source": "engine/render/particles/ParticleEffectRegistry.js",
      "import": "/engine/render/particles/ParticleEffectRegistry.js",
      "sourceHash": "cf9ac56edbe03f6cb30f7890c30def5fc063278d255ee2767963db86907536b2",
      "summary": "ParticleEffectRegistry.js - Custom Particle Effect Storage & Management Features: - IndexedDB persistence across sessions - Import/export as JSON files - Built-in presets always available - Version tracking for effect updates - Event-based notifications for changes",
      "exports": [
        {
          "name": "ParticleEffectRegistry",
          "kind": "class",
          "signature": "class ParticleEffectRegistry",
          "summary": ""
        },
        {
          "name": "particleEffectCurrentId",
          "kind": "function",
          "signature": "particleEffectCurrentId(effectId)",
          "summary": ""
        },
        {
          "name": "prepareParticleEffectRecord",
          "kind": "function",
          "signature": "prepareParticleEffectRecord(record)",
          "summary": "Validate one exact v1/v2 record; no lossy upcasts are attempted."
        },
        {
          "name": "getParticleEffectRegistry",
          "kind": "function",
          "signature": "getParticleEffectRegistry()",
          "summary": "Get the global registry instance"
        },
        {
          "name": "initParticleEffectRegistry",
          "kind": "function",
          "signature": "async initParticleEffectRegistry()",
          "summary": "Initialize the global registry"
        },
        {
          "name": "PARTICLE_EFFECT_DB_NAME",
          "kind": "constant",
          "signature": "PARTICLE_EFFECT_DB_NAME",
          "summary": ""
        },
        {
          "name": "PARTICLE_EFFECT_STORE_NAME",
          "kind": "constant",
          "signature": "PARTICLE_EFFECT_STORE_NAME",
          "summary": ""
        },
        {
          "name": "PARTICLE_EFFECT_RECORD_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_EFFECT_RECORD_SCHEMA",
          "summary": ""
        },
        {
          "name": "PARTICLE_EFFECT_RECORD_VERSION",
          "kind": "constant",
          "signature": "PARTICLE_EFFECT_RECORD_VERSION",
          "summary": ""
        },
        {
          "name": "PARTICLE_EFFECT_RECORD_LIMITS",
          "kind": "constant",
          "signature": "PARTICLE_EFFECT_RECORD_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleEmissiveRenderer",
      "path": "engine/reference/render/particles/ParticleEmissiveRenderer.md",
      "source": "engine/render/particles/ParticleEmissiveRenderer.js",
      "import": "/engine/render/particles/ParticleEmissiveRenderer.js",
      "sourceHash": "b8d39e89d64f5a0c37669819e5f9c40cfad239e2f10598588db043c39b6985c3",
      "summary": "",
      "exports": [
        {
          "name": "createParticleEmissiveRenderer",
          "kind": "function",
          "signature": "async createParticleEmissiveRenderer(options)",
          "summary": ""
        },
        {
          "name": "createParticleEmissiveDataBindGroup",
          "kind": "function",
          "signature": "createParticleEmissiveDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": ""
        },
        {
          "name": "setParticleEmissiveParams",
          "kind": "function",
          "signature": "setParticleEmissiveParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleFieldRenderer",
      "path": "engine/reference/render/particles/ParticleFieldRenderer.md",
      "source": "engine/render/particles/ParticleFieldRenderer.js",
      "import": "/engine/render/particles/ParticleFieldRenderer.js",
      "sourceHash": "417b126cb5d892a66c00d6b174751c8753f61846ef4f1594c7f131512b99d087",
      "summary": "ParticleFieldRenderer.js - Electromagnetic Field Visualizer (GAP 42) Renders electric/magnetic field lines and force arrows around charged particles. Computes field probe grid on CPU from charged particle positions, uploads to GPU. Supports arrow glyphs showing force direction/magnitude. Color: red=positive/repulsion, blue=negative/attraction, intensity=magnitude. Usage: const fr = createFieldRenderer(device, format); updateFieldProbes(fr, device, chargedParticles, probeGrid); renderFieldArrows(pass, fr, viewProj, cameraPos, viewRight, viewUp);",
      "exports": [
        {
          "name": "createFieldRenderer",
          "kind": "function",
          "signature": "createFieldRenderer(device, format)",
          "summary": "Create the field renderer."
        },
        {
          "name": "initFieldRendererBindGroups",
          "kind": "function",
          "signature": "initFieldRendererBindGroups(renderer, device)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "updateFieldProbes",
          "kind": "function",
          "signature": "updateFieldProbes(renderer, device, chargedParticles, gridConfig)",
          "summary": "Generate field probes from charged particle positions (CPU-side). Creates a 3D grid of probe points and computes the E field at each."
        },
        {
          "name": "renderFieldArrows",
          "kind": "function",
          "signature": "renderFieldArrows(pass, renderer, viewProj, cameraPos, viewRight, viewUp)",
          "summary": "Render field arrows in the given render pass."
        },
        {
          "name": "destroyFieldRenderer",
          "kind": "function",
          "signature": "destroyFieldRenderer(renderer)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleHalfResComposite",
      "path": "engine/reference/render/particles/ParticleHalfResComposite.md",
      "source": "engine/render/particles/ParticleHalfResComposite.js",
      "import": "/engine/render/particles/ParticleHalfResComposite.js",
      "sourceHash": "82a8741c6e1284a4de66efb68b345780be1931e5b48dca60c80c0f6d95c90bac",
      "summary": "ParticleHalfResComposite.js - Half-resolution particle rendering + bilateral composite Renders particles to a half-res RGBA target, then composites onto the main framebuffer with alpha blending. Provides 4× fill-rate reduction for particle rendering. ==================== PIPELINE OVERVIEW (for future AI/developers) ==================== The particle color pipeline works as follows: 1. CPU writes per-particle color to metaBuffer in ParticleEmitterSystem.js: singleMeta[0..2] = emitterColor[0..2] (RGB from elementMixToEmitterConfig) → uploaded via device.queue.writeBuffer to GPU metaBuffer 2. SDF vertex shader (particles_sdf_billboard.js) reads: uMeta[ii].xyz → input.color Uses instance_index (ii) directly — NO alive list indirection in SDF path. The billboard shader (particles_billboard_vertex.js) DOES use uAliveList, but the active renderer is SDF (set in EditorParticles.js: particles.pipeline = sdfRenderer.pipeline). 3. SDF fragment shader applies volumetric lighting + thermal glow to input.color, outputs vec4<f32>(lit, finalAlpha) — NON-premultiplied. 4. SDF pipeline renders INTO this half-res texture with blend mode: color: src-alpha, one-minus-src-alpha  (standard alpha blend) This produces PRE-MULTIPLIED RGB in the texture because: result.rgb = src.rgb * src.a + cleared_black * (1 - src.a) = src.rgb * src.a 5. This composite pass reads the half-res texture and blends onto the scene. MUST use pre-multiplied blend (srcFactor='one') because step 4 already multiplied RGB by alpha. Using srcFactor='src-alpha' would DOUBLE the alpha (lit * alpha²), making low-alpha particles nearly invisible. CRITICAL: If you change the SDF pipeline blend mode, you must update this composite blend mode to match. src-alpha render → 'one' composite. premultiplied render → 'one' composite. Ref: GPU Gems 3 Ch.23 \"High-Speed Off-Screen Particles\"",
      "exports": [
        {
          "name": "createHalfResCompositeSystem",
          "kind": "function",
          "signature": "createHalfResCompositeSystem(device, format, fullWidth, fullHeight)",
          "summary": "Create the half-resolution particle rendering + composite system."
        },
        {
          "name": "resizeHalfResTargets",
          "kind": "function",
          "signature": "resizeHalfResTargets(system, fullWidth, fullHeight)",
          "summary": "Resize half-res render targets. Call when the window/canvas resizes."
        },
        {
          "name": "getHalfResPassDescriptor",
          "kind": "function",
          "signature": "getHalfResPassDescriptor(system)",
          "summary": "Get the render pass descriptor for the half-res particle pass. Clear to transparent black (0,0,0,0) so alpha blending composites correctly. After particles render here with src-alpha blend, the texture contains pre-multiplied color: rgb = lit * alpha, a = combined alpha."
        },
        {
          "name": "executeComposite",
          "kind": "function",
          "signature": "executeComposite(system, encoder, mainTextureView)",
          "summary": "Execute the composite pass: upsample half-res particles onto main framebuffer."
        },
        {
          "name": "destroyHalfResCompositeSystem",
          "kind": "function",
          "signature": "destroyHalfResCompositeSystem(system)",
          "summary": "Destroy half-res composite system resources."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleLightingRenderer",
      "path": "engine/reference/render/particles/ParticleLightingRenderer.md",
      "source": "engine/render/particles/ParticleLightingRenderer.js",
      "import": "/engine/render/particles/ParticleLightingRenderer.js",
      "sourceHash": "5775a84d833bd8caea8e02672d166ae9e444cc2934df2ed8f25e79c9bd693204",
      "summary": "Create particle lighting pass renderer",
      "exports": [
        {
          "name": "createParticleLightingRenderer",
          "kind": "function",
          "signature": "async createParticleLightingRenderer(options)",
          "summary": "Create particle lighting pass renderer"
        },
        {
          "name": "createParticleLightingDataBindGroup",
          "kind": "function",
          "signature": "createParticleLightingDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": "Create data bind group for lighting pass"
        },
        {
          "name": "setParticleLightingParams",
          "kind": "function",
          "signature": "setParticleLightingParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": "Update lighting pass parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleMeshRenderer",
      "path": "engine/reference/render/particles/ParticleMeshRenderer.md",
      "source": "engine/render/particles/ParticleMeshRenderer.js",
      "import": "/engine/render/particles/ParticleMeshRenderer.js",
      "sourceHash": "cf7ed0013f445f8e55046d90776ecdabf4fea1d68124d97dfec1156ed6919fd2",
      "summary": "ParticleMeshRenderer.js - Instanced Mesh Particle Renderer (GAP 9) Renders each particle as a 3D mesh instance instead of a billboard. Supports both regular triangle meshes AND voxel meshes (compact u32 format). Each particle's position/velocity/meta drives a mesh instance: - Position from particle positions buffer - Rotation from velocity direction (velocity-aligned) or billboard - Scale from meta.w packed size - Color tint from meta.rgb - Age-based fade from pos.w / vel.w Usage: const renderer = await createParticleMeshRenderer(device, { format, mesh }); // In render loop: renderMeshParticles(pass, renderer, world, { viewProj, instanceCount });",
      "exports": [
        {
          "name": "createParticleMeshRenderer",
          "kind": "function",
          "signature": "async createParticleMeshRenderer(device, options = {})",
          "summary": "Create a particle mesh renderer."
        },
        {
          "name": "setParticleMesh",
          "kind": "function",
          "signature": "setParticleMesh(renderer, mesh)",
          "summary": "Set the mesh to render per particle."
        },
        {
          "name": "bindParticleData",
          "kind": "function",
          "signature": "bindParticleData(renderer, world)",
          "summary": "Bind particle data buffers from a particle world."
        },
        {
          "name": "renderMeshParticles",
          "kind": "function",
          "signature": "renderMeshParticles(pass, renderer, options = {})",
          "summary": "Render mesh particles into a render pass."
        },
        {
          "name": "setMeshParticleParams",
          "kind": "function",
          "signature": "setMeshParticleParams(renderer, params = {})",
          "summary": "Update mesh particle renderer params."
        },
        {
          "name": "initShadowPipeline",
          "kind": "function",
          "signature": "initShadowPipeline(renderer)",
          "summary": "Lazily initialize the shadow depth pipeline for particle mesh shadow casting. Call once before the first flushShadowDepth. Requires dataBindGroup to be set."
        },
        {
          "name": "flushShadowDepth",
          "kind": "function",
          "signature": "flushShadowDepth(pass, renderer, lightViewProj, instanceCount)",
          "summary": "Render mesh particles into a shadow depth pass (depth-only, no color). Compatible with ShadowMapPass.renderShadowDepth()."
        },
        {
          "name": "destroyParticleMeshRenderer",
          "kind": "function",
          "signature": "destroyParticleMeshRenderer(renderer)",
          "summary": "Destroy the renderer."
        },
        {
          "name": "MESH_FRAME_STRUCT",
          "kind": "constant",
          "signature": "MESH_FRAME_STRUCT",
          "summary": ""
        },
        {
          "name": "MESH_ALIGN_VELOCITY",
          "kind": "constant",
          "signature": "MESH_ALIGN_VELOCITY",
          "summary": ""
        },
        {
          "name": "MESH_ALIGN_BILLBOARD",
          "kind": "constant",
          "signature": "MESH_ALIGN_BILLBOARD",
          "summary": ""
        },
        {
          "name": "MESH_ALIGN_WORLD",
          "kind": "constant",
          "signature": "MESH_ALIGN_WORLD",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleNormalsRenderer",
      "path": "engine/reference/render/particles/ParticleNormalsRenderer.md",
      "source": "engine/render/particles/ParticleNormalsRenderer.js",
      "import": "/engine/render/particles/ParticleNormalsRenderer.js",
      "sourceHash": "33573e49191c99b2978b77f08a1eac0b29f98a573015ca443653870c379b1b5f",
      "summary": "Create particle normals pass renderer",
      "exports": [
        {
          "name": "createParticleNormalsRenderer",
          "kind": "function",
          "signature": "async createParticleNormalsRenderer(options)",
          "summary": "Create particle normals pass renderer"
        },
        {
          "name": "createParticleNormalsDataBindGroup",
          "kind": "function",
          "signature": "createParticleNormalsDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": "Create data bind group for normals pass"
        },
        {
          "name": "setParticleNormalsParams",
          "kind": "function",
          "signature": "setParticleNormalsParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": "Update normals pass parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleOrbitalRenderer",
      "path": "engine/reference/render/particles/ParticleOrbitalRenderer.md",
      "source": "engine/render/particles/ParticleOrbitalRenderer.js",
      "import": "/engine/render/particles/ParticleOrbitalRenderer.js",
      "sourceHash": "8456ed7dba8364604bf54daae4ac22b91ce6f7c1db18f58cc15ba52f83be1342",
      "summary": "ParticleOrbitalRenderer.js - Electron Cloud / Orbital Renderer (GAP 40) Renders electron probability clouds around atom-particles using raymarched spherical harmonics. Color by element (CPK convention) from element table. LOD: full orbital at close range, simple sphere at distance. Usage: const orb = createOrbitalRenderer(device, format); renderOrbitals(pass, orb, { positionBuffer, elementBuffer, colorLutBuffer, camera });",
      "exports": [
        {
          "name": "createOrbitalRenderer",
          "kind": "function",
          "signature": "createOrbitalRenderer(device, format)",
          "summary": "Create the orbital renderer."
        },
        {
          "name": "initOrbitalBindGroups",
          "kind": "function",
          "signature": "initOrbitalBindGroups(renderer, device, positionBuffer, velocityBuffer, elementBuffer, lutBuffer, colorLutBuffer)",
          "summary": "Initialize bind groups for orbital rendering."
        },
        {
          "name": "renderOrbitals",
          "kind": "function",
          "signature": "renderOrbitals(pass, renderer, viewProj, cameraPos, viewRight, viewUp, instanceCount)",
          "summary": "Render orbital clouds in the given render pass."
        },
        {
          "name": "destroyOrbitalRenderer",
          "kind": "function",
          "signature": "destroyOrbitalRenderer(renderer)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticlePhaseVFX",
      "path": "engine/reference/render/particles/ParticlePhaseVFX.md",
      "source": "engine/render/particles/ParticlePhaseVFX.js",
      "import": "/engine/render/particles/ParticlePhaseVFX.js",
      "sourceHash": "689f15494e8833f4de83b9be82bcab6c4636f114ff95c0e36db538236b3fb85f",
      "summary": "ParticlePhaseVFX.js - Phase Transition Visual Effects Manager (GAP 43) Manages phase-transition visual effects for particle rendering. Provides WGSL snippet injection for existing billboard/SDF fragment shaders. Controls: frost crystallization, melt sheen, boiling bubbles, ionization arcs. The actual rendering is done by injecting applyPhaseVFX() into existing particle fragment shaders. This module manages the configuration and provides the WGSL code for inclusion. Usage: import { phaseVFXWGSL } from '../shaders/modules/core/particles_phase_vfx.js'; // Include phaseVFXWGSL in particle fragment shader // Call applyPhaseVFX(baseColor, uv, time, phase, temperature, latentProgress)",
      "exports": [
        {
          "name": "createPhaseVFXConfig",
          "kind": "function",
          "signature": "createPhaseVFXConfig(overrides = {})",
          "summary": "Create a phase VFX configuration object."
        },
        {
          "name": "getPhaseVFXShader",
          "kind": "function",
          "signature": "getPhaseVFXShader()",
          "summary": "Get the WGSL snippet for phase VFX. Include this in particle fragment shaders to enable phase transition effects."
        },
        {
          "name": "PHASE_VFX_DEFAULTS",
          "kind": "constant",
          "signature": "PHASE_VFX_DEFAULTS",
          "summary": "Phase VFX configuration. These values are passed to shaders via existing particle uniform buffers."
        },
        {
          "name": "phaseVFXWGSL",
          "kind": "re-export",
          "signature": "phaseVFXWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleQualityManager",
      "path": "engine/reference/render/particles/ParticleQualityManager.md",
      "source": "engine/render/particles/ParticleQualityManager.js",
      "import": "/engine/render/particles/ParticleQualityManager.js",
      "sourceHash": "1ce63623fe509469e9ff75f7c54850a9a99d4b16363b9ea01fca8309735bbc80",
      "summary": "Create a particle quality manager",
      "exports": [
        {
          "name": "createParticleQualityManager",
          "kind": "function",
          "signature": "createParticleQualityManager(options = {})",
          "summary": "Create a particle quality manager"
        },
        {
          "name": "QUALITY_PRESETS",
          "kind": "constant",
          "signature": "QUALITY_PRESETS",
          "summary": "Default quality presets"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleSPHSurfaceRenderer",
      "path": "engine/reference/render/particles/ParticleSPHSurfaceRenderer.md",
      "source": "engine/render/particles/ParticleSPHSurfaceRenderer.js",
      "import": "/engine/render/particles/ParticleSPHSurfaceRenderer.js",
      "sourceHash": "fcd931c1a832a6ed3008c72e2619d325ac88df8e081f8b554a2ad44f92ea9753",
      "summary": "ParticleSPHSurfaceRenderer.js - SPH Fluid Surface Renderer (GAP 44) Screen-space rendering of SPH fluid particles as smooth liquid surface. Bridges SPH particle data (GAP 36) into the existing FluidWaterPass pipeline. Pipeline: 1. Render SPH particles as sphere impostors → depth texture 2. Bilateral blur → smooth surface 3. Thickness accumulation → subsurface scattering 4. Composite with refraction + reflection + Fresnel Per-element tint from element table: water=blue, lava=orange, blood=red. Usage: const ssr = createSPHSurfaceRenderer(device, format, width, height); initSPHSurfaceBindGroups(ssr, device, positionBuffer, velocityBuffer, elementBuffer, colorLutBuffer); renderSPHSurface(ssr, encoder, { sceneColor, sceneDepth, camera, particleCount });",
      "exports": [
        {
          "name": "createSPHSurfaceRenderer",
          "kind": "function",
          "signature": "createSPHSurfaceRenderer(device, format, width, height)",
          "summary": "Create the SPH surface renderer. Full SSFR pipeline: depth → bilateral blur (H+V) → thickness → normals + composite."
        },
        {
          "name": "initSPHSurfaceBindGroups",
          "kind": "function",
          "signature": "initSPHSurfaceBindGroups(renderer, device, positionBuffer, velocityBuffer, thermalBuffer)",
          "summary": "Initialize bind groups for all SSFR passes."
        },
        {
          "name": "initSPHCompositeBindGroup",
          "kind": "function",
          "signature": "initSPHCompositeBindGroup(renderer, device, sceneColorView)",
          "summary": "Create composite bind group (needs scene color texture view). Reads smoothed depth (blurTextureB) + thickness for full SSFR composite."
        },
        {
          "name": "setSPHSurfaceTint",
          "kind": "function",
          "signature": "setSPHSurfaceTint(renderer, r, g, b)",
          "summary": "Set fluid tint color (e.g., from element)."
        },
        {
          "name": "renderSPHSurface",
          "kind": "function",
          "signature": "renderSPHSurface(renderer, encoder, options)",
          "summary": "Render SPH fluid surface (full SSFR pipeline). Pass 1: Depth (sphere impostors) Pass 2: Bilateral blur H Pass 3: Bilateral blur V Pass 4: Thickness (additive)"
        },
        {
          "name": "compositeSPHSurface",
          "kind": "function",
          "signature": "compositeSPHSurface(pass, renderer)",
          "summary": "Composite SPH surface onto the scene in a render pass."
        },
        {
          "name": "destroySPHSurfaceRenderer",
          "kind": "function",
          "signature": "destroySPHSurfaceRenderer(renderer)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleSdfRenderer",
      "path": "engine/reference/render/particles/ParticleSdfRenderer.md",
      "source": "engine/render/particles/ParticleSdfRenderer.js",
      "import": "/engine/render/particles/ParticleSdfRenderer.js",
      "sourceHash": "58fb728cc44affa864d1337e7c46e2cd07a9437be75da75b6639e72d007e5fca",
      "summary": "Create volumetric SDF particle renderer",
      "exports": [
        {
          "name": "createParticleSdfRenderer",
          "kind": "function",
          "signature": "async createParticleSdfRenderer(options)",
          "summary": "Create volumetric SDF particle renderer"
        },
        {
          "name": "createParticleSdfDataBindGroup",
          "kind": "function",
          "signature": "createParticleSdfDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer, thermalBuffer, sphDensityBuffer, classBuffer)",
          "summary": "Create data bind group for SDF particle world. Binds the shared particle buffers (position, meta, velocity, thermal) to group 1. The metaBuffer contains per-particle color at .rgb — written by ParticleEmitterSystem.js. If thermalBuffer is missing, a fallback with room-temp defaults (293K) is created."
        },
        {
          "name": "createParticleSdfDepthBindGroup",
          "kind": "function",
          "signature": "createParticleSdfDepthBindGroup(renderer, depthTextureView)",
          "summary": "Create depth bind group for soft particles (scene depth texture). Must be recreated when the depth texture changes (e.g. on resize). Only binds depth texture (binding 0). Does NOT include alive list buffer — the SDF vertex shader uses instance_index directly, unlike the billboard shader which uses uAliveList for indirection."
        },
        {
          "name": "createParticleSdfLutSixWayBindGroup",
          "kind": "function",
          "signature": "createParticleSdfLutSixWayBindGroup(renderer, colorGradientView, colorGradientSampler, lifetimeCurvesView, lifetimeCurvesSampler, sixWaySystem)",
          "summary": "Create combined LUT + six-way lighting bind group (group 3). Bindings 0-3: color gradient + lifetime curves LUT textures. Bindings 4-11: six directional lightmap textures + sampler + params. Merged into one group to stay within WebGPU maxBindGroups=4."
        },
        {
          "name": "setParticleSdfParams",
          "kind": "function",
          "signature": "setParticleSdfParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": "Update SDF particle rendering parameters"
        },
        {
          "name": "SDF_FRAME_STRUCT",
          "kind": "constant",
          "signature": "SDF_FRAME_STRUCT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleShadowCaster",
      "path": "engine/reference/render/particles/ParticleShadowCaster.md",
      "source": "engine/render/particles/ParticleShadowCaster.js",
      "import": "/engine/render/particles/ParticleShadowCaster.js",
      "sourceHash": "2c0352c05debb9f9a66658c61237f08649553d041a9c5b6a13c9b38c2270ffdd",
      "summary": "",
      "exports": [
        {
          "name": "createParticleShadowCaster",
          "kind": "function",
          "signature": "async createParticleShadowCaster(device)",
          "summary": ""
        },
        {
          "name": "registerCaster",
          "kind": "function",
          "signature": "registerCaster(caster, id, flushFn)",
          "summary": ""
        },
        {
          "name": "unregisterCaster",
          "kind": "function",
          "signature": "unregisterCaster(caster, id)",
          "summary": ""
        },
        {
          "name": "bindShadowParticleData",
          "kind": "function",
          "signature": "bindShadowParticleData(caster, world)",
          "summary": ""
        },
        {
          "name": "flushBillboardShadowDepth",
          "kind": "function",
          "signature": "flushBillboardShadowDepth(pass, caster, lightViewProj, sunDir, instanceCount)",
          "summary": ""
        },
        {
          "name": "flushAllParticleShadows",
          "kind": "function",
          "signature": "flushAllParticleShadows(pass, caster, lightViewProj, sunDir, billboardInstanceCount)",
          "summary": ""
        },
        {
          "name": "createRopeShadowCaster",
          "kind": "function",
          "signature": "async createRopeShadowCaster(device, ropeRenderer)",
          "summary": ""
        },
        {
          "name": "destroyParticleShadowCaster",
          "kind": "function",
          "signature": "destroyParticleShadowCaster(caster)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleSixWayLighting",
      "path": "engine/reference/render/particles/ParticleSixWayLighting.md",
      "source": "engine/render/particles/ParticleSixWayLighting.js",
      "import": "/engine/render/particles/ParticleSixWayLighting.js",
      "sourceHash": "651dcea180d06f365727e796154ef9f1b40961f66fdfce887fbd9810dce841f2",
      "summary": "ParticleSixWayLighting.js - Six-Way Lightmap Particles (GAP 24) Pre-baked lighting from 6 directions (+X, -X, +Y, -Y, +Z, -Z) sampled based on dominant light direction. Creates a fake 3D volumetric look on flat billboard particles, especially useful for smoke and fog. Matches Unity VFX Graph six-way lighting feature. The system bakes a 6-channel lightmap texture (3 RGBA8 textures for 6 directions, or a single RGBA16float with packed channels). At render time, the fragment shader blends between the 6 maps based on the light direction relative to the billboard. Usage: const sixway = createSixWayLightingSystem(device); loadSixWayTextures(sixway, device, { right, left, top, bottom, front, back }); // Or generate procedural maps: generateProceduralSixWay(sixway, device, 'smoke'); // Bind to particle renderer: bindSixWayToRenderer(sixway, renderer);",
      "exports": [
        {
          "name": "createSixWayLightingSystem",
          "kind": "function",
          "signature": "createSixWayLightingSystem(device, config = {})",
          "summary": "Create a six-way lighting system."
        },
        {
          "name": "generateProceduralSixWay",
          "kind": "function",
          "signature": "generateProceduralSixWay(system, device, preset = 'smoke')",
          "summary": "Generate procedural six-way lightmaps."
        },
        {
          "name": "loadSixWayTextures",
          "kind": "function",
          "signature": "async loadSixWayTextures(system, device, images)",
          "summary": "Load six-way textures from external image data."
        },
        {
          "name": "setSixWayLightDirection",
          "kind": "function",
          "signature": "setSixWayLightDirection(system, lightDir, intensity = 1.0)",
          "summary": "Update the dominant light direction."
        },
        {
          "name": "destroySixWayLightingSystem",
          "kind": "function",
          "signature": "destroySixWayLightingSystem(system)",
          "summary": "Destroy the system."
        },
        {
          "name": "SIX_WAY_LIGHTING_WGSL",
          "kind": "constant",
          "signature": "SIX_WAY_LIGHTING_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleSizeRenderer",
      "path": "engine/reference/render/particles/ParticleSizeRenderer.md",
      "source": "engine/render/particles/ParticleSizeRenderer.js",
      "import": "/engine/render/particles/ParticleSizeRenderer.js",
      "sourceHash": "0ddc7579738b43317d9334d999c0d30505f99cca087f60c2901cf9b30b135e47",
      "summary": "",
      "exports": [
        {
          "name": "createParticleSizeRenderer",
          "kind": "function",
          "signature": "async createParticleSizeRenderer(options)",
          "summary": ""
        },
        {
          "name": "createParticleSizeDataBindGroup",
          "kind": "function",
          "signature": "createParticleSizeDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": ""
        },
        {
          "name": "setParticleSizeParams",
          "kind": "function",
          "signature": "setParticleSizeParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleThermalRenderer",
      "path": "engine/reference/render/particles/ParticleThermalRenderer.md",
      "source": "engine/render/particles/ParticleThermalRenderer.js",
      "import": "/engine/render/particles/ParticleThermalRenderer.js",
      "sourceHash": "fa77c55f948062bebe2dd384eb55e68b1f75dee0127a9c2e8dcaa019b6c61450",
      "summary": "Particle Thermal/Blackbody Debug Pass Renderer Renders particle temperature as blackbody radiation color for debug visualization. Requires thermalData buffer (binding 4) in addition to standard particle buffers.",
      "exports": [
        {
          "name": "createParticleThermalRenderer",
          "kind": "function",
          "signature": "async createParticleThermalRenderer(options)",
          "summary": ""
        },
        {
          "name": "createParticleThermalDataBindGroup",
          "kind": "function",
          "signature": "createParticleThermalDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer, thermalBuffer)",
          "summary": ""
        },
        {
          "name": "setParticleThermalParams",
          "kind": "function",
          "signature": "setParticleThermalParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleTrailHistory",
      "path": "engine/reference/render/particles/ParticleTrailHistory.md",
      "source": "engine/render/particles/ParticleTrailHistory.js",
      "import": "/engine/render/particles/ParticleTrailHistory.js",
      "sourceHash": "6a412001397160fd62408f2b48bde7bcac3386057964fc6179f48668659fa0a8",
      "summary": "ParticleTrailHistory.js - Per-Particle Trail Histories (GAP 26) Individual per-particle position history trails. Unlike ribbon trails (which connect sequential particles into a strip), this stores N frames of position history PER particle and renders each as a fading afterimage. Think sparks leaving comet tails, or tracers behind projectiles. Architecture: - Ring buffer: historyBuffer[maxParticles × historyLength × vec4] stores position snapshots - GPU compute shader shifts history and writes current position each frame - Render pass draws each trail point as a small billboard, fading by age Usage: const trails = createTrailHistorySystem(device, maxParticles, { historyLength: 16 }); initTrailHistoryBindGroups(trails, device, positionBuffer, velocityBuffer); // Each frame: updateTrailHistories(trails, device, particleCount); renderTrailHistories(pass, trails, frameBindGroup);",
      "exports": [
        {
          "name": "createTrailHistorySystem",
          "kind": "function",
          "signature": "createTrailHistorySystem(device, maxParticles, config = {})",
          "summary": "Create a per-particle trail history system."
        },
        {
          "name": "initTrailHistoryBindGroups",
          "kind": "function",
          "signature": "initTrailHistoryBindGroups(system, device, positionBuffer, velocityBuffer, metaBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "updateTrailHistories",
          "kind": "function",
          "signature": "updateTrailHistories(system, device, particleCount, dt = 1/60)",
          "summary": "Update trail histories (GPU compute pass). Call once per frame before rendering trails."
        },
        {
          "name": "renderTrailHistories",
          "kind": "function",
          "signature": "renderTrailHistories(pass, system, frameBindGroup, particleCount)",
          "summary": "Render trail histories as additive fading billboards."
        },
        {
          "name": "destroyTrailHistorySystem",
          "kind": "function",
          "signature": "destroyTrailHistorySystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/ParticleVelocityRenderer",
      "path": "engine/reference/render/particles/ParticleVelocityRenderer.md",
      "source": "engine/render/particles/ParticleVelocityRenderer.js",
      "import": "/engine/render/particles/ParticleVelocityRenderer.js",
      "sourceHash": "e59bcc493497639b45fad6102acef8cc87f0b0f60f276bc5813aa729494fa150",
      "summary": "",
      "exports": [
        {
          "name": "createParticleVelocityRenderer",
          "kind": "function",
          "signature": "async createParticleVelocityRenderer(options)",
          "summary": ""
        },
        {
          "name": "createParticleVelocityDataBindGroup",
          "kind": "function",
          "signature": "createParticleVelocityDataBindGroup(renderer, positionBuffer, metaBuffer, velocityBuffer)",
          "summary": ""
        },
        {
          "name": "setParticleVelocityParams",
          "kind": "function",
          "signature": "setParticleVelocityParams(renderer, { size = 1, quality = 1.0, lodBias = 1.0, cullThreshold = 0 })",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/RopeGPURenderer",
      "path": "engine/reference/render/particles/RopeGPURenderer.md",
      "source": "engine/render/particles/RopeGPURenderer.js",
      "import": "/engine/render/particles/RopeGPURenderer.js",
      "sourceHash": "1589b3aad62bf54ab336eb8f0bb1a2a6214b6f0afed7b6657cbf0e85fac503c8",
      "summary": "RopeGPURenderer.js - GPU-driven rope/tube mesh generation Generates tube geometry from rope particle positions entirely on the GPU. Reads particle positions from the simulation buffer and outputs vertex data for rendering as a triangle mesh. Features: - Compute shader generates tube vertices from particle chain - Configurable tube radius and segment count - Automatic tangent/normal/binormal frame calculation - Twist-resistant frame propagation (parallel transport) - Indirect draw support for variable-length ropes",
      "exports": [
        {
          "name": "RopeGPURenderer",
          "kind": "class",
          "signature": "class RopeGPURenderer",
          "summary": ""
        },
        {
          "name": "createRopeGPURenderer",
          "kind": "function",
          "signature": "createRopeGPURenderer(device, options = {})",
          "summary": "Create a rope GPU renderer instance"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/RopeRenderSystem",
      "path": "engine/reference/render/particles/RopeRenderSystem.md",
      "source": "engine/render/particles/RopeRenderSystem.js",
      "import": "/engine/render/particles/RopeRenderSystem.js",
      "sourceHash": "2a27f884d2c9584986ba0d2766217bcc2a7a94ba4c69c3ee8043f521986a8643",
      "summary": "RopeRenderSystem.js - Integration layer for GPU rope rendering Connects the RopeGPURenderer with the particle simulation world's rope chain registry. Manages multiple ropes and batches rendering.",
      "exports": [
        {
          "name": "RopeRenderSystem",
          "kind": "class",
          "signature": "class RopeRenderSystem",
          "summary": ""
        },
        {
          "name": "createRopeRenderSystem",
          "kind": "function",
          "signature": "createRopeRenderSystem(device, options = {})",
          "summary": "Create a rope render system"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/billboard/index",
      "path": "engine/reference/render/particles/billboard/index.md",
      "source": "engine/render/particles/billboard/index.js",
      "import": "/engine/render/particles/billboard/index.js",
      "sourceHash": "42ead5475a75091562ee89bc78a35ea570a9296214769181bd26c90f27abd51b",
      "summary": "billboard/index.js — Re-exports for billboard particle rendering.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/custom/index",
      "path": "engine/reference/render/particles/custom/index.md",
      "source": "engine/render/particles/custom/index.js",
      "import": "/engine/render/particles/custom/index.js",
      "sourceHash": "63b2e5a1df963262c53a8665fd95ff838df8f7e9bc636477b32627f8c2f7151d",
      "summary": "custom/index.js — Re-exports for custom particle effects.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/debug/index",
      "path": "engine/reference/render/particles/debug/index.md",
      "source": "engine/render/particles/debug/index.js",
      "import": "/engine/render/particles/debug/index.js",
      "sourceHash": "381f505a650a3801312e7a3911513a148301dd7f82094c6c51c509c5c76e8201",
      "summary": "debug/index.js — Re-exports for debug visualization renderers.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/distortion/index",
      "path": "engine/reference/render/particles/distortion/index.md",
      "source": "engine/render/particles/distortion/index.js",
      "import": "/engine/render/particles/distortion/index.js",
      "sourceHash": "122fd9109fd3a7fc64be14fae20ccd5a182173a28cfab0509bcdb04674dd68c2",
      "summary": "distortion/index.js — Re-exports for distortion and phase VFX rendering.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/index",
      "path": "engine/reference/render/particles/index.md",
      "source": "engine/render/particles/index.js",
      "import": "/engine/render/particles/index.js",
      "sourceHash": "1ddf819acb8d7b12caf57b80e2d7571bc47b6ac04799090494d87a9397060bf9",
      "summary": "Particle System Exports Barrel file for easy importing of all particle-related modules.",
      "exports": [
        {
          "name": "EFFECT_PRESETS",
          "kind": "re-export",
          "signature": "EFFECT_PRESETS",
          "summary": ""
        },
        {
          "name": "PHASE_VFX_DEFAULTS",
          "kind": "re-export",
          "signature": "PHASE_VFX_DEFAULTS",
          "summary": ""
        },
        {
          "name": "ParticleCollisionSDFSystem",
          "kind": "re-export",
          "signature": "ParticleCollisionSDFSystem",
          "summary": ""
        },
        {
          "name": "ParticleEffectRegistry",
          "kind": "re-export",
          "signature": "ParticleEffectRegistry",
          "summary": ""
        },
        {
          "name": "SDF_HELPERS_WGSL",
          "kind": "re-export",
          "signature": "SDF_HELPERS_WGSL",
          "summary": ""
        },
        {
          "name": "applyEffectToEmitter",
          "kind": "re-export",
          "signature": "applyEffectToEmitter",
          "summary": ""
        },
        {
          "name": "cloneEffect",
          "kind": "re-export",
          "signature": "cloneEffect",
          "summary": ""
        },
        {
          "name": "compileEffect",
          "kind": "re-export",
          "signature": "compileEffect",
          "summary": ""
        },
        {
          "name": "compositeSPHSurface",
          "kind": "re-export",
          "signature": "compositeSPHSurface",
          "summary": ""
        },
        {
          "name": "createBlackbodyBindGroupLayout",
          "kind": "re-export",
          "signature": "createBlackbodyBindGroupLayout",
          "summary": ""
        },
        {
          "name": "createBlackbodySystem",
          "kind": "re-export",
          "signature": "createBlackbodySystem",
          "summary": ""
        },
        {
          "name": "createBondRenderer",
          "kind": "re-export",
          "signature": "createBondRenderer",
          "summary": ""
        },
        {
          "name": "createCollisionPipeline",
          "kind": "re-export",
          "signature": "createCollisionPipeline",
          "summary": ""
        },
        {
          "name": "createEffect",
          "kind": "re-export",
          "signature": "createEffect",
          "summary": ""
        },
        {
          "name": "createEffectParamsData",
          "kind": "re-export",
          "signature": "createEffectParamsData",
          "summary": ""
        },
        {
          "name": "createFieldRenderer",
          "kind": "re-export",
          "signature": "createFieldRenderer",
          "summary": ""
        },
        {
          "name": "createOrbitalRenderer",
          "kind": "re-export",
          "signature": "createOrbitalRenderer",
          "summary": ""
        },
        {
          "name": "createParticleCollisionSDFSystem",
          "kind": "re-export",
          "signature": "createParticleCollisionSDFSystem",
          "summary": ""
        },
        {
          "name": "createParticleSdfDataBindGroup",
          "kind": "re-export",
          "signature": "createParticleSdfDataBindGroup",
          "summary": ""
        },
        {
          "name": "createParticleSdfRenderer",
          "kind": "re-export",
          "signature": "createParticleSdfRenderer",
          "summary": ""
        },
        {
          "name": "createPhaseVFXConfig",
          "kind": "re-export",
          "signature": "createPhaseVFXConfig",
          "summary": ""
        },
        {
          "name": "createSPHSurfaceRenderer",
          "kind": "re-export",
          "signature": "createSPHSurfaceRenderer",
          "summary": ""
        },
        {
          "name": "destroyBlackbodySystem",
          "kind": "re-export",
          "signature": "destroyBlackbodySystem",
          "summary": ""
        },
        {
          "name": "destroyBondRenderer",
          "kind": "re-export",
          "signature": "destroyBondRenderer",
          "summary": ""
        },
        {
          "name": "destroyFieldRenderer",
          "kind": "re-export",
          "signature": "destroyFieldRenderer",
          "summary": ""
        },
        {
          "name": "destroyOrbitalRenderer",
          "kind": "re-export",
          "signature": "destroyOrbitalRenderer",
          "summary": ""
        },
        {
          "name": "destroySPHSurfaceRenderer",
          "kind": "re-export",
          "signature": "destroySPHSurfaceRenderer",
          "summary": ""
        },
        {
          "name": "generateCollisionShader",
          "kind": "re-export",
          "signature": "generateCollisionShader",
          "summary": ""
        },
        {
          "name": "generateMultiEffectCollisionShader",
          "kind": "re-export",
          "signature": "generateMultiEffectCollisionShader",
          "summary": ""
        },
        {
          "name": "generateVisualShader",
          "kind": "re-export",
          "signature": "generateVisualShader",
          "summary": ""
        },
        {
          "name": "getBlackbodyBindGroup",
          "kind": "re-export",
          "signature": "getBlackbodyBindGroup",
          "summary": ""
        },
        {
          "name": "getCollisionSDFSystem",
          "kind": "re-export",
          "signature": "getCollisionSDFSystem",
          "summary": ""
        },
        {
          "name": "getCompiledEffect",
          "kind": "re-export",
          "signature": "getCompiledEffect",
          "summary": ""
        },
        {
          "name": "getEffectByIndex",
          "kind": "re-export",
          "signature": "getEffectByIndex",
          "summary": ""
        },
        {
          "name": "getEffectForRendering",
          "kind": "re-export",
          "signature": "getEffectForRendering",
          "summary": ""
        },
        {
          "name": "getEffectIndex",
          "kind": "re-export",
          "signature": "getEffectIndex",
          "summary": ""
        },
        {
          "name": "getParticleEffectRegistry",
          "kind": "re-export",
          "signature": "getParticleEffectRegistry",
          "summary": ""
        },
        {
          "name": "getParticleSDF",
          "kind": "re-export",
          "signature": "getParticleSDF",
          "summary": ""
        },
        {
          "name": "getPhaseVFXShader",
          "kind": "re-export",
          "signature": "getPhaseVFXShader",
          "summary": ""
        },
        {
          "name": "getPreset",
          "kind": "re-export",
          "signature": "getPreset",
          "summary": ""
        },
        {
          "name": "getPresets",
          "kind": "re-export",
          "signature": "getPresets",
          "summary": ""
        },
        {
          "name": "initBondRendererBindGroups",
          "kind": "re-export",
          "signature": "initBondRendererBindGroups",
          "summary": ""
        },
        {
          "name": "initCustomParticleEffects",
          "kind": "re-export",
          "signature": "initCustomParticleEffects",
          "summary": ""
        },
        {
          "name": "initFieldRendererBindGroups",
          "kind": "re-export",
          "signature": "initFieldRendererBindGroups",
          "summary": ""
        },
        {
          "name": "initOrbitalBindGroups",
          "kind": "re-export",
          "signature": "initOrbitalBindGroups",
          "summary": ""
        },
        {
          "name": "initParticleEffectRegistry",
          "kind": "re-export",
          "signature": "initParticleEffectRegistry",
          "summary": ""
        },
        {
          "name": "initSPHCompositeBindGroup",
          "kind": "re-export",
          "signature": "initSPHCompositeBindGroup",
          "summary": ""
        },
        {
          "name": "initSPHSurfaceBindGroups",
          "kind": "re-export",
          "signature": "initSPHSurfaceBindGroups",
          "summary": ""
        },
        {
          "name": "isCustomEffectsInitialized",
          "kind": "re-export",
          "signature": "isCustomEffectsInitialized",
          "summary": ""
        },
        {
          "name": "phaseVFXWGSL",
          "kind": "re-export",
          "signature": "phaseVFXWGSL",
          "summary": ""
        },
        {
          "name": "registerEffectForCollision",
          "kind": "re-export",
          "signature": "registerEffectForCollision",
          "summary": ""
        },
        {
          "name": "renderBonds",
          "kind": "re-export",
          "signature": "renderBonds",
          "summary": ""
        },
        {
          "name": "renderFieldArrows",
          "kind": "re-export",
          "signature": "renderFieldArrows",
          "summary": ""
        },
        {
          "name": "renderOrbitals",
          "kind": "re-export",
          "signature": "renderOrbitals",
          "summary": ""
        },
        {
          "name": "renderSPHSurface",
          "kind": "re-export",
          "signature": "renderSPHSurface",
          "summary": ""
        },
        {
          "name": "setBlackbodyEmission",
          "kind": "re-export",
          "signature": "setBlackbodyEmission",
          "summary": ""
        },
        {
          "name": "setParticleSdfParams",
          "kind": "re-export",
          "signature": "setParticleSdfParams",
          "summary": ""
        },
        {
          "name": "setSPHSurfaceTint",
          "kind": "re-export",
          "signature": "setSPHSurfaceTint",
          "summary": ""
        },
        {
          "name": "updateFieldProbes",
          "kind": "re-export",
          "signature": "updateFieldProbes",
          "summary": ""
        },
        {
          "name": "uploadBonds",
          "kind": "re-export",
          "signature": "uploadBonds",
          "summary": ""
        },
        {
          "name": "validateEffect",
          "kind": "re-export",
          "signature": "validateEffect",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/mesh/index",
      "path": "engine/reference/render/particles/mesh/index.md",
      "source": "engine/render/particles/mesh/index.js",
      "import": "/engine/render/particles/mesh/index.js",
      "sourceHash": "a00238d9b03e517115893bc4297dfeafef6293a685e4006cab04ee443090c24a",
      "summary": "mesh/index.js — Re-exports for mesh particle rendering.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/rope/index",
      "path": "engine/reference/render/particles/rope/index.md",
      "source": "engine/render/particles/rope/index.js",
      "import": "/engine/render/particles/rope/index.js",
      "sourceHash": "50393f5a83eb8809569900db5f296835a7aa1119afde0eb3843f8754c089fb33",
      "summary": "rope/index.js — Re-exports for rope/wire rendering.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/sdf/index",
      "path": "engine/reference/render/particles/sdf/index.md",
      "source": "engine/render/particles/sdf/index.js",
      "import": "/engine/render/particles/sdf/index.js",
      "sourceHash": "1a81c9d4fa5068dc143dd0d637ca6a471d9bcff5ce6195aca8ba2a8c783e6f5f",
      "summary": "sdf/index.js — Re-exports for SDF volumetric particle rendering.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/surface/index",
      "path": "engine/reference/render/particles/surface/index.md",
      "source": "engine/render/particles/surface/index.js",
      "import": "/engine/render/particles/surface/index.js",
      "sourceHash": "3c66e3f75515adaed25a56a79d814ad5b771c2aa995c6b92204be6ad51de0f4c",
      "summary": "surface/index.js — Re-exports for SSFR surface rendering pipeline.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/particles/trail/index",
      "path": "engine/reference/render/particles/trail/index.md",
      "source": "engine/render/particles/trail/index.js",
      "import": "/engine/render/particles/trail/index.js",
      "sourceHash": "e4cc1e091ed3eb9f370bcb661aa0941dbcf8e7c5ab38325bc7bccaaf5551b43c",
      "summary": "trail/index.js — Re-exports for trail and beam rendering.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/AbyssalCameraRig",
      "path": "engine/reference/render/passes/AbyssalCameraRig.md",
      "source": "engine/render/passes/AbyssalCameraRig.js",
      "import": "/engine/render/passes/AbyssalCameraRig.js",
      "sourceHash": "ede5f517cddb196883b925e8c6c82cef5c81cc7f9a446980bee7602b678dc221",
      "summary": "Applies a restrained floating-camera offset to isolated DOM scenery planes. WebGPU/2D canvases and document-root styles are deliberately excluded so animation cannot invalidate the page or disrupt GPU presentation textures.",
      "exports": [
        {
          "name": "AbyssalCameraRig",
          "kind": "class",
          "signature": "class AbyssalCameraRig",
          "summary": "Applies a restrained floating-camera offset to isolated DOM scenery planes. WebGPU/2D canvases and document-root styles are deliberately excluded so animation cannot invalidate the page or disrupt GPU presentation textures."
        },
        {
          "name": "startAbyssalCameraRig",
          "kind": "function",
          "signature": "startAbyssalCameraRig(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/AbyssalDiveTeam",
      "path": "engine/reference/render/passes/AbyssalDiveTeam.md",
      "source": "engine/render/passes/AbyssalDiveTeam.js",
      "import": "/engine/render/passes/AbyssalDiveTeam.js",
      "sourceHash": "5463887ff1e838b78090d3d1fc0ec01c084e592795f0cffc7636fd4c7d2c878f",
      "summary": "Authored three-person dive team for the abyssal landing scene. The team uses a deterministic mission-state controller instead of random action switching: swim, illuminate, inspect, signal, then inspect again. Individual response, phase, depth, and kick timing keep the formation alive without compromising buddy proximity or opaque paint ordering.",
      "exports": [
        {
          "name": "AbyssalDiveTeam",
          "kind": "class",
          "signature": "class AbyssalDiveTeam",
          "summary": "Authored three-person dive team for the abyssal landing scene. The team uses a deterministic mission-state controller instead of random action switching: swim, illuminate, inspect, signal, then inspect again. Individual response, phase, depth, and kick timing keep the formation alive without compromising buddy proximity or opaque paint ordering."
        },
        {
          "name": "startAbyssalDiveTeam",
          "kind": "function",
          "signature": "startAbyssalDiveTeam(layers, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/AbyssalFaunaField",
      "path": "engine/reference/render/passes/AbyssalFaunaField.md",
      "source": "engine/render/passes/AbyssalFaunaField.js",
      "import": "/engine/render/passes/AbyssalFaunaField.js",
      "sourceHash": "9ec30171f5b64a65660e1786d28900eb8f2b6a7782dfb7955bfd8548cbbbda13",
      "summary": "Small DOM fauna field for the authored abyssal landing scene. Local flock rules are deliberately limited to fish on the same depth plane.",
      "exports": [
        {
          "name": "AbyssalFaunaField",
          "kind": "class",
          "signature": "class AbyssalFaunaField",
          "summary": "Small DOM fauna field for the authored abyssal landing scene. Local flock rules are deliberately limited to fish on the same depth plane."
        },
        {
          "name": "startAbyssalFaunaField",
          "kind": "function",
          "signature": "startAbyssalFaunaField(layers, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/AbyssalSmokeAnimator",
      "path": "engine/reference/render/passes/AbyssalSmokeAnimator.md",
      "source": "engine/render/passes/AbyssalSmokeAnimator.js",
      "import": "/engine/render/passes/AbyssalSmokeAnimator.js",
      "sourceHash": "31b63e2426264412c11b1b563200452b7f68badd0a3fe80a14c0552bd426aeb6",
      "summary": "Cross-faded cel animator for the authored abyssal mineral plume. Two staggered lifecycles share the registered atlas. Each lifecycle changes drawing, rises, spreads, sheds opacity, and disappears while its successor is already forming at the vent. Adjacent-frame alpha always sums to one, which prevents the bright flashes produced by transition races.",
      "exports": [
        {
          "name": "AbyssalSmokeAnimator",
          "kind": "class",
          "signature": "class AbyssalSmokeAnimator",
          "summary": "Cross-faded cel animator for the authored abyssal mineral plume. Two staggered lifecycles share the registered atlas. Each lifecycle changes drawing, rises, spreads, sheds opacity, and disappears while its successor is already forming at the vent. Adjacent-frame alpha always sums to one, which prevents the bright flashes produced by transition races."
        },
        {
          "name": "startAbyssalSmokeAnimator",
          "kind": "function",
          "signature": "startAbyssalSmokeAnimator(stage, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/AreaResamplePass",
      "path": "engine/reference/render/passes/AreaResamplePass.md",
      "source": "engine/render/passes/AreaResamplePass.js",
      "import": "/engine/render/passes/AreaResamplePass.js",
      "sourceHash": "a8cd97fbd83e7df2e2abf1eadbdb455360818dd17839bc72ec8faedf75215b56",
      "summary": "AreaResamplePass - GPU-accelerated area-weighted resampling Better quality than bilinear for arbitrary scale factors. Especially useful for upscaling low-res renders.",
      "exports": [
        {
          "name": "AreaResamplePass",
          "kind": "class",
          "signature": "class AreaResamplePass",
          "summary": "AreaResamplePass - GPU-accelerated area-weighted resampling Better quality than bilinear for arbitrary scale factors. Especially useful for upscaling low-res renders."
        },
        {
          "name": "areaResampleCPU",
          "kind": "function",
          "signature": "areaResampleCPU(input, outputWidth, outputHeight)",
          "summary": "CPU area-weighted resample for ImageData (fallback or small images)"
        },
        {
          "name": "AREA_RESAMPLE_SHADER",
          "kind": "re-export",
          "signature": "AREA_RESAMPLE_SHADER",
          "summary": ""
        },
        {
          "name": "BLIT_FRAGMENT_SHADER",
          "kind": "re-export",
          "signature": "BLIT_FRAGMENT_SHADER",
          "summary": ""
        },
        {
          "name": "BLIT_VERTEX_SHADER",
          "kind": "re-export",
          "signature": "BLIT_VERTEX_SHADER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/AutoExposurePass",
      "path": "engine/reference/render/passes/AutoExposurePass.md",
      "source": "engine/render/passes/AutoExposurePass.js",
      "import": "/engine/render/passes/AutoExposurePass.js",
      "sourceHash": "289bb72a8a4f7fe605398825141be6375a86057a322e867d69adf22137e893ce",
      "summary": "",
      "exports": [
        {
          "name": "AutoExposurePass",
          "kind": "class",
          "signature": "class AutoExposurePass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/BloomPass",
      "path": "engine/reference/render/passes/BloomPass.md",
      "source": "engine/render/passes/BloomPass.js",
      "import": "/engine/render/passes/BloomPass.js",
      "sourceHash": "2ed0e4b0dc53eecbd555e7c0e7b984d0919a633d5a263e76511f5b1a4e7609b1",
      "summary": "",
      "exports": [
        {
          "name": "BloomPass",
          "kind": "class",
          "signature": "class BloomPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/CascadeMetrics",
      "path": "engine/reference/render/passes/CascadeMetrics.md",
      "source": "engine/render/passes/CascadeMetrics.js",
      "import": "/engine/render/passes/CascadeMetrics.js",
      "sourceHash": "9a7e80605570ddda58395922a37e9ceb4b430bd125dd2b1ce6b250f322237b62",
      "summary": "CascadeMetrics - Central metrics collection for cascaded chunk system",
      "exports": [
        {
          "name": "CascadeMetrics",
          "kind": "class",
          "signature": "class CascadeMetrics",
          "summary": "CascadeMetrics - Central metrics collection for cascaded chunk system"
        },
        {
          "name": "getMetrics",
          "kind": "function",
          "signature": "getMetrics()",
          "summary": "Get global metrics instance"
        },
        {
          "name": "resetMetrics",
          "kind": "function",
          "signature": "resetMetrics()",
          "summary": "Reset global metrics"
        },
        {
          "name": "CATEGORY",
          "kind": "re-export",
          "signature": "CATEGORY",
          "summary": ""
        },
        {
          "name": "Counter",
          "kind": "re-export",
          "signature": "Counter",
          "summary": ""
        },
        {
          "name": "RollingStats",
          "kind": "re-export",
          "signature": "RollingStats",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/CascadedShadows",
      "path": "engine/reference/render/passes/CascadedShadows.md",
      "source": "engine/render/passes/CascadedShadows.js",
      "import": "/engine/render/passes/CascadedShadows.js",
      "sourceHash": "f86d4f9679e598a56f470fed8f80e7d1e637fdf4f131687b762ab5f72d1f3f67",
      "summary": "CascadedShadowMap - Multi-cascade shadow mapping system",
      "exports": [
        {
          "name": "CascadedShadowMap",
          "kind": "class",
          "signature": "class CascadedShadowMap",
          "summary": "CascadedShadowMap - Multi-cascade shadow mapping system"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ChromaticAberrationPass",
      "path": "engine/reference/render/passes/ChromaticAberrationPass.md",
      "source": "engine/render/passes/ChromaticAberrationPass.js",
      "import": "/engine/render/passes/ChromaticAberrationPass.js",
      "sourceHash": "7faa00915cdb9553b9ed6a6dea1e9a31f17f7529b45f205d6fd624204387894d",
      "summary": "",
      "exports": [
        {
          "name": "ChromaticAberrationPass",
          "kind": "class",
          "signature": "class ChromaticAberrationPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ClearPass",
      "path": "engine/reference/render/passes/ClearPass.md",
      "source": "engine/render/passes/ClearPass.js",
      "import": "/engine/render/passes/ClearPass.js",
      "sourceHash": "da8f91ab513e5ebaa7c5217e2c5e32fc8eb35fd9c1dc8796e390349739618863",
      "summary": "",
      "exports": [
        {
          "name": "ensureColorAttachmentResource",
          "kind": "function",
          "signature": "ensureColorAttachmentResource(frameGraph, name, descriptor)",
          "summary": ""
        },
        {
          "name": "addCanvasClearPass",
          "kind": "function",
          "signature": "addCanvasClearPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "ClearPass",
          "kind": "re-export",
          "signature": "ClearPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ClothDebugController",
      "path": "engine/reference/render/passes/ClothDebugController.md",
      "source": "engine/render/passes/ClothDebugController.js",
      "import": "/engine/render/passes/ClothDebugController.js",
      "sourceHash": "7043267305dd46eeae61aa140adf69965f2a6c21658d989e05e04b3d8655623c",
      "summary": "",
      "exports": [
        {
          "name": "createClothDebugController",
          "kind": "function",
          "signature": "createClothDebugController(options = {})",
          "summary": ""
        },
        {
          "name": "ClothDebugController",
          "kind": "re-export",
          "signature": "ClothDebugController",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ClothDebugPass",
      "path": "engine/reference/render/passes/ClothDebugPass.md",
      "source": "engine/render/passes/ClothDebugPass.js",
      "import": "/engine/render/passes/ClothDebugPass.js",
      "sourceHash": "61c278b9e7bacc033ef3bbb4994b1b42b600d6d287536e4fbb08fca30996b501",
      "summary": "",
      "exports": [
        {
          "name": "addClothDebugPass",
          "kind": "function",
          "signature": "addClothDebugPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "ClothDebugPass",
          "kind": "re-export",
          "signature": "ClothDebugPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ColorGradingPass",
      "path": "engine/reference/render/passes/ColorGradingPass.md",
      "source": "engine/render/passes/ColorGradingPass.js",
      "import": "/engine/render/passes/ColorGradingPass.js",
      "sourceHash": "30fbda12e56a0818808b266f74e7ac3bcc4c04b7d2c84aa5ce58d25764f03ebc",
      "summary": "",
      "exports": [
        {
          "name": "ColorGradingPass",
          "kind": "class",
          "signature": "class ColorGradingPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ContactShadowsPass",
      "path": "engine/reference/render/passes/ContactShadowsPass.md",
      "source": "engine/render/passes/ContactShadowsPass.js",
      "import": "/engine/render/passes/ContactShadowsPass.js",
      "sourceHash": "7114d9f93ca4eb815592c5f0e05d1fe02c81d85aabc8844c95f6fc0bc4b44ed4",
      "summary": "",
      "exports": [
        {
          "name": "ContactShadowsPass",
          "kind": "class",
          "signature": "class ContactShadowsPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/DepthOfFieldPass",
      "path": "engine/reference/render/passes/DepthOfFieldPass.md",
      "source": "engine/render/passes/DepthOfFieldPass.js",
      "import": "/engine/render/passes/DepthOfFieldPass.js",
      "sourceHash": "f8cbe3e254df56d9bb05aa7d703bcee9597720cf687eb42826277adbe2f1459d",
      "summary": "",
      "exports": [
        {
          "name": "DepthOfFieldPass",
          "kind": "class",
          "signature": "class DepthOfFieldPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/DepthVisualizerPass",
      "path": "engine/reference/render/passes/DepthVisualizerPass.md",
      "source": "engine/render/passes/DepthVisualizerPass.js",
      "import": "/engine/render/passes/DepthVisualizerPass.js",
      "sourceHash": "dd18538bcb26873929f5233d2b6d479b245178a6597376ee1f0ebc32e1160a6f",
      "summary": "Execute depth visualizer pass",
      "exports": [
        {
          "name": "createDepthVisualizerPass",
          "kind": "function",
          "signature": "async createDepthVisualizerPass(device, outputFormat)",
          "summary": ""
        },
        {
          "name": "executeDepthVisualizerPass",
          "kind": "function",
          "signature": "executeDepthVisualizerPass(pass, visualizer, depthTexture, params = {})",
          "summary": "Execute depth visualizer pass"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/FSRPass",
      "path": "engine/reference/render/passes/FSRPass.md",
      "source": "engine/render/passes/FSRPass.js",
      "import": "/engine/render/passes/FSRPass.js",
      "sourceHash": "3ab53526f3bc4bd4e6e8390dc97a0b77103973a2c56c98d35c1701d1df1ad4b4",
      "summary": "FSRPass.js - FidelityFX Super Resolution 1.0 (Spatial Upscaler) Pure WebGPU/WGSL port of AMD's open-source FSR 1.0 algorithm. Two-pass spatial upscaler: EASU (Edge-Adaptive Spatial Upsampling) + RCAS (Sharpening). Use cases: - Fallback when temporal history is invalid (camera cuts, teleports) - Standalone spatial upscaling for non-temporal content - Combined with TSR as the spatial component Pipeline: Low-res input → EASU (directional upscale) → RCAS (adaptive sharpen) → Full-res output EASU: Analyzes local edge direction and applies a directionally-aware 12-tap filter. Detects edges via luminance gradients and stretches the filter kernel along the edge. This preserves edge sharpness while smoothing along edges (not across them). RCAS: Contrast-adaptive sharpening that avoids ringing artifacts. Computes local contrast from a cross-shaped sample pattern and applies sharpening proportional to inverse contrast (sharp where flat, gentle on edges).",
      "exports": [
        {
          "name": "FSRPass",
          "kind": "class",
          "signature": "class FSRPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/FXAAPass",
      "path": "engine/reference/render/passes/FXAAPass.md",
      "source": "engine/render/passes/FXAAPass.js",
      "import": "/engine/render/passes/FXAAPass.js",
      "sourceHash": "9f6dd69609017fd06156283221efb5b3bc07ca461c392219fa174c772f41885f",
      "summary": "",
      "exports": [
        {
          "name": "FXAAPass",
          "kind": "class",
          "signature": "class FXAAPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/FilmGrainPass",
      "path": "engine/reference/render/passes/FilmGrainPass.md",
      "source": "engine/render/passes/FilmGrainPass.js",
      "import": "/engine/render/passes/FilmGrainPass.js",
      "sourceHash": "17cddf642ff0bd5de799c3ec80e070a3bf75041b2b0ccd7d4fc64d46a713889d",
      "summary": "",
      "exports": [
        {
          "name": "FilmGrainPass",
          "kind": "class",
          "signature": "class FilmGrainPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/FluidDebugController",
      "path": "engine/reference/render/passes/FluidDebugController.md",
      "source": "engine/render/passes/FluidDebugController.js",
      "import": "/engine/render/passes/FluidDebugController.js",
      "sourceHash": "674b20d49c33ab003b9ce468117dd624543684e9370ee84efcee5021be1a2c80",
      "summary": "",
      "exports": [
        {
          "name": "createFluidDebugController",
          "kind": "function",
          "signature": "createFluidDebugController(options = {})",
          "summary": ""
        },
        {
          "name": "FluidDebugController",
          "kind": "re-export",
          "signature": "FluidDebugController",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/FluidDebugPass",
      "path": "engine/reference/render/passes/FluidDebugPass.md",
      "source": "engine/render/passes/FluidDebugPass.js",
      "import": "/engine/render/passes/FluidDebugPass.js",
      "sourceHash": "9fe1ef0e0561181556459cec6892df421c72502f35a090e9da9b06a0880a629a",
      "summary": "",
      "exports": [
        {
          "name": "addFluidDebugPass",
          "kind": "function",
          "signature": "addFluidDebugPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "FluidDebugPass",
          "kind": "re-export",
          "signature": "FluidDebugPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/FluidWaterPass",
      "path": "engine/reference/render/passes/FluidWaterPass.md",
      "source": "engine/render/passes/FluidWaterPass.js",
      "import": "/engine/render/passes/FluidWaterPass.js",
      "sourceHash": "5165f7675b0d7af0cc873ecdf85d67bc2839ffa0e14262da70bf3e2feabe1ebf",
      "summary": "Create resources for the fluid water rendering pass",
      "exports": [
        {
          "name": "createFluidWaterPass",
          "kind": "function",
          "signature": "createFluidWaterPass(device, options = {})",
          "summary": "Create resources for the fluid water rendering pass"
        },
        {
          "name": "renderFluidWater",
          "kind": "function",
          "signature": "renderFluidWater(pass, encoder, options = {})",
          "summary": "Render water/metaball surfaces from particles"
        },
        {
          "name": "resizeFluidWaterPass",
          "kind": "function",
          "signature": "resizeFluidWaterPass(pass, width, height)",
          "summary": "Resize the fluid water pass textures"
        },
        {
          "name": "destroyFluidWaterPass",
          "kind": "function",
          "signature": "destroyFluidWaterPass(pass)",
          "summary": "Destroy the fluid water pass resources"
        },
        {
          "name": "FluidWaterPass",
          "kind": "re-export",
          "signature": "FluidWaterPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/GeometryPass",
      "path": "engine/reference/render/passes/GeometryPass.md",
      "source": "engine/render/passes/GeometryPass.js",
      "import": "/engine/render/passes/GeometryPass.js",
      "sourceHash": "fe839ea86c1ae54d96615ef7b7b930fef3d5f46cccce8e5db46c757f3042ed62",
      "summary": "",
      "exports": [
        {
          "name": "addMainGeometryPass",
          "kind": "function",
          "signature": "addMainGeometryPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "GeometryPass",
          "kind": "re-export",
          "signature": "GeometryPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/GodRays",
      "path": "engine/reference/render/passes/GodRays.md",
      "source": "engine/render/passes/GodRays.js",
      "import": "/engine/render/passes/GodRays.js",
      "sourceHash": "92bd9cc5e57ed346537faf13a82cd2016f1f9505f82c1c8235639548bbc9790b",
      "summary": "GodRays - Volumetric light scattering effect WebGPU implementation with fixed 32-sample radial blur",
      "exports": [
        {
          "name": "GodRays",
          "kind": "class",
          "signature": "class GodRays",
          "summary": "GodRays - Volumetric light scattering effect WebGPU implementation with fixed 32-sample radial blur"
        },
        {
          "name": "GOD_RAYS_WGSL",
          "kind": "constant",
          "signature": "GOD_RAYS_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/GroundShadowPass",
      "path": "engine/reference/render/passes/GroundShadowPass.md",
      "source": "engine/render/passes/GroundShadowPass.js",
      "import": "/engine/render/passes/GroundShadowPass.js",
      "sourceHash": "35290af3e3843c8269df3623ab6440efcb28e51e35f0a9ec55f633ce3e854994",
      "summary": "GroundShadowPass.js - Analytical Blob Shadows on Ground Plane Projects entity shadow casters onto the y=0 ground plane along the sun direction and renders soft circular shadows. This is the standard technique used by mobile games (Minecraft, Animal Crossing) and many 3D editors. Advantages over screen-space ray marching: - No depth buffer artifacts (banding, streaking) - Works from any camera angle - Smooth, soft shadow edges with no aliasing - Very fast (one distance check per caster per pixel) Shadow casters are passed via a storage buffer (position + radius per entity). Output: Alpha-blended darkening composited over the scene.",
      "exports": [
        {
          "name": "GroundShadowPass",
          "kind": "class",
          "signature": "class GroundShadowPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/HDRPipeline",
      "path": "engine/reference/render/passes/HDRPipeline.md",
      "source": "engine/render/passes/HDRPipeline.js",
      "import": "/engine/render/passes/HDRPipeline.js",
      "sourceHash": "bc88b51310e741efd0b3801a480ac3c67b3893158d572060356667e0af15962f",
      "summary": "HDRPipeline - Complete HDR rendering pipeline",
      "exports": [
        {
          "name": "HDRPipeline",
          "kind": "class",
          "signature": "class HDRPipeline",
          "summary": "HDRPipeline - Complete HDR rendering pipeline"
        },
        {
          "name": "HDR_PIPELINE_WGSL",
          "kind": "constant",
          "signature": "HDR_PIPELINE_WGSL",
          "summary": ""
        },
        {
          "name": "TONEMAP_OPERATOR",
          "kind": "constant",
          "signature": "TONEMAP_OPERATOR",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/HiZPass",
      "path": "engine/reference/render/passes/HiZPass.md",
      "source": "engine/render/passes/HiZPass.js",
      "import": "/engine/render/passes/HiZPass.js",
      "sourceHash": "7ffd080be7fe5af343492a5bbe3a71d35fa4d70091100aa77b43063509baaff1",
      "summary": "",
      "exports": [
        {
          "name": "HiZPass",
          "kind": "class",
          "signature": "class HiZPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ImageHeatHazePass",
      "path": "engine/reference/render/passes/ImageHeatHazePass.md",
      "source": "engine/render/passes/ImageHeatHazePass.js",
      "import": "/engine/render/passes/ImageHeatHazePass.js",
      "sourceHash": "b860be7c106c9550d42d3dda250b17a4ef4acf61ce17c8032031ec565f3232ba",
      "summary": "ImageHeatHazePass.js - Layered water optics for an authored mineral plate. This is the static-image counterpart to ParticleDistortionRenderer. The authored plate owns geology; this pass owns water refraction, attenuation, caustics, texture-broken god rays, heat haze, and color-aware lava emission.",
      "exports": [
        {
          "name": "ImageHeatHazePass",
          "kind": "class",
          "signature": "class ImageHeatHazePass",
          "summary": ""
        },
        {
          "name": "projectImagePointToViewport",
          "kind": "function",
          "signature": "projectImagePointToViewport(imageUV, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight, imageAspect = 1.5,)",
          "summary": "Project a point in authored-image UV space into the backdrop viewport. Keep this in sync with the landing page's background-size breakpoints."
        },
        {
          "name": "startImageHeatHaze",
          "kind": "function",
          "signature": "async startImageHeatHaze(canvas, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/LensFlarePass",
      "path": "engine/reference/render/passes/LensFlarePass.md",
      "source": "engine/render/passes/LensFlarePass.js",
      "import": "/engine/render/passes/LensFlarePass.js",
      "sourceHash": "95ea2fee13682056030fdf1f8cefec96ae6c5f61b3e6c8f865cced3f2419a085",
      "summary": "",
      "exports": [
        {
          "name": "LensFlarePass",
          "kind": "class",
          "signature": "class LensFlarePass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/LightingPass",
      "path": "engine/reference/render/passes/LightingPass.md",
      "source": "engine/render/passes/LightingPass.js",
      "import": "/engine/render/passes/LightingPass.js",
      "sourceHash": "5a0746bae391d440cbf5b988cef327890d084ecc8b7037903996545e5c0bc348",
      "summary": "",
      "exports": [
        {
          "name": "addLightingPass",
          "kind": "function",
          "signature": "addLightingPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "LightingPass",
          "kind": "re-export",
          "signature": "LightingPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/MotionBlurPass",
      "path": "engine/reference/render/passes/MotionBlurPass.md",
      "source": "engine/render/passes/MotionBlurPass.js",
      "import": "/engine/render/passes/MotionBlurPass.js",
      "sourceHash": "238e2eb13d42e8bd53818e67203f778e0b3ce13789e18f4a2d7da4622f5bfea3",
      "summary": "",
      "exports": [
        {
          "name": "MotionBlurPass",
          "kind": "class",
          "signature": "class MotionBlurPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/OutlinePass",
      "path": "engine/reference/render/passes/OutlinePass.md",
      "source": "engine/render/passes/OutlinePass.js",
      "import": "/engine/render/passes/OutlinePass.js",
      "sourceHash": "e7038e8e729d7c198f7e1fcdd329a3e00b7f037f67a20d525f78725f5149aa95",
      "summary": "",
      "exports": [
        {
          "name": "OutlinePass",
          "kind": "class",
          "signature": "class OutlinePass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/PaniniProjectionPass",
      "path": "engine/reference/render/passes/PaniniProjectionPass.md",
      "source": "engine/render/passes/PaniniProjectionPass.js",
      "import": "/engine/render/passes/PaniniProjectionPass.js",
      "sourceHash": "1776bbec07c7a30210e2252b0b113ae240646efdb251d7049ff81fa8226a0b6a",
      "summary": "PaniniProjectionPass.js - Wide FOV Distortion Correction Now powered by vGPU driver Reduces the \"fish-eye\" distortion that occurs with wide field of view. Based on the Panini projection which maps perspective to a cylinder. Parameters: - strength: How much correction to apply (0 = none, 1 = full panini) - fov: Current field of view in degrees - cropToFit: Scale to avoid black edges (0 = no crop, 1 = full crop)",
      "exports": [
        {
          "name": "PaniniProjectionPass",
          "kind": "class",
          "signature": "class PaniniProjectionPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ParticlePass",
      "path": "engine/reference/render/passes/ParticlePass.md",
      "source": "engine/render/passes/ParticlePass.js",
      "import": "/engine/render/passes/ParticlePass.js",
      "sourceHash": "1fc79eabf581da2aa7276d4d67782f8c4aa9b11ce2f03aa77dc058116076a5e5",
      "summary": "",
      "exports": [
        {
          "name": "addParticleBillboardPass",
          "kind": "function",
          "signature": "addParticleBillboardPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "ParticlePass",
          "kind": "re-export",
          "signature": "ParticlePass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/PathTracingPass",
      "path": "engine/reference/render/passes/PathTracingPass.md",
      "source": "engine/render/passes/PathTracingPass.js",
      "import": "/engine/render/passes/PathTracingPass.js",
      "sourceHash": "8148a15ebabfc1cabef8d28f65b94cfaa6c62062aa824115afb55548f61e8be2",
      "summary": "",
      "exports": [
        {
          "name": "PathTracingPass",
          "kind": "class",
          "signature": "class PathTracingPass",
          "summary": ""
        },
        {
          "name": "PATH_TRACING_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "PATH_TRACING_PCG_HASH_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/PostProcessChainPass",
      "path": "engine/reference/render/passes/PostProcessChainPass.md",
      "source": "engine/render/passes/PostProcessChainPass.js",
      "import": "/engine/render/passes/PostProcessChainPass.js",
      "sourceHash": "afb758cb7abaaf5da143d4dd7d213bb2ce1d09e264c41571f67fd9805f30110d",
      "summary": "",
      "exports": [
        {
          "name": "addPostProcessChainPass",
          "kind": "function",
          "signature": "addPostProcessChainPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "PostProcessChainPass",
          "kind": "re-export",
          "signature": "PostProcessChainPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/PostProcessController",
      "path": "engine/reference/render/passes/PostProcessController.md",
      "source": "engine/render/passes/PostProcessController.js",
      "import": "/engine/render/passes/PostProcessController.js",
      "sourceHash": "b670a877fa3999aad848efcc2b4a425f30e6ef3fb76ca0b79488b653697c35ac",
      "summary": "",
      "exports": [
        {
          "name": "createPostProcessController",
          "kind": "function",
          "signature": "createPostProcessController(options = {})",
          "summary": ""
        },
        {
          "name": "PostProcessController",
          "kind": "re-export",
          "signature": "PostProcessController",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/PurkinjeEffectPass",
      "path": "engine/reference/render/passes/PurkinjeEffectPass.md",
      "source": "engine/render/passes/PurkinjeEffectPass.js",
      "import": "/engine/render/passes/PurkinjeEffectPass.js",
      "sourceHash": "5e1c119ed321bb0fe2e2719136c4ff16a040fd87f9182379e1051d67541456e4",
      "summary": "",
      "exports": [
        {
          "name": "PurkinjeEffectPass",
          "kind": "class",
          "signature": "class PurkinjeEffectPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ReSTIRGIPass",
      "path": "engine/reference/render/passes/ReSTIRGIPass.md",
      "source": "engine/render/passes/ReSTIRGIPass.js",
      "import": "/engine/render/passes/ReSTIRGIPass.js",
      "sourceHash": "c2b431cd5ff98282f3e0d1c5f1e5fb8283d89f7ae9757bf9e78a4fb65c60cf49",
      "summary": "",
      "exports": [
        {
          "name": "ReSTIRGIPass",
          "kind": "class",
          "signature": "class ReSTIRGIPass",
          "summary": ""
        },
        {
          "name": "RESTIR_TEMPORAL_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "RESTIR_TEMPORAL_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "RESTIR_SPATIAL_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "RESTIR_SPATIAL_PCG_HASH_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ReconstructionProvider",
      "path": "engine/reference/render/passes/ReconstructionProvider.md",
      "source": "engine/render/passes/ReconstructionProvider.js",
      "import": "/engine/render/passes/ReconstructionProvider.js",
      "sourceHash": "23141cb45df43984f6f6c0437a75d886626f5075a8b3d22d2004a60ac8f56aa8",
      "summary": "ReconstructionProvider.js - Unified Upscaling & Reconstruction Interface Abstracts over multiple reconstruction backends: - TSR (Temporal Super-Resolution) - best quality, uses temporal history - FSR (FidelityFX Super Resolution) - spatial only, fallback for camera cuts - SVGF (Denoiser) - for path-traced/GI content - Native TAA - no upscaling, just anti-aliasing - None - passthrough Future-proofed for: - WebNN neural upscaling (when browser API matures) - Custom ML models via WebGPU compute Usage: const provider = new ReconstructionProvider(device); await provider.init(displayWidth, displayHeight); provider.setMode('tsr', TSRQuality.QUALITY); // In render loop: const { width, height } = provider.getRenderSize(); const jitteredProj = provider.applyJitter(projMatrix); // ... render scene at width×height ... provider.execute(encoder, colorTex, depthTex, motionTex, outputTex);",
      "exports": [
        {
          "name": "ReconstructionProvider",
          "kind": "class",
          "signature": "class ReconstructionProvider",
          "summary": ""
        },
        {
          "name": "ReconstructionMode",
          "kind": "constant",
          "signature": "ReconstructionMode",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/RenderPassManager",
      "path": "engine/reference/render/passes/RenderPassManager.md",
      "source": "engine/render/passes/RenderPassManager.js",
      "import": "/engine/render/passes/RenderPassManager.js",
      "sourceHash": "da251f09012e1d696aef884a4048a502bc91625ff71d419ffbda38e5ba8df90a",
      "summary": "Render Pass Manager Manages multi-pass rendering pipeline with pass selection and visualization. Handles render target allocation, pass execution, and debug visualization.",
      "exports": [
        {
          "name": "RenderPassManager",
          "kind": "class",
          "signature": "class RenderPassManager",
          "summary": "Render Pass Manager Manages multi-pass rendering pipeline with pass selection and visualization. Handles render target allocation, pass execution, and debug visualization."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/SSAOPass",
      "path": "engine/reference/render/passes/SSAOPass.md",
      "source": "engine/render/passes/SSAOPass.js",
      "import": "/engine/render/passes/SSAOPass.js",
      "sourceHash": "6f095a49e114b50c3740944411b604eb118484a04c7e126dc98f2a2ce599e922",
      "summary": "SSAO Pass Manager",
      "exports": [
        {
          "name": "SSAOPass",
          "kind": "class",
          "signature": "class SSAOPass",
          "summary": "SSAO Pass Manager"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/SSGIPass",
      "path": "engine/reference/render/passes/SSGIPass.md",
      "source": "engine/render/passes/SSGIPass.js",
      "import": "/engine/render/passes/SSGIPass.js",
      "sourceHash": "84f8132c932cca11020b0bb7a5fcdff456aff1d419c22b547b7a9c071cc3ceb8",
      "summary": "",
      "exports": [
        {
          "name": "SSGIPass",
          "kind": "class",
          "signature": "class SSGIPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/SSRPass",
      "path": "engine/reference/render/passes/SSRPass.md",
      "source": "engine/render/passes/SSRPass.js",
      "import": "/engine/render/passes/SSRPass.js",
      "sourceHash": "dc27c00ade96f1ba4107d59bad34785818ddd94e06ff40a59af8f98620d8d396",
      "summary": "SSRPass - Screen-Space Reflections render pass",
      "exports": [
        {
          "name": "SSRPass",
          "kind": "class",
          "signature": "class SSRPass",
          "summary": "SSRPass - Screen-Space Reflections render pass"
        },
        {
          "name": "SSR_JITTER_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "SSR_JITTER_PCG_HASH_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/SVGFDenoise",
      "path": "engine/reference/render/passes/SVGFDenoise.md",
      "source": "engine/render/passes/SVGFDenoise.js",
      "import": "/engine/render/passes/SVGFDenoise.js",
      "sourceHash": "1dc61bfe63e917256e2c4541642d9676c50298384d4ab765d0318174a5545ba8",
      "summary": "SVGFDenoise.js - Spatiotemporal Variance-Guided Filtering Full SVGF denoising pipeline for compute-based path tracing / GI. Converts noisy 1-spp (or low-spp) input into clean output. Based on: - \"Spatiotemporal Variance-Guided Filtering\" (Schied et al., HPG 2017) - NVIDIA SVGF implementation techniques - À-Trous wavelet decomposition with edge-stopping functions Pipeline (per frame): 1. Temporal Accumulation: Reproject history, blend with current, track variance 2. Variance Estimation: Compute spatial variance from accumulated moments 3. À-Trous Wavelet Filter: 1-5 iterations of edge-preserving spatial blur - Edge-stopping by normal, depth, luminance, and variance - Increasing step size each iteration (1, 2, 4, 8, 16) - Firefly suppression via luminance clamping Inputs Required: - Noisy color (1-spp path trace output) - World-space normals - Linear depth - Motion vectors Outputs: - Denoised color (rgba16float) - Accumulated variance (for adaptive sampling feedback)",
      "exports": [
        {
          "name": "SVGFDenoise",
          "kind": "class",
          "signature": "class SVGFDenoise",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/SceneDebugVisualizerPass",
      "path": "engine/reference/render/passes/SceneDebugVisualizerPass.md",
      "source": "engine/render/passes/SceneDebugVisualizerPass.js",
      "import": "/engine/render/passes/SceneDebugVisualizerPass.js",
      "sourceHash": "193e24d26f750c8a5757d1eab192c48b6f0d73aadd568c5932088d04747b5081",
      "summary": "Scene Debug Visualizer Pass Fullscreen post-process that reads the ACTUAL scene depth buffer (depth24plus) and renders industry-standard debug visualizations: - Depth: linearized grayscale (near=white, far=black) - Normals: world-space normals reconstructed from depth (RGB = XYZ) Unlike the particle-only debug renderers, this shows the FULL scene (entity meshes + particles + everything that wrote to the depth buffer).",
      "exports": [
        {
          "name": "createSceneDebugVisualizerPass",
          "kind": "function",
          "signature": "async createSceneDebugVisualizerPass(device, outputFormat)",
          "summary": "Create the scene debug visualizer pass"
        },
        {
          "name": "executeSceneDebugVisualizerPass",
          "kind": "function",
          "signature": "executeSceneDebugVisualizerPass(encoder, outputView, depthView, visualizer, opts)",
          "summary": "Execute the scene debug visualizer pass"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ShadowAtlas",
      "path": "engine/reference/render/passes/ShadowAtlas.md",
      "source": "engine/render/passes/ShadowAtlas.js",
      "import": "/engine/render/passes/ShadowAtlas.js",
      "sourceHash": "5ff6c5d7fa6708d733035958d8daa25658f86b17944ec435936c7a96e9aae9e1",
      "summary": "ShadowAtlas.js - Unified Shadow Depth Atlas Single shared depth texture that ALL shadow casters render into. Inspired by Wicked Engine's shadow atlas architecture (2024): - One depth texture, one clear, one uninterrupted render pass - All geometry types (voxels, entities, particles, ropes) write sequentially - All fragment shaders sample from the same atlas - Comparison sampler for hardware PCF Replaces the separate shadow systems: - VoxelRenderer.shadowMapTexture  → ShadowAtlas.texture - ShadowMapPass.shadowTexture     → ShadowAtlas.texture Usage: const atlas = createShadowAtlas(device, { size: 2048 }); atlas.beginFrame(); atlas.addCaster(x, y, z, radius);  // for frustum fitting const lightVP = atlas.computeLightMatrix(sunDir); atlas.renderDepth(encoder, casters);  // all casters in one pass atlas.composite(encoder, ...);        // fullscreen darken Caster interface: { flush(pass: GPURenderPassEncoder, lightViewProj: Float32Array): void }",
      "exports": [
        {
          "name": "createShadowAtlas",
          "kind": "function",
          "signature": "createShadowAtlas(device, options = {})",
          "summary": ""
        },
        {
          "name": "beginFrame",
          "kind": "function",
          "signature": "beginFrame(atlas)",
          "summary": ""
        },
        {
          "name": "addCaster",
          "kind": "function",
          "signature": "addCaster(atlas, x, y, z, radius)",
          "summary": ""
        },
        {
          "name": "computeLightMatrix",
          "kind": "function",
          "signature": "computeLightMatrix(atlas, sunDir, cameraPos)",
          "summary": ""
        },
        {
          "name": "registerAtlasCaster",
          "kind": "function",
          "signature": "registerAtlasCaster(atlas, caster)",
          "summary": ""
        },
        {
          "name": "unregisterAtlasCaster",
          "kind": "function",
          "signature": "unregisterAtlasCaster(atlas, caster)",
          "summary": ""
        },
        {
          "name": "addCategoryCaster",
          "kind": "function",
          "signature": "addCategoryCaster(atlas, categoryName, caster)",
          "summary": ""
        },
        {
          "name": "renderAndCompositeAll",
          "kind": "function",
          "signature": "renderAndCompositeAll(atlas, encoder, outputView, sceneDepthTexture, invViewProj, screenW, screenH, cameraPos)",
          "summary": ""
        },
        {
          "name": "renderDepth",
          "kind": "function",
          "signature": "renderDepth(atlas, encoder, extraCasters)",
          "summary": ""
        },
        {
          "name": "composite",
          "kind": "function",
          "signature": "composite(atlas, encoder, outputView, sceneDepthTexture, invViewProj, screenW, screenH, cameraPos)",
          "summary": ""
        },
        {
          "name": "destroyShadowAtlas",
          "kind": "function",
          "signature": "destroyShadowAtlas(atlas)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ShadowMapPass",
      "path": "engine/reference/render/passes/ShadowMapPass.md",
      "source": "engine/render/passes/ShadowMapPass.js",
      "import": "/engine/render/passes/ShadowMapPass.js",
      "sourceHash": "7812c79e7c993d2f3b0eceafad716ccab8f229c79ada70be65b6db8cce93c991",
      "summary": "ShadowMapPass.js - Real Geometry Shadow Maps Renders entity depth from the sun's perspective into a shadow map texture, then composites geometry-accurate shadows onto the scene as a fullscreen pass. Architecture: 1. Shadow depth pass: EntityMeshRenderer.flushShadowDepth() draws all instanced entities into a depth32float texture from the light's orthographic projection. This runs AFTER the main flush() so the GPU instance buffer already contains this frame's data. 2. Composite pass: A fullscreen triangle reads the scene depth buffer, reconstructs world positions, projects them into light space, and samples the shadow map with PCF 3×3 filtering. Output is alpha-blended darkening. The light matrix is computed per-frame from the sun direction and a bounding sphere that encompasses all shadow casters (not the camera frustum), so off-screen entities still cast shadows into the visible area.",
      "exports": [
        {
          "name": "ShadowMapPass",
          "kind": "class",
          "signature": "class ShadowMapPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/ShadowPass",
      "path": "engine/reference/render/passes/ShadowPass.md",
      "source": "engine/render/passes/ShadowPass.js",
      "import": "/engine/render/passes/ShadowPass.js",
      "sourceHash": "79d94087be4cc83121e59c83c6024c4b9f806c72b9b1f43f89e95ae4e3f3e1b5",
      "summary": "",
      "exports": [
        {
          "name": "addDirectionalShadowPass",
          "kind": "function",
          "signature": "addDirectionalShadowPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "ShadowPass",
          "kind": "re-export",
          "signature": "ShadowPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/SharpeningPass",
      "path": "engine/reference/render/passes/SharpeningPass.md",
      "source": "engine/render/passes/SharpeningPass.js",
      "import": "/engine/render/passes/SharpeningPass.js",
      "sourceHash": "3a25793c1714b9a578dc2bdd2adfdbebf9469028409eec0a20af40921d703813",
      "summary": "",
      "exports": [
        {
          "name": "SharpeningPass",
          "kind": "class",
          "signature": "class SharpeningPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/SpellEffectPass",
      "path": "engine/reference/render/passes/SpellEffectPass.md",
      "source": "engine/render/passes/SpellEffectPass.js",
      "import": "/engine/render/passes/SpellEffectPass.js",
      "sourceHash": "68b7ee06650e5679da3d6d5385dc13dac901a6d58f0cae7b92d2bdba5d232b73",
      "summary": "Create the spell effect rendering pass",
      "exports": [
        {
          "name": "createSpellEffectPass",
          "kind": "function",
          "signature": "createSpellEffectPass(device, options = {})",
          "summary": "Create the spell effect rendering pass"
        },
        {
          "name": "renderSpellEffects",
          "kind": "function",
          "signature": "renderSpellEffects(pass, encoder, targetView, options = {})",
          "summary": "Render active spell effects"
        },
        {
          "name": "spellElementToEffectType",
          "kind": "function",
          "signature": "spellElementToEffectType(element)",
          "summary": "Map spell element to effect type"
        },
        {
          "name": "spellConfigToInstance",
          "kind": "function",
          "signature": "spellConfigToInstance(spellConfig, position, time, phase = 0.5)",
          "summary": "Convert a spell config to a renderable spell instance"
        },
        {
          "name": "EFFECT_TYPES",
          "kind": "constant",
          "signature": "EFFECT_TYPES",
          "summary": ""
        },
        {
          "name": "SPELL_TYPES",
          "kind": "constant",
          "signature": "SPELL_TYPES",
          "summary": ""
        },
        {
          "name": "SpellEffectPass",
          "kind": "re-export",
          "signature": "SpellEffectPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/TAAPass",
      "path": "engine/reference/render/passes/TAAPass.md",
      "source": "engine/render/passes/TAAPass.js",
      "import": "/engine/render/passes/TAAPass.js",
      "sourceHash": "1bc47ddb20577cc83ee4d132465c9b404596e8664eedd400434960c6c841f295",
      "summary": "TAAPass - Temporal Anti-Aliasing render pass",
      "exports": [
        {
          "name": "TAAPass",
          "kind": "class",
          "signature": "class TAAPass",
          "summary": "TAAPass - Temporal Anti-Aliasing render pass"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/TemporalSuperResolution",
      "path": "engine/reference/render/passes/TemporalSuperResolution.md",
      "source": "engine/render/passes/TemporalSuperResolution.js",
      "import": "/engine/render/passes/TemporalSuperResolution.js",
      "sourceHash": "248dd0deb0dc727f9ff8642871b4122166966f3cc3514ae2bd981ce23be4a607",
      "summary": "TemporalSuperResolution.js - Temporal Upscaling System Renders at reduced internal resolution and reconstructs full-res output using temporal reprojection, motion vectors, and edge-aware upsampling. Inspired by Unreal Engine TSR, AMD FSR 2, and Intel XeSS. Pure WebGPU/WGSL compute implementation. Pipeline: Render at renderScale (e.g. 50-75%) resolution ↓ Dilate motion vectors (fill gaps from thin geometry) ↓ Reproject history to current frame ↓ Neighborhood clamp in YCoCg (anti-ghosting) ↓ Compute per-pixel confidence (depth, motion, disocclusion) ↓ Adaptive blend current + history ↓ Lanczos-weighted upscale to output resolution ↓ RCAS sharpening pass ↓ Full-resolution output Quality Modes: Ultra Performance: 33% (3x upscale) Performance:       50% (2x upscale) Balanced:          58% (~1.7x upscale) Quality:           67% (1.5x upscale) Ultra Quality:     77% (1.3x upscale) Native AA:        100% (TAA replacement, no upscale)",
      "exports": [
        {
          "name": "TemporalSuperResolution",
          "kind": "class",
          "signature": "class TemporalSuperResolution",
          "summary": ""
        },
        {
          "name": "TSRQuality",
          "kind": "constant",
          "signature": "TSRQuality",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/TonemapPass",
      "path": "engine/reference/render/passes/TonemapPass.md",
      "source": "engine/render/passes/TonemapPass.js",
      "import": "/engine/render/passes/TonemapPass.js",
      "sourceHash": "a25f9d9baafc74e85bf55705e18348cc8a43a24b29a9b6f303a4e57ad359c8ba",
      "summary": "TonemapPass.js - Final Post-Processing Pass Applied as the very last pass after bloom. Provides: 1. ACES filmic tonemapping (HDR → LDR, matches playground SDF demo) 2. Vignette (darkened edges for cinematic look) 3. Distance fog (blend toward sky color at far range) Uses a single fullscreen triangle — no vertex buffer, no index buffer.",
      "exports": [
        {
          "name": "TonemapPass",
          "kind": "class",
          "signature": "class TonemapPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/UIHudPass",
      "path": "engine/reference/render/passes/UIHudPass.md",
      "source": "engine/render/passes/UIHudPass.js",
      "import": "/engine/render/passes/UIHudPass.js",
      "sourceHash": "51c08dccdf4ae28480ca432cb31e029f48fb132921a457f723f870da30944ecb",
      "summary": "",
      "exports": [
        {
          "name": "addUIHudPass",
          "kind": "function",
          "signature": "addUIHudPass(frameGraph, options = {})",
          "summary": ""
        },
        {
          "name": "UIHudPass",
          "kind": "re-export",
          "signature": "UIHudPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/UnderwaterPass",
      "path": "engine/reference/render/passes/UnderwaterPass.md",
      "source": "engine/render/passes/UnderwaterPass.js",
      "import": "/engine/render/passes/UnderwaterPass.js",
      "sourceHash": "61cda61d1826fc1c37d43fc7ef7ba620e737c60ccc31c99a855d6287e4f608f2",
      "summary": "",
      "exports": [
        {
          "name": "UnderwaterPass",
          "kind": "class",
          "signature": "class UnderwaterPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/UnderwaterSiltField",
      "path": "engine/reference/render/passes/UnderwaterSiltField.md",
      "source": "engine/render/passes/UnderwaterSiltField.js",
      "import": "/engine/render/passes/UnderwaterSiltField.js",
      "sourceHash": "774631eb5c176fea264e3c8fd6b469c2f8bb6fabdb432d4a556b9d205bf13c02",
      "summary": "UnderwaterSiltField.js - Lightweight interactive particulate atmosphere. A capped Canvas2D pass draws shallow caustic traces, depth-layered volcanic ash/mineral flecks, and upper-left refracted light shafts. Particles follow a slow analytic flow field and receive a local tangential impulse when the pointer disturbs the water. The module has no runtime dependencies so release pages can ship it beside the standalone authored-image backdrop pass.",
      "exports": [
        {
          "name": "UnderwaterSiltField",
          "kind": "class",
          "signature": "class UnderwaterSiltField",
          "summary": ""
        },
        {
          "name": "startUnderwaterSiltField",
          "kind": "function",
          "signature": "startUnderwaterSiltField(canvas, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/VignettePass",
      "path": "engine/reference/render/passes/VignettePass.md",
      "source": "engine/render/passes/VignettePass.js",
      "import": "/engine/render/passes/VignettePass.js",
      "sourceHash": "7db26d586c766cd46b4d540698a6dc80929cf6584a51fb0bcb5962a131188739",
      "summary": "",
      "exports": [
        {
          "name": "VignettePass",
          "kind": "class",
          "signature": "class VignettePass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/VolumetricCloudsPass",
      "path": "engine/reference/render/passes/VolumetricCloudsPass.md",
      "source": "engine/render/passes/VolumetricCloudsPass.js",
      "import": "/engine/render/passes/VolumetricCloudsPass.js",
      "sourceHash": "4a36a08a7bf799679f856f352d4fb45afea400335a2b45bf32566150bd6fb39f",
      "summary": "VolumetricCloudsPass.js - 3D Volumetric Clouds Now powered by vGPU driver Renders realistic volumetric clouds using ray marching through 3D noise-based density fields. Includes lighting and shadowing. Algorithm: 1. Ray march from camera through cloud layer 2. Sample 3D noise for cloud density 3. Accumulate light scattering and extinction 4. Apply shadow from sun direction Parameters: - coverage: Cloud coverage (0-1) - altitude: Cloud layer altitude in meters - thickness: Cloud layer thickness - density: Cloud density multiplier",
      "exports": [
        {
          "name": "VolumetricCloudsPass",
          "kind": "class",
          "signature": "class VolumetricCloudsPass",
          "summary": ""
        },
        {
          "name": "VOLUMETRIC_CLOUDS_JITTER_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "VOLUMETRIC_CLOUDS_JITTER_PCG_HASH_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/index",
      "path": "engine/reference/render/passes/index.md",
      "source": "engine/render/passes/index.js",
      "import": "/engine/render/passes/index.js",
      "sourceHash": "a2da5c4e699d16ccebf4a4bd8ce81267cfd0ff897d19d12f0d1fc2e1cc9a6530",
      "summary": "",
      "exports": [
        {
          "name": "AreaResamplePass",
          "kind": "re-export",
          "signature": "AreaResamplePass",
          "summary": ""
        },
        {
          "name": "AutoExposurePass",
          "kind": "re-export",
          "signature": "AutoExposurePass",
          "summary": ""
        },
        {
          "name": "BloomPass",
          "kind": "re-export",
          "signature": "BloomPass",
          "summary": ""
        },
        {
          "name": "CascadeMetrics",
          "kind": "re-export",
          "signature": "CascadeMetrics",
          "summary": ""
        },
        {
          "name": "CascadedShadowMap",
          "kind": "re-export",
          "signature": "CascadedShadowMap",
          "summary": ""
        },
        {
          "name": "CascadedShadowMapper",
          "kind": "re-export",
          "signature": "CascadedShadowMapper",
          "summary": ""
        },
        {
          "name": "ChromaticAberrationPass",
          "kind": "re-export",
          "signature": "ChromaticAberrationPass",
          "summary": ""
        },
        {
          "name": "ClearPass",
          "kind": "re-export",
          "signature": "ClearPass",
          "summary": ""
        },
        {
          "name": "ClothDebugController",
          "kind": "re-export",
          "signature": "ClothDebugController",
          "summary": ""
        },
        {
          "name": "ClothDebugPass",
          "kind": "re-export",
          "signature": "ClothDebugPass",
          "summary": ""
        },
        {
          "name": "ColorGradingPass",
          "kind": "re-export",
          "signature": "ColorGradingPass",
          "summary": ""
        },
        {
          "name": "ContactShadowsPass",
          "kind": "re-export",
          "signature": "ContactShadowsPass",
          "summary": ""
        },
        {
          "name": "DepthOfFieldPass",
          "kind": "re-export",
          "signature": "DepthOfFieldPass",
          "summary": ""
        },
        {
          "name": "FSRPass",
          "kind": "re-export",
          "signature": "FSRPass",
          "summary": ""
        },
        {
          "name": "FXAAPass",
          "kind": "re-export",
          "signature": "FXAAPass",
          "summary": ""
        },
        {
          "name": "FilmGrainPass",
          "kind": "re-export",
          "signature": "FilmGrainPass",
          "summary": ""
        },
        {
          "name": "FluidDebugController",
          "kind": "re-export",
          "signature": "FluidDebugController",
          "summary": ""
        },
        {
          "name": "FluidDebugPass",
          "kind": "re-export",
          "signature": "FluidDebugPass",
          "summary": ""
        },
        {
          "name": "FluidWaterPass",
          "kind": "re-export",
          "signature": "FluidWaterPass",
          "summary": ""
        },
        {
          "name": "GOD_RAYS_WGSL",
          "kind": "re-export",
          "signature": "GOD_RAYS_WGSL",
          "summary": ""
        },
        {
          "name": "GeometryPass",
          "kind": "re-export",
          "signature": "GeometryPass",
          "summary": ""
        },
        {
          "name": "GodRays",
          "kind": "re-export",
          "signature": "GodRays",
          "summary": ""
        },
        {
          "name": "HDRPipeline",
          "kind": "re-export",
          "signature": "HDRPipeline",
          "summary": ""
        },
        {
          "name": "HDR_PIPELINE_WGSL",
          "kind": "re-export",
          "signature": "HDR_PIPELINE_WGSL",
          "summary": ""
        },
        {
          "name": "HiZPass",
          "kind": "re-export",
          "signature": "HiZPass",
          "summary": ""
        },
        {
          "name": "LensFlarePass",
          "kind": "re-export",
          "signature": "LensFlarePass",
          "summary": ""
        },
        {
          "name": "LightingPass",
          "kind": "re-export",
          "signature": "LightingPass",
          "summary": ""
        },
        {
          "name": "MotionBlurPass",
          "kind": "re-export",
          "signature": "MotionBlurPass",
          "summary": ""
        },
        {
          "name": "OutlinePass",
          "kind": "re-export",
          "signature": "OutlinePass",
          "summary": ""
        },
        {
          "name": "PaniniProjectionPass",
          "kind": "re-export",
          "signature": "PaniniProjectionPass",
          "summary": ""
        },
        {
          "name": "ParticlePass",
          "kind": "re-export",
          "signature": "ParticlePass",
          "summary": ""
        },
        {
          "name": "PathTracingPass",
          "kind": "re-export",
          "signature": "PathTracingPass",
          "summary": ""
        },
        {
          "name": "PostProcessChainPass",
          "kind": "re-export",
          "signature": "PostProcessChainPass",
          "summary": ""
        },
        {
          "name": "PostProcessController",
          "kind": "re-export",
          "signature": "PostProcessController",
          "summary": ""
        },
        {
          "name": "PurkinjeEffectPass",
          "kind": "re-export",
          "signature": "PurkinjeEffectPass",
          "summary": ""
        },
        {
          "name": "ReSTIRGIPass",
          "kind": "re-export",
          "signature": "ReSTIRGIPass",
          "summary": ""
        },
        {
          "name": "ReconstructionMode",
          "kind": "re-export",
          "signature": "ReconstructionMode",
          "summary": ""
        },
        {
          "name": "ReconstructionProvider",
          "kind": "re-export",
          "signature": "ReconstructionProvider",
          "summary": ""
        },
        {
          "name": "SSAOPass",
          "kind": "re-export",
          "signature": "SSAOPass",
          "summary": ""
        },
        {
          "name": "SSGIPass",
          "kind": "re-export",
          "signature": "SSGIPass",
          "summary": ""
        },
        {
          "name": "SSRPass",
          "kind": "re-export",
          "signature": "SSRPass",
          "summary": ""
        },
        {
          "name": "SVGFDenoise",
          "kind": "re-export",
          "signature": "SVGFDenoise",
          "summary": ""
        },
        {
          "name": "ShadowPass",
          "kind": "re-export",
          "signature": "ShadowPass",
          "summary": ""
        },
        {
          "name": "SharpeningPass",
          "kind": "re-export",
          "signature": "SharpeningPass",
          "summary": ""
        },
        {
          "name": "SpellEffectPass",
          "kind": "re-export",
          "signature": "SpellEffectPass",
          "summary": ""
        },
        {
          "name": "TAAPass",
          "kind": "re-export",
          "signature": "TAAPass",
          "summary": ""
        },
        {
          "name": "TONEMAP_OPERATOR",
          "kind": "re-export",
          "signature": "TONEMAP_OPERATOR",
          "summary": ""
        },
        {
          "name": "TSRQuality",
          "kind": "re-export",
          "signature": "TSRQuality",
          "summary": ""
        },
        {
          "name": "TemporalSuperResolution",
          "kind": "re-export",
          "signature": "TemporalSuperResolution",
          "summary": ""
        },
        {
          "name": "UIHudPass",
          "kind": "re-export",
          "signature": "UIHudPass",
          "summary": ""
        },
        {
          "name": "UnderwaterPass",
          "kind": "re-export",
          "signature": "UnderwaterPass",
          "summary": ""
        },
        {
          "name": "VignettePass",
          "kind": "re-export",
          "signature": "VignettePass",
          "summary": ""
        },
        {
          "name": "VolumetricCloudsPass",
          "kind": "re-export",
          "signature": "VolumetricCloudsPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/passes/spellpacks/index",
      "path": "engine/reference/render/passes/spellpacks/index.md",
      "source": "engine/render/passes/spellpacks/index.js",
      "import": "/engine/render/passes/spellpacks/index.js",
      "sourceHash": "acede6b21fbdf71d5dad06484e60e585768d44830ee80440e9b867fc1836a18a",
      "summary": "spellpacks/index.js — placeholder for GPU spell effect manifests. The original data lived in an external sibling tree; this local stub lets SpellEffectPass compile until the spellpack manifest pipeline is merged.",
      "exports": [
        {
          "name": "collectGpuShaders",
          "kind": "function",
          "signature": "collectGpuShaders()",
          "summary": "spellpacks/index.js — placeholder for GPU spell effect manifests. The original data lived in an external sibling tree; this local stub lets SpellEffectPass compile until the spellpack manifest pipeline is merged."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/postprocess/TemporalAA",
      "path": "engine/reference/render/postprocess/TemporalAA.md",
      "source": "engine/render/postprocess/TemporalAA.js",
      "import": "/engine/render/postprocess/TemporalAA.js",
      "sourceHash": "6d70a31f104a34278d390bd5d8548307f6cdc2f4a1d7c29d13c79f2c0f6f3bea",
      "summary": "",
      "exports": [
        {
          "name": "TemporalAA",
          "kind": "class",
          "signature": "class TemporalAA",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/ProxyBillboardAlign",
      "path": "engine/reference/render/proxy/ProxyBillboardAlign.md",
      "source": "engine/render/proxy/ProxyBillboardAlign.js",
      "import": "/engine/render/proxy/ProxyBillboardAlign.js",
      "sourceHash": "29f9d80c08076d2c3dc3d598013b82f10a6844180218642b0dd71508a2f61717",
      "summary": "ProxyBillboardAlign — GPU Compute Pass for Billboard Instance Rotation Aligns BILLBOARD-mode proxy instances to face the camera each frame. Equivalent to Blender's \"Track To\" constraint + \"Align Euler to Vector\" in Geometry Nodes. Input:  instance buffer (read-write) containing worldMat per instance Output: updated rotation portion of worldMat in-place Only processes instances where proxyMode == PROXY_MODE_BILLBOARD (1u). BOX proxies are skipped (their orientation is set by the developer).",
      "exports": [
        {
          "name": "ProxyBillboardAlign",
          "kind": "class",
          "signature": "class ProxyBillboardAlign",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/ProxyGBufferPass",
      "path": "engine/reference/render/proxy/ProxyGBufferPass.md",
      "source": "engine/render/proxy/ProxyGBufferPass.js",
      "import": "/engine/render/proxy/ProxyGBufferPass.js",
      "sourceHash": "939630271c0627a8a3f11bc71625d161690685f671c93499cecd5d44195f3b5b",
      "summary": "ProxyGBufferPass — Rasterize Proxy AABB Cubes into the GBuffer ID Texture Renders invisible proxy bounding boxes (one per instance) to stamp a 1-indexed proxy instance ID into a r32uint GBuffer attachment. The depth buffer ensures correct occlusion against scene geometry. The r32uint texture is then read by ProxyMaskPass, which fires per-pixel rays only for pixels where instanceId > 0. Pipeline: Proxy cube geometry (GPU instanced) → vertex: transform by instance worldMat → fragment: write flat instanceId to r32uint attachment → depth: standard scene depth (proxy boxes occluded correctly) The proxy cubes are invisible in the color attachment — they only tag the ID texture. ProxyShadePass writes final color to the HDR buffer.",
      "exports": [
        {
          "name": "ProxyGBufferPass",
          "kind": "class",
          "signature": "class ProxyGBufferPass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/ProxyGeometrySystem",
      "path": "engine/reference/render/proxy/ProxyGeometrySystem.md",
      "source": "engine/render/proxy/ProxyGeometrySystem.js",
      "import": "/engine/render/proxy/ProxyGeometrySystem.js",
      "sourceHash": "ab1d751c033070314a39286f82e3e5e7c9ed27f8ed70fe5691e130599e73672d",
      "summary": "ProxyGeometrySystem — Main Orchestrator Decouples visual complexity from geometric complexity using the Ray Portal proxy technique adapted from Blender Cycles + 8 researched engine approaches. Architecture: 1. registerTarget(assetId, mesh, material) → Builds BLAS (BVH via BVHAccel), bakes SDF, bakes Octahedral atlas 2. addInstance(assetId, worldMatrix, mode) → Adds to instance buffer + TLAS 3. update(fps, cameraPos, encoder) → Billboard align compute, FPS-driven tier selection, TLAS refit 4. render(encoder, gbuffer, hdrTarget) → ProxyMaskPass → ProxyShadePass Quality tiers (auto-selected by FPS): ULTRA  (>55 FPS) — TLAS/BLAS per-pixel ray portal HIGH   (>40 FPS) — SDF cone march MED    (>28 FPS) — True impostor (height field billboard) LOW    (  <28  ) — Octahedral impostor atlas (baked) Public API: registerTarget(assetId, positions, indices, uvs, material) addInstance(assetId, worldMatrix, mode)        → instanceId removeInstance(instanceId) updateInstanceTransform(instanceId, worldMatrix) setQualityMode('auto' | 'ultra' | 'high' | 'med' | 'low') update(fps, cameraPos, commandEncoder) render(commandEncoder, gbufferTargets, hdrTarget) getStats() destroy()",
      "exports": [
        {
          "name": "ProxyGeometrySystem",
          "kind": "class",
          "signature": "class ProxyGeometrySystem",
          "summary": ""
        },
        {
          "name": "PROXY_MODE",
          "kind": "constant",
          "signature": "PROXY_MODE",
          "summary": ""
        },
        {
          "name": "PROXY_TIER",
          "kind": "re-export",
          "signature": "PROXY_TIER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/ProxyMaskPass",
      "path": "engine/reference/render/proxy/ProxyMaskPass.md",
      "source": "engine/render/proxy/ProxyMaskPass.js",
      "import": "/engine/render/proxy/ProxyMaskPass.js",
      "sourceHash": "c0a81ac86c61ca9140febd5c0715e66975a43c41a7242d9568205c735e713aa3",
      "summary": "ProxyMaskPass — Compute Pass: Per-Pixel Ray → Hit Mask + Hit Data This is the engine equivalent of Blender's Raycast Node. For each screen pixel tagged with a proxy instance ID (written by the GBuffer proxy rasterization pass), fires a ray into the appropriate quality tier: ULTRA (0) — TLAS/BLAS two-level BVH traversal (exact, per-pixel) HIGH  (1) — SDF cone marching (correct topology, slightly cheaper) MED   (2) — True impostor height-field ray march (billboard) LOW   (3) — Octahedral impostor atlas sample (baked, near zero cost) Outputs four textures consumed by ProxyShadePass: hitMask   — r8uint:  0 = miss (transparent), 1 = hit hitPos    — rgba32float: world-space hit position hitNormal — rgba16float: world-space hit normal hitUV     — rg16float:   UV for material sampling \"Is Hit\" = 0 causes ProxyShadePass to discard that pixel, producing the transparent cutout that hides the proxy box edges (Blender Transparent BSDF).",
      "exports": [
        {
          "name": "ProxyMaskPass",
          "kind": "class",
          "signature": "class ProxyMaskPass",
          "summary": ""
        },
        {
          "name": "PROXY_TIER",
          "kind": "constant",
          "signature": "PROXY_TIER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/ProxyOctahedralCache",
      "path": "engine/reference/render/proxy/ProxyOctahedralCache.md",
      "source": "engine/render/proxy/ProxyOctahedralCache.js",
      "import": "/engine/render/proxy/ProxyOctahedralCache.js",
      "sourceHash": "5dd1115914d35f880bc133f0f00a3c8c3b050605ab57260ffaf931004de615d9",
      "summary": "ProxyOctahedralCache — Baked Octahedral Impostor Atlas Pre-renders a target asset from N×N octahedral viewpoints and packs the results into a single texture atlas. At runtime, proxy billboards sample the nearest 4 frames (bilinearly blended in octahedral space). Technique from: Emil Poulsen / Unity Pixyz / UE5 Nanite fallback. Atlas layout: - atlasFrames × atlasFrames grid of FRAME_SIZE×FRAME_SIZE RGBA tiles - Each tile stores: RGB = color, A = alpha mask - An additional normal atlas stores XYZ normals (for lighting correction) Pros:  Near-zero runtime cost, excellent at distance. Cons:  Baked offline (re-bake if mesh changes); limited parallax. Fix:   Dirty flag triggers async re-bake; irradiance probe augments lighting.",
      "exports": [
        {
          "name": "ProxyOctahedralCache",
          "kind": "class",
          "signature": "class ProxyOctahedralCache",
          "summary": ""
        },
        {
          "name": "OCTAHEDRAL_WGSL",
          "kind": "constant",
          "signature": "OCTAHEDRAL_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/ProxySDF",
      "path": "engine/reference/render/proxy/ProxySDF.md",
      "source": "engine/render/proxy/ProxySDF.js",
      "import": "/engine/render/proxy/ProxySDF.js",
      "sourceHash": "d3f2d985cf41f1439435af10c4e69832bbc6b7724ab244d9b6ae820d32bbc534",
      "summary": "ProxySDF — SDF Proxy Baking + Runtime Cone March (HIGH tier) Wraps MeshSDFGenerator to produce 3D SDF textures for registered proxy assets. At runtime, the GPU cone marches (sphere traces) through the SDF to produce pixel-perfect silhouettes, normals, and depth from any viewing angle. Advantages over octahedral impostor: - Handles ANY topology (torus, rings, handles — not just height fields) - Normals derived from SDF gradient (analytically smooth) - SDF soft shadows / AO available for free via cone angle Known problems + solutions: Problem: O(n³) memory for 3D texture Fix:     Sparse SDF using VoxelCompression; only near-surface voxels stored Problem: UV data absent from SDF Fix:     Parallel volume storing nearest-triangle barycentric → UV lookup Problem: Thin features lose precision at low grid resolution Fix:     2-level SDF: coarse 32³ + fine 64³ near-surface refinement",
      "exports": [
        {
          "name": "ProxySDF",
          "kind": "class",
          "signature": "class ProxySDF",
          "summary": ""
        },
        {
          "name": "SDF_PROXY_WGSL",
          "kind": "constant",
          "signature": "SDF_PROXY_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/ProxyShadePass",
      "path": "engine/reference/render/proxy/ProxyShadePass.md",
      "source": "engine/render/proxy/ProxyShadePass.js",
      "import": "/engine/render/proxy/ProxyShadePass.js",
      "sourceHash": "49bfee938d567f47411159e90cfd005a3c1ce026b1b22ca9ea432c93388cb903",
      "summary": "ProxyShadePass — Material Evaluation + Composite to HDR Buffer Reads the hit data textures produced by ProxyMaskPass and: 1. Discards pixels where hitMask = 0 (transparent cutout — Blender Transparent BSDF) 2. Samples the target asset's material at hitUV (albedo, roughness, metallic, normal) 3. Evaluates PBR lighting using the engine's LightManager shader functions 4. Alpha-composites into the HDR color buffer before tonemapping This is the deferred equivalent of Blender's Mix Shader: Mix(factor=IsHit, A=RayPortalBSDF, B=TransparentBSDF) → HDR output",
      "exports": [
        {
          "name": "ProxyShadePass",
          "kind": "class",
          "signature": "class ProxyShadePass",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/TLASBuilder",
      "path": "engine/reference/render/proxy/TLASBuilder.md",
      "source": "engine/render/proxy/TLASBuilder.js",
      "import": "/engine/render/proxy/TLASBuilder.js",
      "sourceHash": "96b6a21a4dec44588a9247463376ecedd22a0a887e1db31e887b5aa0a809fd00",
      "summary": "TLASBuilder — Two-Level Acceleration Structure for Proxy Geometry Implements the TLAS (Top-Level Acceleration Structure) over proxy instances, each referencing a BLAS (Bottom-Level Acceleration Structure = the per-asset BVH built by BVHAccel.js / BVHBuilder). Key insight (from Jacco Bikker / Interplay of Light research): \"Given a mesh with a BVH in object space and a 4x4 matrix, we intersect its BVH in world space by applying the inverse transform to the ray.\" This means: - BLAS is built ONCE per unique asset, stored in object space - TLAS stores instance bounding boxes (world space) + inverse world matrices - Per-ray: traverse TLAS → at leaf, transform ray into object space → traverse BLAS - Adding 1000 instances of the same mesh = 1 BLAS + 1000 TLAS entries (not 1000 BVHes) GPU buffer layout designed for direct use in ray_portal.js WGSL traversal.",
      "exports": [
        {
          "name": "TLASBuilder",
          "kind": "class",
          "signature": "class TLASBuilder",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/proxy/index",
      "path": "engine/reference/render/proxy/index.md",
      "source": "engine/render/proxy/index.js",
      "import": "/engine/render/proxy/index.js",
      "sourceHash": "d2319ce371dd7953dc19b2a286a4cc5acffc2b9bb00b206125ade20047dfcd60",
      "summary": "Proxy Geometry System — Public Exports Ray Portal Proxy Topology rendering system: Decouples visual complexity from geometric complexity using 5 quality tiers that switch dynamically based on FPS. Primary entry point: ProxyGeometrySystem Usage: import { ProxyGeometrySystem, PROXY_MODE, PROXY_TIER } from './proxy/index.js'; const proxy = new ProxyGeometrySystem(device, width, height); await proxy.registerTarget(0, positions, indices, uvs, material); proxy.addInstance(0, worldMatrix, PROXY_MODE.BOX); // Per frame: proxy.update(fps, cameraPos, encoder); proxy.render(encoder, gbuffer, hdrTarget, sceneData);",
      "exports": [
        {
          "name": "OCTAHEDRAL_WGSL",
          "kind": "re-export",
          "signature": "OCTAHEDRAL_WGSL",
          "summary": ""
        },
        {
          "name": "PROXY_MODE",
          "kind": "re-export",
          "signature": "PROXY_MODE",
          "summary": ""
        },
        {
          "name": "PROXY_TIER",
          "kind": "re-export",
          "signature": "PROXY_TIER",
          "summary": ""
        },
        {
          "name": "ProxyBillboardAlign",
          "kind": "re-export",
          "signature": "ProxyBillboardAlign",
          "summary": ""
        },
        {
          "name": "ProxyGBufferPass",
          "kind": "re-export",
          "signature": "ProxyGBufferPass",
          "summary": ""
        },
        {
          "name": "ProxyGeometrySystem",
          "kind": "re-export",
          "signature": "ProxyGeometrySystem",
          "summary": ""
        },
        {
          "name": "ProxyMaskPass",
          "kind": "re-export",
          "signature": "ProxyMaskPass",
          "summary": ""
        },
        {
          "name": "ProxyOctahedralCache",
          "kind": "re-export",
          "signature": "ProxyOctahedralCache",
          "summary": ""
        },
        {
          "name": "ProxySDF",
          "kind": "re-export",
          "signature": "ProxySDF",
          "summary": ""
        },
        {
          "name": "ProxyShadePass",
          "kind": "re-export",
          "signature": "ProxyShadePass",
          "summary": ""
        },
        {
          "name": "RAY_PORTAL_WGSL",
          "kind": "re-export",
          "signature": "RAY_PORTAL_WGSL",
          "summary": ""
        },
        {
          "name": "SDF_PROXY_WGSL",
          "kind": "re-export",
          "signature": "SDF_PROXY_WGSL",
          "summary": ""
        },
        {
          "name": "TLASBuilder",
          "kind": "re-export",
          "signature": "TLASBuilder",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/scenes/StandardEntityRenderResources",
      "path": "engine/reference/render/scenes/StandardEntityRenderResources.md",
      "source": "engine/render/scenes/StandardEntityRenderResources.js",
      "import": "/engine/render/scenes/StandardEntityRenderResources.js",
      "sourceHash": "3962e8deccb25f98edb867aeb5b683a89684c0125acea1b4790c7b8f7cf36b0d",
      "summary": "",
      "exports": [
        {
          "name": "createStandardEntityRenderResources",
          "kind": "function",
          "signature": "createStandardEntityRenderResources(device, renderPipeline, lightsBuffer, entityId, uniformByteLength)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/scenes/StandardRoomRenderer",
      "path": "engine/reference/render/scenes/StandardRoomRenderer.md",
      "source": "engine/render/scenes/StandardRoomRenderer.js",
      "import": "/engine/render/scenes/StandardRoomRenderer.js",
      "sourceHash": "d08e4dca29b6598f339ab014a320d491cef84d1619236a892c19f7c533082d14",
      "summary": "",
      "exports": [
        {
          "name": "createStandardRoomRenderer",
          "kind": "function",
          "signature": "async createStandardRoomRenderer(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/scenes/StandardUniforms",
      "path": "engine/reference/render/scenes/StandardUniforms.md",
      "source": "engine/render/scenes/StandardUniforms.js",
      "import": "/engine/render/scenes/StandardUniforms.js",
      "sourceHash": "a62ec6c22a8ad363c3788ba40e405362df208db1c196b484ee07bbf9e806b174",
      "summary": "",
      "exports": [
        {
          "name": "updateStandardLights",
          "kind": "function",
          "signature": "updateStandardLights(device, lightsBuffer, lightsData, options = {})",
          "summary": ""
        },
        {
          "name": "updateStandardUniforms",
          "kind": "function",
          "signature": "updateStandardUniforms(device, targetBuffer, uniformData, uniformDataU32, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/scenes/VoxelWorldRenderer",
      "path": "engine/reference/render/scenes/VoxelWorldRenderer.md",
      "source": "engine/render/scenes/VoxelWorldRenderer.js",
      "import": "/engine/render/scenes/VoxelWorldRenderer.js",
      "sourceHash": "dfd316dab1b8cfd78a0ac378275c3942dee9e355b4a6f36c9bebe28ec0c9eab1",
      "summary": "Create a voxel world renderer.",
      "exports": [
        {
          "name": "createVoxelWorldRenderer",
          "kind": "function",
          "signature": "async createVoxelWorldRenderer(options)",
          "summary": "Create a voxel world renderer."
        },
        {
          "name": "updateVoxelWorldFrameUniforms",
          "kind": "function",
          "signature": "updateVoxelWorldFrameUniforms(device, frameBuffer, viewProj, view, proj, cameraPos, time,)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/sdf/MeshSDFGenerator",
      "path": "engine/reference/render/sdf/MeshSDFGenerator.md",
      "source": "engine/render/sdf/MeshSDFGenerator.js",
      "import": "/engine/render/sdf/MeshSDFGenerator.js",
      "sourceHash": "f27a66a4f93afefcea59324e4368ea97ab77a521de4f1e39fd276007b8d03b29",
      "summary": "Validate and repair mesh data - removes invalid vertices and degenerate triangles",
      "exports": [
        {
          "name": "validateMesh",
          "kind": "function",
          "signature": "validateMesh(positions, indices)",
          "summary": "Validate and repair mesh data - removes invalid vertices and degenerate triangles"
        },
        {
          "name": "simplifyMesh",
          "kind": "function",
          "signature": "simplifyMesh(positions, indices, targetTriangles = 1000)",
          "summary": "Simplify high-poly mesh for faster SDF generation"
        },
        {
          "name": "analyzeMesh",
          "kind": "function",
          "signature": "analyzeMesh(positions, indices)",
          "summary": "Analyze mesh and determine best SDF approach"
        },
        {
          "name": "computeBounds",
          "kind": "function",
          "signature": "computeBounds(positions)",
          "summary": "Compute axis-aligned bounding box"
        },
        {
          "name": "fitPrimitive",
          "kind": "function",
          "signature": "fitPrimitive(positions, indices)",
          "summary": "Auto-fit best primitive shape to mesh"
        },
        {
          "name": "fitCapsules",
          "kind": "function",
          "signature": "fitCapsules(positions, indices, maxCapsules = 8)",
          "summary": "Fit multiple capsules to a mesh (for ragdoll bodies)"
        },
        {
          "name": "generateTriangleBuffer",
          "kind": "function",
          "signature": "generateTriangleBuffer(positions, indices)",
          "summary": "Generate triangle buffer data for GPU SDF sampling"
        },
        {
          "name": "bakeSDF3D",
          "kind": "function",
          "signature": "bakeSDF3D(positions, indices, resolution = 32)",
          "summary": "Bake 3D SDF texture from mesh using BVH acceleration"
        },
        {
          "name": "initGPUBaker",
          "kind": "function",
          "signature": "async initGPUBaker(device)",
          "summary": "Initialize GPU SDF baker"
        },
        {
          "name": "hasGPUBaker",
          "kind": "function",
          "signature": "hasGPUBaker()",
          "summary": "Check if GPU baking is available"
        },
        {
          "name": "bakeSDF3DGPU",
          "kind": "function",
          "signature": "async bakeSDF3DGPU(positions, indices, resolution = 32)",
          "summary": "Bake 3D SDF texture using GPU compute (~100x faster) Falls back to CPU if GPU not available"
        },
        {
          "name": "generateMeshSDF",
          "kind": "function",
          "signature": "generateMeshSDF(positions, indices, options = {})",
          "summary": "Generate hybrid SDF for a mesh - automatically chooses best approach Now with mesh validation, simplification, and voxel acceleration"
        },
        {
          "name": "getCachedMeshSDF",
          "kind": "function",
          "signature": "getCachedMeshSDF(meshId, positions, indices, options = {})",
          "summary": "Get or generate cached SDF for a mesh"
        },
        {
          "name": "clearSDFCache",
          "kind": "function",
          "signature": "clearSDFCache()",
          "summary": "Clear SDF cache"
        },
        {
          "name": "generateMeshSDFAsync",
          "kind": "function",
          "signature": "async generateMeshSDFAsync(positions, indices, options = {})",
          "summary": "Async version of generateMeshSDF with GPU acceleration Use this for high-resolution baking (64³+)"
        },
        {
          "name": "SDF_TYPE",
          "kind": "constant",
          "signature": "SDF_TYPE",
          "summary": ""
        },
        {
          "name": "TRIANGLE_SDF_WGSL",
          "kind": "constant",
          "signature": "TRIANGLE_SDF_WGSL",
          "summary": "WGSL shader code for triangle buffer SDF sampling"
        },
        {
          "name": "BAKED_SDF_WGSL",
          "kind": "constant",
          "signature": "BAKED_SDF_WGSL",
          "summary": "WGSL shader code for 3D texture SDF sampling"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/sdf/SDFBakeCompute",
      "path": "engine/reference/render/sdf/SDFBakeCompute.md",
      "source": "engine/render/sdf/SDFBakeCompute.js",
      "import": "/engine/render/sdf/SDFBakeCompute.js",
      "sourceHash": "a43917fbb2aa8f564685bc747b40113addbe6859baf2083f6f82ba2aca795fe7",
      "summary": "SDFBakeCompute.js - GPU Compute Shader for 3D SDF Baking Now powered by vGPU driver Accelerates SDF texture generation using WebGPU compute shaders. ~100x faster than CPU for high resolution (64³+) SDF textures. Pipeline: 1. Upload triangle data to GPU buffer 2. Dispatch compute shader to calculate SDF for each voxel in parallel 3. Read back SDF texture data",
      "exports": [
        {
          "name": "SDFBakeCompute",
          "kind": "class",
          "signature": "class SDFBakeCompute",
          "summary": "GPU-accelerated SDF baker"
        },
        {
          "name": "createSDFBaker",
          "kind": "function",
          "signature": "createSDFBaker(device)",
          "summary": "Create GPU SDF baker instance"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/sdf/index",
      "path": "engine/reference/render/sdf/index.md",
      "source": "engine/render/sdf/index.js",
      "import": "/engine/render/sdf/index.js",
      "sourceHash": "08974cf0051060e3804fcc39c7f43cc3c37ea1bc0c8a82bd77fa21b183ea624d",
      "summary": "SDF Utilities - Signed Distance Field generation and baking",
      "exports": [
        {
          "name": "SDFBakeCompute",
          "kind": "re-export",
          "signature": "SDFBakeCompute",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/ShaderComposer",
      "path": "engine/reference/render/shaders/ShaderComposer.md",
      "source": "engine/render/shaders/ShaderComposer.js",
      "import": "/engine/render/shaders/ShaderComposer.js",
      "sourceHash": "7c38366eddee924aa499963175278a1bc2f369c541c3cec37085590fddbffd96",
      "summary": "",
      "exports": [
        {
          "name": "ShaderComposer",
          "kind": "class",
          "signature": "class ShaderComposer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/ShaderLoader",
      "path": "engine/reference/render/shaders/ShaderLoader.md",
      "source": "engine/render/shaders/ShaderLoader.js",
      "import": "/engine/render/shaders/ShaderLoader.js",
      "sourceHash": "835504a8138bdca92eef601ebc19d1c0704fb68521f06905376176ab1b9813f2",
      "summary": "",
      "exports": [
        {
          "name": "createShaderLoader",
          "kind": "function",
          "signature": "createShaderLoader(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/ShaderLoaderJS",
      "path": "engine/reference/render/shaders/ShaderLoaderJS.md",
      "source": "engine/render/shaders/ShaderLoaderJS.js",
      "import": "/engine/render/shaders/ShaderLoaderJS.js",
      "sourceHash": "668ea4d73011cd661ba6d16be48ec0cc1fd1c3ca90a4a798d9a45e812ca80c53",
      "summary": "",
      "exports": [
        {
          "name": "getShaderSource",
          "kind": "function",
          "signature": "getShaderSource(name)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/ShaderSchema",
      "path": "engine/reference/render/shaders/ShaderSchema.md",
      "source": "engine/render/shaders/ShaderSchema.js",
      "import": "/engine/render/shaders/ShaderSchema.js",
      "sourceHash": "464128c6c41d9901c241d280ec263d9b51f4270f282450e4796c976b6e375f84",
      "summary": "Generate WGSL struct definition from schema",
      "exports": [
        {
          "name": "generateStructWGSL",
          "kind": "function",
          "signature": "generateStructWGSL(schema)",
          "summary": "Generate WGSL struct definition from schema"
        },
        {
          "name": "generateBindingsWGSL",
          "kind": "function",
          "signature": "generateBindingsWGSL(groupSchema)",
          "summary": "Generate WGSL binding declarations from binding group schema"
        },
        {
          "name": "generateVertexInputWGSL",
          "kind": "function",
          "signature": "generateVertexInputWGSL(layout)",
          "summary": "Generate WGSL vertex input struct from vertex layout"
        },
        {
          "name": "alignOffset",
          "kind": "function",
          "signature": "alignOffset(offset, alignment)",
          "summary": "Calculate aligned byte offset for a field"
        },
        {
          "name": "calculateBufferSize",
          "kind": "function",
          "signature": "calculateBufferSize(schema)",
          "summary": "Calculate total buffer size from schema (with alignment)"
        },
        {
          "name": "createUniformBuffer",
          "kind": "function",
          "signature": "createUniformBuffer(schema)",
          "summary": "Create a typed array buffer matching schema"
        },
        {
          "name": "writeUniformField",
          "kind": "function",
          "signature": "writeUniformField(buffer, schema, fieldName, value)",
          "summary": "Write a value to a uniform buffer at the field's offset"
        },
        {
          "name": "readUniformField",
          "kind": "function",
          "signature": "readUniformField(buffer, schema, fieldName)",
          "summary": "Read a value from a uniform buffer at the field's offset"
        },
        {
          "name": "validateUniformBuffer",
          "kind": "function",
          "signature": "validateUniformBuffer(buffer, schema)",
          "summary": "Validate a uniform buffer against schema"
        },
        {
          "name": "validateBindingGroup",
          "kind": "function",
          "signature": "validateBindingGroup(entries, groupSchema)",
          "summary": "Validate binding group layout"
        },
        {
          "name": "createFrameUniformsBuffer",
          "kind": "function",
          "signature": "createFrameUniformsBuffer()",
          "summary": "Create frame uniforms buffer with defaults"
        },
        {
          "name": "createModelUniformsBuffer",
          "kind": "function",
          "signature": "createModelUniformsBuffer()",
          "summary": "Create model uniforms buffer with defaults"
        },
        {
          "name": "createMaterialUniformsBuffer",
          "kind": "function",
          "signature": "createMaterialUniformsBuffer()",
          "summary": "Create material uniforms buffer with defaults"
        },
        {
          "name": "createParticleParamsBuffer",
          "kind": "function",
          "signature": "createParticleParamsBuffer()",
          "summary": "Create particle params buffer with defaults"
        },
        {
          "name": "WGSL_TYPES",
          "kind": "constant",
          "signature": "WGSL_TYPES",
          "summary": "WGSL type sizes in bytes (aligned to 16-byte boundaries for uniforms)"
        },
        {
          "name": "BUFFER_USAGE",
          "kind": "constant",
          "signature": "BUFFER_USAGE",
          "summary": "Buffer usage types"
        },
        {
          "name": "TEXTURE_TYPES",
          "kind": "constant",
          "signature": "TEXTURE_TYPES",
          "summary": "Texture types"
        },
        {
          "name": "FRAME_UNIFORMS_SCHEMA",
          "kind": "constant",
          "signature": "FRAME_UNIFORMS_SCHEMA",
          "summary": "Frame uniforms - camera and time data, updated every frame"
        },
        {
          "name": "MODEL_UNIFORMS_SCHEMA",
          "kind": "constant",
          "signature": "MODEL_UNIFORMS_SCHEMA",
          "summary": "Model uniforms - per-object transform data"
        },
        {
          "name": "LIGHT_STRUCT_SCHEMA",
          "kind": "constant",
          "signature": "LIGHT_STRUCT_SCHEMA",
          "summary": "Light struct for dynamic lighting"
        },
        {
          "name": "MATERIAL_UNIFORMS_SCHEMA",
          "kind": "constant",
          "signature": "MATERIAL_UNIFORMS_SCHEMA",
          "summary": "PBR material uniforms"
        },
        {
          "name": "PARTICLE_PARAMS_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_PARAMS_SCHEMA",
          "summary": "Particle render params"
        },
        {
          "name": "POSTFX_PARAMS_SCHEMA",
          "kind": "constant",
          "signature": "POSTFX_PARAMS_SCHEMA",
          "summary": "Post-process common params"
        },
        {
          "name": "BINDING_GROUPS",
          "kind": "constant",
          "signature": "BINDING_GROUPS",
          "summary": "Standard binding group layouts"
        },
        {
          "name": "VERTEX_LAYOUTS",
          "kind": "constant",
          "signature": "VERTEX_LAYOUTS",
          "summary": "Standard vertex layouts"
        },
        {
          "name": "UNIFORM_SCHEMAS",
          "kind": "constant",
          "signature": "UNIFORM_SCHEMAS",
          "summary": ""
        },
        {
          "name": "COMMON_WGSL",
          "kind": "constant",
          "signature": "COMMON_WGSL",
          "summary": "Common WGSL utility functions"
        },
        {
          "name": "FULLSCREEN_TRIANGLE_VS",
          "kind": "constant",
          "signature": "FULLSCREEN_TRIANGLE_VS",
          "summary": "Full-screen triangle vertex shader"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/ShaderSources",
      "path": "engine/reference/render/shaders/ShaderSources.md",
      "source": "engine/render/shaders/ShaderSources.js",
      "import": "/engine/render/shaders/ShaderSources.js",
      "sourceHash": "0424b1914cbf82a77a83f03e8095c83a50310e59bba9bf1ea775a6fbe4cce683",
      "summary": "",
      "exports": [
        {
          "name": "ShaderSources",
          "kind": "constant",
          "signature": "ShaderSources",
          "summary": ""
        },
        {
          "name": "BINDING_GROUPS",
          "kind": "re-export",
          "signature": "BINDING_GROUPS",
          "summary": ""
        },
        {
          "name": "COMMON_WGSL",
          "kind": "re-export",
          "signature": "COMMON_WGSL",
          "summary": ""
        },
        {
          "name": "F32_TILE_64",
          "kind": "re-export",
          "signature": "F32_TILE_64",
          "summary": ""
        },
        {
          "name": "FRAME_UNIFORMS_SCHEMA",
          "kind": "re-export",
          "signature": "FRAME_UNIFORMS_SCHEMA",
          "summary": ""
        },
        {
          "name": "FULLSCREEN_TRIANGLE_VS",
          "kind": "re-export",
          "signature": "FULLSCREEN_TRIANGLE_VS",
          "summary": ""
        },
        {
          "name": "GpuTile",
          "kind": "re-export",
          "signature": "GpuTile",
          "summary": ""
        },
        {
          "name": "LIGHT_STRUCT_SCHEMA",
          "kind": "re-export",
          "signature": "LIGHT_STRUCT_SCHEMA",
          "summary": ""
        },
        {
          "name": "MATERIAL_UNIFORMS_SCHEMA",
          "kind": "re-export",
          "signature": "MATERIAL_UNIFORMS_SCHEMA",
          "summary": ""
        },
        {
          "name": "MODEL_UNIFORMS_SCHEMA",
          "kind": "re-export",
          "signature": "MODEL_UNIFORMS_SCHEMA",
          "summary": ""
        },
        {
          "name": "PARTICLE_PARAMS_SCHEMA",
          "kind": "re-export",
          "signature": "PARTICLE_PARAMS_SCHEMA",
          "summary": ""
        },
        {
          "name": "TILED_NBODY_EXAMPLE_WGSL",
          "kind": "re-export",
          "signature": "TILED_NBODY_EXAMPLE_WGSL",
          "summary": ""
        },
        {
          "name": "UNIFORM_SCHEMAS",
          "kind": "re-export",
          "signature": "UNIFORM_SCHEMAS",
          "summary": ""
        },
        {
          "name": "VEC2_TILE_64",
          "kind": "re-export",
          "signature": "VEC2_TILE_64",
          "summary": ""
        },
        {
          "name": "VEC4_TILE_128",
          "kind": "re-export",
          "signature": "VEC4_TILE_128",
          "summary": ""
        },
        {
          "name": "VEC4_TILE_64",
          "kind": "re-export",
          "signature": "VEC4_TILE_64",
          "summary": ""
        },
        {
          "name": "VERTEX_LAYOUTS",
          "kind": "re-export",
          "signature": "VERTEX_LAYOUTS",
          "summary": ""
        },
        {
          "name": "WGSL_TYPES",
          "kind": "re-export",
          "signature": "WGSL_TYPES",
          "summary": ""
        },
        {
          "name": "animeExplosionWGSL",
          "kind": "re-export",
          "signature": "animeExplosionWGSL",
          "summary": ""
        },
        {
          "name": "animeToonWGSL",
          "kind": "re-export",
          "signature": "animeToonWGSL",
          "summary": ""
        },
        {
          "name": "areaLightingWGSL",
          "kind": "re-export",
          "signature": "areaLightingWGSL",
          "summary": ""
        },
        {
          "name": "bloomBlurWGSL",
          "kind": "re-export",
          "signature": "bloomBlurWGSL",
          "summary": ""
        },
        {
          "name": "bloomCompositeWGSL",
          "kind": "re-export",
          "signature": "bloomCompositeWGSL",
          "summary": ""
        },
        {
          "name": "bloomSinglePassWGSL",
          "kind": "re-export",
          "signature": "bloomSinglePassWGSL",
          "summary": ""
        },
        {
          "name": "bloomThresholdWGSL",
          "kind": "re-export",
          "signature": "bloomThresholdWGSL",
          "summary": ""
        },
        {
          "name": "cameraStructWGSL",
          "kind": "re-export",
          "signature": "cameraStructWGSL",
          "summary": ""
        },
        {
          "name": "cameraUtilsWGSL",
          "kind": "re-export",
          "signature": "cameraUtilsWGSL",
          "summary": ""
        },
        {
          "name": "colorMathWGSL",
          "kind": "re-export",
          "signature": "colorMathWGSL",
          "summary": ""
        },
        {
          "name": "createFrameUniformsBuffer",
          "kind": "re-export",
          "signature": "createFrameUniformsBuffer",
          "summary": ""
        },
        {
          "name": "createMaterialUniformsBuffer",
          "kind": "re-export",
          "signature": "createMaterialUniformsBuffer",
          "summary": ""
        },
        {
          "name": "createModelUniformsBuffer",
          "kind": "re-export",
          "signature": "createModelUniformsBuffer",
          "summary": ""
        },
        {
          "name": "createUniformBuffer",
          "kind": "re-export",
          "signature": "createUniformBuffer",
          "summary": ""
        },
        {
          "name": "denoiseWGSL",
          "kind": "re-export",
          "signature": "denoiseWGSL",
          "summary": ""
        },
        {
          "name": "electricityWGSL",
          "kind": "re-export",
          "signature": "electricityWGSL",
          "summary": ""
        },
        {
          "name": "fireTurbulenceWGSL",
          "kind": "re-export",
          "signature": "fireTurbulenceWGSL",
          "summary": ""
        },
        {
          "name": "fluidWaterCompositeWGSL",
          "kind": "re-export",
          "signature": "fluidWaterCompositeWGSL",
          "summary": ""
        },
        {
          "name": "fractalEdgesWGSL",
          "kind": "re-export",
          "signature": "fractalEdgesWGSL",
          "summary": ""
        },
        {
          "name": "frameUniformsWGSL",
          "kind": "re-export",
          "signature": "frameUniformsWGSL",
          "summary": ""
        },
        {
          "name": "fullscreenQuadVertexWGSL",
          "kind": "re-export",
          "signature": "fullscreenQuadVertexWGSL",
          "summary": ""
        },
        {
          "name": "generateBindingsWGSL",
          "kind": "re-export",
          "signature": "generateBindingsWGSL",
          "summary": ""
        },
        {
          "name": "generateStructWGSL",
          "kind": "re-export",
          "signature": "generateStructWGSL",
          "summary": ""
        },
        {
          "name": "generateVertexInputWGSL",
          "kind": "re-export",
          "signature": "generateVertexInputWGSL",
          "summary": ""
        },
        {
          "name": "gpuTile",
          "kind": "re-export",
          "signature": "gpuTile",
          "summary": ""
        },
        {
          "name": "lightStructWGSL",
          "kind": "re-export",
          "signature": "lightStructWGSL",
          "summary": ""
        },
        {
          "name": "lightingModuleWGSL",
          "kind": "re-export",
          "signature": "lightingModuleWGSL",
          "summary": ""
        },
        {
          "name": "magicEffectsWGSL",
          "kind": "re-export",
          "signature": "magicEffectsWGSL",
          "summary": ""
        },
        {
          "name": "mathCommonWGSL",
          "kind": "re-export",
          "signature": "mathCommonWGSL",
          "summary": ""
        },
        {
          "name": "noise2dWGSL",
          "kind": "re-export",
          "signature": "noise2dWGSL",
          "summary": ""
        },
        {
          "name": "noise3dWGSL",
          "kind": "re-export",
          "signature": "noise3dWGSL",
          "summary": ""
        },
        {
          "name": "packingWGSL",
          "kind": "re-export",
          "signature": "packingWGSL",
          "summary": ""
        },
        {
          "name": "pathtracingGIWGSL",
          "kind": "re-export",
          "signature": "pathtracingGIWGSL",
          "summary": ""
        },
        {
          "name": "pbrMaterialsWGSL",
          "kind": "re-export",
          "signature": "pbrMaterialsWGSL",
          "summary": ""
        },
        {
          "name": "quaternionWGSL",
          "kind": "re-export",
          "signature": "quaternionWGSL",
          "summary": ""
        },
        {
          "name": "rayIntersectWGSL",
          "kind": "re-export",
          "signature": "rayIntersectWGSL",
          "summary": ""
        },
        {
          "name": "rayTerminationWGSL",
          "kind": "re-export",
          "signature": "rayTerminationWGSL",
          "summary": ""
        },
        {
          "name": "rayTracingWGSL",
          "kind": "re-export",
          "signature": "rayTracingWGSL",
          "summary": ""
        },
        {
          "name": "raymarchingModuleWGSL",
          "kind": "re-export",
          "signature": "raymarchingModuleWGSL",
          "summary": ""
        },
        {
          "name": "readUniformField",
          "kind": "re-export",
          "signature": "readUniformField",
          "summary": ""
        },
        {
          "name": "restirGuidePolicyWGSL",
          "kind": "re-export",
          "signature": "restirGuidePolicyWGSL",
          "summary": ""
        },
        {
          "name": "sdfPrimitivesWGSL",
          "kind": "re-export",
          "signature": "sdfPrimitivesWGSL",
          "summary": ""
        },
        {
          "name": "shadowsAoMacrosWGSL",
          "kind": "re-export",
          "signature": "shadowsAoMacrosWGSL",
          "summary": ""
        },
        {
          "name": "shadowsAoWGSL",
          "kind": "re-export",
          "signature": "shadowsAoWGSL",
          "summary": ""
        },
        {
          "name": "spellParticlesWGSL",
          "kind": "re-export",
          "signature": "spellParticlesWGSL",
          "summary": ""
        },
        {
          "name": "temporalAAWGSL",
          "kind": "re-export",
          "signature": "temporalAAWGSL",
          "summary": ""
        },
        {
          "name": "volumetricCloudsWGSL",
          "kind": "re-export",
          "signature": "volumetricCloudsWGSL",
          "summary": ""
        },
        {
          "name": "voronoiWGSL",
          "kind": "re-export",
          "signature": "voronoiWGSL",
          "summary": ""
        },
        {
          "name": "wgsl",
          "kind": "re-export",
          "signature": "wgsl",
          "summary": ""
        },
        {
          "name": "wgslFor",
          "kind": "re-export",
          "signature": "wgslFor",
          "summary": ""
        },
        {
          "name": "wgslIf",
          "kind": "re-export",
          "signature": "wgslIf",
          "summary": ""
        },
        {
          "name": "wgslVariant",
          "kind": "re-export",
          "signature": "wgslVariant",
          "summary": ""
        },
        {
          "name": "writeUniformField",
          "kind": "re-export",
          "signature": "writeUniformField",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/WgslPreprocessor",
      "path": "engine/reference/render/shaders/WgslPreprocessor.md",
      "source": "engine/render/shaders/WgslPreprocessor.js",
      "import": "/engine/render/shaders/WgslPreprocessor.js",
      "sourceHash": "93946d9994191be5b25d7105b9df8b3a3524c03fae865303aed5ff24e0835ee3",
      "summary": "Tagged template literal for WGSL preprocessing",
      "exports": [
        {
          "name": "wgsl",
          "kind": "function",
          "signature": "wgsl(strings, ...values)",
          "summary": "Tagged template literal for WGSL preprocessing"
        },
        {
          "name": "wgslIf",
          "kind": "function",
          "signature": "wgslIf(condition, ifTrue, ifFalse = '')",
          "summary": "Simple string-based conditionals without tagged template Useful for simpler cases"
        },
        {
          "name": "wgslFor",
          "kind": "function",
          "signature": "wgslFor(count, template)",
          "summary": "Repeat a string N times with index substitution ${i} in the template is replaced with the iteration index"
        },
        {
          "name": "wgslVariant",
          "kind": "function",
          "signature": "wgslVariant(features, variants)",
          "summary": "Create a shader variant by selecting features"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/clear_color",
      "path": "engine/reference/render/shaders/core/clear_color.md",
      "source": "engine/render/shaders/core/clear_color.js",
      "import": "/engine/render/shaders/core/clear_color.js",
      "sourceHash": "cfd9913790d25dbf2b5e686197f89f3854b0fafc21d1b71a80258d37f95cca87",
      "summary": "Clear Color Shader - Full-screen clear with uniform color",
      "exports": [
        {
          "name": "clearColorWGSL",
          "kind": "constant",
          "signature": "clearColorWGSL",
          "summary": "Clear Color Shader - Full-screen clear with uniform color"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/global_common",
      "path": "engine/reference/render/shaders/core/global_common.md",
      "source": "engine/render/shaders/core/global_common.js",
      "import": "/engine/render/shaders/core/global_common.js",
      "sourceHash": "f302c1d7fd3b7379299cbcd1b3b91720ee2b8d88a82c75889a3225a97cdc8a01",
      "summary": "",
      "exports": [
        {
          "name": "minimalFrameUniformsWGSL",
          "kind": "constant",
          "signature": "minimalFrameUniformsWGSL",
          "summary": ""
        },
        {
          "name": "globalCommonWGSL",
          "kind": "constant",
          "signature": "globalCommonWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/lighting",
      "path": "engine/reference/render/shaders/core/lighting.md",
      "source": "engine/render/shaders/core/lighting.js",
      "import": "/engine/render/shaders/core/lighting.js",
      "sourceHash": "d5b5299ebf19635d4c6a52adff673a91d4c64d1fb617ef19911fda72233d9bfe",
      "summary": "",
      "exports": [
        {
          "name": "simpleLightStructWGSL",
          "kind": "constant",
          "signature": "simpleLightStructWGSL",
          "summary": ""
        },
        {
          "name": "legacyLightingWGSL",
          "kind": "constant",
          "signature": "legacyLightingWGSL",
          "summary": ""
        },
        {
          "name": "lightingWGSL",
          "kind": "constant",
          "signature": "lightingWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/monitor_patterns",
      "path": "engine/reference/render/shaders/core/monitor_patterns.md",
      "source": "engine/render/shaders/core/monitor_patterns.js",
      "import": "/engine/render/shaders/core/monitor_patterns.js",
      "sourceHash": "3fd99ae2861cf4d89916478b81adf7cb08fe3e7b4742cd80d7b0b200a59b6662",
      "summary": "Monitor Patterns - Test patterns for display calibration",
      "exports": [
        {
          "name": "monitorPatternsWGSL",
          "kind": "constant",
          "signature": "monitorPatternsWGSL",
          "summary": "Monitor Patterns - Test patterns for display calibration"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/particles_billboard_legacy",
      "path": "engine/reference/render/shaders/core/particles_billboard_legacy.md",
      "source": "engine/render/shaders/core/particles_billboard_legacy.js",
      "import": "/engine/render/shaders/core/particles_billboard_legacy.js",
      "sourceHash": "ddb6b79ccc2048ddbf4ff4dd0cef8e3964a5481b1286fdf9ab4e56d0f28f6f4e",
      "summary": "Legacy Particles Billboard - Horizontal quad particles with cloud-like appearance Note: The main particles_billboard shader is in modules/core/particles_billboard.js",
      "exports": [
        {
          "name": "particlesBillboardLegacyWGSL",
          "kind": "constant",
          "signature": "particlesBillboardLegacyWGSL",
          "summary": "Legacy Particles Billboard - Horizontal quad particles with cloud-like appearance Note: The main particles_billboard shader is in modules/core/particles_billboard.js"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/solid_color",
      "path": "engine/reference/render/shaders/core/solid_color.md",
      "source": "engine/render/shaders/core/solid_color.js",
      "import": "/engine/render/shaders/core/solid_color.js",
      "sourceHash": "e406bfd56fcf0633f1870fa754d680ca3038491e939a4abd705e2168bde683ac",
      "summary": "Solid Color Shader - Simple vertex color passthrough",
      "exports": [
        {
          "name": "solidColorWGSL",
          "kind": "constant",
          "signature": "solidColorWGSL",
          "summary": "Solid Color Shader - Simple vertex color passthrough"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/standard",
      "path": "engine/reference/render/shaders/core/standard.md",
      "source": "engine/render/shaders/core/standard.js",
      "import": "/engine/render/shaders/core/standard.js",
      "sourceHash": "028581c8f6ad4e1fc33ac1368dc28459f1de67d972306e600906f2901212dd75",
      "summary": "============================================================================ STANDARD PBR SHADER WITH MULTI-TYPE LIGHTING ============================================================================ Supports three light types: - Point (type 0): Position-based with quadratic distance falloff - Directional (type 1): Direction-based, no distance falloff (sun-like) - Spot (type 2): Position + direction + cone falloff GPU BUFFER LAYOUT: Group 0 (Uniforms): Binding 0: Uniforms - projection, view, model matrices - color, alpha - lightCount, feature flags, sunDir, sunColor Binding 1: lights array<Light, 64> - position (vec3) + lightType (u32) - color (vec3) + innerCone (f32) - direction (vec3) + outerCone (f32)",
      "exports": [
        {
          "name": "standardShaderWGSL",
          "kind": "constant",
          "signature": "standardShaderWGSL",
          "summary": "============================================================================ STANDARD PBR SHADER WITH MULTI-TYPE LIGHTING ============================================================================ Supports three light types: - Point (type 0): Position-based with quadratic distance falloff - Directional (type 1): Direction-based, no distance falloff (sun-like) - Spot (type 2): Position + direction + cone falloff GPU BUFFER LAYOUT: Group 0 (Uniforms): Binding 0: Uniforms - projection, view, model matrices - color, alpha - lightCount, feature flags, sunDir, sunColor Binding 1: lights array<Light, 64> - position (vec3) + lightType (u32) - color (vec3) + innerCone (f32) - direction (vec3) + outerCone (f32)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/core/textured_quad",
      "path": "engine/reference/render/shaders/core/textured_quad.md",
      "source": "engine/render/shaders/core/textured_quad.js",
      "import": "/engine/render/shaders/core/textured_quad.js",
      "sourceHash": "1a7ef733b2d4e71564af682b5487296a9aaec452e851554b3f830321b6a24edf",
      "summary": "Textured Quad Shader - Simple texture sampling",
      "exports": [
        {
          "name": "texturedQuadWGSL",
          "kind": "constant",
          "signature": "texturedQuadWGSL",
          "summary": "Textured Quad Shader - Simple texture sampling"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/debug/cloth_debug",
      "path": "engine/reference/render/shaders/debug/cloth_debug.md",
      "source": "engine/render/shaders/debug/cloth_debug.js",
      "import": "/engine/render/shaders/debug/cloth_debug.js",
      "sourceHash": "c2ebc1ea1756fd4f55e72c8a3c6f3623ec99ef652d7a6ab09c792bdfbf067a47",
      "summary": "Cloth Debug Shader - Visualize cloth mesh with normal-based coloring",
      "exports": [
        {
          "name": "clothDebugWGSL",
          "kind": "constant",
          "signature": "clothDebugWGSL",
          "summary": "Cloth Debug Shader - Visualize cloth mesh with normal-based coloring"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/debug/debug_views",
      "path": "engine/reference/render/shaders/debug/debug_views.md",
      "source": "engine/render/shaders/debug/debug_views.js",
      "import": "/engine/render/shaders/debug/debug_views.js",
      "sourceHash": "c9ceefdeb6347511236eeb0a33a212b3ac1e0c10de15ca132628961b428764b4",
      "summary": "Debug Views Shader - Visualize different render targets (color, depth, normals, roughness/metallic)",
      "exports": [
        {
          "name": "debugViewsWGSL",
          "kind": "constant",
          "signature": "debugViewsWGSL",
          "summary": "Debug Views Shader - Visualize different render targets (color, depth, normals, roughness/metallic)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/debug/fluid_debug",
      "path": "engine/reference/render/shaders/debug/fluid_debug.md",
      "source": "engine/render/shaders/debug/fluid_debug.js",
      "import": "/engine/render/shaders/debug/fluid_debug.js",
      "sourceHash": "8c98f177723f42f05768e7a9b5102174a5625510e7f240837d87aea1343ee266",
      "summary": "Fluid Debug Shader - Visualize fluid density grid slices or max projection",
      "exports": [
        {
          "name": "fluidDebugWGSL",
          "kind": "constant",
          "signature": "fluidDebugWGSL",
          "summary": "Fluid Debug Shader - Visualize fluid density grid slices or max projection"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/effects/spell_effects.wgsl",
      "path": "engine/reference/render/shaders/effects/spell_effects.wgsl.md",
      "source": "engine/render/shaders/effects/spell_effects.wgsl.js",
      "import": "/engine/render/shaders/effects/spell_effects.wgsl.js",
      "sourceHash": "d2779c42f60ff6afa20582a0f75ca27ba8a32ffb6bc08722ca9d09602caba298",
      "summary": "",
      "exports": [
        {
          "name": "spellEffectsWGSL",
          "kind": "constant",
          "signature": "spellEffectsWGSL",
          "summary": ""
        },
        {
          "name": "SPELL_TYPE_CONSTS",
          "kind": "re-export",
          "signature": "SPELL_TYPE_CONSTS",
          "summary": ""
        },
        {
          "name": "spellEffectFragmentWGSL",
          "kind": "re-export",
          "signature": "spellEffectFragmentWGSL",
          "summary": ""
        },
        {
          "name": "spellUniformsWGSL",
          "kind": "re-export",
          "signature": "spellUniformsWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/materials/pbr_brdf",
      "path": "engine/reference/render/shaders/materials/pbr_brdf.md",
      "source": "engine/render/shaders/materials/pbr_brdf.js",
      "import": "/engine/render/shaders/materials/pbr_brdf.js",
      "sourceHash": "6b4c04a1409961463f0896c46e438a31e6b57a679e55c5000d6cb9ecdf7aa4d9",
      "summary": "PBR BRDF - Physically-based rendering BRDF functions (GGX/Schlick) Dependencies: Requires mathCommonWGSL for saturate() and PI. These are provided separately to avoid duplication when composing shaders.",
      "exports": [
        {
          "name": "pbrInputsStructWGSL",
          "kind": "constant",
          "signature": "pbrInputsStructWGSL",
          "summary": ""
        },
        {
          "name": "pbrBrdfFunctionsWGSL",
          "kind": "constant",
          "signature": "pbrBrdfFunctionsWGSL",
          "summary": ""
        },
        {
          "name": "pbrBrdfWGSL",
          "kind": "constant",
          "signature": "pbrBrdfWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/materials/pbr_extensions",
      "path": "engine/reference/render/shaders/materials/pbr_extensions.md",
      "source": "engine/render/shaders/materials/pbr_extensions.js",
      "import": "/engine/render/shaders/materials/pbr_extensions.js",
      "sourceHash": "181438d8646c3f9a4647cbfdba64e5cac2f6a4704e988e3123d7a966ac3e8ec5",
      "summary": "PBR Extensions - Placeholder hooks for subsurface scattering, fog, and post-lighting effects",
      "exports": [
        {
          "name": "pbrExtensionsWGSL",
          "kind": "constant",
          "signature": "pbrExtensionsWGSL",
          "summary": "PBR Extensions - Placeholder hooks for subsurface scattering, fog, and post-lighting effects"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/materials/pbr_ibl",
      "path": "engine/reference/render/shaders/materials/pbr_ibl.md",
      "source": "engine/render/shaders/materials/pbr_ibl.js",
      "import": "/engine/render/shaders/materials/pbr_ibl.js",
      "sourceHash": "7b095a186166d13d41151af7311c5d137d38fe0026c3b8094670036a73d94332",
      "summary": "PBR IBL - Image-based lighting for diffuse irradiance and specular reflections",
      "exports": [
        {
          "name": "pbrIblWGSL",
          "kind": "constant",
          "signature": "pbrIblWGSL",
          "summary": "PBR IBL - Image-based lighting for diffuse irradiance and specular reflections"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/materials/pbr_material_uniforms",
      "path": "engine/reference/render/shaders/materials/pbr_material_uniforms.md",
      "source": "engine/render/shaders/materials/pbr_material_uniforms.js",
      "import": "/engine/render/shaders/materials/pbr_material_uniforms.js",
      "sourceHash": "cc82de9995330d1a22e55834d2e5b70f19e0a172ed2dc7436493954747253d2a",
      "summary": "PBR Material Uniforms - Standard material parameter bindings",
      "exports": [
        {
          "name": "pbrMaterialUniformsWGSL",
          "kind": "constant",
          "signature": "pbrMaterialUniformsWGSL",
          "summary": "PBR Material Uniforms - Standard material parameter bindings"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/materials/shadow_pcf",
      "path": "engine/reference/render/shaders/materials/shadow_pcf.md",
      "source": "engine/render/shaders/materials/shadow_pcf.js",
      "import": "/engine/render/shaders/materials/shadow_pcf.js",
      "sourceHash": "2ff3844dae92f0503d2eb0553a27e1402de7ab38c6fe8b0744cabfc2478a40b0",
      "summary": "Shadow PCF - Percentage-closer filtering for soft shadows",
      "exports": [
        {
          "name": "shadowPcfWGSL",
          "kind": "constant",
          "signature": "shadowPcfWGSL",
          "summary": "Shadow PCF - Percentage-closer filtering for soft shadows"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/materials/unlit_world",
      "path": "engine/reference/render/shaders/materials/unlit_world.md",
      "source": "engine/render/shaders/materials/unlit_world.js",
      "import": "/engine/render/shaders/materials/unlit_world.js",
      "sourceHash": "962475c5eacc6f6d64921799680c09e6454df8f9a1210ded7c6f4b0da203765a",
      "summary": "Unlit World Shader - Simple unlit rendering with checkerboard floor",
      "exports": [
        {
          "name": "unlitWorldWGSL",
          "kind": "constant",
          "signature": "unlitWorldWGSL",
          "summary": "Unlit World Shader - Simple unlit rendering with checkerboard floor"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/materials/voxel_world",
      "path": "engine/reference/render/shaders/materials/voxel_world.md",
      "source": "engine/render/shaders/materials/voxel_world.js",
      "import": "/engine/render/shaders/materials/voxel_world.js",
      "sourceHash": "940f04b1e6ed0d02531b08706917ad12b910dd04c7bdaa942061a4591df7c087",
      "summary": "",
      "exports": [
        {
          "name": "voxelWorldWGSL",
          "kind": "constant",
          "signature": "voxelWorldWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/anime_explosion",
      "path": "engine/reference/render/shaders/modules/chunks/anime_explosion.md",
      "source": "engine/render/shaders/modules/chunks/anime_explosion.js",
      "import": "/engine/render/shaders/modules/chunks/anime_explosion.js",
      "sourceHash": "2e5c8bac538a08773c9cbb3803b897dbdbb6fd624103b2ee15229067bcd26034",
      "summary": "Anime Explosion Effects Stylized explosion effects inspired by anime/manga aesthetics. Key Features: 1. Spiky burst shapes - Sharp radial spikes 2. Color banding - Discrete anime-style colors 3. Impact rays - Speed lines radiating outward 4. Shockwave rings - Expanding circular waves 5. Debris particles - Flying sparks and chunks 6. Smoke puffs - Stylized cloud shapes Functions: - explosionBurst(uv, time) - Main explosion shape - impactRays(uv, count, time) - Speed lines - shockwaveRing(uv, time, speed) - Expanding ring - animeColorBand(intensity, colors) - Discrete color steps",
      "exports": [
        {
          "name": "animeExplosionWGSL",
          "kind": "constant",
          "signature": "animeExplosionWGSL",
          "summary": "Anime Explosion Effects Stylized explosion effects inspired by anime/manga aesthetics. Key Features: 1. Spiky burst shapes - Sharp radial spikes 2. Color banding - Discrete anime-style colors 3. Impact rays - Speed lines radiating outward 4. Shockwave rings - Expanding circular waves 5. Debris particles - Flying sparks and chunks 6. Smoke puffs - Stylized cloud shapes Functions: - explosionBurst(uv, time) - Main explosion shape - impactRays(uv, count, time) - Speed lines - shockwaveRing(uv, time, speed) - Expanding ring - animeColorBand(intensity, colors) - Discrete color steps"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/anime_toon",
      "path": "engine/reference/render/shaders/modules/chunks/anime_toon.md",
      "source": "engine/render/shaders/modules/chunks/anime_toon.js",
      "import": "/engine/render/shaders/modules/chunks/anime_toon.js",
      "sourceHash": "784061c1fed2887e860cbaeccf11b5c8d3eb029de7fb81b36699e9f5f4905f0c",
      "summary": "Anime / Toon Shading Stylized rendering techniques for anime/manga aesthetic. Key Concepts: 1. Multi-step shading - Discrete color bands 2. Outline rendering - Edge detection 3. Specular highlights - Sharp anime-style 4. Rim lighting - Edge glow 5. Hatching/cross-hatching - Manga shadows 6. Subsurface scattering - Skin glow Eye/Face Functions: - animeEye() - Full eye with iris, highlights - animeBrow() - Eyebrow curves - animeBlush() - Cheek flush marks - animeMouth() - Lip curves",
      "exports": [
        {
          "name": "animeToonWGSL",
          "kind": "constant",
          "signature": "animeToonWGSL",
          "summary": "Anime / Toon Shading Stylized rendering techniques for anime/manga aesthetic. Key Concepts: 1. Multi-step shading - Discrete color bands 2. Outline rendering - Edge detection 3. Specular highlights - Sharp anime-style 4. Rim lighting - Edge glow 5. Hatching/cross-hatching - Manga shadows 6. Subsurface scattering - Skin glow Eye/Face Functions: - animeEye() - Full eye with iris, highlights - animeBrow() - Eyebrow curves - animeBlush() - Cheek flush marks - animeMouth() - Lip curves"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/area_lighting",
      "path": "engine/reference/render/shaders/modules/chunks/area_lighting.md",
      "source": "engine/render/shaders/modules/chunks/area_lighting.js",
      "import": "/engine/render/shaders/modules/chunks/area_lighting.js",
      "sourceHash": "8c1f5cf6a403a3e39b07323a318a5fdf531f47fc0fffbc0d6366b6c5894a4d78",
      "summary": "Area Lighting & Soft Shadows Physically-based area light calculations for soft shadows and lighting. Supports spherical lights and occluders. Key Concepts: 1. Sphere occlusion - AO contribution from nearby spheres 2. Area shadows - Soft shadows from spherical lights/occluders 3. Sphere area lights - Proper falloff for spherical emitters 4. Floor occlusion - Ground plane ambient darkening Functions: - sphOcclusion(pos, nor, sph) - AO from single sphere - sphAreaShadow(P, light, occluder) - Soft shadow - sphAreaLight(P, N, light) - Area light contribution - floorOcclusion(P, N, floorY) - Ground plane AO",
      "exports": [
        {
          "name": "areaLightingWGSL",
          "kind": "constant",
          "signature": "areaLightingWGSL",
          "summary": "Area Lighting & Soft Shadows Physically-based area light calculations for soft shadows and lighting. Supports spherical lights and occluders. Key Concepts: 1. Sphere occlusion - AO contribution from nearby spheres 2. Area shadows - Soft shadows from spherical lights/occluders 3. Sphere area lights - Proper falloff for spherical emitters 4. Floor occlusion - Ground plane ambient darkening Functions: - sphOcclusion(pos, nor, sph) - AO from single sphere - sphAreaShadow(P, light, occluder) - Soft shadow - sphAreaLight(P, N, light) - Area light contribution - floorOcclusion(P, N, floorY) - Ground plane AO"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/blend_math",
      "path": "engine/reference/render/shaders/modules/chunks/blend_math.md",
      "source": "engine/render/shaders/modules/chunks/blend_math.js",
      "import": "/engine/render/shaders/modules/chunks/blend_math.js",
      "sourceHash": "9fa67bcf2fbbc556af908b6c87947a6cc76cd85fa595198b991760f06163ad01",
      "summary": "Shared alpha compositing, separable blend, coverage, and ordered-dither helpers for WGSL.",
      "exports": [
        {
          "name": "blendMathWGSL",
          "kind": "constant",
          "signature": "blendMathWGSL",
          "summary": "Shared alpha compositing, separable blend, coverage, and ordered-dither helpers for WGSL."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/camera_utils",
      "path": "engine/reference/render/shaders/modules/chunks/camera_utils.md",
      "source": "engine/render/shaders/modules/chunks/camera_utils.js",
      "import": "/engine/render/shaders/modules/chunks/camera_utils.js",
      "sourceHash": "605e7280721b7ec4e83385c29d7bb4cc306f7feba9aaad9507f2a51ac25bc378",
      "summary": "Camera Utilities for Shaders Common camera operations for ray generation and view transforms. Used by: ray marching, ray tracing, post-processing Functions: - getCameraMatrix(ro, ta, roll) - Look-at camera matrix - getRay(uv, ro, ta) - Generate ray from UV and camera - screenToWorld(uv, invViewProj) - Unproject screen to world",
      "exports": [
        {
          "name": "cameraUtilsWGSL",
          "kind": "constant",
          "signature": "cameraUtilsWGSL",
          "summary": "Camera Utilities for Shaders Common camera operations for ray generation and view transforms. Used by: ray marching, ray tracing, post-processing Functions: - getCameraMatrix(ro, ta, roll) - Look-at camera matrix - getRay(uv, ro, ta) - Generate ray from UV and camera - screenToWorld(uv, invViewProj) - Unproject screen to world"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/color_math",
      "path": "engine/reference/render/shaders/modules/chunks/color_math.md",
      "source": "engine/render/shaders/modules/chunks/color_math.js",
      "import": "/engine/render/shaders/modules/chunks/color_math.js",
      "sourceHash": "d9217091d8ff8d79835336e003ba36cda05c652e17d8ec192c378aaa3878f2b2",
      "summary": "Shared sRGB, luminance, contrast, YUV/YCbCr, and tone-map helpers for WGSL.",
      "exports": [
        {
          "name": "colorMathWGSL",
          "kind": "constant",
          "signature": "colorMathWGSL",
          "summary": "Shared sRGB, luminance, contrast, YUV/YCbCr, and tone-map helpers for WGSL."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/denoise",
      "path": "engine/reference/render/shaders/modules/chunks/denoise.md",
      "source": "engine/render/shaders/modules/chunks/denoise.js",
      "import": "/engine/render/shaders/modules/chunks/denoise.js",
      "sourceHash": "38c87c529bff408ff483e0ad620edf67a64779261933338706854669c5f67245",
      "summary": "Denoising for Path Tracing Edge-aware filtering and temporal accumulation for noisy renders. Key Concepts: 1. À-Trous Wavelet Transform - Multi-scale edge-aware blur 2. Bilateral filtering - Edge-preserving smoothing 3. Temporal AA/Accumulation - Frame blending with clamping 4. YUV color space - Better for temporal clamping 5. SVGF-style weights - Color, normal, depth weighting",
      "exports": [
        {
          "name": "denoiseWGSL",
          "kind": "constant",
          "signature": "denoiseWGSL",
          "summary": "Denoising for Path Tracing Edge-aware filtering and temporal accumulation for noisy renders. Key Concepts: 1. À-Trous Wavelet Transform - Multi-scale edge-aware blur 2. Bilateral filtering - Edge-preserving smoothing 3. Temporal AA/Accumulation - Frame blending with clamping 4. YUV color space - Better for temporal clamping 5. SVGF-style weights - Color, normal, depth weighting"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/electricity",
      "path": "engine/reference/render/shaders/modules/chunks/electricity.md",
      "source": "engine/render/shaders/modules/chunks/electricity.js",
      "import": "/engine/render/shaders/modules/chunks/electricity.js",
      "sourceHash": "f591713b66bd2977b5d53b24ace818c6606441a223c963913ddbaf7aa1f6527d",
      "summary": "Electricity & Plasma Effects Patterns for lightning, plasma, energy beams, and electrical arcs. Key Concepts: 1. Simplex 3D noise - Smooth organic patterns 2. Sharp glow falloff - Electric intensity 3. Color intensification - Plasma color math 4. Animated distortion - Moving energy Functions: - simplex3d(p) - 3D simplex noise - electricNoise(p) - Multi-octave electric noise - plasmaGlow(intensity, falloff) - Sharp glow - electricArc(uv, time) - Lightning bolt pattern - plasmaColor(intensity, baseColor) - Energy coloring",
      "exports": [
        {
          "name": "electricityWGSL",
          "kind": "constant",
          "signature": "electricityWGSL",
          "summary": "Electricity & Plasma Effects Patterns for lightning, plasma, energy beams, and electrical arcs. Key Concepts: 1. Simplex 3D noise - Smooth organic patterns 2. Sharp glow falloff - Electric intensity 3. Color intensification - Plasma color math 4. Animated distortion - Moving energy Functions: - simplex3d(p) - 3D simplex noise - electricNoise(p) - Multi-octave electric noise - plasmaGlow(intensity, falloff) - Sharp glow - electricArc(uv, time) - Lightning bolt pattern - plasmaColor(intensity, baseColor) - Energy coloring"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/fire_turbulence",
      "path": "engine/reference/render/shaders/modules/chunks/fire_turbulence.md",
      "source": "engine/render/shaders/modules/chunks/fire_turbulence.js",
      "import": "/engine/render/shaders/modules/chunks/fire_turbulence.js",
      "sourceHash": "c1700e27a0c1b68f7527e50b03273c5e69de6d4195ac3c1e907d02251d545a33",
      "summary": "Fire & Turbulence Effects Reusable patterns for fire, smoke, and turbulent effects. Based on multi-frequency wave accumulation technique. Key Concepts: 1. Turbulence: Sum of cos() waves at increasing frequencies 2. Twist: Rotate XZ based on Y for spiral motion 3. Expansion: Divide by height for spreading flames 4. Hollow cone SDF: Classic flame silhouette shape Functions: - fireTurbulence(pos, time, octaves) - Multi-octave distortion - fireColor(heat, turbulence) - Heat-based color gradient - flameShape(pos) - Hollow cone distance field - twistPosition(pos, rate) - Helical twist transform",
      "exports": [
        {
          "name": "fireTurbulenceWGSL",
          "kind": "constant",
          "signature": "fireTurbulenceWGSL",
          "summary": "Fire & Turbulence Effects Reusable patterns for fire, smoke, and turbulent effects. Based on multi-frequency wave accumulation technique. Key Concepts: 1. Turbulence: Sum of cos() waves at increasing frequencies 2. Twist: Rotate XZ based on Y for spiral motion 3. Expansion: Divide by height for spreading flames 4. Hollow cone SDF: Classic flame silhouette shape Functions: - fireTurbulence(pos, time, octaves) - Multi-octave distortion - fireColor(heat, turbulence) - Heat-based color gradient - flameShape(pos) - Hollow cone distance field - twistPosition(pos, rate) - Helical twist transform"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/fractal_edges",
      "path": "engine/reference/render/shaders/modules/chunks/fractal_edges.md",
      "source": "engine/render/shaders/modules/chunks/fractal_edges.js",
      "import": "/engine/render/shaders/modules/chunks/fractal_edges.js",
      "sourceHash": "caae5cdb1f034c19438ecb84c4b948592c6c0a044710fff45d47a4367e11c91f",
      "summary": "Fractal & Edge Detection Effects Raymarching fractals with stylized edge rendering. Key Concepts: 1. Fractal distance functions - Amazing Surface, Mandelbulb, etc. 2. Edge detection via Laplacian - Dark outlines from SDF 3. Normal-based coloring - No lighting, just normal as color 4. Rainbow/color bands - Animated stripes 5. Stylized sky/sun - Radial gradient with rays 6. Camera path animation - Smooth path following",
      "exports": [
        {
          "name": "fractalEdgesWGSL",
          "kind": "constant",
          "signature": "fractalEdgesWGSL",
          "summary": "Fractal & Edge Detection Effects Raymarching fractals with stylized edge rendering. Key Concepts: 1. Fractal distance functions - Amazing Surface, Mandelbulb, etc. 2. Edge detection via Laplacian - Dark outlines from SDF 3. Normal-based coloring - No lighting, just normal as color 4. Rainbow/color bands - Animated stripes 5. Stylized sky/sun - Radial gradient with rays 6. Camera path animation - Smooth path following"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/fullscreen_quad",
      "path": "engine/reference/render/shaders/modules/chunks/fullscreen_quad.md",
      "source": "engine/render/shaders/modules/chunks/fullscreen_quad.js",
      "import": "/engine/render/shaders/modules/chunks/fullscreen_quad.js",
      "sourceHash": "6f2178e987734dbbf00b75bb4930a819c4ee8b62ad1d530ea1c7e685019cb304",
      "summary": "Fullscreen Quad Vertex Shader - Reusable for post-processing effects Renders a fullscreen triangle (more efficient than quad) using vertex index. No vertex buffer needed - just draw 3 vertices. Usage: const myPostFx = `${fullscreenQuadVertexWGSL}${myFragmentShader}`;",
      "exports": [
        {
          "name": "fullscreenQuadVertexWGSL",
          "kind": "constant",
          "signature": "fullscreenQuadVertexWGSL",
          "summary": "Fullscreen Quad Vertex Shader - Reusable for post-processing effects Renders a fullscreen triangle (more efficient than quad) using vertex index. No vertex buffer needed - just draw 3 vertices. Usage: const myPostFx = `${fullscreenQuadVertexWGSL}${myFragmentShader}`;"
        },
        {
          "name": "fullscreenQuadExplicitWGSL",
          "kind": "constant",
          "signature": "fullscreenQuadExplicitWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/lighting_common",
      "path": "engine/reference/render/shaders/modules/chunks/lighting_common.md",
      "source": "engine/render/shaders/modules/chunks/lighting_common.js",
      "import": "/engine/render/shaders/modules/chunks/lighting_common.js",
      "sourceHash": "3d443be2b8617ddc62f98b619f11e10767275bedaf3fd5973eb06848cf2742a2",
      "summary": "",
      "exports": [
        {
          "name": "lightAttenuationWGSL",
          "kind": "constant",
          "signature": "lightAttenuationWGSL",
          "summary": ""
        },
        {
          "name": "diffuseLightingWGSL",
          "kind": "constant",
          "signature": "diffuseLightingWGSL",
          "summary": ""
        },
        {
          "name": "specularLightingWGSL",
          "kind": "constant",
          "signature": "specularLightingWGSL",
          "summary": ""
        },
        {
          "name": "lightCalculationWGSL",
          "kind": "constant",
          "signature": "lightCalculationWGSL",
          "summary": ""
        },
        {
          "name": "lightingModuleWGSL",
          "kind": "constant",
          "signature": "lightingModuleWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/magic_effects",
      "path": "engine/reference/render/shaders/modules/chunks/magic_effects.md",
      "source": "engine/render/shaders/modules/chunks/magic_effects.js",
      "import": "/engine/render/shaders/modules/chunks/magic_effects.js",
      "sourceHash": "78a655451f7e8f56bf0abed5928549b590f4eefc0c9d308dbfa90749b209d886",
      "summary": "",
      "exports": [
        {
          "name": "magicEffectsWGSL",
          "kind": "constant",
          "signature": "magicEffectsWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/math_common",
      "path": "engine/reference/render/shaders/modules/chunks/math_common.md",
      "source": "engine/render/shaders/modules/chunks/math_common.js",
      "import": "/engine/render/shaders/modules/chunks/math_common.js",
      "sourceHash": "c76c486d61921a52d0b55b4c87fd9a552aff3dbd7db3fa4487915473db80fbfd",
      "summary": "Shared Math Constants & Utilities for WGSL Shaders Usage: Import and concatenate at the beginning of shaders that need these. Example: `${mathCommonWGSL}` + yourShaderCode",
      "exports": [
        {
          "name": "mathCommonWGSL",
          "kind": "constant",
          "signature": "mathCommonWGSL",
          "summary": "Shared Math Constants & Utilities for WGSL Shaders Usage: Import and concatenate at the beginning of shaders that need these. Example: `${mathCommonWGSL}` + yourShaderCode"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/noise2d",
      "path": "engine/reference/render/shaders/modules/chunks/noise2d.md",
      "source": "engine/render/shaders/modules/chunks/noise2d.js",
      "import": "/engine/render/shaders/modules/chunks/noise2d.js",
      "sourceHash": "187bff708031dd49d8b8aa50c51bd086a75c30300a548654748e182a4895658d",
      "summary": "Shared 2D Noise Functions for WGSL Shaders Used by: particles_billboard, volume_smoke, future effects Functions provided: - hash2d(p) - Pseudo-random hash for 2D position - noise2d(p) - Smooth value noise - fbm2d(p) - Fractal Brownian Motion (4 octaves)",
      "exports": [
        {
          "name": "noise2dWGSL",
          "kind": "constant",
          "signature": "noise2dWGSL",
          "summary": "Shared 2D Noise Functions for WGSL Shaders Used by: particles_billboard, volume_smoke, future effects Functions provided: - hash2d(p) - Pseudo-random hash for 2D position - noise2d(p) - Smooth value noise - fbm2d(p) - Fractal Brownian Motion (4 octaves)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/noise3d",
      "path": "engine/reference/render/shaders/modules/chunks/noise3d.md",
      "source": "engine/render/shaders/modules/chunks/noise3d.js",
      "import": "/engine/render/shaders/modules/chunks/noise3d.js",
      "sourceHash": "a74606f0a74c2a1cffdb0ecccabc85e4884f7ae11842e21c3a7cabdb2f9c2d4c",
      "summary": "Shared 3D Noise Functions for WGSL Shaders Used by: volume_smoke, future volumetric effects Functions provided: - hash3d(p) - Pseudo-random hash for 3D position - noise3d(p) - Smooth value noise - fbm3d(p, octaves) - Fractal Brownian Motion (variable octaves) - fbm3dRotated(p, octaves) - FBM with rotation between octaves (reduces banding) - fbm3dVec(p) - Returns 3 independent noise values for domain warping - domainWarp(p, scale, intensity) - Warp position for organic turbulence",
      "exports": [
        {
          "name": "noise3dWGSL",
          "kind": "constant",
          "signature": "noise3dWGSL",
          "summary": "Shared 3D Noise Functions for WGSL Shaders Used by: volume_smoke, future volumetric effects Functions provided: - hash3d(p) - Pseudo-random hash for 3D position - noise3d(p) - Smooth value noise - fbm3d(p, octaves) - Fractal Brownian Motion (variable octaves) - fbm3dRotated(p, octaves) - FBM with rotation between octaves (reduces banding) - fbm3dVec(p) - Returns 3 independent noise values for domain warping - domainWarp(p, scale, intensity) - Warp position for organic turbulence"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/packing",
      "path": "engine/reference/render/shaders/modules/chunks/packing.md",
      "source": "engine/render/shaders/modules/chunks/packing.js",
      "import": "/engine/render/shaders/modules/chunks/packing.js",
      "sourceHash": "51cd4ab99a5e4533480ffac33475adf3555036e81dd1b0a4d2e9a0240d4f622c",
      "summary": "Normalized integer packing helpers mirrored from engine/core/math/MathPacking.js.",
      "exports": [
        {
          "name": "packingWGSL",
          "kind": "constant",
          "signature": "packingWGSL",
          "summary": "Normalized integer packing helpers mirrored from engine/core/math/MathPacking.js."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/pathtracing_gi",
      "path": "engine/reference/render/shaders/modules/chunks/pathtracing_gi.md",
      "source": "engine/render/shaders/modules/chunks/pathtracing_gi.js",
      "import": "/engine/render/shaders/modules/chunks/pathtracing_gi.js",
      "sourceHash": "43ed14dfb61a8f28d6c4f252ef95b48b6cb7e989c836c1da5654c196e9bb0942",
      "summary": "",
      "exports": [
        {
          "name": "pathtracingGIWGSL",
          "kind": "constant",
          "signature": "pathtracingGIWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/pbr_materials",
      "path": "engine/reference/render/shaders/modules/chunks/pbr_materials.md",
      "source": "engine/render/shaders/modules/chunks/pbr_materials.js",
      "import": "/engine/render/shaders/modules/chunks/pbr_materials.js",
      "sourceHash": "8c0318b5759833a31c76590f1d7097d0d83da734a886dbec3f5f9d6c20db9775",
      "summary": "PBR Materials for Path Tracing Physically-based materials with roughness, metallic, and Fresnel. Key Concepts: 1. Fresnel-Schlick - Reflectance at grazing angles 2. GGX/Roughness sampling - Importance sampling for specular 3. Metallic workflow - Dielectric vs conductor 4. Glass/refraction - Transparent materials 5. Energy conservation - Diffuse + specular balance",
      "exports": [
        {
          "name": "pbrMaterialsWGSL",
          "kind": "constant",
          "signature": "pbrMaterialsWGSL",
          "summary": "PBR Materials for Path Tracing Physically-based materials with roughness, metallic, and Fresnel. Key Concepts: 1. Fresnel-Schlick - Reflectance at grazing angles 2. GGX/Roughness sampling - Importance sampling for specular 3. Metallic workflow - Dielectric vs conductor 4. Glass/refraction - Transparent materials 5. Energy conservation - Diffuse + specular balance"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/quadtree",
      "path": "engine/reference/render/shaders/modules/chunks/quadtree.md",
      "source": "engine/render/shaders/modules/chunks/quadtree.js",
      "import": "/engine/render/shaders/modules/chunks/quadtree.js",
      "sourceHash": "67ddbe92c5a4f22a0556762ec76e1773d58f34900cb0fafade7c617a3aec2a67",
      "summary": "Quadtree / Recursive Cell Pattern Helpers (WGSL) Port of a Shadertoy-style quadtree zoom pattern into reusable WGSL. Functions: - quadtreeCellLevel(uv, time, maxLevels, baseRadius, resolutionY) Returns how deep the recursive subdivision went and a mask for the disc. - quadtreeMask(uv, time) Simple convenience wrapper returning a [0,1] mask based on level.",
      "exports": [
        {
          "name": "quadtreeWGSL",
          "kind": "constant",
          "signature": "quadtreeWGSL",
          "summary": "Quadtree / Recursive Cell Pattern Helpers (WGSL) Port of a Shadertoy-style quadtree zoom pattern into reusable WGSL. Functions: - quadtreeCellLevel(uv, time, maxLevels, baseRadius, resolutionY) Returns how deep the recursive subdivision went and a mask for the disc. - quadtreeMask(uv, time) Simple convenience wrapper returning a [0,1] mask based on level."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/quaternion",
      "path": "engine/reference/render/shaders/modules/chunks/quaternion.md",
      "source": "engine/render/shaders/modules/chunks/quaternion.js",
      "import": "/engine/render/shaders/modules/chunks/quaternion.js",
      "sourceHash": "343928d6d6112ea1846c7a5af88ec8c82e818ecc4ca0de1d8b0212888fb3e7df",
      "summary": "Quaternion Math for Shader Animation Full quaternion operations for skeletal animation and rotation. Key Concepts: 1. Quaternion multiplication - Compose rotations 2. Quaternion inverse/conjugate - Reverse rotation 3. Slerp interpolation - Smooth rotation blending 4. Point rotation - Apply quaternion to position 5. Matrix conversion - Quaternion to mat4 Functions: - quaternionMul(a, b) - Multiply quaternions - quaternionInverse(q) - Inverse rotation - quaternionSlerp(a, b, t) - Spherical interpolation - rotatePoint(p, center, q) - Rotate point - quaternionToMatrix(q, offset) - Convert to mat4",
      "exports": [
        {
          "name": "quaternionWGSL",
          "kind": "constant",
          "signature": "quaternionWGSL",
          "summary": "Quaternion Math for Shader Animation Full quaternion operations for skeletal animation and rotation. Key Concepts: 1. Quaternion multiplication - Compose rotations 2. Quaternion inverse/conjugate - Reverse rotation 3. Slerp interpolation - Smooth rotation blending 4. Point rotation - Apply quaternion to position 5. Matrix conversion - Quaternion to mat4 Functions: - quaternionMul(a, b) - Multiply quaternions - quaternionInverse(q) - Inverse rotation - quaternionSlerp(a, b, t) - Spherical interpolation - rotatePoint(p, center, q) - Rotate point - quaternionToMatrix(q, offset) - Convert to mat4"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/ray_intersect",
      "path": "engine/reference/render/shaders/modules/chunks/ray_intersect.md",
      "source": "engine/render/shaders/modules/chunks/ray_intersect.js",
      "import": "/engine/render/shaders/modules/chunks/ray_intersect.js",
      "sourceHash": "1837b9a4d51bad83321cfe1c5e95c61d62a97c5b36ab1d147431fed23ca283f2",
      "summary": "Ray-Primitive Intersection Library Analytic ray intersection routines for various geometric primitives. Returns intersection distance and surface normal. All functions follow the pattern: fn iShape(ro, rd, ...) -> RayHit Where RayHit contains: - dist: distance along ray (MAX_RAY_DIST if no hit) - normal: surface normal at intersection Primitives: - Plane, Disk - Sphere, Ellipsoid - Box, Rounded Box - Cylinder, Capsule - Cone, Rounded Cone - Torus - Triangle, Quad",
      "exports": [
        {
          "name": "rayIntersectWGSL",
          "kind": "constant",
          "signature": "rayIntersectWGSL",
          "summary": "Ray-Primitive Intersection Library Analytic ray intersection routines for various geometric primitives. Returns intersection distance and surface normal. All functions follow the pattern: fn iShape(ro, rd, ...) -> RayHit Where RayHit contains: - dist: distance along ray (MAX_RAY_DIST if no hit) - normal: surface normal at intersection Primitives: - Plane, Disk - Sphere, Ellipsoid - Box, Rounded Box - Cylinder, Capsule - Cone, Rounded Cone - Torus - Triangle, Quad"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/ray_termination",
      "path": "engine/reference/render/shaders/modules/chunks/ray_termination.md",
      "source": "engine/render/shaders/modules/chunks/ray_termination.js",
      "import": "/engine/render/shaders/modules/chunks/ray_termination.js",
      "sourceHash": "afa47f67300c9cc5b8a0cff8195131916c19766a445f584e69d71e2fc4f8f70e",
      "summary": "",
      "exports": [
        {
          "name": "rayTerminationWGSL",
          "kind": "constant",
          "signature": "rayTerminationWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/ray_tracing",
      "path": "engine/reference/render/shaders/modules/chunks/ray_tracing.md",
      "source": "engine/render/shaders/modules/chunks/ray_tracing.js",
      "import": "/engine/render/shaders/modules/chunks/ray_tracing.js",
      "sourceHash": "19060cc646c814fad8b8ca8af71a4e672fdc92335a4a9e525f17398543d8a188",
      "summary": "Ray Tracing Utilities Helper functions for path tracing and ray-based rendering. Includes materials, sampling, and lighting utilities. Functions: - Material handling (Lambertian, Metal, Dielectric) - Random sampling (hemisphere, disk, importance sampling) - Fresnel and BRDF calculations - Sky/environment sampling",
      "exports": [
        {
          "name": "rayTracingWGSL",
          "kind": "constant",
          "signature": "rayTracingWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/raymarching",
      "path": "engine/reference/render/shaders/modules/chunks/raymarching.md",
      "source": "engine/render/shaders/modules/chunks/raymarching.js",
      "import": "/engine/render/shaders/modules/chunks/raymarching.js",
      "sourceHash": "d991d037f2f953de380e26114c0b37af0361c9bc06f845f8c7bb1bd60d36d784",
      "summary": "",
      "exports": [
        {
          "name": "rayBoxIntersectWGSL",
          "kind": "constant",
          "signature": "rayBoxIntersectWGSL",
          "summary": ""
        },
        {
          "name": "raySphereIntersectWGSL",
          "kind": "constant",
          "signature": "raySphereIntersectWGSL",
          "summary": ""
        },
        {
          "name": "depthUtilsWGSL",
          "kind": "constant",
          "signature": "depthUtilsWGSL",
          "summary": ""
        },
        {
          "name": "trilinearSampleWGSL",
          "kind": "constant",
          "signature": "trilinearSampleWGSL",
          "summary": ""
        },
        {
          "name": "phaseFunctionsWGSL",
          "kind": "constant",
          "signature": "phaseFunctionsWGSL",
          "summary": ""
        },
        {
          "name": "beerLambertWGSL",
          "kind": "constant",
          "signature": "beerLambertWGSL",
          "summary": ""
        },
        {
          "name": "raymarchingModuleWGSL",
          "kind": "constant",
          "signature": "raymarchingModuleWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/restir_guide_policy",
      "path": "engine/reference/render/shaders/modules/chunks/restir_guide_policy.md",
      "source": "engine/render/shaders/modules/chunks/restir_guide_policy.js",
      "import": "/engine/render/shaders/modules/chunks/restir_guide_policy.js",
      "sourceHash": "92c27dcbfb15f8139ad652fec9e7e9d6c3e443ccadd4ccfae0bc307a20cd0549",
      "summary": "",
      "exports": [
        {
          "name": "restirGuidePolicyWGSL",
          "kind": "constant",
          "signature": "restirGuidePolicyWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/sdf_primitives",
      "path": "engine/reference/render/shaders/modules/chunks/sdf_primitives.md",
      "source": "engine/render/shaders/modules/chunks/sdf_primitives.js",
      "import": "/engine/render/shaders/modules/chunks/sdf_primitives.js",
      "sourceHash": "5bffa7e2d55c5ebbcb705397a6997f2018ec24cfb4b2b3c835a5c7cf249a6cac",
      "summary": "Signed Distance Field Primitives Common SDF shapes for ray marching. Used by: volume rendering, procedural geometry, collision detection Functions: - sdSphere(p, r) - Sphere SDF - sdBox(p, b) - Box SDF - sdPlane(p, n) - Plane SDF (n.xyz = normal, n.w = distance) - sdCapsule(p, a, b, r) - Capsule/cylinder SDF - sdTorus(p, t) - Torus SDF - opUnion(d1, d2) - Union of two SDFs - opSubtract(d1, d2) - Subtraction (d1 - d2) - opIntersect(d1, d2) - Intersection - opSmoothUnion(d1, d2, k) - Smooth blend union",
      "exports": [
        {
          "name": "sdfPrimitivesWGSL",
          "kind": "constant",
          "signature": "sdfPrimitivesWGSL",
          "summary": "Signed Distance Field Primitives Common SDF shapes for ray marching. Used by: volume rendering, procedural geometry, collision detection Functions: - sdSphere(p, r) - Sphere SDF - sdBox(p, b) - Box SDF - sdPlane(p, n) - Plane SDF (n.xyz = normal, n.w = distance) - sdCapsule(p, a, b, r) - Capsule/cylinder SDF - sdTorus(p, t) - Torus SDF - opUnion(d1, d2) - Union of two SDFs - opSubtract(d1, d2) - Subtraction (d1 - d2) - opIntersect(d1, d2) - Intersection - opSmoothUnion(d1, d2, k) - Smooth blend union"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/shadows_ao",
      "path": "engine/reference/render/shaders/modules/chunks/shadows_ao.md",
      "source": "engine/render/shaders/modules/chunks/shadows_ao.js",
      "import": "/engine/render/shaders/modules/chunks/shadows_ao.js",
      "sourceHash": "b6f2142015d0894818ab4ed8cc43a736b36bbaa522a29391b9df7f1cd1bc3c63",
      "summary": "Soft Shadows and Ambient Occlusion for Ray Marching Used by: SDF rendering, volumetric effects, global illumination Functions: - calcSoftShadow(ro, rd, sceneSDF, mint, maxt, k) - Penumbra soft shadows - calcAO(pos, nor, sceneSDF) - Ambient occlusion via ray marching - calcHardShadow(ro, rd, sceneSDF, mint, maxt) - Binary shadow test",
      "exports": [
        {
          "name": "shadowsAoWGSL",
          "kind": "constant",
          "signature": "shadowsAoWGSL",
          "summary": "Soft Shadows and Ambient Occlusion for Ray Marching Used by: SDF rendering, volumetric effects, global illumination Functions: - calcSoftShadow(ro, rd, sceneSDF, mint, maxt, k) - Penumbra soft shadows - calcAO(pos, nor, sceneSDF) - Ambient occlusion via ray marching - calcHardShadow(ro, rd, sceneSDF, mint, maxt) - Binary shadow test"
        },
        {
          "name": "shadowsAoMacrosWGSL",
          "kind": "constant",
          "signature": "shadowsAoMacrosWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/spell_particles",
      "path": "engine/reference/render/shaders/modules/chunks/spell_particles.md",
      "source": "engine/render/shaders/modules/chunks/spell_particles.js",
      "import": "/engine/render/shaders/modules/chunks/spell_particles.js",
      "sourceHash": "6708aaf17cb9e133e8189f2a8f36e106b9eb4bcdb6d05b3323bf9a5e297b7828",
      "summary": "Spell Particle Effects - WGSL Shader Chunk Particle behaviors for spell effects including projectiles, shields, auras, and various magical effects.",
      "exports": [
        {
          "name": "spellParticlesWGSL",
          "kind": "constant",
          "signature": "spellParticlesWGSL",
          "summary": "Spell Particle Effects - WGSL Shader Chunk Particle behaviors for spell effects including projectiles, shields, auras, and various magical effects."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/structs_common",
      "path": "engine/reference/render/shaders/modules/chunks/structs_common.md",
      "source": "engine/render/shaders/modules/chunks/structs_common.js",
      "import": "/engine/render/shaders/modules/chunks/structs_common.js",
      "sourceHash": "40d552dfa639ee82206128385d97ebcd8b72e36f3971f0a3e26da9bafe77f08d",
      "summary": "",
      "exports": [
        {
          "name": "lightStructWGSL",
          "kind": "constant",
          "signature": "lightStructWGSL",
          "summary": ""
        },
        {
          "name": "cameraStructWGSL",
          "kind": "constant",
          "signature": "cameraStructWGSL",
          "summary": ""
        },
        {
          "name": "frameUniformsWGSL",
          "kind": "constant",
          "signature": "frameUniformsWGSL",
          "summary": ""
        },
        {
          "name": "pbrMaterialStructWGSL",
          "kind": "constant",
          "signature": "pbrMaterialStructWGSL",
          "summary": ""
        },
        {
          "name": "standardVertexOutputWGSL",
          "kind": "constant",
          "signature": "standardVertexOutputWGSL",
          "summary": ""
        },
        {
          "name": "fullscreenVertexOutputWGSL",
          "kind": "constant",
          "signature": "fullscreenVertexOutputWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/temporal_aa",
      "path": "engine/reference/render/shaders/modules/chunks/temporal_aa.md",
      "source": "engine/render/shaders/modules/chunks/temporal_aa.js",
      "import": "/engine/render/shaders/modules/chunks/temporal_aa.js",
      "sourceHash": "a6951772dd79ce5902cc1aec1099b3f4c5cccf9100868e7b5f2c6b075da8e0a3",
      "summary": "Temporal Anti-Aliasing (TAA) Utilities Functions for implementing high-quality temporal anti-aliasing. Key Concepts: 1. Jittered sampling (Halton sequence) 2. History reprojection 3. Neighborhood clamping (ghosting prevention) 4. YCoCg color space (better clamping) 5. Catmull-Rom history sampling 6. Sharpening filter Functions: - halton23(index) - Halton 2,3 sequence for jitter - rgb2YCoCg / yCoCg2Rgb - Color space conversion - clipToBox - Neighborhood clamping - catmullRomSample - High quality history sampling",
      "exports": [
        {
          "name": "temporalAAWGSL",
          "kind": "constant",
          "signature": "temporalAAWGSL",
          "summary": "Temporal Anti-Aliasing (TAA) Utilities Functions for implementing high-quality temporal anti-aliasing. Key Concepts: 1. Jittered sampling (Halton sequence) 2. History reprojection 3. Neighborhood clamping (ghosting prevention) 4. YCoCg color space (better clamping) 5. Catmull-Rom history sampling 6. Sharpening filter Functions: - halton23(index) - Halton 2,3 sequence for jitter - rgb2YCoCg / yCoCg2Rgb - Color space conversion - clipToBox - Neighborhood clamping - catmullRomSample - High quality history sampling"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/texture_math",
      "path": "engine/reference/render/shaders/modules/chunks/texture_math.md",
      "source": "engine/render/shaders/modules/chunks/texture_math.js",
      "import": "/engine/render/shaders/modules/chunks/texture_math.js",
      "sourceHash": "422ead92e8516de4a7572024f922f79c2a312ca1ce430330cec087fac6def077",
      "summary": "Shared texture coordinate, mip, atlas, and virtual-texture helpers for WGSL.",
      "exports": [
        {
          "name": "textureMathWGSL",
          "kind": "constant",
          "signature": "textureMathWGSL",
          "summary": "Shared texture coordinate, mip, atlas, and virtual-texture helpers for WGSL."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/volumetric_clouds",
      "path": "engine/reference/render/shaders/modules/chunks/volumetric_clouds.md",
      "source": "engine/render/shaders/modules/chunks/volumetric_clouds.js",
      "import": "/engine/render/shaders/modules/chunks/volumetric_clouds.js",
      "sourceHash": "08031ecd713934199694d8ad9a6d0315f2971f50cb6c09839ba88040e93f83b6",
      "summary": "Volumetric Clouds & Fog Rendering Advanced volumetric rendering with dynamic step size and fog integration. Key Concepts: 1. Deformed periodic grid noise - Cheap volume noise 2. Dynamic step size - Adaptive raymarch based on density 3. Fog integral difference - Proper fog accumulation 4. Multi-octave displacement - FBM-like volume noise 5. Saturation-preserving interpolation - Better color blending",
      "exports": [
        {
          "name": "volumetricCloudsWGSL",
          "kind": "constant",
          "signature": "volumetricCloudsWGSL",
          "summary": "Volumetric Clouds & Fog Rendering Advanced volumetric rendering with dynamic step size and fog integration. Key Concepts: 1. Deformed periodic grid noise - Cheap volume noise 2. Dynamic step size - Adaptive raymarch based on density 3. Fog integral difference - Proper fog accumulation 4. Multi-octave displacement - FBM-like volume noise 5. Saturation-preserving interpolation - Better color blending"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/voronoi",
      "path": "engine/reference/render/shaders/modules/chunks/voronoi.md",
      "source": "engine/render/shaders/modules/chunks/voronoi.js",
      "import": "/engine/render/shaders/modules/chunks/voronoi.js",
      "sourceHash": "5721f3b1952a86fc73a50f967701e6d9edae29a107a3c34c2af97607c8e4deb9",
      "summary": "Voronoi & Cellular Noise Patterns Functions for voronoi diagrams, cellular textures, and organic patterns. Key Concepts: 1. Voronoi cells - Animated cellular patterns 2. Smooth voronoi - Blended cell boundaries 3. Polar coordinates - Radial patterns 4. Ring patterns - Concentric ripples 5. FBM with rotation - Reduced axis artifacts Functions: - voronoi2d(p, time) - Basic 2D voronoi - voronoiSmooth(p, w, time) - Smoothed cell edges - toPolar(v) - Cartesian to polar - ringPattern(p, time) - Concentric rings with noise",
      "exports": [
        {
          "name": "voronoiWGSL",
          "kind": "constant",
          "signature": "voronoiWGSL",
          "summary": "Voronoi & Cellular Noise Patterns Functions for voronoi diagrams, cellular textures, and organic patterns. Key Concepts: 1. Voronoi cells - Animated cellular patterns 2. Smooth voronoi - Blended cell boundaries 3. Polar coordinates - Radial patterns 4. Ring patterns - Concentric ripples 5. FBM with rotation - Reduced axis artifacts Functions: - voronoi2d(p, time) - Basic 2D voronoi - voronoiSmooth(p, w, time) - Smoothed cell edges - toPolar(v) - Cartesian to polar - ringPattern(p, time) - Concentric rings with noise"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/chunks/voxel_world",
      "path": "engine/reference/render/shaders/modules/chunks/voxel_world.md",
      "source": "engine/render/shaders/modules/chunks/voxel_world.js",
      "import": "/engine/render/shaders/modules/chunks/voxel_world.js",
      "sourceHash": "a22a0a9eaf778bd4434bcfb2adb16a0b9b45a1df11a27a406c8cf78b006c6d50",
      "summary": "Voxel World Module - shared terrain functions for voxel-style materials. This chunk does NOT declare entry points. It only provides reusable WGSL helpers for triplanar noise, terrain palette, and voxel edge darkening.",
      "exports": [
        {
          "name": "voxelWorldModuleWGSL",
          "kind": "constant",
          "signature": "voxelWorldModuleWGSL",
          "summary": "Voxel World Module - shared terrain functions for voxel-style materials. This chunk does NOT declare entry points. It only provides reusable WGSL helpers for triplanar noise, terrain palette, and voxel edge darkening."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/compute/gpu_tile",
      "path": "engine/reference/render/shaders/modules/compute/gpu_tile.md",
      "source": "engine/render/shaders/modules/compute/gpu_tile.js",
      "import": "/engine/render/shaders/modules/compute/gpu_tile.js",
      "sourceHash": "b3e499f3c87c68734e2b01e47cd1c119c47914af08035bd5ae7784a0a42721b4",
      "summary": "GpuTile - WebGPU workgroup shared-memory tile (WebGPU equivalent of NVIDIA cuda-tile) Inspired by: https://github.com/NVIDIA/cuda-tile CONCEPT: Every thread in a workgroup cooperatively loads one element of a global buffer into fast workgroup-shared memory (\"the tile\"), then ALL threads process the cached tile before advancing to the next tile.  This amortises global-memory latency across the whole group — the same idea that makes tiled matrix-multiply orders of magnitude faster than naive O(N²) reads. CUDA term         WebGPU/WGSL equivalent ─────────────     ───────────────────── __shared__        var<workgroup> template<T,N>     JS class with type / tileSize parameters (build-time) __syncthreads()   workgroupBarrier() threadIdx.x       @builtin(local_invocation_id) USAGE (JavaScript side, shader build-time): import { GpuTile } from \".../modules/compute/gpu_tile.js\"; const bodyTile = new GpuTile({ name: 'bodyTile', type: 'vec4f', tileSize: 64 }); const shader = ` // --- module scope --- ${bodyTile.declareWGSL()} @compute @workgroup_size(64) fn cs(@builtin(global_invocation_id) gid: vec3u, @builtin(local_invocation_id)  lid: vec3u) { let i   = gid.x; let myPos = bodies[i].pos.xyz; var acc = vec3f(0.); ${bodyTile.tiledLoopWGSL({ bufExpr:   'bodies',        // storage buffer binding name elemExpr:  'b.pos',         // expression to extract from element countExpr: 'u.count', lidExpr:   'lid.x', bodyWGSL: ` for (var k = 0u; k < _bodyTile_len; k++) { let b = ${bodyTile.getWGSL('k')}; let d = b.xyz - myPos; acc += d / (dot(d,d) + 0.01); }` })} } `; ADVANCED — multiple simultaneous tiles: Give each a unique `name` so their var<workgroup> identifiers don't collide. const posTile = new GpuTile({ name: 'posTile', type: 'vec4f', tileSize: 64 }); const velTile = new GpuTile({ name: 'velTile', type: 'vec4f', tileSize: 64 }); // In shader: ${posTile.declareWGSL()} ${velTile.declareWGSL()}",
      "exports": [
        {
          "name": "GpuTile",
          "kind": "class",
          "signature": "class GpuTile",
          "summary": "GpuTile - WebGPU workgroup shared-memory tile (WebGPU equivalent of NVIDIA cuda-tile) Inspired by: https://github.com/NVIDIA/cuda-tile CONCEPT: Every thread in a workgroup cooperatively loads one element of a global buffer into fast workgroup-shared memory (\"the tile\"), then ALL threads process the cached tile before advancing to the next tile.  This amortises global-memory latency across the whole group — the same idea that makes tiled matrix-multiply orders of magnitude faster than naive O(N²) reads. CUDA term         WebGPU/WGSL equivalent ─────────────     ───────────────────── __shared__        var<workgroup> template<T,N>     JS class with type / tileSize parameters (build-time) __syncthreads()   workgroupBarrier() threadIdx.x       @builtin(local_invocation_id) USAGE (JavaScript side, shader build-time): import { GpuTile } from \".../modules/compute/gpu_tile.js\"; const bodyTile = new GpuTile({ name: 'bodyTile', type: 'vec4f', tileSize: 64 }); const shader = ` // --- module scope --- ${bodyTile.declareWGSL()} @compute @workgroup_size(64) fn cs(@builtin(global_invocation_id) gid: vec3u, @builtin(local_invocation_id)  lid: vec3u) { let i   = gid.x; let myPos = bodies[i].pos.xyz; var acc = vec3f(0.); ${bodyTile.tiledLoopWGSL({ bufExpr:   'bodies',        // storage buffer binding name elemExpr:  'b.pos',         // expression to extract from element countExpr: 'u.count', lidExpr:   'lid.x', bodyWGSL: ` for (var k = 0u; k < _bodyTile_len; k++) { let b = ${bodyTile.getWGSL('k')}; let d = b.xyz - myPos; acc += d / (dot(d,d) + 0.01); }` })} } `; ADVANCED — multiple simultaneous tiles: Give each a unique `name` so their var<workgroup> identifiers don't collide. const posTile = new GpuTile({ name: 'posTile', type: 'vec4f', tileSize: 64 }); const velTile = new GpuTile({ name: 'velTile', type: 'vec4f', tileSize: 64 }); // In shader: ${posTile.declareWGSL()} ${velTile.declareWGSL()}"
        },
        {
          "name": "gpuTile",
          "kind": "function",
          "signature": "gpuTile(opts)",
          "summary": "Convenience factory — same as `new GpuTile(opts)`."
        },
        {
          "name": "TILED_NBODY_EXAMPLE_WGSL",
          "kind": "function",
          "signature": "TILED_NBODY_EXAMPLE_WGSL()",
          "summary": "Ready-to-paste WGSL string demonstrating the 64-thread tiled N-body pattern. This is the same code used in the playground N-Body demo, expressed via GpuTile."
        },
        {
          "name": "VEC4_TILE_64",
          "kind": "constant",
          "signature": "VEC4_TILE_64",
          "summary": "vec4f tile, 64 threads — matches the N-Body pattern exactly"
        },
        {
          "name": "VEC4_TILE_128",
          "kind": "constant",
          "signature": "VEC4_TILE_128",
          "summary": "vec4f tile, 128 threads — good for higher-throughput passes"
        },
        {
          "name": "F32_TILE_64",
          "kind": "constant",
          "signature": "F32_TILE_64",
          "summary": "f32 tile, 64 threads — useful for scalar reduction passes"
        },
        {
          "name": "VEC2_TILE_64",
          "kind": "constant",
          "signature": "VEC2_TILE_64",
          "summary": "vec2f tile, 64 threads — 2-D positions / UVs"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/compute/grid_splat",
      "path": "engine/reference/render/shaders/modules/compute/grid_splat.md",
      "source": "engine/render/shaders/modules/compute/grid_splat.js",
      "import": "/engine/render/shaders/modules/compute/grid_splat.js",
      "sourceHash": "e635a64fe731e35264be3fe1fc9e2d2166532ee7ac19a3c5e1970cbda6c311b5",
      "summary": "Grid Splat Compute Shader Splats particles/vertices to a 3D density grid for volumetric rendering Input: Particle positions, colors, velocities Output: Density grid + Color grid (for raymarching)",
      "exports": [
        {
          "name": "gridSplatComputeWGSL",
          "kind": "constant",
          "signature": "gridSplatComputeWGSL",
          "summary": "Grid Splat Compute Shader Splats particles/vertices to a 3D density grid for volumetric rendering Input: Particle positions, colors, velocities Output: Density grid + Color grid (for raymarching)"
        },
        {
          "name": "gridClearComputeWGSL",
          "kind": "constant",
          "signature": "gridClearComputeWGSL",
          "summary": ""
        },
        {
          "name": "gridFinalizeComputeWGSL",
          "kind": "constant",
          "signature": "gridFinalizeComputeWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_billboard",
      "path": "engine/reference/render/shaders/modules/core/particles_billboard.md",
      "source": "engine/render/shaders/modules/core/particles_billboard.js",
      "import": "/engine/render/shaders/modules/core/particles_billboard.js",
      "sourceHash": "7253c68178f840401d3a5591f6d831bb4403179c2267508eeb12d53e5e3d140a",
      "summary": "",
      "exports": [
        {
          "name": "particlesBillboardWGSL",
          "kind": "constant",
          "signature": "particlesBillboardWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_billboard_fragment",
      "path": "engine/reference/render/shaders/modules/core/particles_billboard_fragment.md",
      "source": "engine/render/shaders/modules/core/particles_billboard_fragment.js",
      "import": "/engine/render/shaders/modules/core/particles_billboard_fragment.js",
      "sourceHash": "8265e2b030e6ce162ea125fc8f8f77d20cdedd90fe4324bc0cb63b839cb4dd27",
      "summary": "============================================================================ PARTICLE FRAGMENT SHADER - PER-PARTICLE SHAPE RENDERING ============================================================================ This shader renders each particle according to its emitter's shape setting. The shape type is passed from the vertex shader (extracted from meta buffer). SHAPE TYPES: 0 = SPHERE - 3D shaded ball with fake diffuse lighting - Hard circle cutoff (no square corners) - Calculates fake Z depth for sphere surface - Applies directional light from upper-right - Best for: fire, water drops, magic orbs 1 = POINT - Tiny bright dot with small radius - Extra bright center for visibility - Discards most of the quad for small appearance - Best for: sparks, stars, snow, dust 2 = SOFT - Organic smoke/cloud shape with noise-distorted edges - Uses FBM noise to break circular silhouette - Wispy tendrils and irregular boundaries - Best for: smoke, fog, clouds, magic auras 3 = SPARK - Star/cross shape with 4 points - Creates X pattern with bright center - Good for emphasis and magical effects - Best for: magic sparks, highlights, flares INPUTS (from vertex shader): - localPos.xy: Normalized position within quad (-1 to 1) - color: RGBA from emitter - age: Particle age for lifetime fading - shape: Shape type (0-3) OUTPUT: - Final RGBA color with alpha for blending",
      "exports": [
        {
          "name": "particlesBillboardFragmentWGSL",
          "kind": "constant",
          "signature": "particlesBillboardFragmentWGSL",
          "summary": "============================================================================ PARTICLE FRAGMENT SHADER - PER-PARTICLE SHAPE RENDERING ============================================================================ This shader renders each particle according to its emitter's shape setting. The shape type is passed from the vertex shader (extracted from meta buffer). SHAPE TYPES: 0 = SPHERE - 3D shaded ball with fake diffuse lighting - Hard circle cutoff (no square corners) - Calculates fake Z depth for sphere surface - Applies directional light from upper-right - Best for: fire, water drops, magic orbs 1 = POINT - Tiny bright dot with small radius - Extra bright center for visibility - Discards most of the quad for small appearance - Best for: sparks, stars, snow, dust 2 = SOFT - Organic smoke/cloud shape with noise-distorted edges - Uses FBM noise to break circular silhouette - Wispy tendrils and irregular boundaries - Best for: smoke, fog, clouds, magic auras 3 = SPARK - Star/cross shape with 4 points - Creates X pattern with bright center - Good for emphasis and magical effects - Best for: magic sparks, highlights, flares INPUTS (from vertex shader): - localPos.xy: Normalized position within quad (-1 to 1) - color: RGBA from emitter - age: Particle age for lifetime fading - shape: Shape type (0-3) OUTPUT: - Final RGBA color with alpha for blending"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_billboard_vertex",
      "path": "engine/reference/render/shaders/modules/core/particles_billboard_vertex.md",
      "source": "engine/render/shaders/modules/core/particles_billboard_vertex.js",
      "import": "/engine/render/shaders/modules/core/particles_billboard_vertex.js",
      "sourceHash": "db24e24e899b5a5465064d9d8ed821a4063ff196e1caffea11be1067e6366e16",
      "summary": "============================================================================ PARTICLE BILLBOARD VERTEX SHADER ============================================================================ This shader renders particles as SCREEN-ALIGNED quads (always face camera). HOW IT WORKS: 1. Each particle is rendered as 6 vertices (2 triangles = 1 quad) 2. The particle center is transformed to CLIP SPACE first 3. Screen-space offsets are added to create a quad that always faces the camera 4. Per-particle data (color, size, shape) is read from the meta buffer INPUTS (from GPU buffers): - uPositions[ii]: vec4 containing [x, y, z, age] - uMeta[ii]: vec4 containing [r, g, b, packed_size_shape] - uVelocities[ii]: vec4 containing [vx, vy, vz, lifetime] - uParams: Default fallback values OUTPUTS (to fragment shader): - position: Clip-space position for rasterization - color: RGBA color from emitter - localPos: Normalized quad coordinates (-1 to 1) for shape rendering - age: Particle age for lifetime effects - shape: Shape type (0=sphere, 1=point, 2=soft, 3=spark) - lifetime: Per-particle lifetime from emitter SIZE/SHAPE/BEHAVIOR ENCODING: The meta.w value packs size, renderMode, shape, and behavior: meta.w = size * 1000 + renderMode * 100 + shape * 10 + behavior - size: 0-65 (floor(meta.w / 1000)) - renderMode: 0-9 (floor(meta.w / 100) % 10) - shape: 0-9 (floor(meta.w / 10) % 10) - behavior: 0-9 (meta.w % 10) Example: 4302 = size 4, renderMode 3, shape 0, behavior 2",
      "exports": [
        {
          "name": "particlesBillboardVertexWGSL",
          "kind": "constant",
          "signature": "particlesBillboardVertexWGSL",
          "summary": "============================================================================ PARTICLE BILLBOARD VERTEX SHADER ============================================================================ This shader renders particles as SCREEN-ALIGNED quads (always face camera). HOW IT WORKS: 1. Each particle is rendered as 6 vertices (2 triangles = 1 quad) 2. The particle center is transformed to CLIP SPACE first 3. Screen-space offsets are added to create a quad that always faces the camera 4. Per-particle data (color, size, shape) is read from the meta buffer INPUTS (from GPU buffers): - uPositions[ii]: vec4 containing [x, y, z, age] - uMeta[ii]: vec4 containing [r, g, b, packed_size_shape] - uVelocities[ii]: vec4 containing [vx, vy, vz, lifetime] - uParams: Default fallback values OUTPUTS (to fragment shader): - position: Clip-space position for rasterization - color: RGBA color from emitter - localPos: Normalized quad coordinates (-1 to 1) for shape rendering - age: Particle age for lifetime effects - shape: Shape type (0=sphere, 1=point, 2=soft, 3=spark) - lifetime: Per-particle lifetime from emitter SIZE/SHAPE/BEHAVIOR ENCODING: The meta.w value packs size, renderMode, shape, and behavior: meta.w = size * 1000 + renderMode * 100 + shape * 10 + behavior - size: 0-65 (floor(meta.w / 1000)) - renderMode: 0-9 (floor(meta.w / 100) % 10) - shape: 0-9 (floor(meta.w / 10) % 10) - behavior: 0-9 (meta.w % 10) Example: 4302 = size 4, renderMode 3, shape 0, behavior 2"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_blackbody",
      "path": "engine/reference/render/shaders/modules/core/particles_blackbody.md",
      "source": "engine/render/shaders/modules/core/particles_blackbody.js",
      "import": "/engine/render/shaders/modules/core/particles_blackbody.js",
      "sourceHash": "8b5a79363cc5bef06ae3142a5af90525a7895bca70e357f8a73198265646ae19",
      "summary": "particles_blackbody.js - Blackbody Radiation Color Shader (GAP 39) Converts particle temperature → physically-based color + emission. Uses CIE 1931 approximation of Planck's law for blackbody radiation. Stefan-Boltzmann T⁴ scaling for emissive intensity. Generates a 1D LUT texture (256 texels, 300K-30000K → sRGB). Fragment shader samples LUT based on thermalData.x temperature.",
      "exports": [
        {
          "name": "generateBlackbodyLUT",
          "kind": "function",
          "signature": "generateBlackbodyLUT(minTemp = 300, maxTemp = 30000)",
          "summary": "Generate blackbody LUT as Float32Array (256 × RGBA). Maps temperature range [minT, maxT] linearly across 256 texels. Alpha channel = relative emissive intensity (Stefan-Boltzmann T⁴ scaling)."
        },
        {
          "name": "blackbodyWGSL",
          "kind": "constant",
          "signature": "blackbodyWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_bond_line",
      "path": "engine/reference/render/shaders/modules/core/particles_bond_line.md",
      "source": "engine/render/shaders/modules/core/particles_bond_line.js",
      "import": "/engine/render/shaders/modules/core/particles_bond_line.js",
      "sourceHash": "ee61a1bc2b1ad37b3d9b32c3b816ff875b87dc817fd60acc4c403740dd54bd14",
      "summary": "particles_bond_line.js - Bond Line / Stick Shader (GAP 41) Renders molecular bonds as lines/cylinders between bonded particles. Reads constraint buffer to find bonded pairs. Supports single/double/triple bond visualization. Color by bond type: ionic=dashed, covalent=solid, metallic=thick.",
      "exports": [
        {
          "name": "bondLineVertexWGSL",
          "kind": "constant",
          "signature": "bondLineVertexWGSL",
          "summary": "particles_bond_line.js - Bond Line / Stick Shader (GAP 41) Renders molecular bonds as lines/cylinders between bonded particles. Reads constraint buffer to find bonded pairs. Supports single/double/triple bond visualization. Color by bond type: ionic=dashed, covalent=solid, metallic=thick."
        },
        {
          "name": "bondLineFragmentWGSL",
          "kind": "constant",
          "signature": "bondLineFragmentWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_field_lines",
      "path": "engine/reference/render/shaders/modules/core/particles_field_lines.md",
      "source": "engine/render/shaders/modules/core/particles_field_lines.js",
      "import": "/engine/render/shaders/modules/core/particles_field_lines.js",
      "sourceHash": "9d77cf118373351bda392b742661ef504eb42c84acb667baea1020710ef93b19",
      "summary": "particles_field_lines.js - Electromagnetic Field Visualization Shader (GAP 42) Renders electric/magnetic field lines and force arrows around charged particles. Supports: field lines, arrow glyphs, heat map, equipotential surfaces. Color: blue=attraction, red=repulsion, intensity=magnitude.",
      "exports": [
        {
          "name": "fieldLineVertexWGSL",
          "kind": "constant",
          "signature": "fieldLineVertexWGSL",
          "summary": "particles_field_lines.js - Electromagnetic Field Visualization Shader (GAP 42) Renders electric/magnetic field lines and force arrows around charged particles. Supports: field lines, arrow glyphs, heat map, equipotential surfaces. Color: blue=attraction, red=repulsion, intensity=magnitude."
        },
        {
          "name": "fieldLineFragmentWGSL",
          "kind": "constant",
          "signature": "fieldLineFragmentWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_orbital",
      "path": "engine/reference/render/shaders/modules/core/particles_orbital.md",
      "source": "engine/render/shaders/modules/core/particles_orbital.js",
      "import": "/engine/render/shaders/modules/core/particles_orbital.js",
      "sourceHash": "0192982e2883223f4b5c5091c8d628941531956310da0e07fb9f392d689e46fb",
      "summary": "particles_orbital.js - Electron Cloud / Orbital Shader (GAP 40) Raymarched spherical harmonics for visualizing electron probability clouds. Renders hydrogen-like orbital shapes (1s, 2p, 3d, etc.) around atom-particles. Color by element using CPK convention. LOD: at distance → simple sphere; close → full orbital volume.",
      "exports": [
        {
          "name": "orbitalWGSL",
          "kind": "constant",
          "signature": "orbitalWGSL",
          "summary": "particles_orbital.js - Electron Cloud / Orbital Shader (GAP 40) Raymarched spherical harmonics for visualizing electron probability clouds. Renders hydrogen-like orbital shapes (1s, 2p, 3d, etc.) around atom-particles. Color by element using CPK convention. LOD: at distance → simple sphere; close → full orbital volume."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_phase_vfx",
      "path": "engine/reference/render/shaders/modules/core/particles_phase_vfx.md",
      "source": "engine/render/shaders/modules/core/particles_phase_vfx.js",
      "import": "/engine/render/shaders/modules/core/particles_phase_vfx.js",
      "sourceHash": "85d3e87ac2e07a83049b3ee12aaa7555aedc494da113df5f83da8f2f7fe78ab0",
      "summary": "particles_phase_vfx.js - Phase Transition Visual Effects Shader (GAP 43) Visual feedback when particles change phase: - Melt: wet/glossy sheen, drip distortion - Freeze: frost crystallization pattern, ice crackle - Boil: bubble emission pattern, steam distortion - Ionize: plasma glow + electricity arcs Per-particle phase from thermalData.y → drives material blend in fragment. Transition animation uses latentEnergy (thermalData.w) as 0→1 progress.",
      "exports": [
        {
          "name": "phaseVFXWGSL",
          "kind": "constant",
          "signature": "phaseVFXWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_point",
      "path": "engine/reference/render/shaders/modules/core/particles_point.md",
      "source": "engine/render/shaders/modules/core/particles_point.js",
      "import": "/engine/render/shaders/modules/core/particles_point.js",
      "sourceHash": "71ab80fbc12f2787ea94490b6f856c2afbcce668698566154c1d16dfbac8e769",
      "summary": "",
      "exports": [
        {
          "name": "particlesPointWGSL",
          "kind": "constant",
          "signature": "particlesPointWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_point_fragment",
      "path": "engine/reference/render/shaders/modules/core/particles_point_fragment.md",
      "source": "engine/render/shaders/modules/core/particles_point_fragment.js",
      "import": "/engine/render/shaders/modules/core/particles_point_fragment.js",
      "sourceHash": "b2a6b1367b05de6a06f9b9f851c014e905d3529b093a6f8da47536f930d7aac7",
      "summary": "",
      "exports": [
        {
          "name": "particlesPointFragmentWGSL",
          "kind": "constant",
          "signature": "particlesPointFragmentWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_point_vertex",
      "path": "engine/reference/render/shaders/modules/core/particles_point_vertex.md",
      "source": "engine/render/shaders/modules/core/particles_point_vertex.js",
      "import": "/engine/render/shaders/modules/core/particles_point_vertex.js",
      "sourceHash": "67254164a7bd60d5fc4c1722e7121f3a69cd9523343c08c4de0621cb298bd4a5",
      "summary": "",
      "exports": [
        {
          "name": "particlesPointVertexWGSL",
          "kind": "constant",
          "signature": "particlesPointVertexWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_sdf_billboard",
      "path": "engine/reference/render/shaders/modules/core/particles_sdf_billboard.md",
      "source": "engine/render/shaders/modules/core/particles_sdf_billboard.js",
      "import": "/engine/render/shaders/modules/core/particles_sdf_billboard.js",
      "sourceHash": "93b92ed4eae17cd6fe1aff9d514df0a0950301cbc7e4ef55423da16e880c96e4",
      "summary": "",
      "exports": [
        {
          "name": "particlesSdfBillboardShader",
          "kind": "constant",
          "signature": "particlesSdfBillboardShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_sdf_fragment",
      "path": "engine/reference/render/shaders/modules/core/particles_sdf_fragment.md",
      "source": "engine/render/shaders/modules/core/particles_sdf_fragment.js",
      "import": "/engine/render/shaders/modules/core/particles_sdf_fragment.js",
      "sourceHash": "6cd9f0459c3758add9c5d6df469d84836264bef991e66f68609843ad8b0bcd62",
      "summary": "",
      "exports": [
        {
          "name": "particlesSdfFragmentShader",
          "kind": "constant",
          "signature": "particlesSdfFragmentShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/core/particles_shared",
      "path": "engine/reference/render/shaders/modules/core/particles_shared.md",
      "source": "engine/render/shaders/modules/core/particles_shared.js",
      "import": "/engine/render/shaders/modules/core/particles_shared.js",
      "sourceHash": "ad408734f9091d8f5718f65f1b54f6598ffbac09480b3b9913ddbc02666241db",
      "summary": "============================================================================ PARTICLE SHADER SHARED DEFINITIONS ============================================================================ This file contains WGSL struct definitions and buffer bindings shared between the vertex and fragment shaders for particle rendering. Uses ShaderSchema.js for consistent buffer layouts. See BINDING_GROUPS.particles and PARTICLE_PARAMS_SCHEMA for schema definitions. GPU BUFFER LAYOUT (from ShaderSchema.js): Group 0: FrameUniforms (camera, time) Group 1: Particle buffers (positions, meta, params, velocities, uvs, texture) PACK FORMAT (from ParticleSchema.js): meta.w = mass * 1e8 + drag * 1e6 + size * 1e4 + renderMode * 1e3 + shape * 10 + behavior",
      "exports": [
        {
          "name": "particleStructsWGSL",
          "kind": "constant",
          "signature": "particleStructsWGSL",
          "summary": "============================================================================ PARTICLE SHADER SHARED DEFINITIONS ============================================================================ This file contains WGSL struct definitions and buffer bindings shared between the vertex and fragment shaders for particle rendering. Uses ShaderSchema.js for consistent buffer layouts. See BINDING_GROUPS.particles and PARTICLE_PARAMS_SCHEMA for schema definitions. GPU BUFFER LAYOUT (from ShaderSchema.js): Group 0: FrameUniforms (camera, time) Group 1: Particle buffers (positions, meta, params, velocities, uvs, texture) PACK FORMAT (from ParticleSchema.js): meta.w = mass * 1e8 + drag * 1e6 + size * 1e4 + renderMode * 1e3 + shape * 10 + behavior"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/color/blend",
      "path": "engine/reference/render/shaders/modules/lib/color/blend.md",
      "source": "engine/render/shaders/modules/lib/color/blend.js",
      "import": "/engine/render/shaders/modules/lib/color/blend.js",
      "sourceHash": "43a6b3ea37443158db096435cb3d9d2ec9655a39d8b0c34a1ab51c0118b58e9d",
      "summary": "Color Blending Functions Various blend modes for compositing colors. Photoshop-style blend modes and custom game-specific blending.",
      "exports": [
        {
          "name": "colorBlendWGSL",
          "kind": "constant",
          "signature": "colorBlendWGSL",
          "summary": "Color Blending Functions Various blend modes for compositing colors. Photoshop-style blend modes and custom game-specific blending."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/color/index",
      "path": "engine/reference/render/shaders/modules/lib/color/index.md",
      "source": "engine/render/shaders/modules/lib/color/index.js",
      "import": "/engine/render/shaders/modules/lib/color/index.js",
      "sourceHash": "9ea945c915b288c3969643b18f4b181f4325ab8397e7086d054db5d034ba3c6e",
      "summary": "",
      "exports": [
        {
          "name": "colorLibWGSL",
          "kind": "constant",
          "signature": "colorLibWGSL",
          "summary": ""
        },
        {
          "name": "colorBlendWGSL",
          "kind": "re-export",
          "signature": "colorBlendWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/density/falloff",
      "path": "engine/reference/render/shaders/modules/lib/density/falloff.md",
      "source": "engine/render/shaders/modules/lib/density/falloff.js",
      "import": "/engine/render/shaders/modules/lib/density/falloff.js",
      "sourceHash": "bcc3cff98fe784763a93bc19245b9b7e89c088ae60c4c8bb8220394bd6c60e8b",
      "summary": "Density Falloff Functions Various falloff curves for volumetric density, particle opacity, etc. Controls how density/opacity decreases with distance.",
      "exports": [
        {
          "name": "densityFalloffWGSL",
          "kind": "constant",
          "signature": "densityFalloffWGSL",
          "summary": "Density Falloff Functions Various falloff curves for volumetric density, particle opacity, etc. Controls how density/opacity decreases with distance."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/density/index",
      "path": "engine/reference/render/shaders/modules/lib/density/index.md",
      "source": "engine/render/shaders/modules/lib/density/index.js",
      "import": "/engine/render/shaders/modules/lib/density/index.js",
      "sourceHash": "237ab7ac5f9767055f589e6c6da3c10d0cd90df21d424a7a40b44cfb95c29ba4",
      "summary": "",
      "exports": [
        {
          "name": "densityLibWGSL",
          "kind": "constant",
          "signature": "densityLibWGSL",
          "summary": ""
        },
        {
          "name": "densityFalloffWGSL",
          "kind": "re-export",
          "signature": "densityFalloffWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/depth/index",
      "path": "engine/reference/render/shaders/modules/lib/depth/index.md",
      "source": "engine/render/shaders/modules/lib/depth/index.js",
      "import": "/engine/render/shaders/modules/lib/depth/index.js",
      "sourceHash": "151cb010aa691167bdcd855d9002de7836d33e7ea5075bd92ed3c54a2fee029a",
      "summary": "",
      "exports": [
        {
          "name": "depthLibWGSL",
          "kind": "constant",
          "signature": "depthLibWGSL",
          "summary": ""
        },
        {
          "name": "depthLinearizeWGSL",
          "kind": "re-export",
          "signature": "depthLinearizeWGSL",
          "summary": ""
        },
        {
          "name": "depthReconstructWGSL",
          "kind": "re-export",
          "signature": "depthReconstructWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/depth/linearize",
      "path": "engine/reference/render/shaders/modules/lib/depth/linearize.md",
      "source": "engine/render/shaders/modules/lib/depth/linearize.js",
      "import": "/engine/render/shaders/modules/lib/depth/linearize.js",
      "sourceHash": "5e30f18c770c4003f869b0aa7a0a271099542c4c915d6cd6a0009a9571a22c2a",
      "summary": "Depth Buffer Utilities - Linearization Functions for linearizing depth values from perspective projection. WebGPU uses [0,1] depth range with perspective non-linearity.",
      "exports": [
        {
          "name": "depthLinearizeWGSL",
          "kind": "constant",
          "signature": "depthLinearizeWGSL",
          "summary": "Depth Buffer Utilities - Linearization Functions for linearizing depth values from perspective projection. WebGPU uses [0,1] depth range with perspective non-linearity."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/depth/reconstruct",
      "path": "engine/reference/render/shaders/modules/lib/depth/reconstruct.md",
      "source": "engine/render/shaders/modules/lib/depth/reconstruct.js",
      "import": "/engine/render/shaders/modules/lib/depth/reconstruct.js",
      "sourceHash": "064064af63a73145df8b76fe8ab668a60580bcf5e4b3c26f3d1498cb144e3dec",
      "summary": "",
      "exports": [
        {
          "name": "depthReconstructWGSL",
          "kind": "constant",
          "signature": "depthReconstructWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/distortion/domain_warp",
      "path": "engine/reference/render/shaders/modules/lib/distortion/domain_warp.md",
      "source": "engine/render/shaders/modules/lib/distortion/domain_warp.js",
      "import": "/engine/render/shaders/modules/lib/distortion/domain_warp.js",
      "sourceHash": "36c2520108fb94d946fe007f194cc147f49295cbf1b39de9679fa790ae38f7e7",
      "summary": "",
      "exports": [
        {
          "name": "domainWarpWGSL",
          "kind": "constant",
          "signature": "domainWarpWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/distortion/index",
      "path": "engine/reference/render/shaders/modules/lib/distortion/index.md",
      "source": "engine/render/shaders/modules/lib/distortion/index.js",
      "import": "/engine/render/shaders/modules/lib/distortion/index.js",
      "sourceHash": "e23899c89e5f2f66e96a6fc8268c1ff14d377fa34f66cc8538b05a96929eb81f",
      "summary": "",
      "exports": [
        {
          "name": "distortionLibWGSL",
          "kind": "constant",
          "signature": "distortionLibWGSL",
          "summary": ""
        },
        {
          "name": "domainWarpWGSL",
          "kind": "re-export",
          "signature": "domainWarpWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/index",
      "path": "engine/reference/render/shaders/modules/lib/index.md",
      "source": "engine/render/shaders/modules/lib/index.js",
      "import": "/engine/render/shaders/modules/lib/index.js",
      "sourceHash": "f7264e526d625ef3b8b9e6d7966ed5769c8955b5fc9047a271ce70dd777dbca1",
      "summary": "",
      "exports": [
        {
          "name": "fullShaderLibWGSL",
          "kind": "constant",
          "signature": "fullShaderLibWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/lighting/index",
      "path": "engine/reference/render/shaders/modules/lib/lighting/index.md",
      "source": "engine/render/shaders/modules/lib/lighting/index.js",
      "import": "/engine/render/shaders/modules/lib/lighting/index.js",
      "sourceHash": "3f6400edac6e8e57fe59c2b7d9e13837ab94fcab672953470c159eb2d79c4864",
      "summary": "",
      "exports": [
        {
          "name": "lightingLibWGSL",
          "kind": "constant",
          "signature": "lightingLibWGSL",
          "summary": ""
        },
        {
          "name": "lightScatterWGSL",
          "kind": "re-export",
          "signature": "lightScatterWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/lighting/scatter",
      "path": "engine/reference/render/shaders/modules/lib/lighting/scatter.md",
      "source": "engine/render/shaders/modules/lib/lighting/scatter.js",
      "import": "/engine/render/shaders/modules/lib/lighting/scatter.js",
      "sourceHash": "00870be42745dbfb3fafa10b912d9ed1ee7e33f3edd33435736f81f1a38c6c6d",
      "summary": "Light Scattering Functions Physical and approximated scattering models for volumetric lighting. Includes phase functions and multiple scattering approximations.",
      "exports": [
        {
          "name": "lightScatterWGSL",
          "kind": "constant",
          "signature": "lightScatterWGSL",
          "summary": "Light Scattering Functions Physical and approximated scattering models for volumetric lighting. Includes phase functions and multiple scattering approximations."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/math/index",
      "path": "engine/reference/render/shaders/modules/lib/math/index.md",
      "source": "engine/render/shaders/modules/lib/math/index.js",
      "import": "/engine/render/shaders/modules/lib/math/index.js",
      "sourceHash": "065f9cda652d1bf325bd50c2615b826852d97424ae045fea8a4160d73b4b771c",
      "summary": "",
      "exports": [
        {
          "name": "mathLibWGSL",
          "kind": "constant",
          "signature": "mathLibWGSL",
          "summary": ""
        },
        {
          "name": "interpolationWGSL",
          "kind": "re-export",
          "signature": "interpolationWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/math/interpolation",
      "path": "engine/reference/render/shaders/modules/lib/math/interpolation.md",
      "source": "engine/render/shaders/modules/lib/math/interpolation.js",
      "import": "/engine/render/shaders/modules/lib/math/interpolation.js",
      "sourceHash": "c3e5ea27b1a2c21e817b6dbd83401b365b4ecccd58d1519aa55b48d4f4bd6e3b",
      "summary": "Interpolation Functions Various interpolation curves and easing functions.",
      "exports": [
        {
          "name": "interpolationWGSL",
          "kind": "constant",
          "signature": "interpolationWGSL",
          "summary": "Interpolation Functions Various interpolation curves and easing functions."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/noise/curl",
      "path": "engine/reference/render/shaders/modules/lib/noise/curl.md",
      "source": "engine/render/shaders/modules/lib/noise/curl.js",
      "import": "/engine/render/shaders/modules/lib/noise/curl.js",
      "sourceHash": "55acbe63182e62a3d466ac7d06debc2221c07553fde0885f40bd88b6fe51c8ae",
      "summary": "",
      "exports": [
        {
          "name": "curlNoiseWGSL",
          "kind": "constant",
          "signature": "curlNoiseWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/noise/fbm",
      "path": "engine/reference/render/shaders/modules/lib/noise/fbm.md",
      "source": "engine/render/shaders/modules/lib/noise/fbm.js",
      "import": "/engine/render/shaders/modules/lib/noise/fbm.js",
      "sourceHash": "7599404052e50196f2961fb47ac61de2c30a72b16401e308f711f9b6cf0826dc",
      "summary": "",
      "exports": [
        {
          "name": "fbmWGSL",
          "kind": "constant",
          "signature": "fbmWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/noise/hash",
      "path": "engine/reference/render/shaders/modules/lib/noise/hash.md",
      "source": "engine/render/shaders/modules/lib/noise/hash.js",
      "import": "/engine/render/shaders/modules/lib/noise/hash.js",
      "sourceHash": "67fc13c561868b6510dfd9f4b7b6d6f7e0ddea043070c269f491cb5cf73cd41b",
      "summary": "Hash Functions for Pseudo-Random Noise Generation Provides various hash functions for generating pseudo-random values from coordinate inputs. Used as basis for procedural noise.",
      "exports": [
        {
          "name": "hashWGSL",
          "kind": "constant",
          "signature": "hashWGSL",
          "summary": "Hash Functions for Pseudo-Random Noise Generation Provides various hash functions for generating pseudo-random values from coordinate inputs. Used as basis for procedural noise."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/noise/index",
      "path": "engine/reference/render/shaders/modules/lib/noise/index.md",
      "source": "engine/render/shaders/modules/lib/noise/index.js",
      "import": "/engine/render/shaders/modules/lib/noise/index.js",
      "sourceHash": "dbb4583c67e70c2b75f6803d75c73619d05ab21878970dca939eb3a5fc62e33f",
      "summary": "",
      "exports": [
        {
          "name": "noiseLibWGSL",
          "kind": "constant",
          "signature": "noiseLibWGSL",
          "summary": ""
        },
        {
          "name": "curlNoiseWGSL",
          "kind": "re-export",
          "signature": "curlNoiseWGSL",
          "summary": ""
        },
        {
          "name": "fbmWGSL",
          "kind": "re-export",
          "signature": "fbmWGSL",
          "summary": ""
        },
        {
          "name": "hashWGSL",
          "kind": "re-export",
          "signature": "hashWGSL",
          "summary": ""
        },
        {
          "name": "valueNoiseWGSL",
          "kind": "re-export",
          "signature": "valueNoiseWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/noise/noise3d",
      "path": "engine/reference/render/shaders/modules/lib/noise/noise3d.md",
      "source": "engine/render/shaders/modules/lib/noise/noise3d.js",
      "import": "/engine/render/shaders/modules/lib/noise/noise3d.js",
      "sourceHash": "c49338b29b5d1e6986bdecb06035dac255c8b0f2a8d54de106a256f4600d71e3",
      "summary": "3D Noise Functions for Volumetric Effects Used for smoke turbulence, wispy distortion, and organic blending",
      "exports": [
        {
          "name": "noise3dLibrary",
          "kind": "constant",
          "signature": "noise3dLibrary",
          "summary": "3D Noise Functions for Volumetric Effects Used for smoke turbulence, wispy distortion, and organic blending"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/noise/value",
      "path": "engine/reference/render/shaders/modules/lib/noise/value.md",
      "source": "engine/render/shaders/modules/lib/noise/value.js",
      "import": "/engine/render/shaders/modules/lib/noise/value.js",
      "sourceHash": "607fe7ab3687ec0b3aaf22b5c8a05ee021c32d0132132638d259e9b196b9d79e",
      "summary": "",
      "exports": [
        {
          "name": "valueNoiseWGSL",
          "kind": "constant",
          "signature": "valueNoiseWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/lib/sdf/shapes",
      "path": "engine/reference/render/shaders/modules/lib/sdf/shapes.md",
      "source": "engine/render/shaders/modules/lib/sdf/shapes.js",
      "import": "/engine/render/shaders/modules/lib/sdf/shapes.js",
      "sourceHash": "ef5064305ed4666faa1a56938c5d2bcee35f7e6d0a79f9f59364951c498c9a60",
      "summary": "SDF Shape Library Signed Distance Field functions for volumetric particle rendering. Based on Inigo Quilez's distance functions: https://iquilezles.org/articles/distfunctions/",
      "exports": [
        {
          "name": "sdfShapesLibrary",
          "kind": "constant",
          "signature": "sdfShapesLibrary",
          "summary": "SDF Shape Library Signed Distance Field functions for volumetric particle rendering. Based on Inigo Quilez's distance functions: https://iquilezles.org/articles/distfunctions/"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/depth_visualizer",
      "path": "engine/reference/render/shaders/modules/passes/depth_visualizer.md",
      "source": "engine/render/shaders/modules/passes/depth_visualizer.js",
      "import": "/engine/render/shaders/modules/passes/depth_visualizer.js",
      "sourceHash": "2d2aac899f6e0b7ef1a25d681684c3bd7bff63e0f588822cc2fc549574c87670",
      "summary": "",
      "exports": [
        {
          "name": "depthVisualizerShader",
          "kind": "constant",
          "signature": "depthVisualizerShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_age",
      "path": "engine/reference/render/shaders/modules/passes/particle_age.md",
      "source": "engine/render/shaders/modules/passes/particle_age.js",
      "import": "/engine/render/shaders/modules/passes/particle_age.js",
      "sourceHash": "ef0d2371b8c88e094292ed68668e542e8909e487ff521e0e1b92bf223a3e9a24",
      "summary": "",
      "exports": [
        {
          "name": "particleAgePassShader",
          "kind": "constant",
          "signature": "particleAgePassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_albedo",
      "path": "engine/reference/render/shaders/modules/passes/particle_albedo.md",
      "source": "engine/render/shaders/modules/passes/particle_albedo.js",
      "import": "/engine/render/shaders/modules/passes/particle_albedo.js",
      "sourceHash": "5a13b1bf6490da839a1fcf0261a39bc2e5181e4fd99c546fe5d94d525af95811",
      "summary": "",
      "exports": [
        {
          "name": "particleAlbedoPassShader",
          "kind": "constant",
          "signature": "particleAlbedoPassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_depth",
      "path": "engine/reference/render/shaders/modules/passes/particle_depth.md",
      "source": "engine/render/shaders/modules/passes/particle_depth.js",
      "import": "/engine/render/shaders/modules/passes/particle_depth.js",
      "sourceHash": "76e0905ace7f216b500841f70b4e4ee40443b2f559c8b2872f0fb29b9478cc65",
      "summary": "",
      "exports": [
        {
          "name": "particleDepthPassShader",
          "kind": "constant",
          "signature": "particleDepthPassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_emissive",
      "path": "engine/reference/render/shaders/modules/passes/particle_emissive.md",
      "source": "engine/render/shaders/modules/passes/particle_emissive.js",
      "import": "/engine/render/shaders/modules/passes/particle_emissive.js",
      "sourceHash": "0daedfcf7103d22b041209b253d009dc9e4b30702ddafcddb728ca511b08d025",
      "summary": "",
      "exports": [
        {
          "name": "particleEmissivePassShader",
          "kind": "constant",
          "signature": "particleEmissivePassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_lighting",
      "path": "engine/reference/render/shaders/modules/passes/particle_lighting.md",
      "source": "engine/render/shaders/modules/passes/particle_lighting.js",
      "import": "/engine/render/shaders/modules/passes/particle_lighting.js",
      "sourceHash": "6ec81c6237d6c345f960013c5adf1e0e6ecb96c0fd83adafa0cfd8586cf34062",
      "summary": "",
      "exports": [
        {
          "name": "particleLightingPassShader",
          "kind": "constant",
          "signature": "particleLightingPassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_normals",
      "path": "engine/reference/render/shaders/modules/passes/particle_normals.md",
      "source": "engine/render/shaders/modules/passes/particle_normals.js",
      "import": "/engine/render/shaders/modules/passes/particle_normals.js",
      "sourceHash": "d782965eada8cd228dfeec79ac58e00fdc330ab6b8f7d53faf4933ce4e68fbba",
      "summary": "",
      "exports": [
        {
          "name": "particleNormalsPassShader",
          "kind": "constant",
          "signature": "particleNormalsPassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_size",
      "path": "engine/reference/render/shaders/modules/passes/particle_size.md",
      "source": "engine/render/shaders/modules/passes/particle_size.js",
      "import": "/engine/render/shaders/modules/passes/particle_size.js",
      "sourceHash": "ee20ca9a432789b924a5541811af61e14df4b8b64e5c4f9173adf5812add1124",
      "summary": "",
      "exports": [
        {
          "name": "particleSizePassShader",
          "kind": "constant",
          "signature": "particleSizePassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_thermal",
      "path": "engine/reference/render/shaders/modules/passes/particle_thermal.md",
      "source": "engine/render/shaders/modules/passes/particle_thermal.js",
      "import": "/engine/render/shaders/modules/passes/particle_thermal.js",
      "sourceHash": "41bc75788b924a3cde10eb30eb031b69cb321966eaac161a3eae7fd428351661",
      "summary": "Particle Thermal/Blackbody Debug Pass Visualizes particle temperature as blackbody radiation color. Cold (blue) → Room temp (invisible) → Hot (red/orange/white). Requires uThermalData buffer (binding 4) for per-particle temperature.",
      "exports": [
        {
          "name": "particleThermalPassShader",
          "kind": "constant",
          "signature": "particleThermalPassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/particle_velocity",
      "path": "engine/reference/render/shaders/modules/passes/particle_velocity.md",
      "source": "engine/render/shaders/modules/passes/particle_velocity.js",
      "import": "/engine/render/shaders/modules/passes/particle_velocity.js",
      "sourceHash": "4270ac6ca531de77d5aff3b5abcf96b71749e20928c73210a16755b92699f0e7",
      "summary": "",
      "exports": [
        {
          "name": "particleVelocityPassShader",
          "kind": "constant",
          "signature": "particleVelocityPassShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/passes/scene_debug_visualizer",
      "path": "engine/reference/render/shaders/modules/passes/scene_debug_visualizer.md",
      "source": "engine/render/shaders/modules/passes/scene_debug_visualizer.js",
      "import": "/engine/render/shaders/modules/passes/scene_debug_visualizer.js",
      "sourceHash": "ba395235e04aabc79e2f3988cd1778d3733da38360e57903bc3fc3c7007af7c4",
      "summary": "Scene Debug Visualizer Shader Fullscreen post-process that reads the ACTUAL scene depth buffer (texture_depth_2d) containing both entity meshes and particles, and visualizes: Mode 0: Depth — linearized grayscale (near=white, far=black, industry standard) Mode 1: Normals — world-space normals reconstructed from depth (RGB = XYZ) Mode 2: Albedo — passthrough of scene color (placeholder) Mode 3: Lighting — scene luminance only Reads from texture_depth_2d (depth24plus) — NOT texture_2d<f32>.",
      "exports": [
        {
          "name": "sceneDebugVisualizerShader",
          "kind": "constant",
          "signature": "sceneDebugVisualizerShader",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/postfx/bloom",
      "path": "engine/reference/render/shaders/modules/postfx/bloom.md",
      "source": "engine/render/shaders/modules/postfx/bloom.js",
      "import": "/engine/render/shaders/modules/postfx/bloom.js",
      "sourceHash": "5ddcf4c83ccf67f63e86e887082b5e115c328a74d1f617ae1a2c6d8fe17e82f2",
      "summary": "",
      "exports": [
        {
          "name": "bloomThresholdWGSL",
          "kind": "constant",
          "signature": "bloomThresholdWGSL",
          "summary": ""
        },
        {
          "name": "bloomBlurWGSL",
          "kind": "constant",
          "signature": "bloomBlurWGSL",
          "summary": ""
        },
        {
          "name": "bloomCompositeWGSL",
          "kind": "constant",
          "signature": "bloomCompositeWGSL",
          "summary": ""
        },
        {
          "name": "bloomSinglePassWGSL",
          "kind": "constant",
          "signature": "bloomSinglePassWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/postfx/fluid_water_blur",
      "path": "engine/reference/render/shaders/modules/postfx/fluid_water_blur.md",
      "source": "engine/render/shaders/modules/postfx/fluid_water_blur.js",
      "import": "/engine/render/shaders/modules/postfx/fluid_water_blur.js",
      "sourceHash": "8584e4968798b3e2b10b19cff8371c581ba5d987a1b3523cba36f425d1bedafe",
      "summary": "",
      "exports": [
        {
          "name": "fluidWaterBlurWGSL",
          "kind": "constant",
          "signature": "fluidWaterBlurWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/postfx/fluid_water_composite",
      "path": "engine/reference/render/shaders/modules/postfx/fluid_water_composite.md",
      "source": "engine/render/shaders/modules/postfx/fluid_water_composite.js",
      "import": "/engine/render/shaders/modules/postfx/fluid_water_composite.js",
      "sourceHash": "dc53068aa9337a19060f411ea7917c1d08f6a6038ee71035da4e8f2e0eaaaf95",
      "summary": "",
      "exports": [
        {
          "name": "fluidWaterCompositeWGSL",
          "kind": "constant",
          "signature": "fluidWaterCompositeWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/postfx/fluid_water_depth",
      "path": "engine/reference/render/shaders/modules/postfx/fluid_water_depth.md",
      "source": "engine/render/shaders/modules/postfx/fluid_water_depth.js",
      "import": "/engine/render/shaders/modules/postfx/fluid_water_depth.js",
      "sourceHash": "798f14c19358a7379029f595b3d43407742de51c9bee104bf44eecdf53524371",
      "summary": "",
      "exports": [
        {
          "name": "fluidWaterDepthWGSL",
          "kind": "constant",
          "signature": "fluidWaterDepthWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/postfx/fluid_water_thickness",
      "path": "engine/reference/render/shaders/modules/postfx/fluid_water_thickness.md",
      "source": "engine/render/shaders/modules/postfx/fluid_water_thickness.js",
      "import": "/engine/render/shaders/modules/postfx/fluid_water_thickness.js",
      "sourceHash": "4c40d7e543d1977c2a9fdece73cd505798e4a0c700271ee98bc305f642cd0c4b",
      "summary": "",
      "exports": [
        {
          "name": "fluidWaterThicknessWGSL",
          "kind": "constant",
          "signature": "fluidWaterThicknessWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/postfx/volume_isosurface",
      "path": "engine/reference/render/shaders/modules/postfx/volume_isosurface.md",
      "source": "engine/render/shaders/modules/postfx/volume_isosurface.js",
      "import": "/engine/render/shaders/modules/postfx/volume_isosurface.js",
      "sourceHash": "7438677421898ea8b9ed0e5200e46b06f057f8f1a9ec7ab44cf3d8ff6d66951e",
      "summary": "",
      "exports": [
        {
          "name": "volumeIsoSurfaceWGSL",
          "kind": "constant",
          "signature": "volumeIsoSurfaceWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/postfx/volume_smoke",
      "path": "engine/reference/render/shaders/modules/postfx/volume_smoke.md",
      "source": "engine/render/shaders/modules/postfx/volume_smoke.js",
      "import": "/engine/render/shaders/modules/postfx/volume_smoke.js",
      "sourceHash": "dda52e4e7da6510dddcd7e3e0cc0e63e15c7774738a786f42f8957c24d48f6c3",
      "summary": "",
      "exports": [
        {
          "name": "volumeSmokeWGSL",
          "kind": "constant",
          "signature": "volumeSmokeWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/proxy/ray_portal",
      "path": "engine/reference/render/shaders/modules/proxy/ray_portal.md",
      "source": "engine/render/shaders/modules/proxy/ray_portal.js",
      "import": "/engine/render/shaders/modules/proxy/ray_portal.js",
      "sourceHash": "f4b287454e6f487fc95167142ce28fd84a46ed415fb586621558bba10981564f",
      "summary": "Ray Portal WGSL Shader Module Provides WGSL functions for all proxy geometry quality tiers: ULTRA  — TLAS/BLAS two-level BVH traversal with ray redirect HIGH   — SDF cone marching proxy MED    — True impostor (billboarded SDF/height-field) LOW    — Octahedral impostor atlas sampling All functions are pure WGSL and intended to be embedded via template literals into compute shader source strings.",
      "exports": [
        {
          "name": "RAY_PORTAL_WGSL",
          "kind": "constant",
          "signature": "RAY_PORTAL_WGSL",
          "summary": "Ray Portal WGSL Shader Module Provides WGSL functions for all proxy geometry quality tiers: ULTRA  — TLAS/BLAS two-level BVH traversal with ray redirect HIGH   — SDF cone marching proxy MED    — True impostor (billboarded SDF/height-field) LOW    — Octahedral impostor atlas sampling All functions are pure WGSL and intended to be embedded via template literals into compute shader source strings."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/shaders/modules/proxy/tlas_refit",
      "path": "engine/reference/render/shaders/modules/proxy/tlas_refit.md",
      "source": "engine/render/shaders/modules/proxy/tlas_refit.js",
      "import": "/engine/render/shaders/modules/proxy/tlas_refit.js",
      "sourceHash": "b5806d13abe9b72420f90530e1417217b94976a2ef72eab3e071b02d0ccab971",
      "summary": "",
      "exports": [
        {
          "name": "tlasRefitWGSL",
          "kind": "constant",
          "signature": "tlasRefitWGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/CoherentWaveOpticsPass",
      "path": "engine/reference/render/spectral/CoherentWaveOpticsPass.md",
      "source": "engine/render/spectral/CoherentWaveOpticsPass.js",
      "import": "/engine/render/spectral/CoherentWaveOpticsPass.js",
      "sourceHash": "cb9b2b12022e91407b639874e6653d26172d2e0843ac939a8aa8a948dc42b6d1",
      "summary": "",
      "exports": [
        {
          "name": "CoherentWaveOpticsPass",
          "kind": "class",
          "signature": "class CoherentWaveOpticsPass",
          "summary": ""
        },
        {
          "name": "createCoherentWaveOpticsPass",
          "kind": "function",
          "signature": "createCoherentWaveOpticsPass(device, options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/SpectralPhotonMapper",
      "path": "engine/reference/render/spectral/SpectralPhotonMapper.md",
      "source": "engine/render/spectral/SpectralPhotonMapper.js",
      "import": "/engine/render/spectral/SpectralPhotonMapper.js",
      "sourceHash": "8d6bbbd1b7184158cf6d15b360095fbde7b5454004c7925c0ae6a0cfbea6bae2",
      "summary": "",
      "exports": [
        {
          "name": "SpectralPhotonMapper",
          "kind": "class",
          "signature": "class SpectralPhotonMapper",
          "summary": ""
        },
        {
          "name": "createSpectralPhotonMapper",
          "kind": "function",
          "signature": "createSpectralPhotonMapper(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/SpectralPhotonMappingPass",
      "path": "engine/reference/render/spectral/SpectralPhotonMappingPass.md",
      "source": "engine/render/spectral/SpectralPhotonMappingPass.js",
      "import": "/engine/render/spectral/SpectralPhotonMappingPass.js",
      "sourceHash": "3cf7a2beb5286daab88fe872e106091519af9ee63774496291a62f45cb59fbba",
      "summary": "",
      "exports": [
        {
          "name": "SpectralPhotonMappingPass",
          "kind": "class",
          "signature": "class SpectralPhotonMappingPass",
          "summary": ""
        },
        {
          "name": "createSpectralPhotonMappingPass",
          "kind": "function",
          "signature": "createSpectralPhotonMappingPass(device, options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/SpectralPhotonStore",
      "path": "engine/reference/render/spectral/SpectralPhotonStore.md",
      "source": "engine/render/spectral/SpectralPhotonStore.js",
      "import": "/engine/render/spectral/SpectralPhotonStore.js",
      "sourceHash": "f88f944c8af587697320703a7be5cb0da8d3a4404d878d51ef1498e19baf3cf0",
      "summary": "",
      "exports": [
        {
          "name": "SpectralPhotonStore",
          "kind": "class",
          "signature": "class SpectralPhotonStore",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/SpectralScattering",
      "path": "engine/reference/render/spectral/SpectralScattering.md",
      "source": "engine/render/spectral/SpectralScattering.js",
      "import": "/engine/render/spectral/SpectralScattering.js",
      "sourceHash": "42dc1d10f286f9dea288404ec02a68898412034f6916551a32f42ea9fb2848e7",
      "summary": "",
      "exports": [
        {
          "name": "sellmeierIor",
          "kind": "function",
          "signature": "sellmeierIor(lambdaNm, coefficients = null)",
          "summary": ""
        },
        {
          "name": "fresnelDielectric",
          "kind": "function",
          "signature": "fresnelDielectric(cosThetaI, etaI, etaT)",
          "summary": ""
        },
        {
          "name": "beerLambert",
          "kind": "function",
          "signature": "beerLambert(sigmaT, distance)",
          "summary": ""
        },
        {
          "name": "henyeyGreenstein",
          "kind": "function",
          "signature": "henyeyGreenstein(cosTheta, g = 0)",
          "summary": ""
        },
        {
          "name": "lambertBsdf",
          "kind": "function",
          "signature": "lambertBsdf(reflectance)",
          "summary": ""
        },
        {
          "name": "prismMinimumDeviation",
          "kind": "function",
          "signature": "prismMinimumDeviation(lambdaNm, apexRadians = Math.PI / 3, coefficients = null)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/SpectralSensor",
      "path": "engine/reference/render/spectral/SpectralSensor.md",
      "source": "engine/render/spectral/SpectralSensor.js",
      "import": "/engine/render/spectral/SpectralSensor.js",
      "sourceHash": "e5262ea419eff57dd47b912fabae2052d725bff243b29308be37a9e113ddbed0",
      "summary": "",
      "exports": [
        {
          "name": "wavelengthToXyz",
          "kind": "function",
          "signature": "wavelengthToXyz(lambdaNm, value = 1)",
          "summary": ""
        },
        {
          "name": "xyzToLinearSrgb",
          "kind": "function",
          "signature": "xyzToLinearSrgb(xyz)",
          "summary": ""
        },
        {
          "name": "encodeSrgbChannel",
          "kind": "function",
          "signature": "encodeSrgbChannel(v)",
          "summary": ""
        },
        {
          "name": "acesToneMap",
          "kind": "function",
          "signature": "acesToneMap(rgb, exposure = 1)",
          "summary": ""
        },
        {
          "name": "spectralSamplesToXyz",
          "kind": "function",
          "signature": "spectralSamplesToXyz(samples)",
          "summary": ""
        },
        {
          "name": "spectralSamplesToDisplayRgb",
          "kind": "function",
          "signature": "spectralSamplesToDisplayRgb(samples, exposure = 1)",
          "summary": ""
        },
        {
          "name": "normalizeRgb",
          "kind": "function",
          "signature": "normalizeRgb(rgb)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/SpectralTypes",
      "path": "engine/reference/render/spectral/SpectralTypes.md",
      "source": "engine/render/spectral/SpectralTypes.js",
      "import": "/engine/render/spectral/SpectralTypes.js",
      "sourceHash": "b84d01105746c6b740a8b57ba08aac7d12b6e62a1d5c8460727e037407956b24",
      "summary": "",
      "exports": [
        {
          "name": "clamp01",
          "kind": "function",
          "signature": "clamp01(value)",
          "summary": ""
        },
        {
          "name": "clampRange",
          "kind": "function",
          "signature": "clampRange(value, min, max)",
          "summary": ""
        },
        {
          "name": "createWavelengthPacket",
          "kind": "function",
          "signature": "createWavelengthPacket(lambda, pdf, activeMask = 1, hero = 0)",
          "summary": ""
        },
        {
          "name": "createPhotonPacket",
          "kind": "function",
          "signature": "createPhotonPacket(position, direction, lambdaNm, flux, flags = 0, normal = null)",
          "summary": ""
        },
        {
          "name": "createVisiblePoint",
          "kind": "function",
          "signature": "createVisiblePoint(position, normal, materialId = 0, radius = SPECTRAL_DEFAULTS.photonRadius)",
          "summary": ""
        },
        {
          "name": "SPECTRAL_RANGE",
          "kind": "constant",
          "signature": "SPECTRAL_RANGE",
          "summary": ""
        },
        {
          "name": "SPECTRAL_DEFAULTS",
          "kind": "constant",
          "signature": "SPECTRAL_DEFAULTS",
          "summary": ""
        },
        {
          "name": "SPECTRUM_KIND",
          "kind": "constant",
          "signature": "SPECTRUM_KIND",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/SpectrumAsset",
      "path": "engine/reference/render/spectral/SpectrumAsset.md",
      "source": "engine/render/spectral/SpectrumAsset.js",
      "import": "/engine/render/spectral/SpectrumAsset.js",
      "sourceHash": "0b636a83dd3f19d0330f3e221812083b9107c39d7f17e861ef70fd745ae1d12e",
      "summary": "",
      "exports": [
        {
          "name": "SpectrumAsset",
          "kind": "class",
          "signature": "class SpectrumAsset",
          "summary": ""
        },
        {
          "name": "createConstantSpectrum",
          "kind": "function",
          "signature": "createConstantSpectrum(value = 1, scale = 1)",
          "summary": ""
        },
        {
          "name": "createTabulatedSpectrum",
          "kind": "function",
          "signature": "createTabulatedSpectrum(samples, scale = 1)",
          "summary": ""
        },
        {
          "name": "createBlackbodySpectrum",
          "kind": "function",
          "signature": "createBlackbodySpectrum(temperatureK = 6500, scale = 1)",
          "summary": ""
        },
        {
          "name": "createRgbSpectrum",
          "kind": "function",
          "signature": "createRgbSpectrum(rgb, scale = 1)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/WavelengthSampling",
      "path": "engine/reference/render/spectral/WavelengthSampling.md",
      "source": "engine/render/spectral/WavelengthSampling.js",
      "import": "/engine/render/spectral/WavelengthSampling.js",
      "sourceHash": "edcebe8c5f7c3c40143b19474d6530bf11a14a6f1a618bc9ce2128d555475986",
      "summary": "",
      "exports": [
        {
          "name": "visibleImportance",
          "kind": "function",
          "signature": "visibleImportance(lambdaNm)",
          "summary": ""
        },
        {
          "name": "wavelengthToBand",
          "kind": "function",
          "signature": "wavelengthToBand(lambdaNm, bandCount = 18, minNm = SPECTRAL_RANGE.minNm, maxNm = SPECTRAL_RANGE.maxNm)",
          "summary": ""
        },
        {
          "name": "bandCenterWavelength",
          "kind": "function",
          "signature": "bandCenterWavelength(band, bandCount = 18, minNm = SPECTRAL_RANGE.minNm, maxNm = SPECTRAL_RANGE.maxNm)",
          "summary": ""
        },
        {
          "name": "sampleVisibleWavelength",
          "kind": "function",
          "signature": "sampleVisibleWavelength(u = uniformDistribution(0, 1, Math.random)",
          "summary": ""
        },
        {
          "name": "sampleStratifiedVisiblePacket",
          "kind": "function",
          "signature": "sampleStratifiedVisiblePacket(seed = 1, count = 4)",
          "summary": ""
        },
        {
          "name": "samplePhotonWavelength",
          "kind": "function",
          "signature": "samplePhotonWavelength(lightSpectrum, seed = 1, bandCount = 18)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/spectral/index",
      "path": "engine/reference/render/spectral/index.md",
      "source": "engine/render/spectral/index.js",
      "import": "/engine/render/spectral/index.js",
      "sourceHash": "480a78fa603f5876178ffd827f504d0268f3d00321609f7090b376327d22c2ae",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/state/StateFirstEcsSourceAdapter",
      "path": "engine/reference/render/state/StateFirstEcsSourceAdapter.md",
      "source": "engine/render/state/StateFirstEcsSourceAdapter.js",
      "import": "/engine/render/state/StateFirstEcsSourceAdapter.js",
      "sourceHash": "49855335aa323042296c1096fcd80110eb5edf39ebd58f8b954c04b3a31efcad",
      "summary": "Typed, read-only adapter from the authoritative ECS Transform + Renderable archetypes to the State-First presentation source protocol. ECS continues to own identity and transform/renderable state. Presentation owns mesh bounds, importance, dirty state, and the currently materialized representation through explicit resolver callbacks. The adapter retains no entity records and applies policy only through `applyPresentation`.",
      "exports": [
        {
          "name": "StateFirstEcsSourceAdapter",
          "kind": "class",
          "signature": "class StateFirstEcsSourceAdapter",
          "summary": ""
        },
        {
          "name": "createStateFirstEcsSourceAdapter",
          "kind": "function",
          "signature": "createStateFirstEcsSourceAdapter(world, options)",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_ECS_METADATA_VERSION",
          "kind": "constant",
          "signature": "STATE_FIRST_ECS_METADATA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/state/StateFirstExecutionBackend",
      "path": "engine/reference/render/state/StateFirstExecutionBackend.md",
      "source": "engine/render/state/StateFirstExecutionBackend.js",
      "import": "/engine/render/state/StateFirstExecutionBackend.js",
      "sourceHash": "1f43b5947f2c42e296ed3d33a4952909d54f8a1bdfaca9e105e7fa9b2687b81e",
      "summary": "Backend-neutral execution policy for State-First simulations. This object owns selection, frame-boundary switching, and measured reports. It deliberately does not own a CPU step function or GPU shader so the same contract can be shared by every State-First simulation.",
      "exports": [
        {
          "name": "StateFirstExecutionBackend",
          "kind": "class",
          "signature": "class StateFirstExecutionBackend",
          "summary": ""
        },
        {
          "name": "createStateFirstExecutionBackend",
          "kind": "function",
          "signature": "createStateFirstExecutionBackend(options = {})",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_EXECUTION_BACKEND",
          "kind": "constant",
          "signature": "STATE_FIRST_EXECUTION_BACKEND",
          "summary": "Backend-neutral execution policy for State-First simulations. This object owns selection, frame-boundary switching, and measured reports. It deliberately does not own a CPU step function or GPU shader so the same contract can be shared by every State-First simulation."
        },
        {
          "name": "STATE_FIRST_PARITY_STATUS",
          "kind": "constant",
          "signature": "STATE_FIRST_PARITY_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/state/StateFirstGpuCuller",
      "path": "engine/reference/render/state/StateFirstGpuCuller.md",
      "source": "engine/render/state/StateFirstGpuCuller.js",
      "import": "/engine/render/state/StateFirstGpuCuller.js",
      "sourceHash": "0bbf7d509cc367e70c49f553fa2f638770744ce32da984bff4f90fe5ddf2dbdf",
      "summary": "",
      "exports": [
        {
          "name": "StateFirstGpuCuller",
          "kind": "class",
          "signature": "class StateFirstGpuCuller",
          "summary": ""
        },
        {
          "name": "createStateFirstGpuCuller",
          "kind": "function",
          "signature": "createStateFirstGpuCuller(device, options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/state/StateFirstRasterizer",
      "path": "engine/reference/render/state/StateFirstRasterizer.md",
      "source": "engine/render/state/StateFirstRasterizer.js",
      "import": "/engine/render/state/StateFirstRasterizer.js",
      "sourceHash": "e858ad2cd4ef7dd69802d80c8b9cea705e7e857417ef5d0d916bc631b538f247",
      "summary": "",
      "exports": [
        {
          "name": "StateFirstRasterizer",
          "kind": "class",
          "signature": "class StateFirstRasterizer",
          "summary": ""
        },
        {
          "name": "stateFirstModeLabel",
          "kind": "function",
          "signature": "stateFirstModeLabel(mode)",
          "summary": ""
        },
        {
          "name": "chooseStateFirstRepresentation",
          "kind": "function",
          "signature": "chooseStateFirstRepresentation(pixelRadius, importance = 0, current = STATE_FIRST_REPRESENTATION.POINT, holdFrames = 0, thresholds = DEFAULT_THRESHOLDS, policy = null, lodRank = 0.5)",
          "summary": ""
        },
        {
          "name": "createStateFirstRasterizer",
          "kind": "function",
          "signature": "createStateFirstRasterizer(options)",
          "summary": ""
        },
        {
          "name": "RASTERIZER_MODE",
          "kind": "constant",
          "signature": "RASTERIZER_MODE",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_REPRESENTATION",
          "kind": "constant",
          "signature": "STATE_FIRST_REPRESENTATION",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_DIRTY",
          "kind": "constant",
          "signature": "STATE_FIRST_DIRTY",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_REPRESENTATION_NAMES",
          "kind": "constant",
          "signature": "STATE_FIRST_REPRESENTATION_NAMES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_QUALITY_PROFILE",
          "kind": "constant",
          "signature": "STATE_FIRST_QUALITY_PROFILE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/state/StateFirstRetainedStorage",
      "path": "engine/reference/render/state/StateFirstRetainedStorage.md",
      "source": "engine/render/state/StateFirstRetainedStorage.js",
      "import": "/engine/render/state/StateFirstRetainedStorage.js",
      "sourceHash": "bc0e7fde8fd1632c852cfe04173f6f90d39dbcfba7247404fdc01d674afc7853",
      "summary": "Retained state backing for state-first renderers. Entity state lives at a stable entity-id-derived offset while each visual representation owns a dense u32 indirection bucket.  Representation changes therefore never move authoritative state, and an entity may participate in two buckets while an LOD cross-fade is in progress.",
      "exports": [
        {
          "name": "StateFirstRetainedStorage",
          "kind": "class",
          "signature": "class StateFirstRetainedStorage",
          "summary": ""
        },
        {
          "name": "createStateFirstRetainedStorage",
          "kind": "function",
          "signature": "createStateFirstRetainedStorage(device, options)",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_RECORD_FLOATS",
          "kind": "constant",
          "signature": "STATE_FIRST_RETAINED_RECORD_FLOATS",
          "summary": "Retained state backing for state-first renderers. Entity state lives at a stable entity-id-derived offset while each visual representation owns a dense u32 indirection bucket.  Representation changes therefore never move authoritative state, and an entity may participate in two buckets while an LOD cross-fade is in progress."
        },
        {
          "name": "STATE_FIRST_RETAINED_RECORD_BYTES",
          "kind": "constant",
          "signature": "STATE_FIRST_RETAINED_RECORD_BYTES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_INDEX_BYTES",
          "kind": "constant",
          "signature": "STATE_FIRST_RETAINED_INDEX_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/state/StateFirstSourceBridge",
      "path": "engine/reference/render/state/StateFirstSourceBridge.md",
      "source": "engine/render/state/StateFirstSourceBridge.js",
      "import": "/engine/render/state/StateFirstSourceBridge.js",
      "sourceHash": "7fdf9016f5e51df92d649d8bf3768d7d65d807f603d6d068cb31737448ce5193",
      "summary": "Explicit runtime bridge between authoritative simulation state and the State-First presentation policy. The bridge deliberately does not guess GPU layouts or invent renderable entities from arbitrary objects. A source must publish the V1 protocol, provide semantic presentation entities, and consume the resulting plan. GPU sources additionally prove that their active byte range fits in the authoritative GPUBuffer on every update, which makes ping-pong buffers and capacity growth safe to expose without readback.",
      "exports": [
        {
          "name": "StateFirstSourceBridge",
          "kind": "class",
          "signature": "class StateFirstSourceBridge",
          "summary": ""
        },
        {
          "name": "discoverStateFirstSource",
          "kind": "function",
          "signature": "discoverStateFirstSource(candidate)",
          "summary": ""
        },
        {
          "name": "createStateFirstSourceBridge",
          "kind": "function",
          "signature": "createStateFirstSourceBridge(rasterizer, options)",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE",
          "kind": "constant",
          "signature": "STATE_FIRST_SOURCE",
          "summary": "Explicit runtime bridge between authoritative simulation state and the State-First presentation policy. The bridge deliberately does not guess GPU layouts or invent renderable entities from arbitrary objects. A source must publish the V1 protocol, provide semantic presentation entities, and consume the resulting plan. GPU sources additionally prove that their active byte range fits in the authoritative GPUBuffer on every update, which makes ping-pong buffers and capacity growth safe to expose without readback."
        },
        {
          "name": "STATE_FIRST_SOURCE_VERSION",
          "kind": "constant",
          "signature": "STATE_FIRST_SOURCE_VERSION",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE_KIND",
          "kind": "constant",
          "signature": "STATE_FIRST_SOURCE_KIND",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/state/index",
      "path": "engine/reference/render/state/index.md",
      "source": "engine/render/state/index.js",
      "import": "/engine/render/state/index.js",
      "sourceHash": "9df865d83ab650e3a287f9fb5527bcd16eddd143861868307a919dfb709dcfe7",
      "summary": "",
      "exports": [
        {
          "name": "RASTERIZER_MODE",
          "kind": "re-export",
          "signature": "RASTERIZER_MODE",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_DIRTY",
          "kind": "re-export",
          "signature": "STATE_FIRST_DIRTY",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_ECS_METADATA_VERSION",
          "kind": "re-export",
          "signature": "STATE_FIRST_ECS_METADATA_VERSION",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_EXECUTION_BACKEND",
          "kind": "re-export",
          "signature": "STATE_FIRST_EXECUTION_BACKEND",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_PARITY_STATUS",
          "kind": "re-export",
          "signature": "STATE_FIRST_PARITY_STATUS",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_QUALITY_PROFILE",
          "kind": "re-export",
          "signature": "STATE_FIRST_QUALITY_PROFILE",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_REPRESENTATION",
          "kind": "re-export",
          "signature": "STATE_FIRST_REPRESENTATION",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_REPRESENTATION_NAMES",
          "kind": "re-export",
          "signature": "STATE_FIRST_REPRESENTATION_NAMES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_INDEX_BYTES",
          "kind": "re-export",
          "signature": "STATE_FIRST_RETAINED_INDEX_BYTES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_RECORD_BYTES",
          "kind": "re-export",
          "signature": "STATE_FIRST_RETAINED_RECORD_BYTES",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_RETAINED_RECORD_FLOATS",
          "kind": "re-export",
          "signature": "STATE_FIRST_RETAINED_RECORD_FLOATS",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE",
          "kind": "re-export",
          "signature": "STATE_FIRST_SOURCE",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE_KIND",
          "kind": "re-export",
          "signature": "STATE_FIRST_SOURCE_KIND",
          "summary": ""
        },
        {
          "name": "STATE_FIRST_SOURCE_VERSION",
          "kind": "re-export",
          "signature": "STATE_FIRST_SOURCE_VERSION",
          "summary": ""
        },
        {
          "name": "StateFirstEcsSourceAdapter",
          "kind": "re-export",
          "signature": "StateFirstEcsSourceAdapter",
          "summary": ""
        },
        {
          "name": "StateFirstExecutionBackend",
          "kind": "re-export",
          "signature": "StateFirstExecutionBackend",
          "summary": ""
        },
        {
          "name": "StateFirstGpuCuller",
          "kind": "re-export",
          "signature": "StateFirstGpuCuller",
          "summary": ""
        },
        {
          "name": "StateFirstRasterizer",
          "kind": "re-export",
          "signature": "StateFirstRasterizer",
          "summary": ""
        },
        {
          "name": "StateFirstRetainedStorage",
          "kind": "re-export",
          "signature": "StateFirstRetainedStorage",
          "summary": ""
        },
        {
          "name": "StateFirstSourceBridge",
          "kind": "re-export",
          "signature": "StateFirstSourceBridge",
          "summary": ""
        },
        {
          "name": "chooseStateFirstRepresentation",
          "kind": "re-export",
          "signature": "chooseStateFirstRepresentation",
          "summary": ""
        },
        {
          "name": "createStateFirstEcsSourceAdapter",
          "kind": "re-export",
          "signature": "createStateFirstEcsSourceAdapter",
          "summary": ""
        },
        {
          "name": "createStateFirstExecutionBackend",
          "kind": "re-export",
          "signature": "createStateFirstExecutionBackend",
          "summary": ""
        },
        {
          "name": "createStateFirstGpuCuller",
          "kind": "re-export",
          "signature": "createStateFirstGpuCuller",
          "summary": ""
        },
        {
          "name": "createStateFirstRasterizer",
          "kind": "re-export",
          "signature": "createStateFirstRasterizer",
          "summary": ""
        },
        {
          "name": "createStateFirstRetainedStorage",
          "kind": "re-export",
          "signature": "createStateFirstRetainedStorage",
          "summary": ""
        },
        {
          "name": "createStateFirstSourceBridge",
          "kind": "re-export",
          "signature": "createStateFirstSourceBridge",
          "summary": ""
        },
        {
          "name": "discoverStateFirstSource",
          "kind": "re-export",
          "signature": "discoverStateFirstSource",
          "summary": ""
        },
        {
          "name": "stateFirstModeLabel",
          "kind": "re-export",
          "signature": "stateFirstModeLabel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/streaming/VirtualTexturingSystem",
      "path": "engine/reference/render/streaming/VirtualTexturingSystem.md",
      "source": "engine/render/streaming/VirtualTexturingSystem.js",
      "import": "/engine/render/streaming/VirtualTexturingSystem.js",
      "sourceHash": "26b4abb484e5e4568b2f0586f877eea0c4e82173c41c9291f9009a8a7a02fd7f",
      "summary": "Virtual Texturing System - On-demand texture streaming Megatexture/Sparse Virtual Texture implementation Used for massive open worlds with unlimited texture detail Now powered by vGPU driver",
      "exports": [
        {
          "name": "VirtualTexturingSystem",
          "kind": "class",
          "signature": "class VirtualTexturingSystem",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/volumes/HybridVolumeSystem",
      "path": "engine/reference/render/volumes/HybridVolumeSystem.md",
      "source": "engine/render/volumes/HybridVolumeSystem.js",
      "import": "/engine/render/volumes/HybridVolumeSystem.js",
      "sourceHash": "c5655791c77cc0fed1e2164317c3ad2d2a2bed681bea069ae388c2f0fa1a9782",
      "summary": "",
      "exports": [
        {
          "name": "HybridVolumeSystem",
          "kind": "class",
          "signature": "class HybridVolumeSystem",
          "summary": ""
        },
        {
          "name": "VolumeRenderMode",
          "kind": "constant",
          "signature": "VolumeRenderMode",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/volumes/IsoSurfaceVolumeRenderer",
      "path": "engine/reference/render/volumes/IsoSurfaceVolumeRenderer.md",
      "source": "engine/render/volumes/IsoSurfaceVolumeRenderer.js",
      "import": "/engine/render/volumes/IsoSurfaceVolumeRenderer.js",
      "sourceHash": "e8b1918be7a702d7ae2cef2150180fbd5eaaf340ca2503415924dcb00a90e23b",
      "summary": "",
      "exports": [
        {
          "name": "createIsoSurfaceVolumeRenderer",
          "kind": "function",
          "signature": "async createIsoSurfaceVolumeRenderer(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/volumes/ParticleVolumeConnector",
      "path": "engine/reference/render/volumes/ParticleVolumeConnector.md",
      "source": "engine/render/volumes/ParticleVolumeConnector.js",
      "import": "/engine/render/volumes/ParticleVolumeConnector.js",
      "sourceHash": "c5dcbd1f76d8076c620dd82bef349cb6e8a4e4165760285329a813c1321d1a20",
      "summary": "Quick factory to create a connector and initialize it",
      "exports": [
        {
          "name": "ParticleVolumeConnector",
          "kind": "class",
          "signature": "class ParticleVolumeConnector",
          "summary": ""
        },
        {
          "name": "createParticleVolumeConnector",
          "kind": "function",
          "signature": "async createParticleVolumeConnector(device, options = {})",
          "summary": "Quick factory to create a connector and initialize it"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/volumes/SmokeVolumeRenderer",
      "path": "engine/reference/render/volumes/SmokeVolumeRenderer.md",
      "source": "engine/render/volumes/SmokeVolumeRenderer.js",
      "import": "/engine/render/volumes/SmokeVolumeRenderer.js",
      "sourceHash": "72d31c71d7e7c80be91fb5ac3931c2aec51fff485d368411d4af01a032dd8a2d",
      "summary": "",
      "exports": [
        {
          "name": "createSmokeVolumeRenderer",
          "kind": "function",
          "signature": "async createSmokeVolumeRenderer(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/volumes/UnifiedVolumeRenderer",
      "path": "engine/reference/render/volumes/UnifiedVolumeRenderer.md",
      "source": "engine/render/volumes/UnifiedVolumeRenderer.js",
      "import": "/engine/render/volumes/UnifiedVolumeRenderer.js",
      "sourceHash": "1868f2c598c7512c0d6a73dd865d98bb648ae00a1346f1b5c83f292a7b6b92c8",
      "summary": "",
      "exports": [
        {
          "name": "UnifiedVolumeRenderer",
          "kind": "class",
          "signature": "class UnifiedVolumeRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/volumes/VolumeIntegration",
      "path": "engine/reference/render/volumes/VolumeIntegration.md",
      "source": "engine/render/volumes/VolumeIntegration.js",
      "import": "/engine/render/volumes/VolumeIntegration.js",
      "sourceHash": "4130ec95268343649274f700d0ea1666250f0ad548c4d935bf729b32a8873bfc",
      "summary": "",
      "exports": [
        {
          "name": "VolumeIntegration",
          "kind": "class",
          "signature": "class VolumeIntegration",
          "summary": ""
        },
        {
          "name": "createVolumeIntegration",
          "kind": "function",
          "signature": "createVolumeIntegration(device, options = {})",
          "summary": ""
        },
        {
          "name": "VolumeRenderMode",
          "kind": "re-export",
          "signature": "VolumeRenderMode",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "render/volumes/index",
      "path": "engine/reference/render/volumes/index.md",
      "source": "engine/render/volumes/index.js",
      "import": "/engine/render/volumes/index.js",
      "sourceHash": "f87e26cf6c6ea2d429d0f7508e2bb5db702bacf4d021cb0ff1b7440a3f15f798",
      "summary": "Quick factory to create a complete volumetric setup",
      "exports": [
        {
          "name": "createVolumetricSystem",
          "kind": "function",
          "signature": "async createVolumetricSystem(device, options = {})",
          "summary": "Quick factory to create a complete volumetric setup"
        },
        {
          "name": "DEFAULT_PARAMS",
          "kind": "re-export",
          "signature": "DEFAULT_PARAMS",
          "summary": ""
        },
        {
          "name": "DualModeRenderer",
          "kind": "re-export",
          "signature": "DualModeRenderer",
          "summary": ""
        },
        {
          "name": "HybridVolumeSystem",
          "kind": "re-export",
          "signature": "HybridVolumeSystem",
          "summary": ""
        },
        {
          "name": "LOD_THRESHOLDS",
          "kind": "re-export",
          "signature": "LOD_THRESHOLDS",
          "summary": ""
        },
        {
          "name": "ParticleVolumeConnector",
          "kind": "re-export",
          "signature": "ParticleVolumeConnector",
          "summary": ""
        },
        {
          "name": "RenderMode",
          "kind": "re-export",
          "signature": "RenderMode",
          "summary": ""
        },
        {
          "name": "UnifiedVolumeRenderer",
          "kind": "re-export",
          "signature": "UnifiedVolumeRenderer",
          "summary": ""
        },
        {
          "name": "ViewMode",
          "kind": "re-export",
          "signature": "ViewMode",
          "summary": ""
        },
        {
          "name": "VolumeIntegration",
          "kind": "re-export",
          "signature": "VolumeIntegration",
          "summary": ""
        },
        {
          "name": "VolumeRenderMode",
          "kind": "re-export",
          "signature": "VolumeRenderMode",
          "summary": ""
        },
        {
          "name": "VolumetricRaymarcher",
          "kind": "re-export",
          "signature": "VolumetricRaymarcher",
          "summary": ""
        },
        {
          "name": "createIsoSurfaceVolumeRenderer",
          "kind": "re-export",
          "signature": "createIsoSurfaceVolumeRenderer",
          "summary": ""
        },
        {
          "name": "createParticleVolumeConnector",
          "kind": "re-export",
          "signature": "createParticleVolumeConnector",
          "summary": ""
        },
        {
          "name": "createSmokeVolumeRenderer",
          "kind": "re-export",
          "signature": "createSmokeVolumeRenderer",
          "summary": ""
        },
        {
          "name": "createVolumeIntegration",
          "kind": "re-export",
          "signature": "createVolumeIntegration",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "scenes/PhysicsSandboxScene",
      "path": "engine/reference/scenes/PhysicsSandboxScene.md",
      "source": "engine/scenes/PhysicsSandboxScene.js",
      "import": "/engine/scenes/PhysicsSandboxScene.js",
      "sourceHash": "b585dad400a5ea82c23e0befef84a55f0b5b7bf4c3466e36adf7af370bc8f481",
      "summary": "",
      "exports": [
        {
          "name": "configurePhysicsSandboxScene",
          "kind": "function",
          "signature": "configurePhysicsSandboxScene(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/SimulationUpdate",
      "path": "engine/reference/sim/SimulationUpdate.md",
      "source": "engine/sim/SimulationUpdate.js",
      "import": "/engine/sim/SimulationUpdate.js",
      "sourceHash": "3649bffd9c68f739a609cc69f902a35797b3c6b3f4ada484a986d235dd55c508",
      "summary": "Step the particle simulation (emission, colliders, physics).",
      "exports": [
        {
          "name": "stepParticles",
          "kind": "function",
          "signature": "stepParticles(particles, options)",
          "summary": "Step the particle simulation (emission, colliders, physics)."
        },
        {
          "name": "stepFluid",
          "kind": "function",
          "signature": "stepFluid(smoke, particles, gpuDevice, delta, options = {})",
          "summary": "Step the fluid simulation (density splatting, advection)."
        },
        {
          "name": "stepAllSimulations",
          "kind": "function",
          "signature": "stepAllSimulations(state, delta, entities, options = {})",
          "summary": "Step all simulations in one call."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIAiming",
      "path": "engine/reference/sim/ai/AIAiming.md",
      "source": "engine/sim/ai/AIAiming.js",
      "import": "/engine/sim/ai/AIAiming.js",
      "sourceHash": "634491d239c2b7d114d0694e802f5848723eca77ffd94099bfed37663c4b9456",
      "summary": "Create a ray with pre-computed inverse direction for fast intersection tests",
      "exports": [
        {
          "name": "createRay",
          "kind": "function",
          "signature": "createRay(origin, direction)",
          "summary": "Create a ray with pre-computed inverse direction for fast intersection tests"
        },
        {
          "name": "rayAABBIntersect",
          "kind": "function",
          "signature": "rayAABBIntersect(ray, aabbMin, aabbMax)",
          "summary": "Ray-AABB intersection using the slab method Used by NVIDIA OptiX and other professional engines"
        },
        {
          "name": "raySphereIntersect",
          "kind": "function",
          "signature": "raySphereIntersect(rayOrigin, rayDir, sphereCenter, radius)",
          "summary": "Ray-sphere intersection using quadratic formula Good for character hitboxes and bounding spheres"
        },
        {
          "name": "hasLineOfSight",
          "kind": "function",
          "signature": "hasLineOfSight(from, to, obstacles, options = {})",
          "summary": "Check line of sight between two points against obstacle list"
        },
        {
          "name": "hasLineOfSightSpheres",
          "kind": "function",
          "signature": "hasLineOfSightSpheres(from, to, spheres, ignoreIds = [])",
          "summary": "Check line of sight with sphere obstacles (characters)"
        },
        {
          "name": "predictiveAim",
          "kind": "function",
          "signature": "predictiveAim(shooterPos, projectileSpeed, targetPos, targetVel)",
          "summary": "Calculate aim point to intercept a moving target Solves: |P + V×t|² = (S×t)² (quadratic intercept equation)"
        },
        {
          "name": "predictiveAimWithAcceleration",
          "kind": "function",
          "signature": "predictiveAimWithAcceleration(shooterPos, projectileSpeed, targetPos, targetVel, targetAccel, iterations = 4)",
          "summary": "Iterative predictive aim for accelerating targets"
        },
        {
          "name": "gaussianRandom",
          "kind": "function",
          "signature": "gaussianRandom(mean = 0, stdDev = 1, rng = null)",
          "summary": "Generate Gaussian-distributed random number using Box-Muller transform"
        },
        {
          "name": "applyAccuracySpread2D",
          "kind": "function",
          "signature": "applyAccuracySpread2D(aimDirection, spreadAngleRad)",
          "summary": "Apply accuracy spread to aim direction (2D version)"
        },
        {
          "name": "applyAccuracySpread3D",
          "kind": "function",
          "signature": "applyAccuracySpread3D(aimDirection, spreadAngleRad)",
          "summary": "Apply accuracy spread to aim direction (3D version) Generates a cone of spread around the aim direction"
        },
        {
          "name": "calculateThreatScore",
          "kind": "function",
          "signature": "calculateThreatScore(npc, target, options = {})",
          "summary": "Calculate threat score for a potential target"
        },
        {
          "name": "selectTarget",
          "kind": "function",
          "signature": "selectTarget(npc, candidates, options = {})",
          "summary": "Select best target from candidates with hysteresis"
        },
        {
          "name": "createTargetMemory",
          "kind": "function",
          "signature": "createTargetMemory()",
          "summary": "Create a target memory tracker for an NPC Remembers lost targets for a duration"
        },
        {
          "name": "updateTargetMemory",
          "kind": "function",
          "signature": "updateTargetMemory(memory, visibleTarget, now)",
          "summary": "Update target memory with current perception"
        },
        {
          "name": "getAimPointFromMemory",
          "kind": "function",
          "signature": "getAimPointFromMemory(memory, visibleTarget, now)",
          "summary": "Get aim point considering target memory"
        },
        {
          "name": "calculateAccuracyModifier",
          "kind": "function",
          "signature": "calculateAccuracyModifier(params)",
          "summary": "Calculate accuracy modifier based on combat conditions"
        },
        {
          "name": "degToRad",
          "kind": "function",
          "signature": "degToRad(deg)",
          "summary": "Convert degrees to radians"
        },
        {
          "name": "radToDeg",
          "kind": "function",
          "signature": "radToDeg(rad)",
          "summary": "Convert radians to degrees"
        },
        {
          "name": "distanceSquared",
          "kind": "function",
          "signature": "distanceSquared(a, b)",
          "summary": "Squared distance between two points (faster than actual distance)"
        },
        {
          "name": "distance",
          "kind": "function",
          "signature": "distance(a, b)",
          "summary": "Actual distance between two points"
        },
        {
          "name": "isWithinRange",
          "kind": "function",
          "signature": "isWithinRange(a, b, range)",
          "summary": "Check if distance is within range (uses squared comparison)"
        },
        {
          "name": "SKILL_LEVELS",
          "kind": "constant",
          "signature": "SKILL_LEVELS",
          "summary": "Skill level presets for accuracy parameters"
        },
        {
          "name": "DEFAULT_THREAT_WEIGHTS",
          "kind": "constant",
          "signature": "DEFAULT_THREAT_WEIGHTS",
          "summary": "Default threat weight factors"
        },
        {
          "name": "TARGET_SWITCH_THRESHOLD",
          "kind": "constant",
          "signature": "TARGET_SWITCH_THRESHOLD",
          "summary": "Hysteresis threshold - only switch targets if new threat exceeds by this factor"
        },
        {
          "name": "TARGET_MEMORY_DURATION_MS",
          "kind": "constant",
          "signature": "TARGET_MEMORY_DURATION_MS",
          "summary": "Time to remember lost targets (ms)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIAimingSystem",
      "path": "engine/reference/sim/ai/AIAimingSystem.md",
      "source": "engine/sim/ai/AIAimingSystem.js",
      "import": "/engine/sim/ai/AIAimingSystem.js",
      "sourceHash": "ae557fac8b8f7d926adc886061fa9fb4f5759b5ce9520480834159ad0319ad36",
      "summary": "Create an NPC combat controller",
      "exports": [
        {
          "name": "createNPCCombatController",
          "kind": "function",
          "signature": "createNPCCombatController(config = {})",
          "summary": "Create an NPC combat controller"
        },
        {
          "name": "initNPCWeapons",
          "kind": "function",
          "signature": "initNPCWeapons(npc, weaponList)",
          "summary": "Initialize weapons for an NPC"
        },
        {
          "name": "initNPCMelee",
          "kind": "function",
          "signature": "initNPCMelee(npc, config = {})",
          "summary": "Initialize melee for an NPC"
        },
        {
          "name": "createAIAimingSystem",
          "kind": "function",
          "signature": "createAIAimingSystem(config = {})",
          "summary": "Create the main AI aiming system"
        },
        {
          "name": "registerNPC",
          "kind": "function",
          "signature": "registerNPC(system, npc)",
          "summary": "Register an NPC with the aiming system"
        },
        {
          "name": "unregisterNPC",
          "kind": "function",
          "signature": "unregisterNPC(system, npcId)",
          "summary": "Unregister an NPC from the aiming system"
        },
        {
          "name": "updatePlayerPosition",
          "kind": "function",
          "signature": "updatePlayerPosition(system, position)",
          "summary": "Update player position for LOD calculations"
        },
        {
          "name": "updateAIAimingSystem",
          "kind": "function",
          "signature": "updateAIAimingSystem(system, deltaTimeMs, potentialTargets, obstacles)",
          "summary": "Main update function for the AI aiming system"
        },
        {
          "name": "npcFireWeapon",
          "kind": "function",
          "signature": "npcFireWeapon(system, npc, targets, obstacles)",
          "summary": "Command NPC to fire current weapon"
        },
        {
          "name": "npcMeleeAttack",
          "kind": "function",
          "signature": "npcMeleeAttack(npc, targets)",
          "summary": "Command NPC to perform melee attack"
        },
        {
          "name": "applyDamageToNPC",
          "kind": "function",
          "signature": "applyDamageToNPC(npc, damage, attackerId)",
          "summary": "Apply damage to NPC"
        },
        {
          "name": "decayDamageMemory",
          "kind": "function",
          "signature": "decayDamageMemory(npc, deltaTimeMs, decayRate = 10)",
          "summary": "Decay recent damage memory over time"
        },
        {
          "name": "getBatchRays",
          "kind": "function",
          "signature": "getBatchRays(system)",
          "summary": "Get all rays for GPU batch processing"
        },
        {
          "name": "applyBatchRayResults",
          "kind": "function",
          "signature": "applyBatchRayResults(system, results)",
          "summary": "Apply batch ray results from GPU"
        },
        {
          "name": "COMBAT_STATE",
          "kind": "constant",
          "signature": "COMBAT_STATE",
          "summary": "NPC combat states"
        },
        {
          "name": "LOD_UPDATE_INTERVALS",
          "kind": "constant",
          "signature": "LOD_UPDATE_INTERVALS",
          "summary": "LOD update frequencies (frame intervals)"
        },
        {
          "name": "ATTACK_PHASE",
          "kind": "re-export",
          "signature": "ATTACK_PHASE",
          "summary": ""
        },
        {
          "name": "SKILL_LEVELS",
          "kind": "re-export",
          "signature": "SKILL_LEVELS",
          "summary": ""
        },
        {
          "name": "WEAPON_PRESETS",
          "kind": "re-export",
          "signature": "WEAPON_PRESETS",
          "summary": ""
        },
        {
          "name": "WEAPON_TYPE",
          "kind": "re-export",
          "signature": "WEAPON_TYPE",
          "summary": ""
        },
        {
          "name": "applyAccuracySpread3D",
          "kind": "re-export",
          "signature": "applyAccuracySpread3D",
          "summary": ""
        },
        {
          "name": "calculateThreatScore",
          "kind": "re-export",
          "signature": "calculateThreatScore",
          "summary": ""
        },
        {
          "name": "createGrenade",
          "kind": "re-export",
          "signature": "createGrenade",
          "summary": ""
        },
        {
          "name": "createMeleeArc",
          "kind": "re-export",
          "signature": "createMeleeArc",
          "summary": ""
        },
        {
          "name": "createMeleeAttackState",
          "kind": "re-export",
          "signature": "createMeleeAttackState",
          "summary": ""
        },
        {
          "name": "createObjectPool",
          "kind": "re-export",
          "signature": "createObjectPool",
          "summary": ""
        },
        {
          "name": "createProjectile",
          "kind": "re-export",
          "signature": "createProjectile",
          "summary": ""
        },
        {
          "name": "createRay",
          "kind": "re-export",
          "signature": "createRay",
          "summary": ""
        },
        {
          "name": "createSpatialHash",
          "kind": "re-export",
          "signature": "createSpatialHash",
          "summary": ""
        },
        {
          "name": "fireHitscan",
          "kind": "re-export",
          "signature": "fireHitscan",
          "summary": ""
        },
        {
          "name": "fireShotgun",
          "kind": "re-export",
          "signature": "fireShotgun",
          "summary": ""
        },
        {
          "name": "gaussianRandom",
          "kind": "re-export",
          "signature": "gaussianRandom",
          "summary": ""
        },
        {
          "name": "isInCircularAoE",
          "kind": "re-export",
          "signature": "isInCircularAoE",
          "summary": ""
        },
        {
          "name": "isInConeAoE",
          "kind": "re-export",
          "signature": "isInConeAoE",
          "summary": ""
        },
        {
          "name": "isInMeleeArc",
          "kind": "re-export",
          "signature": "isInMeleeArc",
          "summary": ""
        },
        {
          "name": "poolAcquire",
          "kind": "re-export",
          "signature": "poolAcquire",
          "summary": ""
        },
        {
          "name": "poolRelease",
          "kind": "re-export",
          "signature": "poolRelease",
          "summary": ""
        },
        {
          "name": "predictiveAim",
          "kind": "re-export",
          "signature": "predictiveAim",
          "summary": ""
        },
        {
          "name": "predictiveAimWithAcceleration",
          "kind": "re-export",
          "signature": "predictiveAimWithAcceleration",
          "summary": ""
        },
        {
          "name": "rayAABBIntersect",
          "kind": "re-export",
          "signature": "rayAABBIntersect",
          "summary": ""
        },
        {
          "name": "raySphereIntersect",
          "kind": "re-export",
          "signature": "raySphereIntersect",
          "summary": ""
        },
        {
          "name": "spatialHashInsert",
          "kind": "re-export",
          "signature": "spatialHashInsert",
          "summary": ""
        },
        {
          "name": "spatialHashQueryRadius",
          "kind": "re-export",
          "signature": "spatialHashQueryRadius",
          "summary": ""
        },
        {
          "name": "spatialHashRemove",
          "kind": "re-export",
          "signature": "spatialHashRemove",
          "summary": ""
        },
        {
          "name": "spatialHashUpdate",
          "kind": "re-export",
          "signature": "spatialHashUpdate",
          "summary": ""
        },
        {
          "name": "updateGrenade",
          "kind": "re-export",
          "signature": "updateGrenade",
          "summary": ""
        },
        {
          "name": "updateProjectile",
          "kind": "re-export",
          "signature": "updateProjectile",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIBehaviorTree",
      "path": "engine/reference/sim/ai/AIBehaviorTree.md",
      "source": "engine/sim/ai/AIBehaviorTree.js",
      "import": "/engine/sim/ai/AIBehaviorTree.js",
      "sourceHash": "eb167158a8bab1a5c5cdb82b1bf9652c120e667117ea7e9190d22f5bacfc6b3b",
      "summary": "Create a Selector node (OR logic) Runs children left-to-right, succeeds if ANY child succeeds",
      "exports": [
        {
          "name": "createSelector",
          "kind": "function",
          "signature": "createSelector(name, children = [])",
          "summary": "Create a Selector node (OR logic) Runs children left-to-right, succeeds if ANY child succeeds"
        },
        {
          "name": "createSequence",
          "kind": "function",
          "signature": "createSequence(name, children = [])",
          "summary": "Create a Sequence node (AND logic) Runs children left-to-right, fails if ANY child fails"
        },
        {
          "name": "createParallel",
          "kind": "function",
          "signature": "createParallel(name, children = [], successThreshold = -1, failureThreshold = 1)",
          "summary": "Create a Parallel node Runs all children simultaneously"
        },
        {
          "name": "createRandomSelector",
          "kind": "function",
          "signature": "createRandomSelector(name, children = [])",
          "summary": "Create a Random Selector (picks random child)"
        },
        {
          "name": "createInverter",
          "kind": "function",
          "signature": "createInverter(name, child)",
          "summary": "Create an Inverter decorator Inverts child result: SUCCESS ↔ FAILURE"
        },
        {
          "name": "createRepeater",
          "kind": "function",
          "signature": "createRepeater(name, child, times = -1)",
          "summary": "Create a Repeater decorator Repeats child N times or until failure"
        },
        {
          "name": "createUntilFail",
          "kind": "function",
          "signature": "createUntilFail(name, child)",
          "summary": "Create an UntilFail decorator Repeats child until it fails"
        },
        {
          "name": "createUntilSuccess",
          "kind": "function",
          "signature": "createUntilSuccess(name, child)",
          "summary": "Create an UntilSuccess decorator Repeats child until it succeeds"
        },
        {
          "name": "createSucceeder",
          "kind": "function",
          "signature": "createSucceeder(name, child)",
          "summary": "Create a Succeeder decorator Always returns SUCCESS"
        },
        {
          "name": "createFailer",
          "kind": "function",
          "signature": "createFailer(name, child)",
          "summary": "Create a Failer decorator Always returns FAILURE"
        },
        {
          "name": "createCooldown",
          "kind": "function",
          "signature": "createCooldown(name, child, cooldownMs)",
          "summary": "Create a Cooldown decorator Prevents child from running until cooldown expires"
        },
        {
          "name": "createConditionGuard",
          "kind": "function",
          "signature": "createConditionGuard(name, child, condition)",
          "summary": "Create a Condition Guard decorator Only runs child if condition is met"
        },
        {
          "name": "createAction",
          "kind": "function",
          "signature": "createAction(name, action)",
          "summary": "Create an Action leaf node"
        },
        {
          "name": "createCondition",
          "kind": "function",
          "signature": "createCondition(name, condition)",
          "summary": "Create a Condition leaf node"
        },
        {
          "name": "createWait",
          "kind": "function",
          "signature": "createWait(name, durationMs)",
          "summary": "Create a Wait leaf node"
        },
        {
          "name": "createLog",
          "kind": "function",
          "signature": "createLog(name, message)",
          "summary": "Create a Log leaf node (for debugging)"
        },
        {
          "name": "tickNode",
          "kind": "function",
          "signature": "tickNode(node, blackboard, deltaTime)",
          "summary": "Tick a behavior tree node"
        },
        {
          "name": "resetNode",
          "kind": "function",
          "signature": "resetNode(node)",
          "summary": "Reset a behavior tree node and all children"
        },
        {
          "name": "createTreeRunner",
          "kind": "function",
          "signature": "createTreeRunner(rootNode, blackboard)",
          "summary": "Create a behavior tree runner"
        },
        {
          "name": "tickTree",
          "kind": "function",
          "signature": "tickTree(runner, deltaTime)",
          "summary": "Tick the behavior tree"
        },
        {
          "name": "createCombatTree",
          "kind": "function",
          "signature": "createCombatTree(actions)",
          "summary": "Create a common combat behavior tree"
        },
        {
          "name": "NODE_STATUS",
          "kind": "constant",
          "signature": "NODE_STATUS",
          "summary": ""
        },
        {
          "name": "NODE_TYPES",
          "kind": "re-export",
          "signature": "NODE_TYPES",
          "summary": ""
        },
        {
          "name": "getNodeTypeId",
          "kind": "re-export",
          "signature": "getNodeTypeId",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AICover",
      "path": "engine/reference/sim/ai/AICover.md",
      "source": "engine/sim/ai/AICover.js",
      "import": "/engine/sim/ai/AICover.js",
      "sourceHash": "1060f329acd8c23cc1ad1addc08216d0145838fa1a379abe293c8320b8c11207",
      "summary": "Create a cover point definition",
      "exports": [
        {
          "name": "createCoverPoint",
          "kind": "function",
          "signature": "createCoverPoint(position, normal, options = {})",
          "summary": "Create a cover point definition"
        },
        {
          "name": "computePeekPositions",
          "kind": "function",
          "signature": "computePeekPositions(cover)",
          "summary": "Pre-compute peek positions for a cover point"
        },
        {
          "name": "detectCoverPoints",
          "kind": "function",
          "signature": "detectCoverPoints(obstacles, sampleSpacing = 2)",
          "summary": "Find cover points from obstacle geometry"
        },
        {
          "name": "scoreCoverPoint",
          "kind": "function",
          "signature": "scoreCoverPoint(cover, npcPos, threatPos, obstacles, options = {})",
          "summary": "Score a cover point for a given tactical situation"
        },
        {
          "name": "findBestCover",
          "kind": "function",
          "signature": "findBestCover(coverPoints, npcPos, threatPos, obstacles, options = {})",
          "summary": "Find best cover point from available options"
        },
        {
          "name": "createCoverState",
          "kind": "function",
          "signature": "createCoverState()",
          "summary": "Create NPC cover state tracker"
        },
        {
          "name": "enterCover",
          "kind": "function",
          "signature": "enterCover(state, cover, npcId)",
          "summary": "Enter cover at a cover point"
        },
        {
          "name": "exitCover",
          "kind": "function",
          "signature": "exitCover(state)",
          "summary": "Exit current cover"
        },
        {
          "name": "startPeek",
          "kind": "function",
          "signature": "startPeek(state, action, now)",
          "summary": "Start peek action from cover"
        },
        {
          "name": "updateCoverState",
          "kind": "function",
          "signature": "updateCoverState(state, now)",
          "summary": "Update cover state"
        },
        {
          "name": "getCoverShootPosition",
          "kind": "function",
          "signature": "getCoverShootPosition(state, basePos)",
          "summary": "Get current shoot position based on cover action"
        },
        {
          "name": "canShootFromCover",
          "kind": "function",
          "signature": "canShootFromCover(state)",
          "summary": "Check if NPC can shoot from current cover state"
        },
        {
          "name": "applySuppression",
          "kind": "function",
          "signature": "applySuppression(state, duration, now)",
          "summary": "Apply suppression to an NPC"
        },
        {
          "name": "isSuppressed",
          "kind": "function",
          "signature": "isSuppressed(state, now)",
          "summary": "Check if NPC is suppressed"
        },
        {
          "name": "damageCover",
          "kind": "function",
          "signature": "damageCover(cover, damage)",
          "summary": "Apply damage to cover point"
        },
        {
          "name": "findFlankingPositions",
          "kind": "function",
          "signature": "findFlankingPositions(targetPos, targetFacing, flankDistance, coverPoints, obstacles)",
          "summary": "Find flanking positions around a target"
        },
        {
          "name": "findRetreatCover",
          "kind": "function",
          "signature": "findRetreatCover(npcPos, threatPos, coverPoints, obstacles, minRetreatDist = 10)",
          "summary": "Find retreat positions away from threat"
        },
        {
          "name": "COVER_QUALITY",
          "kind": "constant",
          "signature": "COVER_QUALITY",
          "summary": "Cover quality thresholds"
        },
        {
          "name": "COVER_ACTION",
          "kind": "constant",
          "signature": "COVER_ACTION",
          "summary": "Cover action types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AICrowd",
      "path": "engine/reference/sim/ai/AICrowd.md",
      "source": "engine/sim/ai/AICrowd.js",
      "import": "/engine/sim/ai/AICrowd.js",
      "sourceHash": "1bd559a5b547aedc624190346c5750064e16706e1d26817245aae2ee6f192a36",
      "summary": "Calculate social force (Helbing model)",
      "exports": [
        {
          "name": "calculateSocialForce",
          "kind": "function",
          "signature": "calculateSocialForce(agent, neighbors, walls, goal)",
          "summary": "Calculate social force (Helbing model)"
        },
        {
          "name": "createCrowdAgent",
          "kind": "function",
          "signature": "createCrowdAgent(position, config = {})",
          "summary": "Create crowd agent"
        },
        {
          "name": "createCrowdSystem",
          "kind": "function",
          "signature": "createCrowdSystem(config = {})",
          "summary": "Create crowd system"
        },
        {
          "name": "addCrowdAgent",
          "kind": "function",
          "signature": "addCrowdAgent(crowd, agent)",
          "summary": "Add agent to crowd"
        },
        {
          "name": "removeCrowdAgent",
          "kind": "function",
          "signature": "removeCrowdAgent(crowd, agentId)",
          "summary": "Remove agent from crowd"
        },
        {
          "name": "addCrowdWall",
          "kind": "function",
          "signature": "addCrowdWall(crowd, start, end)",
          "summary": "Add wall to crowd system"
        },
        {
          "name": "addAttractor",
          "kind": "function",
          "signature": "addAttractor(crowd, position, strength, radius)",
          "summary": "Add attractor (draws crowd)"
        },
        {
          "name": "triggerPanic",
          "kind": "function",
          "signature": "triggerPanic(crowd, source, radius, intensity = 1)",
          "summary": "Trigger panic"
        },
        {
          "name": "triggerEvacuation",
          "kind": "function",
          "signature": "triggerEvacuation(crowd)",
          "summary": "Set evacuation mode"
        },
        {
          "name": "updateCrowd",
          "kind": "function",
          "signature": "updateCrowd(crowd, deltaTime)",
          "summary": "Update crowd simulation"
        },
        {
          "name": "getCrowdStats",
          "kind": "function",
          "signature": "getCrowdStats(crowd)",
          "summary": "Get crowd statistics"
        },
        {
          "name": "CROWD_BEHAVIOR",
          "kind": "constant",
          "signature": "CROWD_BEHAVIOR",
          "summary": "Crowd behavior modes"
        },
        {
          "name": "AGENT_STATE",
          "kind": "constant",
          "signature": "AGENT_STATE",
          "summary": "Individual agent states"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIDialogue",
      "path": "engine/reference/sim/ai/AIDialogue.md",
      "source": "engine/sim/ai/AIDialogue.js",
      "import": "/engine/sim/ai/AIDialogue.js",
      "sourceHash": "e60add376dceaf9aead5f23e8be9a8d74628b816071d70ad57d02d520703e55e",
      "summary": "Create a dialogue tree",
      "exports": [
        {
          "name": "createDialogueTree",
          "kind": "function",
          "signature": "createDialogueTree(id, config = {})",
          "summary": "Create a dialogue tree"
        },
        {
          "name": "createDialogueNode",
          "kind": "function",
          "signature": "createDialogueNode(config)",
          "summary": "Create a dialogue node"
        },
        {
          "name": "addDialogueNode",
          "kind": "function",
          "signature": "addDialogueNode(tree, node)",
          "summary": "Add node to dialogue tree"
        },
        {
          "name": "createDialogueState",
          "kind": "function",
          "signature": "createDialogueState()",
          "summary": "Create dialogue state for an NPC"
        },
        {
          "name": "addDialogueTree",
          "kind": "function",
          "signature": "addDialogueTree(state, tree)",
          "summary": "Add dialogue tree to NPC"
        },
        {
          "name": "setDialogueFlag",
          "kind": "function",
          "signature": "setDialogueFlag(state, flag, value)",
          "summary": "Set dialogue flag"
        },
        {
          "name": "getDialogueFlag",
          "kind": "function",
          "signature": "getDialogueFlag(state, flag, defaultValue = null)",
          "summary": "Get dialogue flag"
        },
        {
          "name": "startConversation",
          "kind": "function",
          "signature": "startConversation(state, context = {})",
          "summary": "Start conversation with NPC"
        },
        {
          "name": "processCurrentNode",
          "kind": "function",
          "signature": "processCurrentNode(state, context = {})",
          "summary": "Process current dialogue node"
        },
        {
          "name": "selectChoice",
          "kind": "function",
          "signature": "selectChoice(state, choiceIndex, context = {})",
          "summary": "Select player choice"
        },
        {
          "name": "continueDialogue",
          "kind": "function",
          "signature": "continueDialogue(state, context = {})",
          "summary": "Continue to next dialogue (for NPC lines)"
        },
        {
          "name": "dialogueBuilder",
          "kind": "function",
          "signature": "dialogueBuilder(id)",
          "summary": "Fluent dialogue tree builder"
        },
        {
          "name": "NODE_TYPE",
          "kind": "constant",
          "signature": "NODE_TYPE",
          "summary": "Node types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIDirector",
      "path": "engine/reference/sim/ai/AIDirector.md",
      "source": "engine/sim/ai/AIDirector.js",
      "import": "/engine/sim/ai/AIDirector.js",
      "sourceHash": "b10ac27dd06d407530f1d370ffd4856103d7ce037e6eed5b5c5aac55e51d7505",
      "summary": "Create player state tracker",
      "exports": [
        {
          "name": "createPlayerState",
          "kind": "function",
          "signature": "createPlayerState()",
          "summary": "Create player state tracker"
        },
        {
          "name": "updatePlayerState",
          "kind": "function",
          "signature": "updatePlayerState(state, data, deltaTime)",
          "summary": "Update player state metrics"
        },
        {
          "name": "createPacingController",
          "kind": "function",
          "signature": "createPacingController(config = {})",
          "summary": "Create pacing controller"
        },
        {
          "name": "updatePacing",
          "kind": "function",
          "signature": "updatePacing(pacing, playerState, deltaTime)",
          "summary": "Update pacing state"
        },
        {
          "name": "createSpawnDirector",
          "kind": "function",
          "signature": "createSpawnDirector(config = {})",
          "summary": "Create spawn director"
        },
        {
          "name": "registerSpawnType",
          "kind": "function",
          "signature": "registerSpawnType(director, intensity, spawnType)",
          "summary": "Register spawn type"
        },
        {
          "name": "addSpawnPoint",
          "kind": "function",
          "signature": "addSpawnPoint(director, point)",
          "summary": "Add spawn point"
        },
        {
          "name": "updateSpawnDirector",
          "kind": "function",
          "signature": "updateSpawnDirector(director, pacing, playerPosition, deltaTime)",
          "summary": "Update spawn director"
        },
        {
          "name": "reportSpawnKilled",
          "kind": "function",
          "signature": "reportSpawnKilled(director, spawnId)",
          "summary": "Report spawn killed"
        },
        {
          "name": "createDifficultyScaler",
          "kind": "function",
          "signature": "createDifficultyScaler(config = {})",
          "summary": "Create difficulty scaler"
        },
        {
          "name": "updateDifficulty",
          "kind": "function",
          "signature": "updateDifficulty(scaler, playerState, deltaTime)",
          "summary": "Update difficulty based on player performance"
        },
        {
          "name": "createAIDirector",
          "kind": "function",
          "signature": "createAIDirector(config = {})",
          "summary": "Create complete AI Director"
        },
        {
          "name": "updateAIDirector",
          "kind": "function",
          "signature": "updateAIDirector(director, gameData, deltaTime)",
          "summary": "Update AI Director"
        },
        {
          "name": "PACING_STATE",
          "kind": "constant",
          "signature": "PACING_STATE",
          "summary": "Pacing states"
        },
        {
          "name": "INTENSITY_LEVEL",
          "kind": "constant",
          "signature": "INTENSITY_LEVEL",
          "summary": "Intensity levels"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIEcology",
      "path": "engine/reference/sim/ai/AIEcology.md",
      "source": "engine/sim/ai/AIEcology.js",
      "import": "/engine/sim/ai/AIEcology.js",
      "sourceHash": "69bd4af8e6f80748e89bb42d7c08882e3ec9ef0a0072124b04782c1466db257e",
      "summary": "Create species definition",
      "exports": [
        {
          "name": "createSpecies",
          "kind": "function",
          "signature": "createSpecies(config)",
          "summary": "Create species definition"
        },
        {
          "name": "createCreature",
          "kind": "function",
          "signature": "createCreature(species, position)",
          "summary": "Create creature instance"
        },
        {
          "name": "createEcosystem",
          "kind": "function",
          "signature": "createEcosystem(config = {})",
          "summary": "Create ecosystem manager"
        },
        {
          "name": "registerSpecies",
          "kind": "function",
          "signature": "registerSpecies(eco, species)",
          "summary": "Register species in ecosystem"
        },
        {
          "name": "spawnCreature",
          "kind": "function",
          "signature": "spawnCreature(eco, speciesId, position)",
          "summary": "Spawn creature in ecosystem"
        },
        {
          "name": "removeCreature",
          "kind": "function",
          "signature": "removeCreature(eco, creatureId, cause = \"natural\")",
          "summary": "Remove creature from ecosystem"
        },
        {
          "name": "createFoodSource",
          "kind": "function",
          "signature": "createFoodSource(eco, position, type, nutrition)",
          "summary": "Create food source"
        },
        {
          "name": "consumeFood",
          "kind": "function",
          "signature": "consumeFood(eco, foodId, amount)",
          "summary": "Consume food source"
        },
        {
          "name": "createPack",
          "kind": "function",
          "signature": "createPack(eco, speciesId, leaderId)",
          "summary": "Create pack/herd"
        },
        {
          "name": "addToPack",
          "kind": "function",
          "signature": "addToPack(eco, packId, creatureId)",
          "summary": "Add creature to pack"
        },
        {
          "name": "updateCreature",
          "kind": "function",
          "signature": "updateCreature(eco, creature, deltaHours)",
          "summary": "Update creature behavior"
        },
        {
          "name": "updateEcosystem",
          "kind": "function",
          "signature": "updateEcosystem(eco, deltaHours)",
          "summary": "Update entire ecosystem"
        },
        {
          "name": "getEcosystemStats",
          "kind": "function",
          "signature": "getEcosystemStats(eco)",
          "summary": "Get ecosystem statistics"
        },
        {
          "name": "SPECIES_ROLE",
          "kind": "constant",
          "signature": "SPECIES_ROLE",
          "summary": "Species roles in ecosystem"
        },
        {
          "name": "CREATURE_STATE",
          "kind": "constant",
          "signature": "CREATURE_STATE",
          "summary": "Activity states"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIEconomy",
      "path": "engine/reference/sim/ai/AIEconomy.md",
      "source": "engine/sim/ai/AIEconomy.js",
      "import": "/engine/sim/ai/AIEconomy.js",
      "sourceHash": "b8f0adf00b470a6d0b1bb7d4179819db63d609eb3ceceb2a01e24b7e8ad78089",
      "summary": "Create resource definition",
      "exports": [
        {
          "name": "createResource",
          "kind": "function",
          "signature": "createResource(config)",
          "summary": "Create resource definition"
        },
        {
          "name": "createMarket",
          "kind": "function",
          "signature": "createMarket(config = {})",
          "summary": "Create a market (trading location)"
        },
        {
          "name": "initMarketResource",
          "kind": "function",
          "signature": "initMarketResource(market, resource, initialSupply = 100, baseDemand = 10)",
          "summary": "Initialize resource in market"
        },
        {
          "name": "calculatePrice",
          "kind": "function",
          "signature": "calculatePrice(market, resourceId)",
          "summary": "Calculate current price based on supply/demand"
        },
        {
          "name": "updateMarketPrices",
          "kind": "function",
          "signature": "updateMarketPrices(market, deltaHours)",
          "summary": "Update market prices"
        },
        {
          "name": "buyFromMarket",
          "kind": "function",
          "signature": "buyFromMarket(market, resourceId, quantity, buyer)",
          "summary": "Execute a buy transaction"
        },
        {
          "name": "sellToMarket",
          "kind": "function",
          "signature": "sellToMarket(market, resourceId, quantity, seller)",
          "summary": "Execute a sell transaction"
        },
        {
          "name": "createInventory",
          "kind": "function",
          "signature": "createInventory(capacity = 100)",
          "summary": "Create inventory"
        },
        {
          "name": "addToInventory",
          "kind": "function",
          "signature": "addToInventory(inventory, resourceId, quantity, resourceDef)",
          "summary": "Add items to inventory"
        },
        {
          "name": "removeFromInventory",
          "kind": "function",
          "signature": "removeFromInventory(inventory, resourceId, quantity, resourceDef)",
          "summary": "Remove items from inventory"
        },
        {
          "name": "createRecipe",
          "kind": "function",
          "signature": "createRecipe(config)",
          "summary": "Create crafting recipe"
        },
        {
          "name": "canCraft",
          "kind": "function",
          "signature": "canCraft(recipe, inventory, skills = {})",
          "summary": "Check if can craft recipe"
        },
        {
          "name": "craft",
          "kind": "function",
          "signature": "craft(recipe, inventory, resourceDefs, skills = {})",
          "summary": "Execute crafting"
        },
        {
          "name": "createProductionBuilding",
          "kind": "function",
          "signature": "createProductionBuilding(config)",
          "summary": "Create production building"
        },
        {
          "name": "updateProductionBuilding",
          "kind": "function",
          "signature": "updateProductionBuilding(building, recipes, resourceDefs, deltaHours)",
          "summary": "Update production building"
        },
        {
          "name": "createEconomyManager",
          "kind": "function",
          "signature": "createEconomyManager()",
          "summary": "Create economy manager"
        },
        {
          "name": "registerResource",
          "kind": "function",
          "signature": "registerResource(manager, resource)",
          "summary": "Register resource"
        },
        {
          "name": "registerRecipe",
          "kind": "function",
          "signature": "registerRecipe(manager, recipe)",
          "summary": "Register recipe"
        },
        {
          "name": "updateEconomy",
          "kind": "function",
          "signature": "updateEconomy(manager, deltaHours)",
          "summary": "Update entire economy"
        },
        {
          "name": "RESOURCE_CATEGORY",
          "kind": "constant",
          "signature": "RESOURCE_CATEGORY",
          "summary": "Resource categories"
        },
        {
          "name": "MARKET_TREND",
          "kind": "constant",
          "signature": "MARKET_TREND",
          "summary": "Market trend directions"
        },
        {
          "name": "PRESET_RESOURCES",
          "kind": "constant",
          "signature": "PRESET_RESOURCES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIEvasion",
      "path": "engine/reference/sim/ai/AIEvasion.md",
      "source": "engine/sim/ai/AIEvasion.js",
      "import": "/engine/sim/ai/AIEvasion.js",
      "sourceHash": "7c4c3237b4789b534aab9867498323f5592f7d7c79cfb6fb9a4e17c855c19186",
      "summary": "Create evasion state for an NPC",
      "exports": [
        {
          "name": "createEvasionState",
          "kind": "function",
          "signature": "createEvasionState(params = {})",
          "summary": "Create evasion state for an NPC"
        },
        {
          "name": "startDodge",
          "kind": "function",
          "signature": "startDodge(state, dodgeType, npcPos, npcFacing, now)",
          "summary": "Attempt to dodge in a direction"
        },
        {
          "name": "updateEvasion",
          "kind": "function",
          "signature": "updateEvasion(state, now)",
          "summary": "Update evasion state"
        },
        {
          "name": "isEvading",
          "kind": "function",
          "signature": "isEvading(state)",
          "summary": "Check if NPC is currently evading"
        },
        {
          "name": "canDodge",
          "kind": "function",
          "signature": "canDodge(state, now)",
          "summary": "Check if NPC can dodge"
        },
        {
          "name": "updateStrafe",
          "kind": "function",
          "signature": "updateStrafe(state, npcFacing, deltaTime)",
          "summary": "Update strafe behavior"
        },
        {
          "name": "setStrafeDirection",
          "kind": "function",
          "signature": "setStrafeDirection(state, direction)",
          "summary": "Set explicit strafe direction"
        },
        {
          "name": "reactToThreat",
          "kind": "function",
          "signature": "reactToThreat(state, npcPos, npcFacing, threatDir, now, options = {})",
          "summary": "React to incoming threat (projectile, attack)"
        },
        {
          "name": "checkProjectileThreats",
          "kind": "function",
          "signature": "checkProjectileThreats(state, npcPos, npcFacing, projectiles, now)",
          "summary": "Check for incoming projectiles and react"
        },
        {
          "name": "checkGrenadeThreats",
          "kind": "function",
          "signature": "checkGrenadeThreats(state, npcPos, npcFacing, grenades, now)",
          "summary": "Check for grenades and react"
        },
        {
          "name": "generateCombatMovement",
          "kind": "function",
          "signature": "generateCombatMovement(state, npcPos, targetPos, deltaTimeMs)",
          "summary": "Generate unpredictable movement pattern"
        },
        {
          "name": "circleStrafe",
          "kind": "function",
          "signature": "circleStrafe(npcPos, targetPos, direction, speed)",
          "summary": "Calculate circle-strafe velocity around target"
        },
        {
          "name": "getEvasionParamsForSkill",
          "kind": "function",
          "signature": "getEvasionParamsForSkill(skill)",
          "summary": "Get evasion parameters for skill level"
        },
        {
          "name": "EVASION_TYPE",
          "kind": "constant",
          "signature": "EVASION_TYPE",
          "summary": "Evasion action types"
        },
        {
          "name": "DEFAULT_EVASION_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_EVASION_PARAMS",
          "summary": "Default evasion parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIFaction",
      "path": "engine/reference/sim/ai/AIFaction.md",
      "source": "engine/sim/ai/AIFaction.js",
      "import": "/engine/sim/ai/AIFaction.js",
      "sourceHash": "75f7eae497b4e4f998467e7745f9ac65bfc7deccd0f826ebf2d820b62712697f",
      "summary": "Create a faction",
      "exports": [
        {
          "name": "createFaction",
          "kind": "function",
          "signature": "createFaction(config)",
          "summary": "Create a faction"
        },
        {
          "name": "createFactionManager",
          "kind": "function",
          "signature": "createFactionManager()",
          "summary": "Create faction manager"
        },
        {
          "name": "registerFaction",
          "kind": "function",
          "signature": "registerFaction(manager, faction)",
          "summary": "Register a faction"
        },
        {
          "name": "getEntityFaction",
          "kind": "function",
          "signature": "getEntityFaction(manager, entityId)",
          "summary": "Get entity's faction"
        },
        {
          "name": "addToFaction",
          "kind": "function",
          "signature": "addToFaction(manager, entityId, factionId)",
          "summary": "Add entity to faction"
        },
        {
          "name": "setDiplomaticStance",
          "kind": "function",
          "signature": "setDiplomaticStance(manager, factionA, factionB, stance)",
          "summary": "Set diplomatic stance between factions"
        },
        {
          "name": "getDiplomaticStance",
          "kind": "function",
          "signature": "getDiplomaticStance(manager, factionA, factionB)",
          "summary": "Get diplomatic stance between factions"
        },
        {
          "name": "areFactionsHostile",
          "kind": "function",
          "signature": "areFactionsHostile(manager, factionA, factionB)",
          "summary": "Check if factions are hostile"
        },
        {
          "name": "areFactionsAllied",
          "kind": "function",
          "signature": "areFactionsAllied(manager, factionA, factionB)",
          "summary": "Check if factions are allied"
        },
        {
          "name": "areEntitiesHostile",
          "kind": "function",
          "signature": "areEntitiesHostile(manager, entityA, entityB)",
          "summary": "Check if two entities are hostile to each other"
        },
        {
          "name": "modifyPlayerReputation",
          "kind": "function",
          "signature": "modifyPlayerReputation(manager, factionId, delta)",
          "summary": "Modify player reputation with faction"
        },
        {
          "name": "getPlayerReputationLevel",
          "kind": "function",
          "signature": "getPlayerReputationLevel(manager, factionId)",
          "summary": "Get player reputation level with faction"
        },
        {
          "name": "canAccessFactionService",
          "kind": "function",
          "signature": "canAccessFactionService(manager, factionId, service)",
          "summary": "Check if player can access faction services"
        },
        {
          "name": "createTreaty",
          "kind": "function",
          "signature": "createTreaty(config)",
          "summary": "Create a treaty"
        },
        {
          "name": "proposeTreaty",
          "kind": "function",
          "signature": "proposeTreaty(manager, treaty)",
          "summary": "Propose treaty"
        },
        {
          "name": "declareWar",
          "kind": "function",
          "signature": "declareWar(manager, aggressor, target)",
          "summary": "Declare war"
        },
        {
          "name": "claimTerritory",
          "kind": "function",
          "signature": "claimTerritory(manager, factionId, territoryId)",
          "summary": "Claim territory for faction"
        },
        {
          "name": "getTerritoryOwner",
          "kind": "function",
          "signature": "getTerritoryOwner(manager, territoryId)",
          "summary": "Get territory owner"
        },
        {
          "name": "calculateFactionPower",
          "kind": "function",
          "signature": "calculateFactionPower(manager, factionId)",
          "summary": "Calculate faction power"
        },
        {
          "name": "DIPLOMATIC_STANCE",
          "kind": "constant",
          "signature": "DIPLOMATIC_STANCE",
          "summary": "Diplomatic stance"
        },
        {
          "name": "REPUTATION_LEVEL",
          "kind": "constant",
          "signature": "REPUTATION_LEVEL",
          "summary": "Reputation thresholds - from AISchema"
        },
        {
          "name": "TREATY_TYPE",
          "kind": "constant",
          "signature": "TREATY_TYPE",
          "summary": "Treaty types"
        },
        {
          "name": "getReputationLevel",
          "kind": "re-export",
          "signature": "getReputationLevel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIFormation",
      "path": "engine/reference/sim/ai/AIFormation.md",
      "source": "engine/sim/ai/AIFormation.js",
      "import": "/engine/sim/ai/AIFormation.js",
      "sourceHash": "a83d400bb417fc0e2e26ff4d7efa21ea855c379f336a6b523076077b90b4a6f0",
      "summary": "Create formation definition",
      "exports": [
        {
          "name": "createFormation",
          "kind": "function",
          "signature": "createFormation(type, options = {})",
          "summary": "Create formation definition"
        },
        {
          "name": "generateFormationSlots",
          "kind": "function",
          "signature": "generateFormationSlots(formation, unitCount)",
          "summary": "Generate formation slot positions"
        },
        {
          "name": "createFormationManager",
          "kind": "function",
          "signature": "createFormationManager(formation)",
          "summary": "Create formation manager for a group"
        },
        {
          "name": "assignToFormation",
          "kind": "function",
          "signature": "assignToFormation(manager, unitId, isLeader = false)",
          "summary": "Assign unit to formation slot"
        },
        {
          "name": "removeFromFormation",
          "kind": "function",
          "signature": "removeFromFormation(manager, unitId)",
          "summary": "Remove unit from formation"
        },
        {
          "name": "getFormationPosition",
          "kind": "function",
          "signature": "getFormationPosition(manager, unitId)",
          "summary": "Get unit's target position in formation"
        },
        {
          "name": "moveFormation",
          "kind": "function",
          "signature": "moveFormation(manager, targetCenter, targetFacing = null)",
          "summary": "Move formation to target"
        },
        {
          "name": "updateFormationMovement",
          "kind": "function",
          "signature": "updateFormationMovement(manager, deltaTime)",
          "summary": "Update formation movement"
        },
        {
          "name": "changeFormation",
          "kind": "function",
          "signature": "changeFormation(manager, newType, options = {})",
          "summary": "Change formation type"
        },
        {
          "name": "getAllFormationPositions",
          "kind": "function",
          "signature": "getAllFormationPositions(manager)",
          "summary": "Get all unit target positions"
        },
        {
          "name": "isFormationComplete",
          "kind": "function",
          "signature": "isFormationComplete(manager, currentPositions, threshold = 1)",
          "summary": "Check if formation is formed up"
        },
        {
          "name": "FORMATION_TYPE",
          "kind": "constant",
          "signature": "FORMATION_TYPE",
          "summary": "Formation patterns"
        },
        {
          "name": "PRESET_FORMATIONS",
          "kind": "constant",
          "signature": "PRESET_FORMATIONS",
          "summary": "Create preset formations for common scenarios"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIHitDetection",
      "path": "engine/reference/sim/ai/AIHitDetection.md",
      "source": "engine/sim/ai/AIHitDetection.js",
      "import": "/engine/sim/ai/AIHitDetection.js",
      "sourceHash": "da03ef9c7c457e989acd8ef5ebb8d0aaaf40886d98802999e85c78b6a1957ac4",
      "summary": "Spatial hash for efficient broad-phase collision detection",
      "exports": [
        {
          "name": "SpatialHash",
          "kind": "class",
          "signature": "class SpatialHash",
          "summary": "Spatial hash for efficient broad-phase collision detection"
        },
        {
          "name": "sweptSphereSphere",
          "kind": "function",
          "signature": "sweptSphereSphere(sphereStart, sphereEnd, sphereRadius, targetCenter, targetRadius)",
          "summary": "Swept sphere vs static sphere intersection Finds time t in [0,1] when moving sphere first touches static sphere"
        },
        {
          "name": "sweptSphereSphereMoving",
          "kind": "function",
          "signature": "sweptSphereSphereMoving(sphereA, sphereB)",
          "summary": "Swept sphere vs moving sphere intersection Handles both objects moving (relative velocity approach)"
        },
        {
          "name": "capsuleSphereIntersect",
          "kind": "function",
          "signature": "capsuleSphereIntersect(capsuleStart, capsuleEnd, capsuleRadius, targetCenter, targetRadius)",
          "summary": "Swept capsule collision (projectile path as line segment) Creates a capsule from start to end position with given radius"
        },
        {
          "name": "calculateDamageFalloff",
          "kind": "function",
          "signature": "calculateDamageFalloff(baseDamage, distance, radius, falloffType = FALLOFF_TYPE.LINEAR, options = {})",
          "summary": "Calculate damage with distance falloff"
        },
        {
          "name": "getAoETargets",
          "kind": "function",
          "signature": "getAoETargets(center, radius, targets, options = {})",
          "summary": "Find all targets within an Area of Effect"
        },
        {
          "name": "getConeTargets",
          "kind": "function",
          "signature": "getConeTargets(origin, direction, halfAngle, range, targets, options = {})",
          "summary": "Cone-shaped AoE (dragon breath, flamethrower)"
        },
        {
          "name": "checkProjectileHit",
          "kind": "function",
          "signature": "checkProjectileHit(projectile, targets, options = {})",
          "summary": "Check projectile hit with swept collision and spatial optimization"
        },
        {
          "name": "checkBeamHit",
          "kind": "function",
          "signature": "checkBeamHit(origin, direction, maxRange, targets, options = {})",
          "summary": "Check beam/ray hit against multiple targets"
        },
        {
          "name": "FALLOFF_TYPE",
          "kind": "constant",
          "signature": "FALLOFF_TYPE",
          "summary": "Damage falloff types"
        },
        {
          "name": "HITBOX_TYPE",
          "kind": "constant",
          "signature": "HITBOX_TYPE",
          "summary": "Hitbox types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIInfluenceMap",
      "path": "engine/reference/sim/ai/AIInfluenceMap.md",
      "source": "engine/sim/ai/AIInfluenceMap.js",
      "import": "/engine/sim/ai/AIInfluenceMap.js",
      "sourceHash": "ffe3ffa6cce26808f4bb8a795256cbb9e4487940e5911f58a483546c567fee86",
      "summary": "Create an influence map layer",
      "exports": [
        {
          "name": "createInfluenceLayer",
          "kind": "function",
          "signature": "createInfluenceLayer(width, height, cellSize, origin = [0, 0])",
          "summary": "Create an influence map layer"
        },
        {
          "name": "createInfluenceMap",
          "kind": "function",
          "signature": "createInfluenceMap(width, height, cellSize, origin = [0, 0])",
          "summary": "Create a multi-layer influence map"
        },
        {
          "name": "worldToInfluenceCell",
          "kind": "function",
          "signature": "worldToInfluenceCell(map, worldX, worldZ)",
          "summary": "World position to grid cell"
        },
        {
          "name": "influenceCellToWorld",
          "kind": "function",
          "signature": "influenceCellToWorld(map, cellX, cellY)",
          "summary": "Grid cell to world position (center of cell)"
        },
        {
          "name": "getInfluenceAt",
          "kind": "function",
          "signature": "getInfluenceAt(layer, worldX, worldZ)",
          "summary": "Get influence value at world position"
        },
        {
          "name": "setInfluenceAt",
          "kind": "function",
          "signature": "setInfluenceAt(layer, worldX, worldZ, value)",
          "summary": "Set influence value at world position"
        },
        {
          "name": "addInfluenceAt",
          "kind": "function",
          "signature": "addInfluenceAt(layer, worldX, worldZ, value)",
          "summary": "Add influence at world position"
        },
        {
          "name": "stampInfluence",
          "kind": "function",
          "signature": "stampInfluence(layer, worldX, worldZ, radius, value, falloff = \"linear\")",
          "summary": "Stamp circular influence at position"
        },
        {
          "name": "propagateInfluence",
          "kind": "function",
          "signature": "propagateInfluence(layer, decayFactor = 0.9)",
          "summary": "Propagate influence to neighboring cells (blur/spread)"
        },
        {
          "name": "decayInfluence",
          "kind": "function",
          "signature": "decayInfluence(layer, decayRate = 0.1)",
          "summary": "Decay all influence values"
        },
        {
          "name": "clearInfluence",
          "kind": "function",
          "signature": "clearInfluence(layer)",
          "summary": "Clear all influence"
        },
        {
          "name": "findLowestInfluence",
          "kind": "function",
          "signature": "findLowestInfluence(layer, worldX, worldZ, searchRadius)",
          "summary": "Find position with lowest influence in radius"
        },
        {
          "name": "findHighestInfluence",
          "kind": "function",
          "signature": "findHighestInfluence(layer, worldX, worldZ, searchRadius)",
          "summary": "Find position with highest influence in radius"
        },
        {
          "name": "sampleCombinedInfluence",
          "kind": "function",
          "signature": "sampleCombinedInfluence(map, worldX, worldZ, weights)",
          "summary": "Sample combined influence from multiple layers"
        },
        {
          "name": "findChokePoints",
          "kind": "function",
          "signature": "findChokePoints(walkabilityGrid, influenceMap)",
          "summary": "Analyze terrain for choke points"
        },
        {
          "name": "updateThreatInfluence",
          "kind": "function",
          "signature": "updateThreatInfluence(map, enemies)",
          "summary": "Update threat layer from enemy positions"
        },
        {
          "name": "updateAllyInfluence",
          "kind": "function",
          "signature": "updateAllyInfluence(map, allies)",
          "summary": "Update ally layer from friendly positions"
        },
        {
          "name": "reservePath",
          "kind": "function",
          "signature": "reservePath(map, path, reserveValue = 1.0)",
          "summary": "Reserve a path on the influence map"
        },
        {
          "name": "clearPathReservations",
          "kind": "function",
          "signature": "clearPathReservations(map)",
          "summary": "Clear path reservation"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIKnowledge",
      "path": "engine/reference/sim/ai/AIKnowledge.md",
      "source": "engine/sim/ai/AIKnowledge.js",
      "import": "/engine/sim/ai/AIKnowledge.js",
      "sourceHash": "5aac2f6d25a4f5a66cd883b9d24f70267ae590acc8cfbaddd097efb9b399f322",
      "summary": "Create knowledge item",
      "exports": [
        {
          "name": "createKnowledge",
          "kind": "function",
          "signature": "createKnowledge(config)",
          "summary": "Create knowledge item"
        },
        {
          "name": "distortKnowledge",
          "kind": "function",
          "signature": "distortKnowledge(knowledge, distortion = 0.1)",
          "summary": "Create a distorted copy (for rumor spreading)"
        },
        {
          "name": "createKnowledgeBase",
          "kind": "function",
          "signature": "createKnowledgeBase()",
          "summary": "Create NPC knowledge base"
        },
        {
          "name": "addKnowledge",
          "kind": "function",
          "signature": "addKnowledge(kb, knowledge)",
          "summary": "Add knowledge to NPC's knowledge base"
        },
        {
          "name": "queryKnowledge",
          "kind": "function",
          "signature": "queryKnowledge(kb, query)",
          "summary": "Query knowledge base"
        },
        {
          "name": "hasKnowledgeOf",
          "kind": "function",
          "signature": "hasKnowledgeOf(kb, subject)",
          "summary": "Check if NPC knows about something"
        },
        {
          "name": "shareKnowledge",
          "kind": "function",
          "signature": "shareKnowledge(giver, receiver, knowledge, giverNpcId)",
          "summary": "Share knowledge between NPCs"
        },
        {
          "name": "spreadKnowledge",
          "kind": "function",
          "signature": "spreadKnowledge(network, knowledge, originNpcId, maxHops = 3)",
          "summary": "Spread knowledge through social network"
        },
        {
          "name": "createWorldKnowledgeManager",
          "kind": "function",
          "signature": "createWorldKnowledgeManager()",
          "summary": "Create world knowledge manager"
        },
        {
          "name": "registerNPCKnowledge",
          "kind": "function",
          "signature": "registerNPCKnowledge(manager, npcId, config = {})",
          "summary": "Register NPC with knowledge system"
        },
        {
          "name": "connectNPCs",
          "kind": "function",
          "signature": "connectNPCs(manager, npc1, npc2)",
          "summary": "Connect two NPCs in social network"
        },
        {
          "name": "announcePublicKnowledge",
          "kind": "function",
          "signature": "announcePublicKnowledge(manager, knowledge)",
          "summary": "Announce public knowledge"
        },
        {
          "name": "updateKnowledgePropagation",
          "kind": "function",
          "signature": "updateKnowledgePropagation(manager, gameTime)",
          "summary": "Update knowledge propagation"
        },
        {
          "name": "INFO_TYPE",
          "kind": "constant",
          "signature": "INFO_TYPE",
          "summary": "Information types"
        },
        {
          "name": "RELIABILITY",
          "kind": "constant",
          "signature": "RELIABILITY",
          "summary": "Information reliability"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AILoot",
      "path": "engine/reference/sim/ai/AILoot.md",
      "source": "engine/sim/ai/AILoot.js",
      "import": "/engine/sim/ai/AILoot.js",
      "sourceHash": "6f0a484d5039293dce33182e229f0f16dd975f061510ae1692aaa36fedf123c4",
      "summary": "Create item definition",
      "exports": [
        {
          "name": "createItemDef",
          "kind": "function",
          "signature": "createItemDef(config)",
          "summary": "Create item definition"
        },
        {
          "name": "createItemInstance",
          "kind": "function",
          "signature": "createItemInstance(itemDef, options = {})",
          "summary": "Create item instance from definition"
        },
        {
          "name": "createAffix",
          "kind": "function",
          "signature": "createAffix(config)",
          "summary": "Create affix definition"
        },
        {
          "name": "applyAffix",
          "kind": "function",
          "signature": "applyAffix(item, affix)",
          "summary": "Apply affix to item"
        },
        {
          "name": "generateItemName",
          "kind": "function",
          "signature": "generateItemName(item)",
          "summary": "Generate item name from affixes"
        },
        {
          "name": "createLootEntry",
          "kind": "function",
          "signature": "createLootEntry(config)",
          "summary": "Create loot table entry"
        },
        {
          "name": "createLootTable",
          "kind": "function",
          "signature": "createLootTable(config)",
          "summary": "Create loot table"
        },
        {
          "name": "rollLootTable",
          "kind": "function",
          "signature": "rollLootTable(table, itemDefs, context = {})",
          "summary": "Roll loot from table"
        },
        {
          "name": "rollRarity",
          "kind": "function",
          "signature": "rollRarity(luckBonus = 0)",
          "summary": "Roll rarity based on luck"
        },
        {
          "name": "createLootManager",
          "kind": "function",
          "signature": "createLootManager()",
          "summary": "Create loot manager"
        },
        {
          "name": "registerItemDef",
          "kind": "function",
          "signature": "registerItemDef(manager, itemDef)",
          "summary": "Register item definition"
        },
        {
          "name": "registerAffix",
          "kind": "function",
          "signature": "registerAffix(manager, affix)",
          "summary": "Register affix"
        },
        {
          "name": "registerLootTable",
          "kind": "function",
          "signature": "registerLootTable(manager, table)",
          "summary": "Register loot table"
        },
        {
          "name": "dropLoot",
          "kind": "function",
          "signature": "dropLoot(manager, tableId, position, context = {})",
          "summary": "Drop loot at position"
        },
        {
          "name": "cleanupDrops",
          "kind": "function",
          "signature": "cleanupDrops(manager)",
          "summary": "Clean up expired drops"
        },
        {
          "name": "RARITY",
          "kind": "constant",
          "signature": "RARITY",
          "summary": "Rarity tiers"
        },
        {
          "name": "RARITY_COLORS",
          "kind": "constant",
          "signature": "RARITY_COLORS",
          "summary": "Rarity color codes"
        },
        {
          "name": "ITEM_CATEGORY",
          "kind": "constant",
          "signature": "ITEM_CATEGORY",
          "summary": "Item categories"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIMelee",
      "path": "engine/reference/sim/ai/AIMelee.md",
      "source": "engine/sim/ai/AIMelee.js",
      "import": "/engine/sim/ai/AIMelee.js",
      "sourceHash": "f74eedf064ca3e2a234e231c10d851861b3fe119a657cad2a8c3ae94a0b745cb",
      "summary": "Create a melee attack arc (pie-slice shaped hitbox)",
      "exports": [
        {
          "name": "createMeleeArc",
          "kind": "function",
          "signature": "createMeleeArc(origin, direction, range, arcAngleDeg)",
          "summary": "Create a melee attack arc (pie-slice shaped hitbox)"
        },
        {
          "name": "isInMeleeArc",
          "kind": "function",
          "signature": "isInMeleeArc(arc, targetPos, targetRadius = 0)",
          "summary": "Check if a point is within the melee arc (2D horizontal check) Uses cosine comparison for efficiency (avoids atan2)"
        },
        {
          "name": "isInMeleeArc3D",
          "kind": "function",
          "signature": "isInMeleeArc3D(arc, targetPos, targetRadius = 0, verticalToleranceRad = Math.PI / 4)",
          "summary": "Check if target is in 3D melee arc (includes vertical angle)"
        },
        {
          "name": "createMeleeAttackState",
          "kind": "function",
          "signature": "createMeleeAttackState(config)",
          "summary": "Create a melee attack state tracker"
        },
        {
          "name": "startMeleeAttack",
          "kind": "function",
          "signature": "startMeleeAttack(state, now)",
          "summary": "Start a melee attack"
        },
        {
          "name": "updateMeleeAttack",
          "kind": "function",
          "signature": "updateMeleeAttack(state, now)",
          "summary": "Update melee attack state and check phase transitions"
        },
        {
          "name": "interruptMeleeAttack",
          "kind": "function",
          "signature": "interruptMeleeAttack(state)",
          "summary": "Try to interrupt a melee attack (e.g., from stagger)"
        },
        {
          "name": "checkMeleeHits",
          "kind": "function",
          "signature": "checkMeleeHits(state, attackerPos, attackerDir, targets)",
          "summary": "Check for hits during active phase"
        },
        {
          "name": "chainComboAttack",
          "kind": "function",
          "signature": "chainComboAttack(state, now)",
          "summary": "Chain to next combo attack"
        },
        {
          "name": "getComboMultiplier",
          "kind": "function",
          "signature": "getComboMultiplier(comboStep)",
          "summary": "Get combo multiplier for current step"
        },
        {
          "name": "sweepMeleeArc",
          "kind": "function",
          "signature": "sweepMeleeArc(origin, startDir, endDir, range, targets, sweepSamples = 5)",
          "summary": "Perform a sweeping melee attack across multiple positions Useful for wide slash attacks"
        },
        {
          "name": "getPhaseTimeRemaining",
          "kind": "function",
          "signature": "getPhaseTimeRemaining(state, now)",
          "summary": "Get remaining time in current phase"
        },
        {
          "name": "getPhaseProgress",
          "kind": "function",
          "signature": "getPhaseProgress(state, now)",
          "summary": "Get phase progress (0-1)"
        },
        {
          "name": "ATTACK_PHASE",
          "kind": "constant",
          "signature": "ATTACK_PHASE",
          "summary": "Attack phase types"
        },
        {
          "name": "DEFAULT_PHASE_DURATIONS",
          "kind": "constant",
          "signature": "DEFAULT_PHASE_DURATIONS",
          "summary": "Default phase durations in milliseconds"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIMemory",
      "path": "engine/reference/sim/ai/AIMemory.md",
      "source": "engine/sim/ai/AIMemory.js",
      "import": "/engine/sim/ai/AIMemory.js",
      "sourceHash": "b5320a23dd2762b858f505b68d4e3e0102eba6a46493c1ad8673cbd3ef90b7c9",
      "summary": "Create working memory (limited capacity short-term)",
      "exports": [
        {
          "name": "createWorkingMemory",
          "kind": "function",
          "signature": "createWorkingMemory(capacity = 7)",
          "summary": "Create working memory (limited capacity short-term)"
        },
        {
          "name": "workingMemoryPush",
          "kind": "function",
          "signature": "workingMemoryPush(memory, item)",
          "summary": "Add item to working memory (displaces oldest if full)"
        },
        {
          "name": "setFocus",
          "kind": "function",
          "signature": "setFocus(memory, type, data)",
          "summary": "Set focus of attention"
        },
        {
          "name": "getWorkingMemoryByType",
          "kind": "function",
          "signature": "getWorkingMemoryByType(memory, type)",
          "summary": "Get items from working memory by type"
        },
        {
          "name": "clearWorkingMemory",
          "kind": "function",
          "signature": "clearWorkingMemory(memory)",
          "summary": "Clear working memory"
        },
        {
          "name": "createEpisodicMemory",
          "kind": "function",
          "signature": "createEpisodicMemory(maxEpisodes = 1000)",
          "summary": "Create episodic memory (personal experiences)"
        },
        {
          "name": "createEpisode",
          "kind": "function",
          "signature": "createEpisode(data)",
          "summary": "Create an episode (memory of an event)"
        },
        {
          "name": "storeEpisode",
          "kind": "function",
          "signature": "storeEpisode(memory, episode)",
          "summary": "Store an episode"
        },
        {
          "name": "recallEpisodesWithEntity",
          "kind": "function",
          "signature": "recallEpisodesWithEntity(memory, entityId, limit = 10)",
          "summary": "Recall episodes involving an entity"
        },
        {
          "name": "recallEpisodesWithEmotion",
          "kind": "function",
          "signature": "recallEpisodesWithEmotion(memory, emotion, limit = 10)",
          "summary": "Recall episodes by emotion"
        },
        {
          "name": "recallRecentEpisodes",
          "kind": "function",
          "signature": "recallRecentEpisodes(memory, count = 5)",
          "summary": "Recall recent episodes"
        },
        {
          "name": "searchEpisodes",
          "kind": "function",
          "signature": "searchEpisodes(memory, criteria)",
          "summary": "Search episodes by criteria"
        },
        {
          "name": "createSemanticMemory",
          "kind": "function",
          "signature": "createSemanticMemory()",
          "summary": "Create semantic memory (facts and knowledge)"
        },
        {
          "name": "storeFact",
          "kind": "function",
          "signature": "storeFact(memory, key, value, meta = {})",
          "summary": "Store a fact"
        },
        {
          "name": "getFact",
          "kind": "function",
          "signature": "getFact(memory, key)",
          "summary": "Retrieve a fact"
        },
        {
          "name": "storeRelationship",
          "kind": "function",
          "signature": "storeRelationship(memory, subject, predicate, object, confidence = 1.0)",
          "summary": "Store a relationship between entities"
        },
        {
          "name": "queryRelationships",
          "kind": "function",
          "signature": "queryRelationships(memory, query)",
          "summary": "Query relationships"
        },
        {
          "name": "storeBelief",
          "kind": "function",
          "signature": "storeBelief(memory, topic, belief, confidence = 0.5)",
          "summary": "Store a belief"
        },
        {
          "name": "challengeBelief",
          "kind": "function",
          "signature": "challengeBelief(memory, topic, evidenceStrength = 0.1)",
          "summary": "Challenge a belief (potentially weakens it)"
        },
        {
          "name": "createProceduralMemory",
          "kind": "function",
          "signature": "createProceduralMemory()",
          "summary": "Create procedural memory (skills and habits)"
        },
        {
          "name": "practiceSkill",
          "kind": "function",
          "signature": "practiceSkill(memory, skill, success = true)",
          "summary": "Record skill practice"
        },
        {
          "name": "getSkillProficiency",
          "kind": "function",
          "signature": "getSkillProficiency(memory, skill)",
          "summary": "Get skill proficiency"
        },
        {
          "name": "formHabit",
          "kind": "function",
          "signature": "formHabit(memory, trigger, action, initialStrength = 0.3)",
          "summary": "Form a habit"
        },
        {
          "name": "getHabitualResponse",
          "kind": "function",
          "signature": "getHabitualResponse(memory, trigger)",
          "summary": "Get habitual response to trigger"
        },
        {
          "name": "createMemorySystem",
          "kind": "function",
          "signature": "createMemorySystem(config = {})",
          "summary": "Create complete NPC memory system"
        },
        {
          "name": "consolidateMemories",
          "kind": "function",
          "signature": "consolidateMemories(memSystem)",
          "summary": "Consolidate memories (transfer from working to long-term)"
        },
        {
          "name": "getEntityImpression",
          "kind": "function",
          "signature": "getEntityImpression(memSystem, entityId)",
          "summary": "Get overall impression of an entity"
        },
        {
          "name": "MEMORY_TYPE",
          "kind": "constant",
          "signature": "MEMORY_TYPE",
          "summary": "Memory types"
        },
        {
          "name": "IMPORTANCE",
          "kind": "constant",
          "signature": "IMPORTANCE",
          "summary": "Event importance levels"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIMorale",
      "path": "engine/reference/sim/ai/AIMorale.md",
      "source": "engine/sim/ai/AIMorale.js",
      "import": "/engine/sim/ai/AIMorale.js",
      "sourceHash": "ea3637bd2d5be51886b0b34bf95a71eee11c54fbf5d70c465a2b2790772c643c",
      "summary": "Create morale state for an NPC",
      "exports": [
        {
          "name": "createMoraleState",
          "kind": "function",
          "signature": "createMoraleState(params = {})",
          "summary": "Create morale state for an NPC"
        },
        {
          "name": "changeMorale",
          "kind": "function",
          "signature": "changeMorale(state, delta)",
          "summary": "Apply morale change"
        },
        {
          "name": "applySuppression",
          "kind": "function",
          "signature": "applySuppression(state, amount)",
          "summary": "Apply suppression"
        },
        {
          "name": "processDamageMorale",
          "kind": "function",
          "signature": "processDamageMorale(state, damage, fromBehind = false)",
          "summary": "Process taking damage"
        },
        {
          "name": "processAllyDeath",
          "kind": "function",
          "signature": "processAllyDeath(state, wasLeader = false)",
          "summary": "Process ally death"
        },
        {
          "name": "processEnemyDeath",
          "kind": "function",
          "signature": "processEnemyDeath(state, wasLeader = false)",
          "summary": "Process enemy death"
        },
        {
          "name": "rally",
          "kind": "function",
          "signature": "rally(state)",
          "summary": "Rally (leader ability)"
        },
        {
          "name": "updateMorale",
          "kind": "function",
          "signature": "updateMorale(state, deltaTimeSec, inCombat, inCover)",
          "summary": "Update morale over time (recovery, suppression decay)"
        },
        {
          "name": "updateMoraleContext",
          "kind": "function",
          "signature": "updateMoraleContext(state, alliesNearby, enemiesVisible, leaderNearby)",
          "summary": "Update context (allies, enemies, leader)"
        },
        {
          "name": "getMoraleAccuracyMod",
          "kind": "function",
          "signature": "getMoraleAccuracyMod(state)",
          "summary": "Get accuracy modifier based on morale"
        },
        {
          "name": "getMoraleSpeedMod",
          "kind": "function",
          "signature": "getMoraleSpeedMod(state)",
          "summary": "Get movement speed modifier based on morale"
        },
        {
          "name": "getMoraleReactionMod",
          "kind": "function",
          "signature": "getMoraleReactionMod(state)",
          "summary": "Get reaction time modifier based on morale"
        },
        {
          "name": "shouldFlee",
          "kind": "function",
          "signature": "shouldFlee(state)",
          "summary": "Check if NPC should flee"
        },
        {
          "name": "shouldSurrender",
          "kind": "function",
          "signature": "shouldSurrender(state, canEscape = true)",
          "summary": "Check if NPC should surrender"
        },
        {
          "name": "shouldSeekCover",
          "kind": "function",
          "signature": "shouldSeekCover(state, currentlyInCover)",
          "summary": "Check if NPC should take cover"
        },
        {
          "name": "shouldBeAggressive",
          "kind": "function",
          "signature": "shouldBeAggressive(state)",
          "summary": "Check if NPC should be aggressive (charge, flank)"
        },
        {
          "name": "moraleCheck",
          "kind": "function",
          "signature": "moraleCheck(state, difficulty)",
          "summary": "Roll morale check for risky action"
        },
        {
          "name": "getGroupMorale",
          "kind": "function",
          "signature": "getGroupMorale(moraleStates)",
          "summary": "Calculate group morale average"
        },
        {
          "name": "isGroupRouting",
          "kind": "function",
          "signature": "isGroupRouting(moraleStates)",
          "summary": "Check if group is routing (majority broken)"
        },
        {
          "name": "groupRally",
          "kind": "function",
          "signature": "groupRally(moraleStates)",
          "summary": "Apply group rally (leader ability affecting all nearby)"
        },
        {
          "name": "MORALE_STATE",
          "kind": "constant",
          "signature": "MORALE_STATE",
          "summary": "Morale states"
        },
        {
          "name": "DEFAULT_MORALE_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_MORALE_PARAMS",
          "summary": "Default morale parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIPerception",
      "path": "engine/reference/sim/ai/AIPerception.md",
      "source": "engine/sim/ai/AIPerception.js",
      "import": "/engine/sim/ai/AIPerception.js",
      "sourceHash": "13537f469d28780d89e5c29c2e8021e0e56236b163a72e7c58b8196e6709ea68",
      "summary": "Create perception state for an NPC",
      "exports": [
        {
          "name": "createPerceptionState",
          "kind": "function",
          "signature": "createPerceptionState(params = {})",
          "summary": "Create perception state for an NPC"
        },
        {
          "name": "checkVision",
          "kind": "function",
          "signature": "checkVision(perception, npcPos, npcFacing, targetPos, obstacles)",
          "summary": "Check if target is in vision cone"
        },
        {
          "name": "calculateDetectionRate",
          "kind": "function",
          "signature": "calculateDetectionRate(visionResult, perception, options = {})",
          "summary": "Calculate detection rate based on visibility conditions"
        },
        {
          "name": "createNoiseEvent",
          "kind": "function",
          "signature": "createNoiseEvent(position, loudness, type, sourceId = null)",
          "summary": "Create a noise event"
        },
        {
          "name": "checkHearing",
          "kind": "function",
          "signature": "checkHearing(perception, npcPos, noise)",
          "summary": "Check if NPC can hear a noise event"
        },
        {
          "name": "processVisualDetection",
          "kind": "function",
          "signature": "processVisualDetection(perception, npcPos, npcFacing, target, obstacles, deltaTimeSec, options = {})",
          "summary": "Process visual detection of a target"
        },
        {
          "name": "processNoiseEvent",
          "kind": "function",
          "signature": "processNoiseEvent(perception, npcPos, noise)",
          "summary": "Process a noise event"
        },
        {
          "name": "processDamage",
          "kind": "function",
          "signature": "processDamage(perception, damageDirection = null, attackerId = null)",
          "summary": "Process taking damage"
        },
        {
          "name": "shareTeamInfo",
          "kind": "function",
          "signature": "shareTeamInfo(perception, targetId, targetPos)",
          "summary": "Share threat info from teammate"
        },
        {
          "name": "getLastKnownPosition",
          "kind": "function",
          "signature": "getLastKnownPosition(perception, entityId)",
          "summary": "Get last known position of an entity"
        },
        {
          "name": "getMostThreateningEntity",
          "kind": "function",
          "signature": "getMostThreateningEntity(perception)",
          "summary": "Get the most threatening known entity"
        },
        {
          "name": "decayAwareness",
          "kind": "function",
          "signature": "decayAwareness(perception, deltaTimeSec, canSeeThreats)",
          "summary": "Decay awareness over time"
        },
        {
          "name": "checkInvestigationComplete",
          "kind": "function",
          "signature": "checkInvestigationComplete(perception, npcPos, arrivalRadius = 2)",
          "summary": "Check if investigation is complete"
        },
        {
          "name": "updatePerception",
          "kind": "function",
          "signature": "updatePerception(perception, npcPos, npcFacing, targets, noiseEvents, obstacles, deltaTimeSec)",
          "summary": "Full perception update tick"
        },
        {
          "name": "AWARENESS_STATE",
          "kind": "constant",
          "signature": "AWARENESS_STATE",
          "summary": "Awareness states"
        },
        {
          "name": "SENSE_TYPE",
          "kind": "constant",
          "signature": "SENSE_TYPE",
          "summary": "Sense types"
        },
        {
          "name": "DEFAULT_PERCEPTION_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_PERCEPTION_PARAMS",
          "summary": "Default perception parameters - from AISchema"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIPersonality",
      "path": "engine/reference/sim/ai/AIPersonality.md",
      "source": "engine/sim/ai/AIPersonality.js",
      "import": "/engine/sim/ai/AIPersonality.js",
      "sourceHash": "088c67d33c1d0f8e048fe25277fdae93b552dbdd7370085ddd4e411e2dc9f2f2",
      "summary": "Create personality profile",
      "exports": [
        {
          "name": "createPersonality",
          "kind": "function",
          "signature": "createPersonality(traits = {})",
          "summary": "Create personality profile"
        },
        {
          "name": "createPersonalityFromArchetype",
          "kind": "function",
          "signature": "createPersonalityFromArchetype(archetype)",
          "summary": "Create personality from archetype"
        },
        {
          "name": "getPersonalityBehaviorMod",
          "kind": "function",
          "signature": "getPersonalityBehaviorMod(personality, behavior)",
          "summary": "Get personality-based behavior modifier"
        },
        {
          "name": "createEmotionalState",
          "kind": "function",
          "signature": "createEmotionalState()",
          "summary": "Create emotional state"
        },
        {
          "name": "applyEmotionalStimulus",
          "kind": "function",
          "signature": "applyEmotionalStimulus(state, emotion, intensity, personality = null)",
          "summary": "Apply emotional stimulus"
        },
        {
          "name": "decayEmotions",
          "kind": "function",
          "signature": "decayEmotions(state, deltaTimeSec, decayRate = 0.1)",
          "summary": "Decay emotions over time"
        },
        {
          "name": "hasComplexEmotion",
          "kind": "function",
          "signature": "hasComplexEmotion(state, complexEmotion, threshold = 0.3)",
          "summary": "Check for complex emotion"
        },
        {
          "name": "createRelationshipTracker",
          "kind": "function",
          "signature": "createRelationshipTracker()",
          "summary": "Create relationship tracker"
        },
        {
          "name": "getRelationship",
          "kind": "function",
          "signature": "getRelationship(tracker, entityId)",
          "summary": "Create or get relationship with entity"
        },
        {
          "name": "recordInteraction",
          "kind": "function",
          "signature": "recordInteraction(tracker, entityId, interactionType, valence, intensity = 0.5)",
          "summary": "Record interaction with entity"
        },
        {
          "name": "getDisposition",
          "kind": "function",
          "signature": "getDisposition(tracker, entityId)",
          "summary": "Get disposition toward entity"
        },
        {
          "name": "willHelp",
          "kind": "function",
          "signature": "willHelp(tracker, entityId, personality = null)",
          "summary": "Will entity help another"
        },
        {
          "name": "createCharacterState",
          "kind": "function",
          "signature": "createCharacterState(config = {})",
          "summary": "Create complete character psychological state"
        },
        {
          "name": "updateCharacterState",
          "kind": "function",
          "signature": "updateCharacterState(state, deltaTimeSec)",
          "summary": "Update character state"
        },
        {
          "name": "TRAIT",
          "kind": "constant",
          "signature": "TRAIT",
          "summary": "Personality trait ranges: -1 to 1"
        },
        {
          "name": "EMOTION",
          "kind": "constant",
          "signature": "EMOTION",
          "summary": "Primary emotions"
        },
        {
          "name": "COMPLEX_EMOTION",
          "kind": "constant",
          "signature": "COMPLEX_EMOTION",
          "summary": "Emotion combinations"
        },
        {
          "name": "RELATIONSHIP_TYPE",
          "kind": "constant",
          "signature": "RELATIONSHIP_TYPE",
          "summary": "Relationship types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIQuest",
      "path": "engine/reference/sim/ai/AIQuest.md",
      "source": "engine/sim/ai/AIQuest.js",
      "import": "/engine/sim/ai/AIQuest.js",
      "sourceHash": "edd2f332c3f46f7a4513205cac34fd055939861340e9b24581f7593fdf73bfb8",
      "summary": "Create quest objective",
      "exports": [
        {
          "name": "createObjective",
          "kind": "function",
          "signature": "createObjective(config)",
          "summary": "Create quest objective"
        },
        {
          "name": "updateObjectiveProgress",
          "kind": "function",
          "signature": "updateObjectiveProgress(objective, amount = 1)",
          "summary": "Update objective progress"
        },
        {
          "name": "createQuest",
          "kind": "function",
          "signature": "createQuest(config)",
          "summary": "Create quest"
        },
        {
          "name": "canAcceptQuest",
          "kind": "function",
          "signature": "canAcceptQuest(quest, playerState)",
          "summary": "Check if quest can be accepted"
        },
        {
          "name": "acceptQuest",
          "kind": "function",
          "signature": "acceptQuest(quest)",
          "summary": "Accept quest"
        },
        {
          "name": "checkQuestComplete",
          "kind": "function",
          "signature": "checkQuestComplete(quest)",
          "summary": "Check quest completion"
        },
        {
          "name": "turnInQuest",
          "kind": "function",
          "signature": "turnInQuest(quest)",
          "summary": "Turn in quest and get rewards"
        },
        {
          "name": "failQuest",
          "kind": "function",
          "signature": "failQuest(quest, reason = \"unknown\")",
          "summary": "Fail quest"
        },
        {
          "name": "createQuestManager",
          "kind": "function",
          "signature": "createQuestManager()",
          "summary": "Create quest manager"
        },
        {
          "name": "registerQuest",
          "kind": "function",
          "signature": "registerQuest(manager, quest)",
          "summary": "Register quest"
        },
        {
          "name": "updateAvailableQuests",
          "kind": "function",
          "signature": "updateAvailableQuests(manager, playerState)",
          "summary": "Update available quests based on player state"
        },
        {
          "name": "reportQuestEvent",
          "kind": "function",
          "signature": "reportQuestEvent(manager, eventType, eventData)",
          "summary": "Report event for quest objectives"
        },
        {
          "name": "generateQuest",
          "kind": "function",
          "signature": "generateQuest(templateId, params, context = {})",
          "summary": "Generate procedural quest"
        },
        {
          "name": "generateDailyQuests",
          "kind": "function",
          "signature": "generateDailyQuests(context, count = 3)",
          "summary": "Generate daily quests"
        },
        {
          "name": "QUEST_TYPE",
          "kind": "constant",
          "signature": "QUEST_TYPE",
          "summary": "Quest types"
        },
        {
          "name": "QUEST_STATUS",
          "kind": "constant",
          "signature": "QUEST_STATUS",
          "summary": "Quest status"
        },
        {
          "name": "QUEST_PRIORITY",
          "kind": "constant",
          "signature": "QUEST_PRIORITY",
          "summary": "Quest priority"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIRandom",
      "path": "engine/reference/sim/ai/AIRandom.md",
      "source": "engine/sim/ai/AIRandom.js",
      "import": "/engine/sim/ai/AIRandom.js",
      "sourceHash": "2050852dd1e9ce7da989d3d3a11adaf85031e1c084030beb7d577b142b092772",
      "summary": "Set the global AI RNG context. Call this at the start of each game tick.",
      "exports": [
        {
          "name": "setAIRngContext",
          "kind": "function",
          "signature": "setAIRngContext(worldSeed, tick)",
          "summary": "Set the global AI RNG context. Call this at the start of each game tick."
        },
        {
          "name": "getEntityRngState",
          "kind": "function",
          "signature": "getEntityRngState(entityId)",
          "summary": "Get RNG state for a specific entity (deterministic per entity+tick)"
        },
        {
          "name": "getPositionRngState",
          "kind": "function",
          "signature": "getPositionRngState(x, y, z)",
          "summary": "Get RNG state for a position (terrain, spawns, etc.)"
        },
        {
          "name": "getInteractionRngState",
          "kind": "function",
          "signature": "getInteractionRngState(entityA, entityB)",
          "summary": "Get RNG state for interaction between two entities"
        },
        {
          "name": "createEntityRng",
          "kind": "function",
          "signature": "createEntityRng(entityId)",
          "summary": "Create RNG stream for a specific entity Use when you need multiple random values for one entity in the same tick"
        },
        {
          "name": "createPositionRng",
          "kind": "function",
          "signature": "createPositionRng(x, y, z)",
          "summary": "Create RNG stream for a world position"
        },
        {
          "name": "aiRng",
          "kind": "constant",
          "signature": "aiRng",
          "summary": ""
        },
        {
          "name": "pcgHash",
          "kind": "re-export",
          "signature": "pcgHash",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIRaycastGPU",
      "path": "engine/reference/sim/ai/AIRaycastGPU.md",
      "source": "engine/sim/ai/AIRaycastGPU.js",
      "import": "/engine/sim/ai/AIRaycastGPU.js",
      "sourceHash": "134499f4372845b82940ab0dceab4c3f4b003caf04dcfb2610b2a9452c1a27da",
      "summary": "Create a GPU raycast system",
      "exports": [
        {
          "name": "createGPURaycastSystem",
          "kind": "function",
          "signature": "async createGPURaycastSystem(device, options = {})",
          "summary": "Create a GPU raycast system"
        },
        {
          "name": "uploadRays",
          "kind": "function",
          "signature": "uploadRays(system, rays)",
          "summary": "Upload ray data to GPU"
        },
        {
          "name": "uploadAABBTargets",
          "kind": "function",
          "signature": "uploadAABBTargets(system, targets)",
          "summary": "Upload AABB targets to GPU"
        },
        {
          "name": "uploadSphereTargets",
          "kind": "function",
          "signature": "uploadSphereTargets(system, targets)",
          "summary": "Upload sphere targets to GPU"
        },
        {
          "name": "dispatchAABBRaycast",
          "kind": "function",
          "signature": "dispatchAABBRaycast(system, encoder)",
          "summary": "Dispatch GPU raycast against AABBs"
        },
        {
          "name": "dispatchSphereRaycast",
          "kind": "function",
          "signature": "dispatchSphereRaycast(system, encoder)",
          "summary": "Dispatch GPU raycast against spheres"
        },
        {
          "name": "copyResultsToReadback",
          "kind": "function",
          "signature": "copyResultsToReadback(system, encoder)",
          "summary": "Copy results to readback buffer"
        },
        {
          "name": "readbackResults",
          "kind": "function",
          "signature": "async readbackResults(system)",
          "summary": "Read back results from GPU (async)"
        },
        {
          "name": "batchRaycast",
          "kind": "function",
          "signature": "async batchRaycast(system, rays, targets, targetType = \"sphere\")",
          "summary": "Full batch raycast operation"
        },
        {
          "name": "destroyGPURaycastSystem",
          "kind": "function",
          "signature": "destroyGPURaycastSystem(system)",
          "summary": "Destroy GPU raycast system and free resources"
        },
        {
          "name": "shouldUseGPURaycast",
          "kind": "function",
          "signature": "shouldUseGPURaycast(rayCount, threshold = 500)",
          "summary": "Determine if GPU raycast should be used based on ray count"
        },
        {
          "name": "benchmarkRaycast",
          "kind": "function",
          "signature": "async benchmarkRaycast(system, rayCount = 1000, targetCount = 100)",
          "summary": "Benchmark CPU vs GPU raycast for calibration"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIScheduler",
      "path": "engine/reference/sim/ai/AIScheduler.md",
      "source": "engine/sim/ai/AIScheduler.js",
      "import": "/engine/sim/ai/AIScheduler.js",
      "sourceHash": "3b6ffe38bc7cf95c623fc68517773e0db1be1fa9201df3346e31097cd58e9eeb",
      "summary": "Create needs state",
      "exports": [
        {
          "name": "createNeedsState",
          "kind": "function",
          "signature": "createNeedsState(initial = {})",
          "summary": "Create needs state"
        },
        {
          "name": "updateNeeds",
          "kind": "function",
          "signature": "updateNeeds(needs, gameHours)",
          "summary": "Update needs over time"
        },
        {
          "name": "satisfyNeed",
          "kind": "function",
          "signature": "satisfyNeed(needs, need, amount)",
          "summary": "Satisfy a need"
        },
        {
          "name": "getMostUrgentNeed",
          "kind": "function",
          "signature": "getMostUrgentNeed(needs)",
          "summary": "Get most urgent need"
        },
        {
          "name": "getCriticalNeeds",
          "kind": "function",
          "signature": "getCriticalNeeds(needs)",
          "summary": "Get all critical needs"
        },
        {
          "name": "calculateWellbeing",
          "kind": "function",
          "signature": "calculateWellbeing(needs)",
          "summary": "Calculate overall wellbeing"
        },
        {
          "name": "createActivity",
          "kind": "function",
          "signature": "createActivity(config)",
          "summary": "Create an activity definition"
        },
        {
          "name": "scoreActivity",
          "kind": "function",
          "signature": "scoreActivity(activity, needs, gameHour = 12)",
          "summary": "Score an activity based on needs"
        },
        {
          "name": "selectActivity",
          "kind": "function",
          "signature": "selectActivity(activities, needs, gameHour = 12)",
          "summary": "Select best activity from options"
        },
        {
          "name": "createSchedule",
          "kind": "function",
          "signature": "createSchedule()",
          "summary": "Create a daily schedule"
        },
        {
          "name": "addScheduleEntry",
          "kind": "function",
          "signature": "addScheduleEntry(schedule, hour, activityId, priority = 1, days = null)",
          "summary": "Add scheduled entry"
        },
        {
          "name": "getScheduledActivity",
          "kind": "function",
          "signature": "getScheduledActivity(schedule, gameHour, dayOfWeek = 0)",
          "summary": "Get scheduled activity for time"
        },
        {
          "name": "createJob",
          "kind": "function",
          "signature": "createJob(config)",
          "summary": "Create job definition"
        },
        {
          "name": "isWorkTime",
          "kind": "function",
          "signature": "isWorkTime(job, gameHour, dayOfWeek)",
          "summary": "Check if currently work hours"
        },
        {
          "name": "createNPCScheduler",
          "kind": "function",
          "signature": "createNPCScheduler(config = {})",
          "summary": "Create NPC scheduler"
        },
        {
          "name": "updateScheduler",
          "kind": "function",
          "signature": "updateScheduler(scheduler, gameHour, dayOfWeek, deltaGameHours)",
          "summary": "Update NPC scheduler"
        },
        {
          "name": "NEED",
          "kind": "constant",
          "signature": "NEED",
          "summary": "Basic need types"
        },
        {
          "name": "URGENCY",
          "kind": "constant",
          "signature": "URGENCY",
          "summary": "Need urgency thresholds"
        },
        {
          "name": "JOB_TYPE",
          "kind": "constant",
          "signature": "JOB_TYPE",
          "summary": "Job types"
        },
        {
          "name": "PRESET_ACTIVITIES",
          "kind": "constant",
          "signature": "PRESET_ACTIVITIES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AISchema",
      "path": "engine/reference/sim/ai/AISchema.md",
      "source": "engine/sim/ai/AISchema.js",
      "import": "/engine/sim/ai/AISchema.js",
      "sourceHash": "07535f43fb70f2be387bf96fa343e3418cdf50be9ea51b2eba78f0f8e2b2ddaa",
      "summary": "Get node type ID from name",
      "exports": [
        {
          "name": "getNodeTypeId",
          "kind": "function",
          "signature": "getNodeTypeId(typeName)",
          "summary": "Get node type ID from name"
        },
        {
          "name": "getAwarenessStateId",
          "kind": "function",
          "signature": "getAwarenessStateId(stateName)",
          "summary": "Get awareness state ID from name"
        },
        {
          "name": "getAwarenessStateName",
          "kind": "function",
          "signature": "getAwarenessStateName(stateId)",
          "summary": "Get awareness state name from ID"
        },
        {
          "name": "getReputationLevel",
          "kind": "function",
          "signature": "getReputationLevel(value)",
          "summary": "Get reputation level from value"
        },
        {
          "name": "validatePerception",
          "kind": "function",
          "signature": "validatePerception(config)",
          "summary": "Validate perception parameters"
        },
        {
          "name": "validateSteeringAgent",
          "kind": "function",
          "signature": "validateSteeringAgent(config)",
          "summary": "Validate steering agent config"
        },
        {
          "name": "validatePersonality",
          "kind": "function",
          "signature": "validatePersonality(config)",
          "summary": "Validate personality"
        },
        {
          "name": "createDefaultPerception",
          "kind": "function",
          "signature": "createDefaultPerception()",
          "summary": "Create default perception config"
        },
        {
          "name": "createDefaultSteeringAgent",
          "kind": "function",
          "signature": "createDefaultSteeringAgent()",
          "summary": "Create default steering agent"
        },
        {
          "name": "createDefaultPersonality",
          "kind": "function",
          "signature": "createDefaultPersonality()",
          "summary": "Create default personality"
        },
        {
          "name": "createDefaultFaction",
          "kind": "function",
          "signature": "createDefaultFaction(id, name)",
          "summary": "Create default faction"
        },
        {
          "name": "NODE_STATUS",
          "kind": "constant",
          "signature": "NODE_STATUS",
          "summary": "Behavior tree node status"
        },
        {
          "name": "NODE_TYPES",
          "kind": "constant",
          "signature": "NODE_TYPES",
          "summary": "Behavior tree node types"
        },
        {
          "name": "AWARENESS_STATES",
          "kind": "constant",
          "signature": "AWARENESS_STATES",
          "summary": "NPC awareness states"
        },
        {
          "name": "SENSE_TYPES",
          "kind": "constant",
          "signature": "SENSE_TYPES",
          "summary": "Sense types for perception"
        },
        {
          "name": "PERCEPTION_SCHEMA",
          "kind": "constant",
          "signature": "PERCEPTION_SCHEMA",
          "summary": "Perception parameters schema"
        },
        {
          "name": "STEERING_BEHAVIORS",
          "kind": "constant",
          "signature": "STEERING_BEHAVIORS",
          "summary": "Steering behavior types"
        },
        {
          "name": "STEERING_AGENT_SCHEMA",
          "kind": "constant",
          "signature": "STEERING_AGENT_SCHEMA",
          "summary": "Steering agent schema"
        },
        {
          "name": "DIPLOMATIC_STANCES",
          "kind": "constant",
          "signature": "DIPLOMATIC_STANCES",
          "summary": "Diplomatic stances"
        },
        {
          "name": "REPUTATION_LEVELS",
          "kind": "constant",
          "signature": "REPUTATION_LEVELS",
          "summary": "Reputation levels"
        },
        {
          "name": "FACTION_SCHEMA",
          "kind": "constant",
          "signature": "FACTION_SCHEMA",
          "summary": "Faction schema"
        },
        {
          "name": "PERSONALITY_TRAITS",
          "kind": "constant",
          "signature": "PERSONALITY_TRAITS",
          "summary": "Personality traits (Big Five + custom)"
        },
        {
          "name": "PERSONALITY_SCHEMA",
          "kind": "constant",
          "signature": "PERSONALITY_SCHEMA",
          "summary": "Personality schema"
        },
        {
          "name": "NPC_AI_SCHEMA",
          "kind": "constant",
          "signature": "NPC_AI_SCHEMA",
          "summary": "Complete NPC AI schema"
        },
        {
          "name": "PERSONALITY_PRESETS",
          "kind": "constant",
          "signature": "PERSONALITY_PRESETS",
          "summary": "Create preset personality"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AISenses",
      "path": "engine/reference/sim/ai/AISenses.md",
      "source": "engine/sim/ai/AISenses.js",
      "import": "/engine/sim/ai/AISenses.js",
      "sourceHash": "b81abdf74771cb9ee370b7bd178850baa44c91703e637eda33bacb157f676edb",
      "summary": "Create scent particle",
      "exports": [
        {
          "name": "createScentParticle",
          "kind": "function",
          "signature": "createScentParticle(config)",
          "summary": "Create scent particle"
        },
        {
          "name": "createScentTrail",
          "kind": "function",
          "signature": "createScentTrail(sourceId, type)",
          "summary": "Create scent trail (series of particles)"
        },
        {
          "name": "addTrailParticle",
          "kind": "function",
          "signature": "addTrailParticle(trail, position, intensity = 1.0)",
          "summary": "Add particle to trail"
        },
        {
          "name": "createScentSystem",
          "kind": "function",
          "signature": "createScentSystem()",
          "summary": "Create scent system"
        },
        {
          "name": "updateScentSystem",
          "kind": "function",
          "signature": "updateScentSystem(system, deltaTime)",
          "summary": "Update scent system"
        },
        {
          "name": "smellAt",
          "kind": "function",
          "signature": "smellAt(system, position, range, sensitivity = 1.0)",
          "summary": "Smell at position"
        },
        {
          "name": "followScentTrail",
          "kind": "function",
          "signature": "followScentTrail(system, position, targetSourceId, range)",
          "summary": "Follow scent trail"
        },
        {
          "name": "createVibration",
          "kind": "function",
          "signature": "createVibration(config)",
          "summary": "Create vibration event"
        },
        {
          "name": "createTremorSense",
          "kind": "function",
          "signature": "createTremorSense()",
          "summary": "Create tremor sense system"
        },
        {
          "name": "emitVibration",
          "kind": "function",
          "signature": "emitVibration(system, vibration)",
          "summary": "Emit vibration"
        },
        {
          "name": "senseVibrations",
          "kind": "function",
          "signature": "senseVibrations(system, position, sensitivity = 1.0)",
          "summary": "Sense vibrations at position"
        },
        {
          "name": "createDangerSense",
          "kind": "function",
          "signature": "createDangerSense()",
          "summary": "Create danger sense system"
        },
        {
          "name": "registerThreat",
          "kind": "function",
          "signature": "registerThreat(system, threatId, position, dangerLevel, type = \"unknown\")",
          "summary": "Register threat"
        },
        {
          "name": "removeThreat",
          "kind": "function",
          "signature": "removeThreat(system, threatId)",
          "summary": "Remove threat"
        },
        {
          "name": "senseDanger",
          "kind": "function",
          "signature": "senseDanger(system, position, range, sensitivity = 1.0)",
          "summary": "Sense danger level at position"
        },
        {
          "name": "createEnvironmentSensor",
          "kind": "function",
          "signature": "createEnvironmentSensor()",
          "summary": "Create environmental sensor"
        },
        {
          "name": "updateEnvironmentReadings",
          "kind": "function",
          "signature": "updateEnvironmentReadings(sensor, readings)",
          "summary": "Update environment readings"
        },
        {
          "name": "getEnvironmentalComfort",
          "kind": "function",
          "signature": "getEnvironmentalComfort(sensor)",
          "summary": "Get environmental comfort level"
        },
        {
          "name": "detectEnvironmentTrend",
          "kind": "function",
          "signature": "detectEnvironmentTrend(sensor, property)",
          "summary": "Detect environmental trend"
        },
        {
          "name": "SCENT_TYPE",
          "kind": "constant",
          "signature": "SCENT_TYPE",
          "summary": "Scent types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AISmartObjects",
      "path": "engine/reference/sim/ai/AISmartObjects.md",
      "source": "engine/sim/ai/AISmartObjects.js",
      "import": "/engine/sim/ai/AISmartObjects.js",
      "sourceHash": "bc96fadae73232ba60b86b85e1e8cc8c5b6820a4356b29934bea016039eb914b",
      "summary": "Create a smart object",
      "exports": [
        {
          "name": "createSmartObject",
          "kind": "function",
          "signature": "createSmartObject(config)",
          "summary": "Create a smart object"
        },
        {
          "name": "getSlotWorldPosition",
          "kind": "function",
          "signature": "getSlotWorldPosition(smartObject, slotIndex = 0)",
          "summary": "Get world position of an interaction slot"
        },
        {
          "name": "findAvailableSlot",
          "kind": "function",
          "signature": "findAvailableSlot(smartObject)",
          "summary": "Find available slot for interaction"
        },
        {
          "name": "reserveSlot",
          "kind": "function",
          "signature": "reserveSlot(smartObject, slotIndex, npcId)",
          "summary": "Reserve a slot for an NPC"
        },
        {
          "name": "releaseSlot",
          "kind": "function",
          "signature": "releaseSlot(smartObject, slotIndex)",
          "summary": "Release a slot"
        },
        {
          "name": "checkPrerequisites",
          "kind": "function",
          "signature": "checkPrerequisites(smartObject, npcState)",
          "summary": "Check if NPC meets prerequisites for interaction"
        },
        {
          "name": "createInteraction",
          "kind": "function",
          "signature": "createInteraction(smartObject, npcId, slotIndex)",
          "summary": "Create an interaction session"
        },
        {
          "name": "updateInteraction",
          "kind": "function",
          "signature": "updateInteraction(interaction, npcPos, npcFacing, now)",
          "summary": "Update interaction state"
        },
        {
          "name": "completeInteraction",
          "kind": "function",
          "signature": "completeInteraction(smartObject, interaction, npcState)",
          "summary": "Complete interaction and apply effects"
        },
        {
          "name": "createSmartObjectRegistry",
          "kind": "function",
          "signature": "createSmartObjectRegistry()",
          "summary": "Create a smart object registry"
        },
        {
          "name": "registerSmartObject",
          "kind": "function",
          "signature": "registerSmartObject(registry, smartObject)",
          "summary": "Register a smart object"
        },
        {
          "name": "findByCategory",
          "kind": "function",
          "signature": "findByCategory(registry, category)",
          "summary": "Find smart objects by category"
        },
        {
          "name": "findByTag",
          "kind": "function",
          "signature": "findByTag(registry, tag)",
          "summary": "Find smart objects by tag"
        },
        {
          "name": "findNearestUsable",
          "kind": "function",
          "signature": "findNearestUsable(registry, position, npcState, filters = {})",
          "summary": "Find nearest usable smart object"
        },
        {
          "name": "createHealthStation",
          "kind": "function",
          "signature": "createHealthStation(id, position, healAmount = 50)",
          "summary": "Create a health station smart object"
        },
        {
          "name": "createAmmoCrate",
          "kind": "function",
          "signature": "createAmmoCrate(id, position, ammoAmount = 30)",
          "summary": "Create an ammo crate smart object"
        },
        {
          "name": "createDoor",
          "kind": "function",
          "signature": "createDoor(id, position, rotation = 0)",
          "summary": "Create a door smart object"
        },
        {
          "name": "OBJECT_CATEGORY",
          "kind": "constant",
          "signature": "OBJECT_CATEGORY",
          "summary": "Smart object categories"
        },
        {
          "name": "INTERACTION_STATE",
          "kind": "constant",
          "signature": "INTERACTION_STATE",
          "summary": "Interaction states"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AISound",
      "path": "engine/reference/sim/ai/AISound.md",
      "source": "engine/sim/ai/AISound.js",
      "import": "/engine/sim/ai/AISound.js",
      "sourceHash": "d39b20cacac1289018b899f8f9c3e7f463eac7a8ec0898cc8950598873d47ad6",
      "summary": "Create a sound event",
      "exports": [
        {
          "name": "createSoundEvent",
          "kind": "function",
          "signature": "createSoundEvent(config)",
          "summary": "Create a sound event"
        },
        {
          "name": "createSoundSystem",
          "kind": "function",
          "signature": "createSoundSystem(config = {})",
          "summary": "Create sound propagation system"
        },
        {
          "name": "registerListener",
          "kind": "function",
          "signature": "registerListener(system, entityId, config = {})",
          "summary": "Register listener (AI agent that can hear)"
        },
        {
          "name": "updateListenerPosition",
          "kind": "function",
          "signature": "updateListenerPosition(system, entityId, position)",
          "summary": "Update listener position"
        },
        {
          "name": "addSoundOccluder",
          "kind": "function",
          "signature": "addSoundOccluder(system, wall)",
          "summary": "Add wall/occluder"
        },
        {
          "name": "emitSound",
          "kind": "function",
          "signature": "emitSound(system, soundConfig)",
          "summary": "Emit sound"
        },
        {
          "name": "calculateSoundIntensity",
          "kind": "function",
          "signature": "calculateSoundIntensity(sound, position, walls)",
          "summary": "Calculate sound intensity at position"
        },
        {
          "name": "updateSoundSystem",
          "kind": "function",
          "signature": "updateSoundSystem(system, deltaTime)",
          "summary": "Update sound propagation and detection"
        },
        {
          "name": "getRecentDetections",
          "kind": "function",
          "signature": "getRecentDetections(system, entityId, maxAge = 5000)",
          "summary": "Get recent detections for entity"
        },
        {
          "name": "getHighestPriorityDetection",
          "kind": "function",
          "signature": "getHighestPriorityDetection(system, entityId)",
          "summary": "Get highest priority unhandled detection"
        },
        {
          "name": "emitFootstep",
          "kind": "function",
          "signature": "emitFootstep(system, position, surface = SURFACE_TYPE.CONCRETE, running = false)",
          "summary": "Emit footstep sound"
        },
        {
          "name": "emitGunshot",
          "kind": "function",
          "signature": "emitGunshot(system, position, weaponType = \"pistol\")",
          "summary": "Emit gunshot sound"
        },
        {
          "name": "emitExplosion",
          "kind": "function",
          "signature": "emitExplosion(system, position, size = 1.0)",
          "summary": "Emit explosion sound"
        },
        {
          "name": "SOUND_CATEGORY",
          "kind": "constant",
          "signature": "SOUND_CATEGORY",
          "summary": "Sound categories"
        },
        {
          "name": "SURFACE_TYPE",
          "kind": "constant",
          "signature": "SURFACE_TYPE",
          "summary": "Surface types for acoustic properties"
        },
        {
          "name": "SOUND_PRIORITY",
          "kind": "constant",
          "signature": "SOUND_PRIORITY",
          "summary": "Sound priority for AI attention"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AISquad",
      "path": "engine/reference/sim/ai/AISquad.md",
      "source": "engine/sim/ai/AISquad.js",
      "import": "/engine/sim/ai/AISquad.js",
      "sourceHash": "97b073e58e921f839113ddd74f680ca4a418aa5f0e867f782d3251f8a13e8af8",
      "summary": "Create a squad manager",
      "exports": [
        {
          "name": "createSquadManager",
          "kind": "function",
          "signature": "createSquadManager()",
          "summary": "Create a squad manager"
        },
        {
          "name": "createSquad",
          "kind": "function",
          "signature": "createSquad(manager, leader)",
          "summary": "Create a new squad"
        },
        {
          "name": "addToSquad",
          "kind": "function",
          "signature": "addToSquad(manager, squad, npc, role = SQUAD_ROLE.NONE)",
          "summary": "Add NPC to squad"
        },
        {
          "name": "removeFromSquad",
          "kind": "function",
          "signature": "removeFromSquad(manager, npcId)",
          "summary": "Remove NPC from their squad"
        },
        {
          "name": "disbandSquad",
          "kind": "function",
          "signature": "disbandSquad(manager, squad)",
          "summary": "Disband a squad"
        },
        {
          "name": "updateSquadFormations",
          "kind": "function",
          "signature": "updateSquadFormations(manager, npcs)",
          "summary": "Update squad formations based on proximity NPCs within range form impromptu squads"
        },
        {
          "name": "assignSquadRoles",
          "kind": "function",
          "signature": "assignSquadRoles(squad, threatPos)",
          "summary": "Assign tactical roles to squad members"
        },
        {
          "name": "calculateAttackPositions",
          "kind": "function",
          "signature": "calculateAttackPositions(squad, targetPos, coverPoints)",
          "summary": "Calculate attack positions for coordinated assault"
        },
        {
          "name": "planSuppressionManeuver",
          "kind": "function",
          "signature": "planSuppressionManeuver(squad, targetPos)",
          "summary": "Check if squad should coordinate suppression fire"
        },
        {
          "name": "queueBark",
          "kind": "function",
          "signature": "queueBark(squad, npcId, barkType, data = {})",
          "summary": "Queue a bark for the squad"
        },
        {
          "name": "processBarkQueue",
          "kind": "function",
          "signature": "processBarkQueue(squad)",
          "summary": "Process pending barks"
        },
        {
          "name": "getBarkText",
          "kind": "function",
          "signature": "getBarkText(barkType)",
          "summary": "Get bark text for a bark type"
        },
        {
          "name": "updateSquadTactics",
          "kind": "function",
          "signature": "updateSquadTactics(manager, squad, threatPos, options = {})",
          "summary": "Update squad tactical state"
        },
        {
          "name": "getSquadForNPC",
          "kind": "function",
          "signature": "getSquadForNPC(manager, npcId)",
          "summary": "Get squad for an NPC"
        },
        {
          "name": "getTeammates",
          "kind": "function",
          "signature": "getTeammates(manager, npcId)",
          "summary": "Get teammates for an NPC (excluding self)"
        },
        {
          "name": "SQUAD_ROLE",
          "kind": "constant",
          "signature": "SQUAD_ROLE",
          "summary": "Squad roles"
        },
        {
          "name": "BARK_TYPE",
          "kind": "constant",
          "signature": "BARK_TYPE",
          "summary": "Communication bark types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AISteering",
      "path": "engine/reference/sim/ai/AISteering.md",
      "source": "engine/sim/ai/AISteering.js",
      "import": "/engine/sim/ai/AISteering.js",
      "sourceHash": "4ec77443410e33f7679cf24c863ac23be78602277ced9201e5551b317947cb71",
      "summary": "Create a steering agent Uses AISchema defaults for consistent configuration",
      "exports": [
        {
          "name": "createSteeringAgent",
          "kind": "function",
          "signature": "createSteeringAgent(config = {})",
          "summary": "Create a steering agent Uses AISchema defaults for consistent configuration"
        },
        {
          "name": "applyForce",
          "kind": "function",
          "signature": "applyForce(agent, force)",
          "summary": "Apply steering force to agent"
        },
        {
          "name": "updateSteering",
          "kind": "function",
          "signature": "updateSteering(agent, deltaTime)",
          "summary": "Update agent physics"
        },
        {
          "name": "seek",
          "kind": "function",
          "signature": "seek(agent, target)",
          "summary": "Seek: steer toward target"
        },
        {
          "name": "flee",
          "kind": "function",
          "signature": "flee(agent, target)",
          "summary": "Flee: steer away from target"
        },
        {
          "name": "arrive",
          "kind": "function",
          "signature": "arrive(agent, target, slowingRadius = 5)",
          "summary": "Arrive: seek with slowing near target"
        },
        {
          "name": "pursue",
          "kind": "function",
          "signature": "pursue(agent, targetPos, targetVel)",
          "summary": "Pursue: seek predicted future position of moving target"
        },
        {
          "name": "evade",
          "kind": "function",
          "signature": "evade(agent, targetPos, targetVel)",
          "summary": "Evade: flee from predicted future position"
        },
        {
          "name": "wander",
          "kind": "function",
          "signature": "wander(agent)",
          "summary": "Wander: random steering"
        },
        {
          "name": "avoidObstacles",
          "kind": "function",
          "signature": "avoidObstacles(agent, obstacles)",
          "summary": "Avoid obstacles using ray casting"
        },
        {
          "name": "avoidWalls",
          "kind": "function",
          "signature": "avoidWalls(agent, walls)",
          "summary": "Avoid walls using feeler rays"
        },
        {
          "name": "separation",
          "kind": "function",
          "signature": "separation(agent, neighbors, separationRadius = 3)",
          "summary": "Separation: steer away from nearby agents"
        },
        {
          "name": "alignment",
          "kind": "function",
          "signature": "alignment(agent, neighbors, alignmentRadius = 5)",
          "summary": "Alignment: steer toward average heading of neighbors"
        },
        {
          "name": "cohesion",
          "kind": "function",
          "signature": "cohesion(agent, neighbors, cohesionRadius = 8)",
          "summary": "Cohesion: steer toward center of neighbors"
        },
        {
          "name": "flock",
          "kind": "function",
          "signature": "flock(agent, neighbors, weights = {})",
          "summary": "Combined flocking behavior"
        },
        {
          "name": "followPath",
          "kind": "function",
          "signature": "followPath(agent, path, pathRadius = 2)",
          "summary": "Follow a path"
        },
        {
          "name": "createFlowField",
          "kind": "function",
          "signature": "createFlowField(width, height, cellSize)",
          "summary": "Create a flow field"
        },
        {
          "name": "setFlowDirection",
          "kind": "function",
          "signature": "setFlowDirection(field, x, y, dirX, dirZ)",
          "summary": "Set flow field cell direction"
        },
        {
          "name": "getFlowDirection",
          "kind": "function",
          "signature": "getFlowDirection(field, worldX, worldZ)",
          "summary": "Get flow direction at world position"
        },
        {
          "name": "followFlowField",
          "kind": "function",
          "signature": "followFlowField(agent, field)",
          "summary": "Follow flow field"
        },
        {
          "name": "generateFlowFieldToTarget",
          "kind": "function",
          "signature": "generateFlowFieldToTarget(field, targetX, targetZ)",
          "summary": "Generate flow field toward target"
        },
        {
          "name": "STEERING_BEHAVIORS",
          "kind": "re-export",
          "signature": "STEERING_BEHAVIORS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AITerrain",
      "path": "engine/reference/sim/ai/AITerrain.md",
      "source": "engine/sim/ai/AITerrain.js",
      "import": "/engine/sim/ai/AITerrain.js",
      "sourceHash": "73bd38d9411cd01706032100e5eff15b8912740b7db70c9fa4c5898292ef0e8e",
      "summary": "Create terrain grid",
      "exports": [
        {
          "name": "createTerrainGrid",
          "kind": "function",
          "signature": "createTerrainGrid(width, height, cellSize)",
          "summary": "Create terrain grid"
        },
        {
          "name": "setTerrainType",
          "kind": "function",
          "signature": "setTerrainType(grid, x, y, type)",
          "summary": "Set terrain type at cell"
        },
        {
          "name": "getTerrainType",
          "kind": "function",
          "signature": "getTerrainType(grid, x, y)",
          "summary": "Get terrain type at cell"
        },
        {
          "name": "setTerrainHeight",
          "kind": "function",
          "signature": "setTerrainHeight(grid, x, y, height)",
          "summary": "Set height at cell"
        },
        {
          "name": "getTerrainHeight",
          "kind": "function",
          "signature": "getTerrainHeight(grid, x, y)",
          "summary": "Get height at cell"
        },
        {
          "name": "worldToTerrainCell",
          "kind": "function",
          "signature": "worldToTerrainCell(grid, worldX, worldZ)",
          "summary": "World to grid coordinates"
        },
        {
          "name": "terrainCellToWorld",
          "kind": "function",
          "signature": "terrainCellToWorld(grid, cellX, cellY)",
          "summary": "Grid to world coordinates (cell center)"
        },
        {
          "name": "getTerrainPropertiesAt",
          "kind": "function",
          "signature": "getTerrainPropertiesAt(grid, worldX, worldZ)",
          "summary": "Get terrain properties at world position"
        },
        {
          "name": "calculateMovementCost",
          "kind": "function",
          "signature": "calculateMovementCost(grid, fromX, fromZ, toX, toZ)",
          "summary": "Calculate movement cost between two points"
        },
        {
          "name": "getStealthModifier",
          "kind": "function",
          "signature": "getStealthModifier(grid, worldX, worldZ)",
          "summary": "Get stealth modifier at position"
        },
        {
          "name": "getNoiseModifier",
          "kind": "function",
          "signature": "getNoiseModifier(grid, worldX, worldZ)",
          "summary": "Get noise modifier at position"
        },
        {
          "name": "calculateHeightAdvantage",
          "kind": "function",
          "signature": "calculateHeightAdvantage(grid, attackerX, attackerZ, defenderX, defenderZ)",
          "summary": "Calculate height advantage"
        },
        {
          "name": "findHighGround",
          "kind": "function",
          "signature": "findHighGround(grid, centerX, centerZ, radius, count = 5)",
          "summary": "Find high ground positions in area"
        },
        {
          "name": "findConcealment",
          "kind": "function",
          "signature": "findConcealment(grid, centerX, centerZ, radius, count = 5)",
          "summary": "Find concealment positions"
        },
        {
          "name": "detectChokepoints",
          "kind": "function",
          "signature": "detectChokepoints(grid, minX, minZ, maxX, maxZ)",
          "summary": "Detect chokepoints in area"
        },
        {
          "name": "evaluateTacticalPosition",
          "kind": "function",
          "signature": "evaluateTacticalPosition(grid, worldX, worldZ, threatDirection = null)",
          "summary": "Evaluate tactical position value"
        },
        {
          "name": "TERRAIN_TYPE",
          "kind": "constant",
          "signature": "TERRAIN_TYPE",
          "summary": "Terrain types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIUtility",
      "path": "engine/reference/sim/ai/AIUtility.md",
      "source": "engine/sim/ai/AIUtility.js",
      "import": "/engine/sim/ai/AIUtility.js",
      "sourceHash": "fa5b52b61032ead15125bcc841d7c0f7ed9f2e23b827def2921209d04ff25fa3",
      "summary": "Linear curve: y = mx + b",
      "exports": [
        {
          "name": "linearCurve",
          "kind": "function",
          "signature": "linearCurve(slope = 1, intercept = 0)",
          "summary": "Linear curve: y = mx + b"
        },
        {
          "name": "inverseLinearCurve",
          "kind": "function",
          "signature": "inverseLinearCurve()",
          "summary": "Inverse linear curve: y = 1 - x"
        },
        {
          "name": "quadraticCurve",
          "kind": "function",
          "signature": "quadraticCurve(scale = 1, offset = 0)",
          "summary": "Quadratic curve: y = (x - offset)^2 * scale"
        },
        {
          "name": "exponentialCurve",
          "kind": "function",
          "signature": "exponentialCurve(k = 2)",
          "summary": "Exponential curve: y = e^(kx) normalized"
        },
        {
          "name": "logisticCurve",
          "kind": "function",
          "signature": "logisticCurve(k = 10, midpoint = 0.5)",
          "summary": "Logistic (S-curve): y = 1 / (1 + e^(-k(x - midpoint)))"
        },
        {
          "name": "smoothstepCurve",
          "kind": "function",
          "signature": "smoothstepCurve()",
          "summary": "Smoothstep curve: 3x^2 - 2x^3"
        },
        {
          "name": "stepCurve",
          "kind": "function",
          "signature": "stepCurve(threshold = 0.5)",
          "summary": "Step curve: returns 0 below threshold, 1 above"
        },
        {
          "name": "bellCurve",
          "kind": "function",
          "signature": "bellCurve(center = 0.5, width = 0.3)",
          "summary": "Bell curve (Gaussian-like): peaks at center"
        },
        {
          "name": "customCurve",
          "kind": "function",
          "signature": "customCurve(points)",
          "summary": "Custom curve from control points (piecewise linear)"
        },
        {
          "name": "createConsideration",
          "kind": "function",
          "signature": "createConsideration(name, inputFn, curve, weight = 1)",
          "summary": "Create a consideration (single scoring factor)"
        },
        {
          "name": "evaluateConsideration",
          "kind": "function",
          "signature": "evaluateConsideration(consideration, context)",
          "summary": "Evaluate a consideration"
        },
        {
          "name": "createUtilityAction",
          "kind": "function",
          "signature": "createUtilityAction(name, considerations, execute, options = {})",
          "summary": "Create a utility action"
        },
        {
          "name": "scoreAction",
          "kind": "function",
          "signature": "scoreAction(action, context)",
          "summary": "Score an action"
        },
        {
          "name": "selectBestAction",
          "kind": "function",
          "signature": "selectBestAction(actions, context)",
          "summary": "Select best action from candidates"
        },
        {
          "name": "selectActionWeighted",
          "kind": "function",
          "signature": "selectActionWeighted(actions, context, randomFactor = 0.2)",
          "summary": "Select action with weighted randomization Higher scores = higher chance, but not guaranteed"
        },
        {
          "name": "selectActionBucketed",
          "kind": "function",
          "signature": "selectActionBucketed(actions, context, bucketSize = 3)",
          "summary": "Select from top N actions (bucketing)"
        },
        {
          "name": "createUtilityBrain",
          "kind": "function",
          "signature": "createUtilityBrain(actions, options = {})",
          "summary": "Create a utility AI brain"
        },
        {
          "name": "updateUtilityBrain",
          "kind": "function",
          "signature": "updateUtilityBrain(brain, context, now = performance.now()",
          "summary": "Update utility brain and select action"
        },
        {
          "name": "executeCurrentAction",
          "kind": "function",
          "signature": "executeCurrentAction(brain, context)",
          "summary": "Execute the current action"
        },
        {
          "name": "createHealthConsideration",
          "kind": "function",
          "signature": "createHealthConsideration(criticalThreshold = 0.3)",
          "summary": "Create health consideration"
        },
        {
          "name": "createDistanceConsideration",
          "kind": "function",
          "signature": "createDistanceConsideration(idealDistance, maxDistance)",
          "summary": "Create distance consideration"
        },
        {
          "name": "createAmmoConsideration",
          "kind": "function",
          "signature": "createAmmoConsideration()",
          "summary": "Create ammo consideration"
        },
        {
          "name": "createThreatConsideration",
          "kind": "function",
          "signature": "createThreatConsideration()",
          "summary": "Create threat consideration"
        },
        {
          "name": "createCoverConsideration",
          "kind": "function",
          "signature": "createCoverConsideration()",
          "summary": "Create cover consideration"
        },
        {
          "name": "createLOSConsideration",
          "kind": "function",
          "signature": "createLOSConsideration()",
          "summary": "Create line of sight consideration"
        },
        {
          "name": "createCombatActions",
          "kind": "function",
          "signature": "createCombatActions(handlers)",
          "summary": "Create basic combat action set"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIValues",
      "path": "engine/reference/sim/ai/AIValues.md",
      "source": "engine/sim/ai/AIValues.js",
      "import": "/engine/sim/ai/AIValues.js",
      "sourceHash": "3cd1cfed5cc159d3b2d8adcb366ee2bd4fb61ff77c007dbc806aa0e2b69a3863",
      "summary": "Create NPC values system",
      "exports": [
        {
          "name": "createValueSystem",
          "kind": "function",
          "signature": "createValueSystem(config = {})",
          "summary": "Create NPC values system"
        },
        {
          "name": "createLifeGoal",
          "kind": "function",
          "signature": "createLifeGoal(config)",
          "summary": "Create a life goal"
        },
        {
          "name": "getValue",
          "kind": "function",
          "signature": "getValue(system, value)",
          "summary": "Get value strength"
        },
        {
          "name": "setValue",
          "kind": "function",
          "signature": "setValue(system, value, level)",
          "summary": "Set value strength"
        },
        {
          "name": "modifyValue",
          "kind": "function",
          "signature": "modifyValue(system, value, delta)",
          "summary": "Modify value (shift toward a direction)"
        },
        {
          "name": "valuesPositively",
          "kind": "function",
          "signature": "valuesPositively(system, value)",
          "summary": "Check if NPC values something"
        },
        {
          "name": "getTopValues",
          "kind": "function",
          "signature": "getTopValues(system, count = 5)",
          "summary": "Get top values (what they care about most)"
        },
        {
          "name": "satisfyPsychNeed",
          "kind": "function",
          "signature": "satisfyPsychNeed(system, need, delta)",
          "summary": "Update psychological need"
        },
        {
          "name": "decayPsychNeeds",
          "kind": "function",
          "signature": "decayPsychNeeds(system, deltaTime)",
          "summary": "Decay psychological needs over time"
        },
        {
          "name": "getMostDeprivedNeed",
          "kind": "function",
          "signature": "getMostDeprivedNeed(system)",
          "summary": "Get most deprived psychological need"
        },
        {
          "name": "calculateWellbeing",
          "kind": "function",
          "signature": "calculateWellbeing(system)",
          "summary": "Calculate overall psychological wellbeing"
        },
        {
          "name": "addLifeGoal",
          "kind": "function",
          "signature": "addLifeGoal(system, goal)",
          "summary": "Add life goal"
        },
        {
          "name": "updateGoalProgress",
          "kind": "function",
          "signature": "updateGoalProgress(system, goalId, progress)",
          "summary": "Update goal progress"
        },
        {
          "name": "pursueGoal",
          "kind": "function",
          "signature": "pursueGoal(system, goalId)",
          "summary": "Start pursuing a goal"
        },
        {
          "name": "getActiveGoals",
          "kind": "function",
          "signature": "getActiveGoals(system)",
          "summary": "Get active goals being pursued"
        },
        {
          "name": "getUnfulfilledDreams",
          "kind": "function",
          "signature": "getUnfulfilledDreams(system)",
          "summary": "Get unfulfilled dreams"
        },
        {
          "name": "scoreActionByValues",
          "kind": "function",
          "signature": "scoreActionByValues(system, action)",
          "summary": "Score an action based on values"
        },
        {
          "name": "wouldDoAction",
          "kind": "function",
          "signature": "wouldDoAction(system, action, threshold = 0)",
          "summary": "Would NPC do this action based on values?"
        },
        {
          "name": "createFromPreset",
          "kind": "function",
          "signature": "createFromPreset(preset)",
          "summary": "Create value system from preset"
        },
        {
          "name": "VALUE",
          "kind": "constant",
          "signature": "VALUE",
          "summary": "Value types - things an NPC can care about"
        },
        {
          "name": "VALUE_LEVEL",
          "kind": "constant",
          "signature": "VALUE_LEVEL",
          "summary": "Value strength levels"
        },
        {
          "name": "GOAL_TYPE",
          "kind": "constant",
          "signature": "GOAL_TYPE",
          "summary": "Types of life goals"
        },
        {
          "name": "GOAL_STATUS",
          "kind": "constant",
          "signature": "GOAL_STATUS",
          "summary": "Goal status"
        },
        {
          "name": "PSYCH_NEED",
          "kind": "constant",
          "signature": "PSYCH_NEED",
          "summary": "Higher-order psychological needs"
        },
        {
          "name": "PREF_CATEGORY",
          "kind": "constant",
          "signature": "PREF_CATEGORY",
          "summary": "Preference categories"
        },
        {
          "name": "VALUE_PRESETS",
          "kind": "constant",
          "signature": "VALUE_PRESETS",
          "summary": "Value presets for quick character creation"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIVehicle",
      "path": "engine/reference/sim/ai/AIVehicle.md",
      "source": "engine/sim/ai/AIVehicle.js",
      "import": "/engine/sim/ai/AIVehicle.js",
      "sourceHash": "93a2ff7c8c0b951778f395a8be3c9356c96bf27cde4cf4aacf2cd2cd0e5913d3",
      "summary": "AIVehicle.js ⚠️ MULTIPLAYER: Uses deterministic RNG from AIRandom.js",
      "exports": [
        {
          "name": "createVehicleType",
          "kind": "function",
          "signature": "createVehicleType(config)",
          "summary": "Create vehicle definition"
        },
        {
          "name": "createVehicle",
          "kind": "function",
          "signature": "createVehicle(vehicleType, position, heading = 0)",
          "summary": "Create vehicle instance"
        },
        {
          "name": "updateVehiclePhysics",
          "kind": "function",
          "signature": "updateVehiclePhysics(vehicle, deltaTime)",
          "summary": "Update vehicle physics"
        },
        {
          "name": "updateVehicleAI",
          "kind": "function",
          "signature": "updateVehicleAI(vehicle, world, deltaTime)",
          "summary": "Update vehicle AI"
        },
        {
          "name": "setVehiclePath",
          "kind": "function",
          "signature": "setVehiclePath(vehicle, path)",
          "summary": "Set vehicle path"
        },
        {
          "name": "createTrafficSystem",
          "kind": "function",
          "signature": "createTrafficSystem(config = {})",
          "summary": "Create traffic system"
        },
        {
          "name": "updateTrafficSystem",
          "kind": "function",
          "signature": "updateTrafficSystem(traffic, deltaTime)",
          "summary": "Update traffic system"
        },
        {
          "name": "DRIVE_MODE",
          "kind": "constant",
          "signature": "DRIVE_MODE",
          "summary": "Vehicle behavior modes"
        },
        {
          "name": "TRAFFIC_LIGHT",
          "kind": "constant",
          "signature": "TRAFFIC_LIGHT",
          "summary": "Traffic light states"
        },
        {
          "name": "PRESET_VEHICLES",
          "kind": "constant",
          "signature": "PRESET_VEHICLES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIWeapons",
      "path": "engine/reference/sim/ai/AIWeapons.md",
      "source": "engine/sim/ai/AIWeapons.js",
      "import": "/engine/sim/ai/AIWeapons.js",
      "sourceHash": "0062a523463a6ab8eac286154facd6ea6891767ebbcc7dde4e2f119c4d6b366e",
      "summary": "Fire a hitscan weapon (instant ray hit)",
      "exports": [
        {
          "name": "fireHitscan",
          "kind": "function",
          "signature": "fireHitscan(origin, direction, weapon, targets, obstacles = [])",
          "summary": "Fire a hitscan weapon (instant ray hit)"
        },
        {
          "name": "fireShotgun",
          "kind": "function",
          "signature": "fireShotgun(origin, direction, weapon, targets, obstacles = [])",
          "summary": "Fire a shotgun (multiple pellets in ring pattern)"
        },
        {
          "name": "calculateDamageFalloff",
          "kind": "function",
          "signature": "calculateDamageFalloff(baseDamage, distance, rangeModifier = 0.98)",
          "summary": "Calculate damage falloff (CS:GO style exponential)"
        },
        {
          "name": "createProjectile",
          "kind": "function",
          "signature": "createProjectile(position, velocity, config = {})",
          "summary": "Create a projectile entity"
        },
        {
          "name": "updateProjectile",
          "kind": "function",
          "signature": "updateProjectile(projectile, deltaTimeSec)",
          "summary": "Update projectile position (kinematic motion)"
        },
        {
          "name": "getProjectilePositionAtTime",
          "kind": "function",
          "signature": "getProjectilePositionAtTime(projectile, timeSec)",
          "summary": "Get projectile position at future time (prediction) P(t) = P₀ + V₀×t + ½×g×t²"
        },
        {
          "name": "checkProjectileCollision",
          "kind": "function",
          "signature": "checkProjectileCollision(projectile, targets, projectileRadius = 0.5)",
          "summary": "Check projectile collision with targets"
        },
        {
          "name": "isInCircularAoE",
          "kind": "function",
          "signature": "isInCircularAoE(targetPos, center, radius)",
          "summary": "Check if target is in circular AoE"
        },
        {
          "name": "calculateAoEDamage",
          "kind": "function",
          "signature": "calculateAoEDamage(baseDamage, dist, radius)",
          "summary": "Calculate AoE damage with quadratic falloff"
        },
        {
          "name": "resolveCircularAoE",
          "kind": "function",
          "signature": "resolveCircularAoE(center, radius, baseDamage, targets)",
          "summary": "Get all targets in circular AoE with damage"
        },
        {
          "name": "isInConeAoE",
          "kind": "function",
          "signature": "isInConeAoE(targetPos, origin, direction, halfAngleRad, range)",
          "summary": "Check if target is in cone AoE"
        },
        {
          "name": "resolveConeAoE",
          "kind": "function",
          "signature": "resolveConeAoE(origin, direction, coneAngleDeg, range, baseDamage, targets)",
          "summary": "Get all targets in cone AoE"
        },
        {
          "name": "createBeamWeapon",
          "kind": "function",
          "signature": "createBeamWeapon(config = {})",
          "summary": "Create a beam weapon state"
        },
        {
          "name": "updateBeamTracking",
          "kind": "function",
          "signature": "updateBeamTracking(beam, origin, targetPos, deltaTimeSec)",
          "summary": "Update beam weapon direction toward target"
        },
        {
          "name": "fireBeam",
          "kind": "function",
          "signature": "fireBeam(beam, origin, targets, obstacles, deltaTimeSec)",
          "summary": "Fire beam weapon (continuous damage)"
        },
        {
          "name": "createGrenade",
          "kind": "function",
          "signature": "createGrenade(position, velocity, config = {})",
          "summary": "Create a grenade projectile"
        },
        {
          "name": "updateGrenade",
          "kind": "function",
          "signature": "updateGrenade(grenade, deltaTimeSec, surfaces = [])",
          "summary": "Update grenade physics"
        },
        {
          "name": "calculateGrenadeLaunchVelocity",
          "kind": "function",
          "signature": "calculateGrenadeLaunchVelocity(start, target, gravity, launchAngleDeg)",
          "summary": "Calculate grenade launch velocity to hit target"
        },
        {
          "name": "createWeaponController",
          "kind": "function",
          "signature": "createWeaponController()",
          "summary": "Create an NPC weapon controller for multi-weapon management"
        },
        {
          "name": "addWeapon",
          "kind": "function",
          "signature": "addWeapon(controller, name, config)",
          "summary": "Add weapon to controller"
        },
        {
          "name": "selectBestWeapon",
          "kind": "function",
          "signature": "selectBestWeapon(controller, params)",
          "summary": "Select best weapon for situation"
        },
        {
          "name": "canFireWeapon",
          "kind": "function",
          "signature": "canFireWeapon(controller, weaponName, now)",
          "summary": "Check if weapon can fire (fire rate cooldown)"
        },
        {
          "name": "recordWeaponFire",
          "kind": "function",
          "signature": "recordWeaponFire(controller, weaponName, now)",
          "summary": "Record weapon fire"
        },
        {
          "name": "WEAPON_TYPE",
          "kind": "constant",
          "signature": "WEAPON_TYPE",
          "summary": "Weapon type constants"
        },
        {
          "name": "WEAPON_PRESETS",
          "kind": "constant",
          "signature": "WEAPON_PRESETS",
          "summary": "Default weapon configurations"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/AIWorld",
      "path": "engine/reference/sim/ai/AIWorld.md",
      "source": "engine/sim/ai/AIWorld.js",
      "import": "/engine/sim/ai/AIWorld.js",
      "sourceHash": "b86f138f93aacb26abc23ae04e944070daa653b7808527141ad4fcd00ce58711",
      "summary": "Create world time system",
      "exports": [
        {
          "name": "createWorldTime",
          "kind": "function",
          "signature": "createWorldTime(config = {})",
          "summary": "Create world time system"
        },
        {
          "name": "advanceTime",
          "kind": "function",
          "signature": "advanceTime(time, realDeltaSeconds)",
          "summary": "Advance world time"
        },
        {
          "name": "getSeason",
          "kind": "function",
          "signature": "getSeason(time)",
          "summary": "Get current season"
        },
        {
          "name": "getDayPhase",
          "kind": "function",
          "signature": "getDayPhase(time)",
          "summary": "Get day/night phase"
        },
        {
          "name": "formatTime",
          "kind": "function",
          "signature": "formatTime(time)",
          "summary": "Get formatted time string"
        },
        {
          "name": "formatDate",
          "kind": "function",
          "signature": "formatDate(time)",
          "summary": "Get formatted date string"
        },
        {
          "name": "createWeatherSystem",
          "kind": "function",
          "signature": "createWeatherSystem(config = {})",
          "summary": "Create weather system"
        },
        {
          "name": "updateWeather",
          "kind": "function",
          "signature": "updateWeather(weather, time, deltaHours)",
          "summary": "Update weather"
        },
        {
          "name": "getWeatherEffects",
          "kind": "function",
          "signature": "getWeatherEffects(weather)",
          "summary": "Get weather effects on gameplay"
        },
        {
          "name": "createWorldEvent",
          "kind": "function",
          "signature": "createWorldEvent(config)",
          "summary": "Create world event"
        },
        {
          "name": "createEventManager",
          "kind": "function",
          "signature": "createEventManager()",
          "summary": "Create world event manager"
        },
        {
          "name": "scheduleEvent",
          "kind": "function",
          "signature": "scheduleEvent(manager, event)",
          "summary": "Schedule world event"
        },
        {
          "name": "updateEvents",
          "kind": "function",
          "signature": "updateEvents(manager, currentTime, deltaHours)",
          "summary": "Update world events"
        },
        {
          "name": "createWorldState",
          "kind": "function",
          "signature": "createWorldState(config = {})",
          "summary": "Create complete world state"
        },
        {
          "name": "updateWorldState",
          "kind": "function",
          "signature": "updateWorldState(world, realDeltaSeconds)",
          "summary": "Update world state"
        },
        {
          "name": "SEASON",
          "kind": "constant",
          "signature": "SEASON",
          "summary": "Seasons"
        },
        {
          "name": "DAY_OF_WEEK",
          "kind": "constant",
          "signature": "DAY_OF_WEEK",
          "summary": "Days of week"
        },
        {
          "name": "MONTH",
          "kind": "constant",
          "signature": "MONTH",
          "summary": "Months"
        },
        {
          "name": "WEATHER_TYPE",
          "kind": "constant",
          "signature": "WEATHER_TYPE",
          "summary": "Weather types"
        },
        {
          "name": "EVENT_TYPE",
          "kind": "constant",
          "signature": "EVENT_TYPE",
          "summary": "Event types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/Blackboard",
      "path": "engine/reference/sim/ai/Blackboard.md",
      "source": "engine/sim/ai/Blackboard.js",
      "import": "/engine/sim/ai/Blackboard.js",
      "sourceHash": "94de8c90d1d268e9f238b4257883c497177e5bde0af9db2f713e1673c0d04d83",
      "summary": "",
      "exports": [
        {
          "name": "createBlackboard",
          "kind": "function",
          "signature": "createBlackboard(initial = {})",
          "summary": ""
        },
        {
          "name": "getBlackboardValue",
          "kind": "function",
          "signature": "getBlackboardValue(blackboard, key, defaultValue)",
          "summary": ""
        },
        {
          "name": "setBlackboardValue",
          "kind": "function",
          "signature": "setBlackboardValue(blackboard, key, value)",
          "summary": ""
        },
        {
          "name": "removeBlackboardValue",
          "kind": "function",
          "signature": "removeBlackboardValue(blackboard, key)",
          "summary": ""
        },
        {
          "name": "clearBlackboard",
          "kind": "function",
          "signature": "clearBlackboard(blackboard)",
          "summary": ""
        },
        {
          "name": "exportBlackboard",
          "kind": "function",
          "signature": "exportBlackboard(blackboard)",
          "summary": ""
        },
        {
          "name": "createBlackboardRegistry",
          "kind": "function",
          "signature": "createBlackboardRegistry()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/NavGrid",
      "path": "engine/reference/sim/ai/NavGrid.md",
      "source": "engine/sim/ai/NavGrid.js",
      "import": "/engine/sim/ai/NavGrid.js",
      "sourceHash": "6b2bace3fff5a5dcf805deb1c03f7869ecf5540f1adb94e44c66efae8554fc3a",
      "summary": "Convert axial (q, r) to cube (q, r, s) coordinates",
      "exports": [
        {
          "name": "createNavGrid",
          "kind": "function",
          "signature": "createNavGrid(options = {})",
          "summary": ""
        },
        {
          "name": "destroyNavGrid",
          "kind": "function",
          "signature": "destroyNavGrid(grid)",
          "summary": ""
        },
        {
          "name": "worldToGrid",
          "kind": "function",
          "signature": "worldToGrid(grid, worldX, worldZ)",
          "summary": ""
        },
        {
          "name": "gridToWorld",
          "kind": "function",
          "signature": "gridToWorld(grid, gx, gz)",
          "summary": ""
        },
        {
          "name": "isCellWalkable",
          "kind": "function",
          "signature": "isCellWalkable(grid, gx, gz)",
          "summary": ""
        },
        {
          "name": "setCellWalkable",
          "kind": "function",
          "signature": "setCellWalkable(grid, gx, gz, value)",
          "summary": ""
        },
        {
          "name": "bakeNavGridFromWorldSim",
          "kind": "function",
          "signature": "bakeNavGridFromWorldSim(grid, worldSim, options = {})",
          "summary": ""
        },
        {
          "name": "axialToCube",
          "kind": "function",
          "signature": "axialToCube(q, r)",
          "summary": "Convert axial (q, r) to cube (q, r, s) coordinates"
        },
        {
          "name": "cubeToAxial",
          "kind": "function",
          "signature": "cubeToAxial(q, r, s)",
          "summary": "Convert cube to axial coordinates"
        },
        {
          "name": "hexToWorld",
          "kind": "function",
          "signature": "hexToWorld(q, r, size = 1)",
          "summary": "Convert cube coordinates to world position (pointy-top hexes)"
        },
        {
          "name": "worldToHex",
          "kind": "function",
          "signature": "worldToHex(x, z, size = 1)",
          "summary": "Convert world position to cube hex coordinates"
        },
        {
          "name": "cubeRound",
          "kind": "function",
          "signature": "cubeRound(q, r, s)",
          "summary": "Round fractional cube coordinates to nearest hex"
        },
        {
          "name": "hexNeighbors",
          "kind": "function",
          "signature": "hexNeighbors(q, r, s)",
          "summary": "Get 6 hex neighbors in cube coordinates"
        },
        {
          "name": "hexDistance",
          "kind": "function",
          "signature": "hexDistance(q1, r1, s1, q2, r2, s2)",
          "summary": "Calculate hex distance in cube coordinates"
        },
        {
          "name": "hexRange",
          "kind": "function",
          "signature": "hexRange(q, r, range)",
          "summary": "Get all hexes within range of center"
        },
        {
          "name": "hexRing",
          "kind": "function",
          "signature": "hexRing(q, r, radius)",
          "summary": "Get hex ring at exact distance from center"
        },
        {
          "name": "hexLine",
          "kind": "function",
          "signature": "hexLine(q1, r1, q2, r2)",
          "summary": "Linear interpolation between two hexes (for line drawing)"
        },
        {
          "name": "createHexGrid",
          "kind": "function",
          "signature": "createHexGrid(radius, hexSize = 1)",
          "summary": "Create hex grid for strategy layer"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/NavWorld",
      "path": "engine/reference/sim/ai/NavWorld.md",
      "source": "engine/sim/ai/NavWorld.js",
      "import": "/engine/sim/ai/NavWorld.js",
      "sourceHash": "86bc6bb218f82f4fb91b064358c82a657e9f4227ea81e4005922f199bec30460",
      "summary": "",
      "exports": [
        {
          "name": "createNavWorld",
          "kind": "function",
          "signature": "createNavWorld(options = {})",
          "summary": ""
        },
        {
          "name": "destroyNavWorld",
          "kind": "function",
          "signature": "destroyNavWorld(navWorld)",
          "summary": ""
        },
        {
          "name": "addGridLayer",
          "kind": "function",
          "signature": "addGridLayer(navWorld, name, grid)",
          "summary": ""
        },
        {
          "name": "getGridLayer",
          "kind": "function",
          "signature": "getGridLayer(navWorld, name)",
          "summary": ""
        },
        {
          "name": "removeGridLayer",
          "kind": "function",
          "signature": "removeGridLayer(navWorld, name)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/Pathfinder",
      "path": "engine/reference/sim/ai/Pathfinder.md",
      "source": "engine/sim/ai/Pathfinder.js",
      "import": "/engine/sim/ai/Pathfinder.js",
      "sourceHash": "9cc03cfaae2e5e431fb55784883b03e8bc3dadec7d25ed63bb134f3e806cffb8",
      "summary": "",
      "exports": [
        {
          "name": "findPathOnGrid",
          "kind": "function",
          "signature": "findPathOnGrid(grid, start, goal, options = {})",
          "summary": ""
        },
        {
          "name": "findPathInNavWorld",
          "kind": "function",
          "signature": "findPathInNavWorld(navWorld, layerName, start, goal, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/SpatialHash",
      "path": "engine/reference/sim/ai/SpatialHash.md",
      "source": "engine/sim/ai/SpatialHash.js",
      "import": "/engine/sim/ai/SpatialHash.js",
      "sourceHash": "74e7cb3ccb26a7f01b6104dd97639d2b8b91465b59acc65784b1e8b89c321fb5",
      "summary": "Create a 3D spatial hash grid",
      "exports": [
        {
          "name": "createSpatialHash",
          "kind": "function",
          "signature": "createSpatialHash(cellSize = 10)",
          "summary": "Create a 3D spatial hash grid"
        },
        {
          "name": "spatialHashInsert",
          "kind": "function",
          "signature": "spatialHashInsert(hash, entity)",
          "summary": "Insert an entity into the spatial hash"
        },
        {
          "name": "spatialHashRemove",
          "kind": "function",
          "signature": "spatialHashRemove(hash, entityId)",
          "summary": "Remove an entity from the spatial hash"
        },
        {
          "name": "spatialHashUpdate",
          "kind": "function",
          "signature": "spatialHashUpdate(hash, entity)",
          "summary": "Update an entity's position in the spatial hash"
        },
        {
          "name": "spatialHashQueryRadius",
          "kind": "function",
          "signature": "spatialHashQueryRadius(hash, x, y, z, radius)",
          "summary": "Query all entities within radius of a point"
        },
        {
          "name": "spatialHashQueryRadius2D",
          "kind": "function",
          "signature": "spatialHashQueryRadius2D(hash, x, z, radius)",
          "summary": "Query all entities within radius (2D, ignores Y)"
        },
        {
          "name": "spatialHashQueryAABB",
          "kind": "function",
          "signature": "spatialHashQueryAABB(hash, min, max)",
          "summary": "Query entities in an AABB"
        },
        {
          "name": "spatialHashKNearest",
          "kind": "function",
          "signature": "spatialHashKNearest(hash, x, y, z, k, maxRadius = 100)",
          "summary": "Get K nearest neighbors to a point"
        },
        {
          "name": "spatialHashClear",
          "kind": "function",
          "signature": "spatialHashClear(hash)",
          "summary": "Clear all entities from the spatial hash"
        },
        {
          "name": "spatialHashCount",
          "kind": "function",
          "signature": "spatialHashCount(hash)",
          "summary": "Get total entity count"
        },
        {
          "name": "spatialHashRebuild",
          "kind": "function",
          "signature": "spatialHashRebuild(hash, entities)",
          "summary": "Rebuild the spatial hash from an entity array"
        },
        {
          "name": "createObjectPool",
          "kind": "function",
          "signature": "createObjectPool(factory, reset = null, initialSize = 100)",
          "summary": "Create an object pool for reducing GC pressure"
        },
        {
          "name": "poolAcquire",
          "kind": "function",
          "signature": "poolAcquire(pool)",
          "summary": "Acquire an object from the pool"
        },
        {
          "name": "poolRelease",
          "kind": "function",
          "signature": "poolRelease(pool, obj)",
          "summary": "Release an object back to the pool"
        },
        {
          "name": "poolReleaseAll",
          "kind": "function",
          "signature": "poolReleaseAll(pool)",
          "summary": "Release all active objects back to pool"
        },
        {
          "name": "poolStats",
          "kind": "function",
          "signature": "poolStats(pool)",
          "summary": "Get pool statistics"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/ai/index",
      "path": "engine/reference/sim/ai/index.md",
      "source": "engine/sim/ai/index.js",
      "import": "/engine/sim/ai/index.js",
      "sourceHash": "607ef48d8b7e58bf87dd4162a2fbfca5f56b666eb834b30695e65862c7031f11",
      "summary": "",
      "exports": [
        {
          "name": "AGENT_STATE",
          "kind": "re-export",
          "signature": "AGENT_STATE",
          "summary": ""
        },
        {
          "name": "ATTACK_PHASE",
          "kind": "re-export",
          "signature": "ATTACK_PHASE",
          "summary": ""
        },
        {
          "name": "AWARENESS_STATE",
          "kind": "re-export",
          "signature": "AWARENESS_STATE",
          "summary": ""
        },
        {
          "name": "AWARENESS_STATES",
          "kind": "re-export",
          "signature": "AWARENESS_STATES",
          "summary": ""
        },
        {
          "name": "BARK_TYPE",
          "kind": "re-export",
          "signature": "BARK_TYPE",
          "summary": ""
        },
        {
          "name": "COMBAT_STATE",
          "kind": "re-export",
          "signature": "COMBAT_STATE",
          "summary": ""
        },
        {
          "name": "COMPLEX_EMOTION",
          "kind": "re-export",
          "signature": "COMPLEX_EMOTION",
          "summary": ""
        },
        {
          "name": "COVER_ACTION",
          "kind": "re-export",
          "signature": "COVER_ACTION",
          "summary": ""
        },
        {
          "name": "COVER_QUALITY",
          "kind": "re-export",
          "signature": "COVER_QUALITY",
          "summary": ""
        },
        {
          "name": "CREATURE_STATE",
          "kind": "re-export",
          "signature": "CREATURE_STATE",
          "summary": ""
        },
        {
          "name": "CROWD_BEHAVIOR",
          "kind": "re-export",
          "signature": "CROWD_BEHAVIOR",
          "summary": ""
        },
        {
          "name": "DAY_OF_WEEK",
          "kind": "re-export",
          "signature": "DAY_OF_WEEK",
          "summary": ""
        },
        {
          "name": "DEFAULT_EVASION_PARAMS",
          "kind": "re-export",
          "signature": "DEFAULT_EVASION_PARAMS",
          "summary": ""
        },
        {
          "name": "DEFAULT_MORALE_PARAMS",
          "kind": "re-export",
          "signature": "DEFAULT_MORALE_PARAMS",
          "summary": ""
        },
        {
          "name": "DEFAULT_PERCEPTION_PARAMS",
          "kind": "re-export",
          "signature": "DEFAULT_PERCEPTION_PARAMS",
          "summary": ""
        },
        {
          "name": "DEFAULT_PHASE_DURATIONS",
          "kind": "re-export",
          "signature": "DEFAULT_PHASE_DURATIONS",
          "summary": ""
        },
        {
          "name": "DEFAULT_THREAT_WEIGHTS",
          "kind": "re-export",
          "signature": "DEFAULT_THREAT_WEIGHTS",
          "summary": ""
        },
        {
          "name": "DIPLOMATIC_STANCE",
          "kind": "re-export",
          "signature": "DIPLOMATIC_STANCE",
          "summary": ""
        },
        {
          "name": "DIPLOMATIC_STANCES",
          "kind": "re-export",
          "signature": "DIPLOMATIC_STANCES",
          "summary": ""
        },
        {
          "name": "DRIVE_MODE",
          "kind": "re-export",
          "signature": "DRIVE_MODE",
          "summary": ""
        },
        {
          "name": "EMOTION",
          "kind": "re-export",
          "signature": "EMOTION",
          "summary": ""
        },
        {
          "name": "EVASION_TYPE",
          "kind": "re-export",
          "signature": "EVASION_TYPE",
          "summary": ""
        },
        {
          "name": "EVENT_TYPE",
          "kind": "re-export",
          "signature": "EVENT_TYPE",
          "summary": ""
        },
        {
          "name": "FACTION_SCHEMA",
          "kind": "re-export",
          "signature": "FACTION_SCHEMA",
          "summary": ""
        },
        {
          "name": "FALLOFF_TYPE",
          "kind": "re-export",
          "signature": "FALLOFF_TYPE",
          "summary": ""
        },
        {
          "name": "FORMATION_TYPE",
          "kind": "re-export",
          "signature": "FORMATION_TYPE",
          "summary": ""
        },
        {
          "name": "GOAL_STATUS",
          "kind": "re-export",
          "signature": "GOAL_STATUS",
          "summary": ""
        },
        {
          "name": "GOAL_TYPE",
          "kind": "re-export",
          "signature": "GOAL_TYPE",
          "summary": ""
        },
        {
          "name": "HITBOX_TYPE",
          "kind": "re-export",
          "signature": "HITBOX_TYPE",
          "summary": ""
        },
        {
          "name": "IMPORTANCE",
          "kind": "re-export",
          "signature": "IMPORTANCE",
          "summary": ""
        },
        {
          "name": "INFO_TYPE",
          "kind": "re-export",
          "signature": "INFO_TYPE",
          "summary": ""
        },
        {
          "name": "INTENSITY_LEVEL",
          "kind": "re-export",
          "signature": "INTENSITY_LEVEL",
          "summary": ""
        },
        {
          "name": "INTERACTION_STATE",
          "kind": "re-export",
          "signature": "INTERACTION_STATE",
          "summary": ""
        },
        {
          "name": "ITEM_CATEGORY",
          "kind": "re-export",
          "signature": "ITEM_CATEGORY",
          "summary": ""
        },
        {
          "name": "JOB_TYPE",
          "kind": "re-export",
          "signature": "JOB_TYPE",
          "summary": ""
        },
        {
          "name": "LOD_UPDATE_INTERVALS",
          "kind": "re-export",
          "signature": "LOD_UPDATE_INTERVALS",
          "summary": ""
        },
        {
          "name": "MARKET_TREND",
          "kind": "re-export",
          "signature": "MARKET_TREND",
          "summary": ""
        },
        {
          "name": "MEMORY_TYPE",
          "kind": "re-export",
          "signature": "MEMORY_TYPE",
          "summary": ""
        },
        {
          "name": "MONTH",
          "kind": "re-export",
          "signature": "MONTH",
          "summary": ""
        },
        {
          "name": "MORALE_STATE",
          "kind": "re-export",
          "signature": "MORALE_STATE",
          "summary": ""
        },
        {
          "name": "NEED",
          "kind": "re-export",
          "signature": "NEED",
          "summary": ""
        },
        {
          "name": "NODE_STATUS",
          "kind": "re-export",
          "signature": "NODE_STATUS",
          "summary": ""
        },
        {
          "name": "NODE_TYPE",
          "kind": "re-export",
          "signature": "NODE_TYPE",
          "summary": ""
        },
        {
          "name": "NODE_TYPES",
          "kind": "re-export",
          "signature": "NODE_TYPES",
          "summary": ""
        },
        {
          "name": "NPC_AI_SCHEMA",
          "kind": "re-export",
          "signature": "NPC_AI_SCHEMA",
          "summary": ""
        },
        {
          "name": "OBJECT_CATEGORY",
          "kind": "re-export",
          "signature": "OBJECT_CATEGORY",
          "summary": ""
        },
        {
          "name": "PACING_STATE",
          "kind": "re-export",
          "signature": "PACING_STATE",
          "summary": ""
        },
        {
          "name": "PERCEPTION_SCHEMA",
          "kind": "re-export",
          "signature": "PERCEPTION_SCHEMA",
          "summary": ""
        },
        {
          "name": "PERSONALITY_PRESETS",
          "kind": "re-export",
          "signature": "PERSONALITY_PRESETS",
          "summary": ""
        },
        {
          "name": "PERSONALITY_SCHEMA",
          "kind": "re-export",
          "signature": "PERSONALITY_SCHEMA",
          "summary": ""
        },
        {
          "name": "PERSONALITY_TRAITS",
          "kind": "re-export",
          "signature": "PERSONALITY_TRAITS",
          "summary": ""
        },
        {
          "name": "PREF_CATEGORY",
          "kind": "re-export",
          "signature": "PREF_CATEGORY",
          "summary": ""
        },
        {
          "name": "PRESET_ACTIVITIES",
          "kind": "re-export",
          "signature": "PRESET_ACTIVITIES",
          "summary": ""
        },
        {
          "name": "PRESET_FORMATIONS",
          "kind": "re-export",
          "signature": "PRESET_FORMATIONS",
          "summary": ""
        },
        {
          "name": "PRESET_RESOURCES",
          "kind": "re-export",
          "signature": "PRESET_RESOURCES",
          "summary": ""
        },
        {
          "name": "PRESET_VEHICLES",
          "kind": "re-export",
          "signature": "PRESET_VEHICLES",
          "summary": ""
        },
        {
          "name": "PSYCH_NEED",
          "kind": "re-export",
          "signature": "PSYCH_NEED",
          "summary": ""
        },
        {
          "name": "QUEST_PRIORITY",
          "kind": "re-export",
          "signature": "QUEST_PRIORITY",
          "summary": ""
        },
        {
          "name": "QUEST_STATUS",
          "kind": "re-export",
          "signature": "QUEST_STATUS",
          "summary": ""
        },
        {
          "name": "QUEST_TYPE",
          "kind": "re-export",
          "signature": "QUEST_TYPE",
          "summary": ""
        },
        {
          "name": "RARITY",
          "kind": "re-export",
          "signature": "RARITY",
          "summary": ""
        },
        {
          "name": "RARITY_COLORS",
          "kind": "re-export",
          "signature": "RARITY_COLORS",
          "summary": ""
        },
        {
          "name": "RELATIONSHIP_TYPE",
          "kind": "re-export",
          "signature": "RELATIONSHIP_TYPE",
          "summary": ""
        },
        {
          "name": "RELIABILITY",
          "kind": "re-export",
          "signature": "RELIABILITY",
          "summary": ""
        },
        {
          "name": "REPUTATION_LEVEL",
          "kind": "re-export",
          "signature": "REPUTATION_LEVEL",
          "summary": ""
        },
        {
          "name": "REPUTATION_LEVELS",
          "kind": "re-export",
          "signature": "REPUTATION_LEVELS",
          "summary": ""
        },
        {
          "name": "RESOURCE_CATEGORY",
          "kind": "re-export",
          "signature": "RESOURCE_CATEGORY",
          "summary": ""
        },
        {
          "name": "SCENT_TYPE",
          "kind": "re-export",
          "signature": "SCENT_TYPE",
          "summary": ""
        },
        {
          "name": "SCHEMA_NODE_STATUS",
          "kind": "re-export",
          "signature": "SCHEMA_NODE_STATUS",
          "summary": ""
        },
        {
          "name": "SEASON",
          "kind": "re-export",
          "signature": "SEASON",
          "summary": ""
        },
        {
          "name": "SENSE_TYPE",
          "kind": "re-export",
          "signature": "SENSE_TYPE",
          "summary": ""
        },
        {
          "name": "SENSE_TYPES",
          "kind": "re-export",
          "signature": "SENSE_TYPES",
          "summary": ""
        },
        {
          "name": "SKILL_LEVELS",
          "kind": "re-export",
          "signature": "SKILL_LEVELS",
          "summary": ""
        },
        {
          "name": "SOUND_CATEGORY",
          "kind": "re-export",
          "signature": "SOUND_CATEGORY",
          "summary": ""
        },
        {
          "name": "SOUND_PRIORITY",
          "kind": "re-export",
          "signature": "SOUND_PRIORITY",
          "summary": ""
        },
        {
          "name": "SPECIES_ROLE",
          "kind": "re-export",
          "signature": "SPECIES_ROLE",
          "summary": ""
        },
        {
          "name": "SQUAD_ROLE",
          "kind": "re-export",
          "signature": "SQUAD_ROLE",
          "summary": ""
        },
        {
          "name": "STEERING_AGENT_SCHEMA",
          "kind": "re-export",
          "signature": "STEERING_AGENT_SCHEMA",
          "summary": ""
        },
        {
          "name": "STEERING_BEHAVIORS",
          "kind": "re-export",
          "signature": "STEERING_BEHAVIORS",
          "summary": ""
        },
        {
          "name": "SURFACE_TYPE",
          "kind": "re-export",
          "signature": "SURFACE_TYPE",
          "summary": ""
        },
        {
          "name": "SpatialHash",
          "kind": "re-export",
          "signature": "SpatialHash",
          "summary": ""
        },
        {
          "name": "TARGET_MEMORY_DURATION_MS",
          "kind": "re-export",
          "signature": "TARGET_MEMORY_DURATION_MS",
          "summary": ""
        },
        {
          "name": "TARGET_SWITCH_THRESHOLD",
          "kind": "re-export",
          "signature": "TARGET_SWITCH_THRESHOLD",
          "summary": ""
        },
        {
          "name": "TERRAIN_TYPE",
          "kind": "re-export",
          "signature": "TERRAIN_TYPE",
          "summary": ""
        },
        {
          "name": "TRAFFIC_LIGHT",
          "kind": "re-export",
          "signature": "TRAFFIC_LIGHT",
          "summary": ""
        },
        {
          "name": "TRAIT",
          "kind": "re-export",
          "signature": "TRAIT",
          "summary": ""
        },
        {
          "name": "TREATY_TYPE",
          "kind": "re-export",
          "signature": "TREATY_TYPE",
          "summary": ""
        },
        {
          "name": "URGENCY",
          "kind": "re-export",
          "signature": "URGENCY",
          "summary": ""
        },
        {
          "name": "VALUE",
          "kind": "re-export",
          "signature": "VALUE",
          "summary": ""
        },
        {
          "name": "VALUE_LEVEL",
          "kind": "re-export",
          "signature": "VALUE_LEVEL",
          "summary": ""
        },
        {
          "name": "VALUE_PRESETS",
          "kind": "re-export",
          "signature": "VALUE_PRESETS",
          "summary": ""
        },
        {
          "name": "WEAPON_PRESETS",
          "kind": "re-export",
          "signature": "WEAPON_PRESETS",
          "summary": ""
        },
        {
          "name": "WEAPON_TYPE",
          "kind": "re-export",
          "signature": "WEAPON_TYPE",
          "summary": ""
        },
        {
          "name": "WEATHER_TYPE",
          "kind": "re-export",
          "signature": "WEATHER_TYPE",
          "summary": ""
        },
        {
          "name": "acceptQuest",
          "kind": "re-export",
          "signature": "acceptQuest",
          "summary": ""
        },
        {
          "name": "addAttractor",
          "kind": "re-export",
          "signature": "addAttractor",
          "summary": ""
        },
        {
          "name": "addCrowdAgent",
          "kind": "re-export",
          "signature": "addCrowdAgent",
          "summary": ""
        },
        {
          "name": "addCrowdWall",
          "kind": "re-export",
          "signature": "addCrowdWall",
          "summary": ""
        },
        {
          "name": "addDialogueNode",
          "kind": "re-export",
          "signature": "addDialogueNode",
          "summary": ""
        },
        {
          "name": "addDialogueTree",
          "kind": "re-export",
          "signature": "addDialogueTree",
          "summary": ""
        },
        {
          "name": "addGridLayer",
          "kind": "re-export",
          "signature": "addGridLayer",
          "summary": ""
        },
        {
          "name": "addInfluenceAt",
          "kind": "re-export",
          "signature": "addInfluenceAt",
          "summary": ""
        },
        {
          "name": "addKnowledge",
          "kind": "re-export",
          "signature": "addKnowledge",
          "summary": ""
        },
        {
          "name": "addLifeGoal",
          "kind": "re-export",
          "signature": "addLifeGoal",
          "summary": ""
        },
        {
          "name": "addScheduleEntry",
          "kind": "re-export",
          "signature": "addScheduleEntry",
          "summary": ""
        },
        {
          "name": "addSoundOccluder",
          "kind": "re-export",
          "signature": "addSoundOccluder",
          "summary": ""
        },
        {
          "name": "addSpawnPoint",
          "kind": "re-export",
          "signature": "addSpawnPoint",
          "summary": ""
        },
        {
          "name": "addToFaction",
          "kind": "re-export",
          "signature": "addToFaction",
          "summary": ""
        },
        {
          "name": "addToInventory",
          "kind": "re-export",
          "signature": "addToInventory",
          "summary": ""
        },
        {
          "name": "addToPack",
          "kind": "re-export",
          "signature": "addToPack",
          "summary": ""
        },
        {
          "name": "addToSquad",
          "kind": "re-export",
          "signature": "addToSquad",
          "summary": ""
        },
        {
          "name": "addTrailParticle",
          "kind": "re-export",
          "signature": "addTrailParticle",
          "summary": ""
        },
        {
          "name": "addWeapon",
          "kind": "re-export",
          "signature": "addWeapon",
          "summary": ""
        },
        {
          "name": "advanceTime",
          "kind": "re-export",
          "signature": "advanceTime",
          "summary": ""
        },
        {
          "name": "aiRng",
          "kind": "re-export",
          "signature": "aiRng",
          "summary": ""
        },
        {
          "name": "alignment",
          "kind": "re-export",
          "signature": "alignment",
          "summary": ""
        },
        {
          "name": "announcePublicKnowledge",
          "kind": "re-export",
          "signature": "announcePublicKnowledge",
          "summary": ""
        },
        {
          "name": "applyAccuracySpread2D",
          "kind": "re-export",
          "signature": "applyAccuracySpread2D",
          "summary": ""
        },
        {
          "name": "applyAccuracySpread3D",
          "kind": "re-export",
          "signature": "applyAccuracySpread3D",
          "summary": ""
        },
        {
          "name": "applyAffix",
          "kind": "re-export",
          "signature": "applyAffix",
          "summary": ""
        },
        {
          "name": "applyBatchRayResults",
          "kind": "re-export",
          "signature": "applyBatchRayResults",
          "summary": ""
        },
        {
          "name": "applyDamageToNPC",
          "kind": "re-export",
          "signature": "applyDamageToNPC",
          "summary": ""
        },
        {
          "name": "applyEmotionalStimulus",
          "kind": "re-export",
          "signature": "applyEmotionalStimulus",
          "summary": ""
        },
        {
          "name": "applyForce",
          "kind": "re-export",
          "signature": "applyForce",
          "summary": ""
        },
        {
          "name": "applyMoraleSuppression",
          "kind": "re-export",
          "signature": "applyMoraleSuppression",
          "summary": ""
        },
        {
          "name": "applySuppression",
          "kind": "re-export",
          "signature": "applySuppression",
          "summary": ""
        },
        {
          "name": "areEntitiesHostile",
          "kind": "re-export",
          "signature": "areEntitiesHostile",
          "summary": ""
        },
        {
          "name": "areFactionsAllied",
          "kind": "re-export",
          "signature": "areFactionsAllied",
          "summary": ""
        },
        {
          "name": "areFactionsHostile",
          "kind": "re-export",
          "signature": "areFactionsHostile",
          "summary": ""
        },
        {
          "name": "arrive",
          "kind": "re-export",
          "signature": "arrive",
          "summary": ""
        },
        {
          "name": "assignSquadRoles",
          "kind": "re-export",
          "signature": "assignSquadRoles",
          "summary": ""
        },
        {
          "name": "assignToFormation",
          "kind": "re-export",
          "signature": "assignToFormation",
          "summary": ""
        },
        {
          "name": "avoidObstacles",
          "kind": "re-export",
          "signature": "avoidObstacles",
          "summary": ""
        },
        {
          "name": "avoidWalls",
          "kind": "re-export",
          "signature": "avoidWalls",
          "summary": ""
        },
        {
          "name": "bakeNavGridFromWorldSim",
          "kind": "re-export",
          "signature": "bakeNavGridFromWorldSim",
          "summary": ""
        },
        {
          "name": "batchRaycast",
          "kind": "re-export",
          "signature": "batchRaycast",
          "summary": ""
        },
        {
          "name": "bellCurve",
          "kind": "re-export",
          "signature": "bellCurve",
          "summary": ""
        },
        {
          "name": "benchmarkRaycast",
          "kind": "re-export",
          "signature": "benchmarkRaycast",
          "summary": ""
        },
        {
          "name": "buyFromMarket",
          "kind": "re-export",
          "signature": "buyFromMarket",
          "summary": ""
        },
        {
          "name": "calculateAccuracyModifier",
          "kind": "re-export",
          "signature": "calculateAccuracyModifier",
          "summary": ""
        },
        {
          "name": "calculateAoEDamage",
          "kind": "re-export",
          "signature": "calculateAoEDamage",
          "summary": ""
        },
        {
          "name": "calculateAttackPositions",
          "kind": "re-export",
          "signature": "calculateAttackPositions",
          "summary": ""
        },
        {
          "name": "calculateDamageFalloff",
          "kind": "re-export",
          "signature": "calculateDamageFalloff",
          "summary": ""
        },
        {
          "name": "calculateDetectionRate",
          "kind": "re-export",
          "signature": "calculateDetectionRate",
          "summary": ""
        },
        {
          "name": "calculateFactionPower",
          "kind": "re-export",
          "signature": "calculateFactionPower",
          "summary": ""
        },
        {
          "name": "calculateGrenadeLaunchVelocity",
          "kind": "re-export",
          "signature": "calculateGrenadeLaunchVelocity",
          "summary": ""
        },
        {
          "name": "calculateHeightAdvantage",
          "kind": "re-export",
          "signature": "calculateHeightAdvantage",
          "summary": ""
        },
        {
          "name": "calculateHitDamageFalloff",
          "kind": "re-export",
          "signature": "calculateHitDamageFalloff",
          "summary": ""
        },
        {
          "name": "calculateMovementCost",
          "kind": "re-export",
          "signature": "calculateMovementCost",
          "summary": ""
        },
        {
          "name": "calculateNeedsWellbeing",
          "kind": "re-export",
          "signature": "calculateNeedsWellbeing",
          "summary": ""
        },
        {
          "name": "calculatePrice",
          "kind": "re-export",
          "signature": "calculatePrice",
          "summary": ""
        },
        {
          "name": "calculateSocialForce",
          "kind": "re-export",
          "signature": "calculateSocialForce",
          "summary": ""
        },
        {
          "name": "calculateSoundIntensity",
          "kind": "re-export",
          "signature": "calculateSoundIntensity",
          "summary": ""
        },
        {
          "name": "calculateThreatScore",
          "kind": "re-export",
          "signature": "calculateThreatScore",
          "summary": ""
        },
        {
          "name": "calculateValuesWellbeing",
          "kind": "re-export",
          "signature": "calculateValuesWellbeing",
          "summary": ""
        },
        {
          "name": "calculateWellbeing",
          "kind": "re-export",
          "signature": "calculateWellbeing",
          "summary": ""
        },
        {
          "name": "canAcceptQuest",
          "kind": "re-export",
          "signature": "canAcceptQuest",
          "summary": ""
        },
        {
          "name": "canAccessFactionService",
          "kind": "re-export",
          "signature": "canAccessFactionService",
          "summary": ""
        },
        {
          "name": "canCraft",
          "kind": "re-export",
          "signature": "canCraft",
          "summary": ""
        },
        {
          "name": "canDodge",
          "kind": "re-export",
          "signature": "canDodge",
          "summary": ""
        },
        {
          "name": "canFireWeapon",
          "kind": "re-export",
          "signature": "canFireWeapon",
          "summary": ""
        },
        {
          "name": "canShootFromCover",
          "kind": "re-export",
          "signature": "canShootFromCover",
          "summary": ""
        },
        {
          "name": "capsuleSphereIntersect",
          "kind": "re-export",
          "signature": "capsuleSphereIntersect",
          "summary": ""
        },
        {
          "name": "chainComboAttack",
          "kind": "re-export",
          "signature": "chainComboAttack",
          "summary": ""
        },
        {
          "name": "challengeBelief",
          "kind": "re-export",
          "signature": "challengeBelief",
          "summary": ""
        },
        {
          "name": "changeFormation",
          "kind": "re-export",
          "signature": "changeFormation",
          "summary": ""
        },
        {
          "name": "changeMorale",
          "kind": "re-export",
          "signature": "changeMorale",
          "summary": ""
        },
        {
          "name": "checkBeamHit",
          "kind": "re-export",
          "signature": "checkBeamHit",
          "summary": ""
        },
        {
          "name": "checkGrenadeThreats",
          "kind": "re-export",
          "signature": "checkGrenadeThreats",
          "summary": ""
        },
        {
          "name": "checkHearing",
          "kind": "re-export",
          "signature": "checkHearing",
          "summary": ""
        },
        {
          "name": "checkInvestigationComplete",
          "kind": "re-export",
          "signature": "checkInvestigationComplete",
          "summary": ""
        },
        {
          "name": "checkMeleeHits",
          "kind": "re-export",
          "signature": "checkMeleeHits",
          "summary": ""
        },
        {
          "name": "checkPrerequisites",
          "kind": "re-export",
          "signature": "checkPrerequisites",
          "summary": ""
        },
        {
          "name": "checkProjectileCollision",
          "kind": "re-export",
          "signature": "checkProjectileCollision",
          "summary": ""
        },
        {
          "name": "checkProjectileHit",
          "kind": "re-export",
          "signature": "checkProjectileHit",
          "summary": ""
        },
        {
          "name": "checkProjectileThreats",
          "kind": "re-export",
          "signature": "checkProjectileThreats",
          "summary": ""
        },
        {
          "name": "checkQuestComplete",
          "kind": "re-export",
          "signature": "checkQuestComplete",
          "summary": ""
        },
        {
          "name": "checkVision",
          "kind": "re-export",
          "signature": "checkVision",
          "summary": ""
        },
        {
          "name": "circleStrafe",
          "kind": "re-export",
          "signature": "circleStrafe",
          "summary": ""
        },
        {
          "name": "claimTerritory",
          "kind": "re-export",
          "signature": "claimTerritory",
          "summary": ""
        },
        {
          "name": "cleanupDrops",
          "kind": "re-export",
          "signature": "cleanupDrops",
          "summary": ""
        },
        {
          "name": "clearBlackboard",
          "kind": "re-export",
          "signature": "clearBlackboard",
          "summary": ""
        },
        {
          "name": "clearInfluence",
          "kind": "re-export",
          "signature": "clearInfluence",
          "summary": ""
        },
        {
          "name": "clearPathReservations",
          "kind": "re-export",
          "signature": "clearPathReservations",
          "summary": ""
        },
        {
          "name": "clearWorkingMemory",
          "kind": "re-export",
          "signature": "clearWorkingMemory",
          "summary": ""
        },
        {
          "name": "cohesion",
          "kind": "re-export",
          "signature": "cohesion",
          "summary": ""
        },
        {
          "name": "completeInteraction",
          "kind": "re-export",
          "signature": "completeInteraction",
          "summary": ""
        },
        {
          "name": "computePeekPositions",
          "kind": "re-export",
          "signature": "computePeekPositions",
          "summary": ""
        },
        {
          "name": "connectNPCs",
          "kind": "re-export",
          "signature": "connectNPCs",
          "summary": ""
        },
        {
          "name": "consolidateMemories",
          "kind": "re-export",
          "signature": "consolidateMemories",
          "summary": ""
        },
        {
          "name": "consumeFood",
          "kind": "re-export",
          "signature": "consumeFood",
          "summary": ""
        },
        {
          "name": "continueDialogue",
          "kind": "re-export",
          "signature": "continueDialogue",
          "summary": ""
        },
        {
          "name": "copyResultsToReadback",
          "kind": "re-export",
          "signature": "copyResultsToReadback",
          "summary": ""
        },
        {
          "name": "craft",
          "kind": "re-export",
          "signature": "craft",
          "summary": ""
        },
        {
          "name": "createAIAimingSystem",
          "kind": "re-export",
          "signature": "createAIAimingSystem",
          "summary": ""
        },
        {
          "name": "createAIDirector",
          "kind": "re-export",
          "signature": "createAIDirector",
          "summary": ""
        },
        {
          "name": "createAction",
          "kind": "re-export",
          "signature": "createAction",
          "summary": ""
        },
        {
          "name": "createActivity",
          "kind": "re-export",
          "signature": "createActivity",
          "summary": ""
        },
        {
          "name": "createAffix",
          "kind": "re-export",
          "signature": "createAffix",
          "summary": ""
        },
        {
          "name": "createAmmoConsideration",
          "kind": "re-export",
          "signature": "createAmmoConsideration",
          "summary": ""
        },
        {
          "name": "createAmmoCrate",
          "kind": "re-export",
          "signature": "createAmmoCrate",
          "summary": ""
        },
        {
          "name": "createBeamWeapon",
          "kind": "re-export",
          "signature": "createBeamWeapon",
          "summary": ""
        },
        {
          "name": "createBlackboard",
          "kind": "re-export",
          "signature": "createBlackboard",
          "summary": ""
        },
        {
          "name": "createBlackboardRegistry",
          "kind": "re-export",
          "signature": "createBlackboardRegistry",
          "summary": ""
        },
        {
          "name": "createCharacterState",
          "kind": "re-export",
          "signature": "createCharacterState",
          "summary": ""
        },
        {
          "name": "createCombatActions",
          "kind": "re-export",
          "signature": "createCombatActions",
          "summary": ""
        },
        {
          "name": "createCombatTree",
          "kind": "re-export",
          "signature": "createCombatTree",
          "summary": ""
        },
        {
          "name": "createCondition",
          "kind": "re-export",
          "signature": "createCondition",
          "summary": ""
        },
        {
          "name": "createConditionGuard",
          "kind": "re-export",
          "signature": "createConditionGuard",
          "summary": ""
        },
        {
          "name": "createConsideration",
          "kind": "re-export",
          "signature": "createConsideration",
          "summary": ""
        },
        {
          "name": "createCooldown",
          "kind": "re-export",
          "signature": "createCooldown",
          "summary": ""
        },
        {
          "name": "createCoverConsideration",
          "kind": "re-export",
          "signature": "createCoverConsideration",
          "summary": ""
        },
        {
          "name": "createCoverPoint",
          "kind": "re-export",
          "signature": "createCoverPoint",
          "summary": ""
        },
        {
          "name": "createCoverState",
          "kind": "re-export",
          "signature": "createCoverState",
          "summary": ""
        },
        {
          "name": "createCreature",
          "kind": "re-export",
          "signature": "createCreature",
          "summary": ""
        },
        {
          "name": "createCrowdAgent",
          "kind": "re-export",
          "signature": "createCrowdAgent",
          "summary": ""
        },
        {
          "name": "createCrowdSystem",
          "kind": "re-export",
          "signature": "createCrowdSystem",
          "summary": ""
        },
        {
          "name": "createDangerSense",
          "kind": "re-export",
          "signature": "createDangerSense",
          "summary": ""
        },
        {
          "name": "createDefaultFaction",
          "kind": "re-export",
          "signature": "createDefaultFaction",
          "summary": ""
        },
        {
          "name": "createDefaultPerception",
          "kind": "re-export",
          "signature": "createDefaultPerception",
          "summary": ""
        },
        {
          "name": "createDefaultPersonality",
          "kind": "re-export",
          "signature": "createDefaultPersonality",
          "summary": ""
        },
        {
          "name": "createDefaultSteeringAgent",
          "kind": "re-export",
          "signature": "createDefaultSteeringAgent",
          "summary": ""
        },
        {
          "name": "createDialogueNode",
          "kind": "re-export",
          "signature": "createDialogueNode",
          "summary": ""
        },
        {
          "name": "createDialogueState",
          "kind": "re-export",
          "signature": "createDialogueState",
          "summary": ""
        },
        {
          "name": "createDialogueTree",
          "kind": "re-export",
          "signature": "createDialogueTree",
          "summary": ""
        },
        {
          "name": "createDifficultyScaler",
          "kind": "re-export",
          "signature": "createDifficultyScaler",
          "summary": ""
        },
        {
          "name": "createDistanceConsideration",
          "kind": "re-export",
          "signature": "createDistanceConsideration",
          "summary": ""
        },
        {
          "name": "createDoor",
          "kind": "re-export",
          "signature": "createDoor",
          "summary": ""
        },
        {
          "name": "createEconomyManager",
          "kind": "re-export",
          "signature": "createEconomyManager",
          "summary": ""
        },
        {
          "name": "createEcosystem",
          "kind": "re-export",
          "signature": "createEcosystem",
          "summary": ""
        },
        {
          "name": "createEmotionalState",
          "kind": "re-export",
          "signature": "createEmotionalState",
          "summary": ""
        },
        {
          "name": "createEntityRng",
          "kind": "re-export",
          "signature": "createEntityRng",
          "summary": ""
        },
        {
          "name": "createEnvironmentSensor",
          "kind": "re-export",
          "signature": "createEnvironmentSensor",
          "summary": ""
        },
        {
          "name": "createEpisode",
          "kind": "re-export",
          "signature": "createEpisode",
          "summary": ""
        },
        {
          "name": "createEpisodicMemory",
          "kind": "re-export",
          "signature": "createEpisodicMemory",
          "summary": ""
        },
        {
          "name": "createEvasionState",
          "kind": "re-export",
          "signature": "createEvasionState",
          "summary": ""
        },
        {
          "name": "createEventManager",
          "kind": "re-export",
          "signature": "createEventManager",
          "summary": ""
        },
        {
          "name": "createFaction",
          "kind": "re-export",
          "signature": "createFaction",
          "summary": ""
        },
        {
          "name": "createFactionManager",
          "kind": "re-export",
          "signature": "createFactionManager",
          "summary": ""
        },
        {
          "name": "createFailer",
          "kind": "re-export",
          "signature": "createFailer",
          "summary": ""
        },
        {
          "name": "createFlowField",
          "kind": "re-export",
          "signature": "createFlowField",
          "summary": ""
        },
        {
          "name": "createFoodSource",
          "kind": "re-export",
          "signature": "createFoodSource",
          "summary": ""
        },
        {
          "name": "createFormation",
          "kind": "re-export",
          "signature": "createFormation",
          "summary": ""
        },
        {
          "name": "createFormationManager",
          "kind": "re-export",
          "signature": "createFormationManager",
          "summary": ""
        },
        {
          "name": "createFromPreset",
          "kind": "re-export",
          "signature": "createFromPreset",
          "summary": ""
        },
        {
          "name": "createGPURaycastSystem",
          "kind": "re-export",
          "signature": "createGPURaycastSystem",
          "summary": ""
        },
        {
          "name": "createGrenade",
          "kind": "re-export",
          "signature": "createGrenade",
          "summary": ""
        },
        {
          "name": "createHealthConsideration",
          "kind": "re-export",
          "signature": "createHealthConsideration",
          "summary": ""
        },
        {
          "name": "createHealthStation",
          "kind": "re-export",
          "signature": "createHealthStation",
          "summary": ""
        },
        {
          "name": "createInfluenceLayer",
          "kind": "re-export",
          "signature": "createInfluenceLayer",
          "summary": ""
        },
        {
          "name": "createInfluenceMap",
          "kind": "re-export",
          "signature": "createInfluenceMap",
          "summary": ""
        },
        {
          "name": "createInteraction",
          "kind": "re-export",
          "signature": "createInteraction",
          "summary": ""
        },
        {
          "name": "createInventory",
          "kind": "re-export",
          "signature": "createInventory",
          "summary": ""
        },
        {
          "name": "createInverter",
          "kind": "re-export",
          "signature": "createInverter",
          "summary": ""
        },
        {
          "name": "createItemDef",
          "kind": "re-export",
          "signature": "createItemDef",
          "summary": ""
        },
        {
          "name": "createItemInstance",
          "kind": "re-export",
          "signature": "createItemInstance",
          "summary": ""
        },
        {
          "name": "createJob",
          "kind": "re-export",
          "signature": "createJob",
          "summary": ""
        },
        {
          "name": "createKnowledge",
          "kind": "re-export",
          "signature": "createKnowledge",
          "summary": ""
        },
        {
          "name": "createKnowledgeBase",
          "kind": "re-export",
          "signature": "createKnowledgeBase",
          "summary": ""
        },
        {
          "name": "createLOSConsideration",
          "kind": "re-export",
          "signature": "createLOSConsideration",
          "summary": ""
        },
        {
          "name": "createLifeGoal",
          "kind": "re-export",
          "signature": "createLifeGoal",
          "summary": ""
        },
        {
          "name": "createLog",
          "kind": "re-export",
          "signature": "createLog",
          "summary": ""
        },
        {
          "name": "createLootEntry",
          "kind": "re-export",
          "signature": "createLootEntry",
          "summary": ""
        },
        {
          "name": "createLootManager",
          "kind": "re-export",
          "signature": "createLootManager",
          "summary": ""
        },
        {
          "name": "createLootTable",
          "kind": "re-export",
          "signature": "createLootTable",
          "summary": ""
        },
        {
          "name": "createMarket",
          "kind": "re-export",
          "signature": "createMarket",
          "summary": ""
        },
        {
          "name": "createMeleeArc",
          "kind": "re-export",
          "signature": "createMeleeArc",
          "summary": ""
        },
        {
          "name": "createMeleeAttackState",
          "kind": "re-export",
          "signature": "createMeleeAttackState",
          "summary": ""
        },
        {
          "name": "createMemorySystem",
          "kind": "re-export",
          "signature": "createMemorySystem",
          "summary": ""
        },
        {
          "name": "createMoraleState",
          "kind": "re-export",
          "signature": "createMoraleState",
          "summary": ""
        },
        {
          "name": "createNPCCombatController",
          "kind": "re-export",
          "signature": "createNPCCombatController",
          "summary": ""
        },
        {
          "name": "createNPCScheduler",
          "kind": "re-export",
          "signature": "createNPCScheduler",
          "summary": ""
        },
        {
          "name": "createNavGrid",
          "kind": "re-export",
          "signature": "createNavGrid",
          "summary": ""
        },
        {
          "name": "createNavWorld",
          "kind": "re-export",
          "signature": "createNavWorld",
          "summary": ""
        },
        {
          "name": "createNeedsState",
          "kind": "re-export",
          "signature": "createNeedsState",
          "summary": ""
        },
        {
          "name": "createNoiseEvent",
          "kind": "re-export",
          "signature": "createNoiseEvent",
          "summary": ""
        },
        {
          "name": "createObjectPool",
          "kind": "re-export",
          "signature": "createObjectPool",
          "summary": ""
        },
        {
          "name": "createObjective",
          "kind": "re-export",
          "signature": "createObjective",
          "summary": ""
        },
        {
          "name": "createPacingController",
          "kind": "re-export",
          "signature": "createPacingController",
          "summary": ""
        },
        {
          "name": "createPack",
          "kind": "re-export",
          "signature": "createPack",
          "summary": ""
        },
        {
          "name": "createParallel",
          "kind": "re-export",
          "signature": "createParallel",
          "summary": ""
        },
        {
          "name": "createPerceptionState",
          "kind": "re-export",
          "signature": "createPerceptionState",
          "summary": ""
        },
        {
          "name": "createPersonality",
          "kind": "re-export",
          "signature": "createPersonality",
          "summary": ""
        },
        {
          "name": "createPersonalityFromArchetype",
          "kind": "re-export",
          "signature": "createPersonalityFromArchetype",
          "summary": ""
        },
        {
          "name": "createPlayerState",
          "kind": "re-export",
          "signature": "createPlayerState",
          "summary": ""
        },
        {
          "name": "createPositionRng",
          "kind": "re-export",
          "signature": "createPositionRng",
          "summary": ""
        },
        {
          "name": "createProceduralMemory",
          "kind": "re-export",
          "signature": "createProceduralMemory",
          "summary": ""
        },
        {
          "name": "createProductionBuilding",
          "kind": "re-export",
          "signature": "createProductionBuilding",
          "summary": ""
        },
        {
          "name": "createProjectile",
          "kind": "re-export",
          "signature": "createProjectile",
          "summary": ""
        },
        {
          "name": "createQuest",
          "kind": "re-export",
          "signature": "createQuest",
          "summary": ""
        },
        {
          "name": "createQuestManager",
          "kind": "re-export",
          "signature": "createQuestManager",
          "summary": ""
        },
        {
          "name": "createRandomSelector",
          "kind": "re-export",
          "signature": "createRandomSelector",
          "summary": ""
        },
        {
          "name": "createRay",
          "kind": "re-export",
          "signature": "createRay",
          "summary": ""
        },
        {
          "name": "createRecipe",
          "kind": "re-export",
          "signature": "createRecipe",
          "summary": ""
        },
        {
          "name": "createRelationshipTracker",
          "kind": "re-export",
          "signature": "createRelationshipTracker",
          "summary": ""
        },
        {
          "name": "createRepeater",
          "kind": "re-export",
          "signature": "createRepeater",
          "summary": ""
        },
        {
          "name": "createResource",
          "kind": "re-export",
          "signature": "createResource",
          "summary": ""
        },
        {
          "name": "createScentParticle",
          "kind": "re-export",
          "signature": "createScentParticle",
          "summary": ""
        },
        {
          "name": "createScentSystem",
          "kind": "re-export",
          "signature": "createScentSystem",
          "summary": ""
        },
        {
          "name": "createScentTrail",
          "kind": "re-export",
          "signature": "createScentTrail",
          "summary": ""
        },
        {
          "name": "createSchedule",
          "kind": "re-export",
          "signature": "createSchedule",
          "summary": ""
        },
        {
          "name": "createSelector",
          "kind": "re-export",
          "signature": "createSelector",
          "summary": ""
        },
        {
          "name": "createSemanticMemory",
          "kind": "re-export",
          "signature": "createSemanticMemory",
          "summary": ""
        },
        {
          "name": "createSequence",
          "kind": "re-export",
          "signature": "createSequence",
          "summary": ""
        },
        {
          "name": "createSmartObject",
          "kind": "re-export",
          "signature": "createSmartObject",
          "summary": ""
        },
        {
          "name": "createSmartObjectRegistry",
          "kind": "re-export",
          "signature": "createSmartObjectRegistry",
          "summary": ""
        },
        {
          "name": "createSoundEvent",
          "kind": "re-export",
          "signature": "createSoundEvent",
          "summary": ""
        },
        {
          "name": "createSoundSystem",
          "kind": "re-export",
          "signature": "createSoundSystem",
          "summary": ""
        },
        {
          "name": "createSpatialHash",
          "kind": "re-export",
          "signature": "createSpatialHash",
          "summary": ""
        },
        {
          "name": "createSpawnDirector",
          "kind": "re-export",
          "signature": "createSpawnDirector",
          "summary": ""
        },
        {
          "name": "createSpecies",
          "kind": "re-export",
          "signature": "createSpecies",
          "summary": ""
        },
        {
          "name": "createSquad",
          "kind": "re-export",
          "signature": "createSquad",
          "summary": ""
        },
        {
          "name": "createSquadManager",
          "kind": "re-export",
          "signature": "createSquadManager",
          "summary": ""
        },
        {
          "name": "createSteeringAgent",
          "kind": "re-export",
          "signature": "createSteeringAgent",
          "summary": ""
        },
        {
          "name": "createSucceeder",
          "kind": "re-export",
          "signature": "createSucceeder",
          "summary": ""
        },
        {
          "name": "createTargetMemory",
          "kind": "re-export",
          "signature": "createTargetMemory",
          "summary": ""
        },
        {
          "name": "createTerrainGrid",
          "kind": "re-export",
          "signature": "createTerrainGrid",
          "summary": ""
        },
        {
          "name": "createThreatConsideration",
          "kind": "re-export",
          "signature": "createThreatConsideration",
          "summary": ""
        },
        {
          "name": "createTrafficSystem",
          "kind": "re-export",
          "signature": "createTrafficSystem",
          "summary": ""
        },
        {
          "name": "createTreaty",
          "kind": "re-export",
          "signature": "createTreaty",
          "summary": ""
        },
        {
          "name": "createTreeRunner",
          "kind": "re-export",
          "signature": "createTreeRunner",
          "summary": ""
        },
        {
          "name": "createTremorSense",
          "kind": "re-export",
          "signature": "createTremorSense",
          "summary": ""
        },
        {
          "name": "createUntilFail",
          "kind": "re-export",
          "signature": "createUntilFail",
          "summary": ""
        },
        {
          "name": "createUntilSuccess",
          "kind": "re-export",
          "signature": "createUntilSuccess",
          "summary": ""
        },
        {
          "name": "createUtilityAction",
          "kind": "re-export",
          "signature": "createUtilityAction",
          "summary": ""
        },
        {
          "name": "createUtilityBrain",
          "kind": "re-export",
          "signature": "createUtilityBrain",
          "summary": ""
        },
        {
          "name": "createValueSystem",
          "kind": "re-export",
          "signature": "createValueSystem",
          "summary": ""
        },
        {
          "name": "createVehicle",
          "kind": "re-export",
          "signature": "createVehicle",
          "summary": ""
        },
        {
          "name": "createVehicleType",
          "kind": "re-export",
          "signature": "createVehicleType",
          "summary": ""
        },
        {
          "name": "createVibration",
          "kind": "re-export",
          "signature": "createVibration",
          "summary": ""
        },
        {
          "name": "createWait",
          "kind": "re-export",
          "signature": "createWait",
          "summary": ""
        },
        {
          "name": "createWeaponController",
          "kind": "re-export",
          "signature": "createWeaponController",
          "summary": ""
        },
        {
          "name": "createWeatherSystem",
          "kind": "re-export",
          "signature": "createWeatherSystem",
          "summary": ""
        },
        {
          "name": "createWorkingMemory",
          "kind": "re-export",
          "signature": "createWorkingMemory",
          "summary": ""
        },
        {
          "name": "createWorldEvent",
          "kind": "re-export",
          "signature": "createWorldEvent",
          "summary": ""
        },
        {
          "name": "createWorldKnowledgeManager",
          "kind": "re-export",
          "signature": "createWorldKnowledgeManager",
          "summary": ""
        },
        {
          "name": "createWorldState",
          "kind": "re-export",
          "signature": "createWorldState",
          "summary": ""
        },
        {
          "name": "createWorldTime",
          "kind": "re-export",
          "signature": "createWorldTime",
          "summary": ""
        },
        {
          "name": "customCurve",
          "kind": "re-export",
          "signature": "customCurve",
          "summary": ""
        },
        {
          "name": "damageCover",
          "kind": "re-export",
          "signature": "damageCover",
          "summary": ""
        },
        {
          "name": "decayAwareness",
          "kind": "re-export",
          "signature": "decayAwareness",
          "summary": ""
        },
        {
          "name": "decayDamageMemory",
          "kind": "re-export",
          "signature": "decayDamageMemory",
          "summary": ""
        },
        {
          "name": "decayEmotions",
          "kind": "re-export",
          "signature": "decayEmotions",
          "summary": ""
        },
        {
          "name": "decayInfluence",
          "kind": "re-export",
          "signature": "decayInfluence",
          "summary": ""
        },
        {
          "name": "decayPsychNeeds",
          "kind": "re-export",
          "signature": "decayPsychNeeds",
          "summary": ""
        },
        {
          "name": "declareWar",
          "kind": "re-export",
          "signature": "declareWar",
          "summary": ""
        },
        {
          "name": "degToRad",
          "kind": "re-export",
          "signature": "degToRad",
          "summary": ""
        },
        {
          "name": "destroyGPURaycastSystem",
          "kind": "re-export",
          "signature": "destroyGPURaycastSystem",
          "summary": ""
        },
        {
          "name": "destroyNavGrid",
          "kind": "re-export",
          "signature": "destroyNavGrid",
          "summary": ""
        },
        {
          "name": "destroyNavWorld",
          "kind": "re-export",
          "signature": "destroyNavWorld",
          "summary": ""
        },
        {
          "name": "detectChokepoints",
          "kind": "re-export",
          "signature": "detectChokepoints",
          "summary": ""
        },
        {
          "name": "detectCoverPoints",
          "kind": "re-export",
          "signature": "detectCoverPoints",
          "summary": ""
        },
        {
          "name": "detectEnvironmentTrend",
          "kind": "re-export",
          "signature": "detectEnvironmentTrend",
          "summary": ""
        },
        {
          "name": "dialogueBuilder",
          "kind": "re-export",
          "signature": "dialogueBuilder",
          "summary": ""
        },
        {
          "name": "disbandSquad",
          "kind": "re-export",
          "signature": "disbandSquad",
          "summary": ""
        },
        {
          "name": "dispatchAABBRaycast",
          "kind": "re-export",
          "signature": "dispatchAABBRaycast",
          "summary": ""
        },
        {
          "name": "dispatchSphereRaycast",
          "kind": "re-export",
          "signature": "dispatchSphereRaycast",
          "summary": ""
        },
        {
          "name": "distance",
          "kind": "re-export",
          "signature": "distance",
          "summary": ""
        },
        {
          "name": "distanceSquared",
          "kind": "re-export",
          "signature": "distanceSquared",
          "summary": ""
        },
        {
          "name": "distortKnowledge",
          "kind": "re-export",
          "signature": "distortKnowledge",
          "summary": ""
        },
        {
          "name": "dropLoot",
          "kind": "re-export",
          "signature": "dropLoot",
          "summary": ""
        },
        {
          "name": "emitExplosion",
          "kind": "re-export",
          "signature": "emitExplosion",
          "summary": ""
        },
        {
          "name": "emitFootstep",
          "kind": "re-export",
          "signature": "emitFootstep",
          "summary": ""
        },
        {
          "name": "emitGunshot",
          "kind": "re-export",
          "signature": "emitGunshot",
          "summary": ""
        },
        {
          "name": "emitSound",
          "kind": "re-export",
          "signature": "emitSound",
          "summary": ""
        },
        {
          "name": "emitVibration",
          "kind": "re-export",
          "signature": "emitVibration",
          "summary": ""
        },
        {
          "name": "enterCover",
          "kind": "re-export",
          "signature": "enterCover",
          "summary": ""
        },
        {
          "name": "evade",
          "kind": "re-export",
          "signature": "evade",
          "summary": ""
        },
        {
          "name": "evaluateConsideration",
          "kind": "re-export",
          "signature": "evaluateConsideration",
          "summary": ""
        },
        {
          "name": "evaluateTacticalPosition",
          "kind": "re-export",
          "signature": "evaluateTacticalPosition",
          "summary": ""
        },
        {
          "name": "executeCurrentAction",
          "kind": "re-export",
          "signature": "executeCurrentAction",
          "summary": ""
        },
        {
          "name": "exitCover",
          "kind": "re-export",
          "signature": "exitCover",
          "summary": ""
        },
        {
          "name": "exponentialCurve",
          "kind": "re-export",
          "signature": "exponentialCurve",
          "summary": ""
        },
        {
          "name": "exportBlackboard",
          "kind": "re-export",
          "signature": "exportBlackboard",
          "summary": ""
        },
        {
          "name": "failQuest",
          "kind": "re-export",
          "signature": "failQuest",
          "summary": ""
        },
        {
          "name": "findAvailableSlot",
          "kind": "re-export",
          "signature": "findAvailableSlot",
          "summary": ""
        },
        {
          "name": "findBestCover",
          "kind": "re-export",
          "signature": "findBestCover",
          "summary": ""
        },
        {
          "name": "findByCategory",
          "kind": "re-export",
          "signature": "findByCategory",
          "summary": ""
        },
        {
          "name": "findByTag",
          "kind": "re-export",
          "signature": "findByTag",
          "summary": ""
        },
        {
          "name": "findChokePoints",
          "kind": "re-export",
          "signature": "findChokePoints",
          "summary": ""
        },
        {
          "name": "findConcealment",
          "kind": "re-export",
          "signature": "findConcealment",
          "summary": ""
        },
        {
          "name": "findFlankingPositions",
          "kind": "re-export",
          "signature": "findFlankingPositions",
          "summary": ""
        },
        {
          "name": "findHighGround",
          "kind": "re-export",
          "signature": "findHighGround",
          "summary": ""
        },
        {
          "name": "findHighestInfluence",
          "kind": "re-export",
          "signature": "findHighestInfluence",
          "summary": ""
        },
        {
          "name": "findLowestInfluence",
          "kind": "re-export",
          "signature": "findLowestInfluence",
          "summary": ""
        },
        {
          "name": "findNearestUsable",
          "kind": "re-export",
          "signature": "findNearestUsable",
          "summary": ""
        },
        {
          "name": "findPathInNavWorld",
          "kind": "re-export",
          "signature": "findPathInNavWorld",
          "summary": ""
        },
        {
          "name": "findPathOnGrid",
          "kind": "re-export",
          "signature": "findPathOnGrid",
          "summary": ""
        },
        {
          "name": "findRetreatCover",
          "kind": "re-export",
          "signature": "findRetreatCover",
          "summary": ""
        },
        {
          "name": "fireBeam",
          "kind": "re-export",
          "signature": "fireBeam",
          "summary": ""
        },
        {
          "name": "fireHitscan",
          "kind": "re-export",
          "signature": "fireHitscan",
          "summary": ""
        },
        {
          "name": "fireShotgun",
          "kind": "re-export",
          "signature": "fireShotgun",
          "summary": ""
        },
        {
          "name": "flee",
          "kind": "re-export",
          "signature": "flee",
          "summary": ""
        },
        {
          "name": "flock",
          "kind": "re-export",
          "signature": "flock",
          "summary": ""
        },
        {
          "name": "followFlowField",
          "kind": "re-export",
          "signature": "followFlowField",
          "summary": ""
        },
        {
          "name": "followPath",
          "kind": "re-export",
          "signature": "followPath",
          "summary": ""
        },
        {
          "name": "followScentTrail",
          "kind": "re-export",
          "signature": "followScentTrail",
          "summary": ""
        },
        {
          "name": "formHabit",
          "kind": "re-export",
          "signature": "formHabit",
          "summary": ""
        },
        {
          "name": "formatDate",
          "kind": "re-export",
          "signature": "formatDate",
          "summary": ""
        },
        {
          "name": "formatTime",
          "kind": "re-export",
          "signature": "formatTime",
          "summary": ""
        },
        {
          "name": "gaussianRandom",
          "kind": "re-export",
          "signature": "gaussianRandom",
          "summary": ""
        },
        {
          "name": "generateCombatMovement",
          "kind": "re-export",
          "signature": "generateCombatMovement",
          "summary": ""
        },
        {
          "name": "generateDailyQuests",
          "kind": "re-export",
          "signature": "generateDailyQuests",
          "summary": ""
        },
        {
          "name": "generateFlowFieldToTarget",
          "kind": "re-export",
          "signature": "generateFlowFieldToTarget",
          "summary": ""
        },
        {
          "name": "generateFormationSlots",
          "kind": "re-export",
          "signature": "generateFormationSlots",
          "summary": ""
        },
        {
          "name": "generateItemName",
          "kind": "re-export",
          "signature": "generateItemName",
          "summary": ""
        },
        {
          "name": "generateQuest",
          "kind": "re-export",
          "signature": "generateQuest",
          "summary": ""
        },
        {
          "name": "getActiveGoals",
          "kind": "re-export",
          "signature": "getActiveGoals",
          "summary": ""
        },
        {
          "name": "getAimPointFromMemory",
          "kind": "re-export",
          "signature": "getAimPointFromMemory",
          "summary": ""
        },
        {
          "name": "getAllFormationPositions",
          "kind": "re-export",
          "signature": "getAllFormationPositions",
          "summary": ""
        },
        {
          "name": "getAoETargets",
          "kind": "re-export",
          "signature": "getAoETargets",
          "summary": ""
        },
        {
          "name": "getAwarenessStateId",
          "kind": "re-export",
          "signature": "getAwarenessStateId",
          "summary": ""
        },
        {
          "name": "getAwarenessStateName",
          "kind": "re-export",
          "signature": "getAwarenessStateName",
          "summary": ""
        },
        {
          "name": "getBarkText",
          "kind": "re-export",
          "signature": "getBarkText",
          "summary": ""
        },
        {
          "name": "getBatchRays",
          "kind": "re-export",
          "signature": "getBatchRays",
          "summary": ""
        },
        {
          "name": "getBlackboardValue",
          "kind": "re-export",
          "signature": "getBlackboardValue",
          "summary": ""
        },
        {
          "name": "getComboMultiplier",
          "kind": "re-export",
          "signature": "getComboMultiplier",
          "summary": ""
        },
        {
          "name": "getConeTargets",
          "kind": "re-export",
          "signature": "getConeTargets",
          "summary": ""
        },
        {
          "name": "getCoverShootPosition",
          "kind": "re-export",
          "signature": "getCoverShootPosition",
          "summary": ""
        },
        {
          "name": "getCriticalNeeds",
          "kind": "re-export",
          "signature": "getCriticalNeeds",
          "summary": ""
        },
        {
          "name": "getCrowdStats",
          "kind": "re-export",
          "signature": "getCrowdStats",
          "summary": ""
        },
        {
          "name": "getDayPhase",
          "kind": "re-export",
          "signature": "getDayPhase",
          "summary": ""
        },
        {
          "name": "getDialogueFlag",
          "kind": "re-export",
          "signature": "getDialogueFlag",
          "summary": ""
        },
        {
          "name": "getDiplomaticStance",
          "kind": "re-export",
          "signature": "getDiplomaticStance",
          "summary": ""
        },
        {
          "name": "getDisposition",
          "kind": "re-export",
          "signature": "getDisposition",
          "summary": ""
        },
        {
          "name": "getEcosystemStats",
          "kind": "re-export",
          "signature": "getEcosystemStats",
          "summary": ""
        },
        {
          "name": "getEntityFaction",
          "kind": "re-export",
          "signature": "getEntityFaction",
          "summary": ""
        },
        {
          "name": "getEntityImpression",
          "kind": "re-export",
          "signature": "getEntityImpression",
          "summary": ""
        },
        {
          "name": "getEntityRngState",
          "kind": "re-export",
          "signature": "getEntityRngState",
          "summary": ""
        },
        {
          "name": "getEnvironmentalComfort",
          "kind": "re-export",
          "signature": "getEnvironmentalComfort",
          "summary": ""
        },
        {
          "name": "getEvasionParamsForSkill",
          "kind": "re-export",
          "signature": "getEvasionParamsForSkill",
          "summary": ""
        },
        {
          "name": "getFact",
          "kind": "re-export",
          "signature": "getFact",
          "summary": ""
        },
        {
          "name": "getFlowDirection",
          "kind": "re-export",
          "signature": "getFlowDirection",
          "summary": ""
        },
        {
          "name": "getFormationPosition",
          "kind": "re-export",
          "signature": "getFormationPosition",
          "summary": ""
        },
        {
          "name": "getGridLayer",
          "kind": "re-export",
          "signature": "getGridLayer",
          "summary": ""
        },
        {
          "name": "getGroupMorale",
          "kind": "re-export",
          "signature": "getGroupMorale",
          "summary": ""
        },
        {
          "name": "getHabitualResponse",
          "kind": "re-export",
          "signature": "getHabitualResponse",
          "summary": ""
        },
        {
          "name": "getHighestPriorityDetection",
          "kind": "re-export",
          "signature": "getHighestPriorityDetection",
          "summary": ""
        },
        {
          "name": "getInfluenceAt",
          "kind": "re-export",
          "signature": "getInfluenceAt",
          "summary": ""
        },
        {
          "name": "getInteractionRngState",
          "kind": "re-export",
          "signature": "getInteractionRngState",
          "summary": ""
        },
        {
          "name": "getLastKnownPosition",
          "kind": "re-export",
          "signature": "getLastKnownPosition",
          "summary": ""
        },
        {
          "name": "getMoraleAccuracyMod",
          "kind": "re-export",
          "signature": "getMoraleAccuracyMod",
          "summary": ""
        },
        {
          "name": "getMoraleReactionMod",
          "kind": "re-export",
          "signature": "getMoraleReactionMod",
          "summary": ""
        },
        {
          "name": "getMoraleSpeedMod",
          "kind": "re-export",
          "signature": "getMoraleSpeedMod",
          "summary": ""
        },
        {
          "name": "getMostDeprivedNeed",
          "kind": "re-export",
          "signature": "getMostDeprivedNeed",
          "summary": ""
        },
        {
          "name": "getMostThreateningEntity",
          "kind": "re-export",
          "signature": "getMostThreateningEntity",
          "summary": ""
        },
        {
          "name": "getMostUrgentNeed",
          "kind": "re-export",
          "signature": "getMostUrgentNeed",
          "summary": ""
        },
        {
          "name": "getNodeTypeId",
          "kind": "re-export",
          "signature": "getNodeTypeId",
          "summary": ""
        },
        {
          "name": "getNoiseModifier",
          "kind": "re-export",
          "signature": "getNoiseModifier",
          "summary": ""
        },
        {
          "name": "getPersonalityBehaviorMod",
          "kind": "re-export",
          "signature": "getPersonalityBehaviorMod",
          "summary": ""
        },
        {
          "name": "getPhaseProgress",
          "kind": "re-export",
          "signature": "getPhaseProgress",
          "summary": ""
        },
        {
          "name": "getPhaseTimeRemaining",
          "kind": "re-export",
          "signature": "getPhaseTimeRemaining",
          "summary": ""
        },
        {
          "name": "getPlayerReputationLevel",
          "kind": "re-export",
          "signature": "getPlayerReputationLevel",
          "summary": ""
        },
        {
          "name": "getPositionRngState",
          "kind": "re-export",
          "signature": "getPositionRngState",
          "summary": ""
        },
        {
          "name": "getProjectilePositionAtTime",
          "kind": "re-export",
          "signature": "getProjectilePositionAtTime",
          "summary": ""
        },
        {
          "name": "getRecentDetections",
          "kind": "re-export",
          "signature": "getRecentDetections",
          "summary": ""
        },
        {
          "name": "getRelationship",
          "kind": "re-export",
          "signature": "getRelationship",
          "summary": ""
        },
        {
          "name": "getReputationLevel",
          "kind": "re-export",
          "signature": "getReputationLevel",
          "summary": ""
        },
        {
          "name": "getScheduledActivity",
          "kind": "re-export",
          "signature": "getScheduledActivity",
          "summary": ""
        },
        {
          "name": "getSeason",
          "kind": "re-export",
          "signature": "getSeason",
          "summary": ""
        },
        {
          "name": "getSkillProficiency",
          "kind": "re-export",
          "signature": "getSkillProficiency",
          "summary": ""
        },
        {
          "name": "getSlotWorldPosition",
          "kind": "re-export",
          "signature": "getSlotWorldPosition",
          "summary": ""
        },
        {
          "name": "getSquadForNPC",
          "kind": "re-export",
          "signature": "getSquadForNPC",
          "summary": ""
        },
        {
          "name": "getStealthModifier",
          "kind": "re-export",
          "signature": "getStealthModifier",
          "summary": ""
        },
        {
          "name": "getTeammates",
          "kind": "re-export",
          "signature": "getTeammates",
          "summary": ""
        },
        {
          "name": "getTerrainHeight",
          "kind": "re-export",
          "signature": "getTerrainHeight",
          "summary": ""
        },
        {
          "name": "getTerrainPropertiesAt",
          "kind": "re-export",
          "signature": "getTerrainPropertiesAt",
          "summary": ""
        },
        {
          "name": "getTerrainType",
          "kind": "re-export",
          "signature": "getTerrainType",
          "summary": ""
        },
        {
          "name": "getTerritoryOwner",
          "kind": "re-export",
          "signature": "getTerritoryOwner",
          "summary": ""
        },
        {
          "name": "getTopValues",
          "kind": "re-export",
          "signature": "getTopValues",
          "summary": ""
        },
        {
          "name": "getUnfulfilledDreams",
          "kind": "re-export",
          "signature": "getUnfulfilledDreams",
          "summary": ""
        },
        {
          "name": "getValue",
          "kind": "re-export",
          "signature": "getValue",
          "summary": ""
        },
        {
          "name": "getWeatherEffects",
          "kind": "re-export",
          "signature": "getWeatherEffects",
          "summary": ""
        },
        {
          "name": "getWorkingMemoryByType",
          "kind": "re-export",
          "signature": "getWorkingMemoryByType",
          "summary": ""
        },
        {
          "name": "gridToWorld",
          "kind": "re-export",
          "signature": "gridToWorld",
          "summary": ""
        },
        {
          "name": "groupRally",
          "kind": "re-export",
          "signature": "groupRally",
          "summary": ""
        },
        {
          "name": "hasComplexEmotion",
          "kind": "re-export",
          "signature": "hasComplexEmotion",
          "summary": ""
        },
        {
          "name": "hasKnowledgeOf",
          "kind": "re-export",
          "signature": "hasKnowledgeOf",
          "summary": ""
        },
        {
          "name": "hasLineOfSight",
          "kind": "re-export",
          "signature": "hasLineOfSight",
          "summary": ""
        },
        {
          "name": "hasLineOfSightSpheres",
          "kind": "re-export",
          "signature": "hasLineOfSightSpheres",
          "summary": ""
        },
        {
          "name": "influenceCellToWorld",
          "kind": "re-export",
          "signature": "influenceCellToWorld",
          "summary": ""
        },
        {
          "name": "initMarketResource",
          "kind": "re-export",
          "signature": "initMarketResource",
          "summary": ""
        },
        {
          "name": "initNPCMelee",
          "kind": "re-export",
          "signature": "initNPCMelee",
          "summary": ""
        },
        {
          "name": "initNPCWeapons",
          "kind": "re-export",
          "signature": "initNPCWeapons",
          "summary": ""
        },
        {
          "name": "interruptMeleeAttack",
          "kind": "re-export",
          "signature": "interruptMeleeAttack",
          "summary": ""
        },
        {
          "name": "inverseLinearCurve",
          "kind": "re-export",
          "signature": "inverseLinearCurve",
          "summary": ""
        },
        {
          "name": "isCellWalkable",
          "kind": "re-export",
          "signature": "isCellWalkable",
          "summary": ""
        },
        {
          "name": "isEvading",
          "kind": "re-export",
          "signature": "isEvading",
          "summary": ""
        },
        {
          "name": "isFormationComplete",
          "kind": "re-export",
          "signature": "isFormationComplete",
          "summary": ""
        },
        {
          "name": "isGroupRouting",
          "kind": "re-export",
          "signature": "isGroupRouting",
          "summary": ""
        },
        {
          "name": "isInCircularAoE",
          "kind": "re-export",
          "signature": "isInCircularAoE",
          "summary": ""
        },
        {
          "name": "isInConeAoE",
          "kind": "re-export",
          "signature": "isInConeAoE",
          "summary": ""
        },
        {
          "name": "isInMeleeArc",
          "kind": "re-export",
          "signature": "isInMeleeArc",
          "summary": ""
        },
        {
          "name": "isInMeleeArc3D",
          "kind": "re-export",
          "signature": "isInMeleeArc3D",
          "summary": ""
        },
        {
          "name": "isSuppressed",
          "kind": "re-export",
          "signature": "isSuppressed",
          "summary": ""
        },
        {
          "name": "isWithinRange",
          "kind": "re-export",
          "signature": "isWithinRange",
          "summary": ""
        },
        {
          "name": "isWorkTime",
          "kind": "re-export",
          "signature": "isWorkTime",
          "summary": ""
        },
        {
          "name": "linearCurve",
          "kind": "re-export",
          "signature": "linearCurve",
          "summary": ""
        },
        {
          "name": "logisticCurve",
          "kind": "re-export",
          "signature": "logisticCurve",
          "summary": ""
        },
        {
          "name": "modifyPlayerReputation",
          "kind": "re-export",
          "signature": "modifyPlayerReputation",
          "summary": ""
        },
        {
          "name": "modifyValue",
          "kind": "re-export",
          "signature": "modifyValue",
          "summary": ""
        },
        {
          "name": "moraleCheck",
          "kind": "re-export",
          "signature": "moraleCheck",
          "summary": ""
        },
        {
          "name": "moveFormation",
          "kind": "re-export",
          "signature": "moveFormation",
          "summary": ""
        },
        {
          "name": "npcFireWeapon",
          "kind": "re-export",
          "signature": "npcFireWeapon",
          "summary": ""
        },
        {
          "name": "npcMeleeAttack",
          "kind": "re-export",
          "signature": "npcMeleeAttack",
          "summary": ""
        },
        {
          "name": "pcgHash",
          "kind": "re-export",
          "signature": "pcgHash",
          "summary": ""
        },
        {
          "name": "planSuppressionManeuver",
          "kind": "re-export",
          "signature": "planSuppressionManeuver",
          "summary": ""
        },
        {
          "name": "poolAcquire",
          "kind": "re-export",
          "signature": "poolAcquire",
          "summary": ""
        },
        {
          "name": "poolRelease",
          "kind": "re-export",
          "signature": "poolRelease",
          "summary": ""
        },
        {
          "name": "poolReleaseAll",
          "kind": "re-export",
          "signature": "poolReleaseAll",
          "summary": ""
        },
        {
          "name": "poolStats",
          "kind": "re-export",
          "signature": "poolStats",
          "summary": ""
        },
        {
          "name": "practiceSkill",
          "kind": "re-export",
          "signature": "practiceSkill",
          "summary": ""
        },
        {
          "name": "predictiveAim",
          "kind": "re-export",
          "signature": "predictiveAim",
          "summary": ""
        },
        {
          "name": "predictiveAimWithAcceleration",
          "kind": "re-export",
          "signature": "predictiveAimWithAcceleration",
          "summary": ""
        },
        {
          "name": "processAllyDeath",
          "kind": "re-export",
          "signature": "processAllyDeath",
          "summary": ""
        },
        {
          "name": "processBarkQueue",
          "kind": "re-export",
          "signature": "processBarkQueue",
          "summary": ""
        },
        {
          "name": "processDamage",
          "kind": "re-export",
          "signature": "processDamage",
          "summary": ""
        },
        {
          "name": "processDamageMorale",
          "kind": "re-export",
          "signature": "processDamageMorale",
          "summary": ""
        },
        {
          "name": "processEnemyDeath",
          "kind": "re-export",
          "signature": "processEnemyDeath",
          "summary": ""
        },
        {
          "name": "processNoiseEvent",
          "kind": "re-export",
          "signature": "processNoiseEvent",
          "summary": ""
        },
        {
          "name": "processVisualDetection",
          "kind": "re-export",
          "signature": "processVisualDetection",
          "summary": ""
        },
        {
          "name": "propagateInfluence",
          "kind": "re-export",
          "signature": "propagateInfluence",
          "summary": ""
        },
        {
          "name": "proposeTreaty",
          "kind": "re-export",
          "signature": "proposeTreaty",
          "summary": ""
        },
        {
          "name": "pursue",
          "kind": "re-export",
          "signature": "pursue",
          "summary": ""
        },
        {
          "name": "pursueGoal",
          "kind": "re-export",
          "signature": "pursueGoal",
          "summary": ""
        },
        {
          "name": "quadraticCurve",
          "kind": "re-export",
          "signature": "quadraticCurve",
          "summary": ""
        },
        {
          "name": "queryKnowledge",
          "kind": "re-export",
          "signature": "queryKnowledge",
          "summary": ""
        },
        {
          "name": "queryRelationships",
          "kind": "re-export",
          "signature": "queryRelationships",
          "summary": ""
        },
        {
          "name": "queueBark",
          "kind": "re-export",
          "signature": "queueBark",
          "summary": ""
        },
        {
          "name": "radToDeg",
          "kind": "re-export",
          "signature": "radToDeg",
          "summary": ""
        },
        {
          "name": "rally",
          "kind": "re-export",
          "signature": "rally",
          "summary": ""
        },
        {
          "name": "rayAABBIntersect",
          "kind": "re-export",
          "signature": "rayAABBIntersect",
          "summary": ""
        },
        {
          "name": "raySphereIntersect",
          "kind": "re-export",
          "signature": "raySphereIntersect",
          "summary": ""
        },
        {
          "name": "reactToThreat",
          "kind": "re-export",
          "signature": "reactToThreat",
          "summary": ""
        },
        {
          "name": "readbackResults",
          "kind": "re-export",
          "signature": "readbackResults",
          "summary": ""
        },
        {
          "name": "recallEpisodesWithEmotion",
          "kind": "re-export",
          "signature": "recallEpisodesWithEmotion",
          "summary": ""
        },
        {
          "name": "recallEpisodesWithEntity",
          "kind": "re-export",
          "signature": "recallEpisodesWithEntity",
          "summary": ""
        },
        {
          "name": "recallRecentEpisodes",
          "kind": "re-export",
          "signature": "recallRecentEpisodes",
          "summary": ""
        },
        {
          "name": "recordInteraction",
          "kind": "re-export",
          "signature": "recordInteraction",
          "summary": ""
        },
        {
          "name": "recordWeaponFire",
          "kind": "re-export",
          "signature": "recordWeaponFire",
          "summary": ""
        },
        {
          "name": "registerAffix",
          "kind": "re-export",
          "signature": "registerAffix",
          "summary": ""
        },
        {
          "name": "registerFaction",
          "kind": "re-export",
          "signature": "registerFaction",
          "summary": ""
        },
        {
          "name": "registerItemDef",
          "kind": "re-export",
          "signature": "registerItemDef",
          "summary": ""
        },
        {
          "name": "registerListener",
          "kind": "re-export",
          "signature": "registerListener",
          "summary": ""
        },
        {
          "name": "registerLootTable",
          "kind": "re-export",
          "signature": "registerLootTable",
          "summary": ""
        },
        {
          "name": "registerNPC",
          "kind": "re-export",
          "signature": "registerNPC",
          "summary": ""
        },
        {
          "name": "registerNPCKnowledge",
          "kind": "re-export",
          "signature": "registerNPCKnowledge",
          "summary": ""
        },
        {
          "name": "registerQuest",
          "kind": "re-export",
          "signature": "registerQuest",
          "summary": ""
        },
        {
          "name": "registerRecipe",
          "kind": "re-export",
          "signature": "registerRecipe",
          "summary": ""
        },
        {
          "name": "registerResource",
          "kind": "re-export",
          "signature": "registerResource",
          "summary": ""
        },
        {
          "name": "registerSmartObject",
          "kind": "re-export",
          "signature": "registerSmartObject",
          "summary": ""
        },
        {
          "name": "registerSpawnType",
          "kind": "re-export",
          "signature": "registerSpawnType",
          "summary": ""
        },
        {
          "name": "registerSpecies",
          "kind": "re-export",
          "signature": "registerSpecies",
          "summary": ""
        },
        {
          "name": "registerThreat",
          "kind": "re-export",
          "signature": "registerThreat",
          "summary": ""
        },
        {
          "name": "releaseSlot",
          "kind": "re-export",
          "signature": "releaseSlot",
          "summary": ""
        },
        {
          "name": "removeBlackboardValue",
          "kind": "re-export",
          "signature": "removeBlackboardValue",
          "summary": ""
        },
        {
          "name": "removeCreature",
          "kind": "re-export",
          "signature": "removeCreature",
          "summary": ""
        },
        {
          "name": "removeCrowdAgent",
          "kind": "re-export",
          "signature": "removeCrowdAgent",
          "summary": ""
        },
        {
          "name": "removeFromFormation",
          "kind": "re-export",
          "signature": "removeFromFormation",
          "summary": ""
        },
        {
          "name": "removeFromInventory",
          "kind": "re-export",
          "signature": "removeFromInventory",
          "summary": ""
        },
        {
          "name": "removeFromSquad",
          "kind": "re-export",
          "signature": "removeFromSquad",
          "summary": ""
        },
        {
          "name": "removeGridLayer",
          "kind": "re-export",
          "signature": "removeGridLayer",
          "summary": ""
        },
        {
          "name": "removeThreat",
          "kind": "re-export",
          "signature": "removeThreat",
          "summary": ""
        },
        {
          "name": "reportQuestEvent",
          "kind": "re-export",
          "signature": "reportQuestEvent",
          "summary": ""
        },
        {
          "name": "reportSpawnKilled",
          "kind": "re-export",
          "signature": "reportSpawnKilled",
          "summary": ""
        },
        {
          "name": "reservePath",
          "kind": "re-export",
          "signature": "reservePath",
          "summary": ""
        },
        {
          "name": "reserveSlot",
          "kind": "re-export",
          "signature": "reserveSlot",
          "summary": ""
        },
        {
          "name": "resetNode",
          "kind": "re-export",
          "signature": "resetNode",
          "summary": ""
        },
        {
          "name": "resolveCircularAoE",
          "kind": "re-export",
          "signature": "resolveCircularAoE",
          "summary": ""
        },
        {
          "name": "resolveConeAoE",
          "kind": "re-export",
          "signature": "resolveConeAoE",
          "summary": ""
        },
        {
          "name": "rollLootTable",
          "kind": "re-export",
          "signature": "rollLootTable",
          "summary": ""
        },
        {
          "name": "rollRarity",
          "kind": "re-export",
          "signature": "rollRarity",
          "summary": ""
        },
        {
          "name": "sampleCombinedInfluence",
          "kind": "re-export",
          "signature": "sampleCombinedInfluence",
          "summary": ""
        },
        {
          "name": "satisfyNeed",
          "kind": "re-export",
          "signature": "satisfyNeed",
          "summary": ""
        },
        {
          "name": "satisfyPsychNeed",
          "kind": "re-export",
          "signature": "satisfyPsychNeed",
          "summary": ""
        },
        {
          "name": "scheduleEvent",
          "kind": "re-export",
          "signature": "scheduleEvent",
          "summary": ""
        },
        {
          "name": "scoreAction",
          "kind": "re-export",
          "signature": "scoreAction",
          "summary": ""
        },
        {
          "name": "scoreActionByValues",
          "kind": "re-export",
          "signature": "scoreActionByValues",
          "summary": ""
        },
        {
          "name": "scoreActivity",
          "kind": "re-export",
          "signature": "scoreActivity",
          "summary": ""
        },
        {
          "name": "scoreCoverPoint",
          "kind": "re-export",
          "signature": "scoreCoverPoint",
          "summary": ""
        },
        {
          "name": "searchEpisodes",
          "kind": "re-export",
          "signature": "searchEpisodes",
          "summary": ""
        },
        {
          "name": "seek",
          "kind": "re-export",
          "signature": "seek",
          "summary": ""
        },
        {
          "name": "selectActionBucketed",
          "kind": "re-export",
          "signature": "selectActionBucketed",
          "summary": ""
        },
        {
          "name": "selectActionWeighted",
          "kind": "re-export",
          "signature": "selectActionWeighted",
          "summary": ""
        },
        {
          "name": "selectActivity",
          "kind": "re-export",
          "signature": "selectActivity",
          "summary": ""
        },
        {
          "name": "selectBestAction",
          "kind": "re-export",
          "signature": "selectBestAction",
          "summary": ""
        },
        {
          "name": "selectBestWeapon",
          "kind": "re-export",
          "signature": "selectBestWeapon",
          "summary": ""
        },
        {
          "name": "selectChoice",
          "kind": "re-export",
          "signature": "selectChoice",
          "summary": ""
        },
        {
          "name": "selectTarget",
          "kind": "re-export",
          "signature": "selectTarget",
          "summary": ""
        },
        {
          "name": "sellToMarket",
          "kind": "re-export",
          "signature": "sellToMarket",
          "summary": ""
        },
        {
          "name": "senseDanger",
          "kind": "re-export",
          "signature": "senseDanger",
          "summary": ""
        },
        {
          "name": "senseVibrations",
          "kind": "re-export",
          "signature": "senseVibrations",
          "summary": ""
        },
        {
          "name": "separation",
          "kind": "re-export",
          "signature": "separation",
          "summary": ""
        },
        {
          "name": "setAIRngContext",
          "kind": "re-export",
          "signature": "setAIRngContext",
          "summary": ""
        },
        {
          "name": "setBlackboardValue",
          "kind": "re-export",
          "signature": "setBlackboardValue",
          "summary": ""
        },
        {
          "name": "setCellWalkable",
          "kind": "re-export",
          "signature": "setCellWalkable",
          "summary": ""
        },
        {
          "name": "setDialogueFlag",
          "kind": "re-export",
          "signature": "setDialogueFlag",
          "summary": ""
        },
        {
          "name": "setDiplomaticStance",
          "kind": "re-export",
          "signature": "setDiplomaticStance",
          "summary": ""
        },
        {
          "name": "setFlowDirection",
          "kind": "re-export",
          "signature": "setFlowDirection",
          "summary": ""
        },
        {
          "name": "setFocus",
          "kind": "re-export",
          "signature": "setFocus",
          "summary": ""
        },
        {
          "name": "setInfluenceAt",
          "kind": "re-export",
          "signature": "setInfluenceAt",
          "summary": ""
        },
        {
          "name": "setStrafeDirection",
          "kind": "re-export",
          "signature": "setStrafeDirection",
          "summary": ""
        },
        {
          "name": "setTerrainHeight",
          "kind": "re-export",
          "signature": "setTerrainHeight",
          "summary": ""
        },
        {
          "name": "setTerrainType",
          "kind": "re-export",
          "signature": "setTerrainType",
          "summary": ""
        },
        {
          "name": "setValue",
          "kind": "re-export",
          "signature": "setValue",
          "summary": ""
        },
        {
          "name": "setVehiclePath",
          "kind": "re-export",
          "signature": "setVehiclePath",
          "summary": ""
        },
        {
          "name": "shareKnowledge",
          "kind": "re-export",
          "signature": "shareKnowledge",
          "summary": ""
        },
        {
          "name": "shareTeamInfo",
          "kind": "re-export",
          "signature": "shareTeamInfo",
          "summary": ""
        },
        {
          "name": "shouldBeAggressive",
          "kind": "re-export",
          "signature": "shouldBeAggressive",
          "summary": ""
        },
        {
          "name": "shouldFlee",
          "kind": "re-export",
          "signature": "shouldFlee",
          "summary": ""
        },
        {
          "name": "shouldSeekCover",
          "kind": "re-export",
          "signature": "shouldSeekCover",
          "summary": ""
        },
        {
          "name": "shouldSurrender",
          "kind": "re-export",
          "signature": "shouldSurrender",
          "summary": ""
        },
        {
          "name": "shouldUseGPURaycast",
          "kind": "re-export",
          "signature": "shouldUseGPURaycast",
          "summary": ""
        },
        {
          "name": "smellAt",
          "kind": "re-export",
          "signature": "smellAt",
          "summary": ""
        },
        {
          "name": "smoothstepCurve",
          "kind": "re-export",
          "signature": "smoothstepCurve",
          "summary": ""
        },
        {
          "name": "spatialHashClear",
          "kind": "re-export",
          "signature": "spatialHashClear",
          "summary": ""
        },
        {
          "name": "spatialHashCount",
          "kind": "re-export",
          "signature": "spatialHashCount",
          "summary": ""
        },
        {
          "name": "spatialHashInsert",
          "kind": "re-export",
          "signature": "spatialHashInsert",
          "summary": ""
        },
        {
          "name": "spatialHashKNearest",
          "kind": "re-export",
          "signature": "spatialHashKNearest",
          "summary": ""
        },
        {
          "name": "spatialHashQueryAABB",
          "kind": "re-export",
          "signature": "spatialHashQueryAABB",
          "summary": ""
        },
        {
          "name": "spatialHashQueryRadius",
          "kind": "re-export",
          "signature": "spatialHashQueryRadius",
          "summary": ""
        },
        {
          "name": "spatialHashQueryRadius2D",
          "kind": "re-export",
          "signature": "spatialHashQueryRadius2D",
          "summary": ""
        },
        {
          "name": "spatialHashRebuild",
          "kind": "re-export",
          "signature": "spatialHashRebuild",
          "summary": ""
        },
        {
          "name": "spatialHashRemove",
          "kind": "re-export",
          "signature": "spatialHashRemove",
          "summary": ""
        },
        {
          "name": "spatialHashUpdate",
          "kind": "re-export",
          "signature": "spatialHashUpdate",
          "summary": ""
        },
        {
          "name": "spawnCreature",
          "kind": "re-export",
          "signature": "spawnCreature",
          "summary": ""
        },
        {
          "name": "spreadKnowledge",
          "kind": "re-export",
          "signature": "spreadKnowledge",
          "summary": ""
        },
        {
          "name": "stampInfluence",
          "kind": "re-export",
          "signature": "stampInfluence",
          "summary": ""
        },
        {
          "name": "startConversation",
          "kind": "re-export",
          "signature": "startConversation",
          "summary": ""
        },
        {
          "name": "startDodge",
          "kind": "re-export",
          "signature": "startDodge",
          "summary": ""
        },
        {
          "name": "startMeleeAttack",
          "kind": "re-export",
          "signature": "startMeleeAttack",
          "summary": ""
        },
        {
          "name": "startPeek",
          "kind": "re-export",
          "signature": "startPeek",
          "summary": ""
        },
        {
          "name": "stepCurve",
          "kind": "re-export",
          "signature": "stepCurve",
          "summary": ""
        },
        {
          "name": "storeBelief",
          "kind": "re-export",
          "signature": "storeBelief",
          "summary": ""
        },
        {
          "name": "storeEpisode",
          "kind": "re-export",
          "signature": "storeEpisode",
          "summary": ""
        },
        {
          "name": "storeFact",
          "kind": "re-export",
          "signature": "storeFact",
          "summary": ""
        },
        {
          "name": "storeRelationship",
          "kind": "re-export",
          "signature": "storeRelationship",
          "summary": ""
        },
        {
          "name": "sweepMeleeArc",
          "kind": "re-export",
          "signature": "sweepMeleeArc",
          "summary": ""
        },
        {
          "name": "sweptSphereSphere",
          "kind": "re-export",
          "signature": "sweptSphereSphere",
          "summary": ""
        },
        {
          "name": "sweptSphereSphereMoving",
          "kind": "re-export",
          "signature": "sweptSphereSphereMoving",
          "summary": ""
        },
        {
          "name": "terrainCellToWorld",
          "kind": "re-export",
          "signature": "terrainCellToWorld",
          "summary": ""
        },
        {
          "name": "tickNode",
          "kind": "re-export",
          "signature": "tickNode",
          "summary": ""
        },
        {
          "name": "tickTree",
          "kind": "re-export",
          "signature": "tickTree",
          "summary": ""
        },
        {
          "name": "triggerEvacuation",
          "kind": "re-export",
          "signature": "triggerEvacuation",
          "summary": ""
        },
        {
          "name": "triggerPanic",
          "kind": "re-export",
          "signature": "triggerPanic",
          "summary": ""
        },
        {
          "name": "turnInQuest",
          "kind": "re-export",
          "signature": "turnInQuest",
          "summary": ""
        },
        {
          "name": "unregisterNPC",
          "kind": "re-export",
          "signature": "unregisterNPC",
          "summary": ""
        },
        {
          "name": "updateAIAimingSystem",
          "kind": "re-export",
          "signature": "updateAIAimingSystem",
          "summary": ""
        },
        {
          "name": "updateAIDirector",
          "kind": "re-export",
          "signature": "updateAIDirector",
          "summary": ""
        },
        {
          "name": "updateAllyInfluence",
          "kind": "re-export",
          "signature": "updateAllyInfluence",
          "summary": ""
        },
        {
          "name": "updateAvailableQuests",
          "kind": "re-export",
          "signature": "updateAvailableQuests",
          "summary": ""
        },
        {
          "name": "updateBeamTracking",
          "kind": "re-export",
          "signature": "updateBeamTracking",
          "summary": ""
        },
        {
          "name": "updateCharacterState",
          "kind": "re-export",
          "signature": "updateCharacterState",
          "summary": ""
        },
        {
          "name": "updateCoverState",
          "kind": "re-export",
          "signature": "updateCoverState",
          "summary": ""
        },
        {
          "name": "updateCreature",
          "kind": "re-export",
          "signature": "updateCreature",
          "summary": ""
        },
        {
          "name": "updateCrowd",
          "kind": "re-export",
          "signature": "updateCrowd",
          "summary": ""
        },
        {
          "name": "updateDifficulty",
          "kind": "re-export",
          "signature": "updateDifficulty",
          "summary": ""
        },
        {
          "name": "updateEconomy",
          "kind": "re-export",
          "signature": "updateEconomy",
          "summary": ""
        },
        {
          "name": "updateEcosystem",
          "kind": "re-export",
          "signature": "updateEcosystem",
          "summary": ""
        },
        {
          "name": "updateEnvironmentReadings",
          "kind": "re-export",
          "signature": "updateEnvironmentReadings",
          "summary": ""
        },
        {
          "name": "updateEvasion",
          "kind": "re-export",
          "signature": "updateEvasion",
          "summary": ""
        },
        {
          "name": "updateEvents",
          "kind": "re-export",
          "signature": "updateEvents",
          "summary": ""
        },
        {
          "name": "updateFormationMovement",
          "kind": "re-export",
          "signature": "updateFormationMovement",
          "summary": ""
        },
        {
          "name": "updateGoalProgress",
          "kind": "re-export",
          "signature": "updateGoalProgress",
          "summary": ""
        },
        {
          "name": "updateGrenade",
          "kind": "re-export",
          "signature": "updateGrenade",
          "summary": ""
        },
        {
          "name": "updateInteraction",
          "kind": "re-export",
          "signature": "updateInteraction",
          "summary": ""
        },
        {
          "name": "updateKnowledgePropagation",
          "kind": "re-export",
          "signature": "updateKnowledgePropagation",
          "summary": ""
        },
        {
          "name": "updateListenerPosition",
          "kind": "re-export",
          "signature": "updateListenerPosition",
          "summary": ""
        },
        {
          "name": "updateMarketPrices",
          "kind": "re-export",
          "signature": "updateMarketPrices",
          "summary": ""
        },
        {
          "name": "updateMeleeAttack",
          "kind": "re-export",
          "signature": "updateMeleeAttack",
          "summary": ""
        },
        {
          "name": "updateMorale",
          "kind": "re-export",
          "signature": "updateMorale",
          "summary": ""
        },
        {
          "name": "updateMoraleContext",
          "kind": "re-export",
          "signature": "updateMoraleContext",
          "summary": ""
        },
        {
          "name": "updateNeeds",
          "kind": "re-export",
          "signature": "updateNeeds",
          "summary": ""
        },
        {
          "name": "updateObjectiveProgress",
          "kind": "re-export",
          "signature": "updateObjectiveProgress",
          "summary": ""
        },
        {
          "name": "updatePacing",
          "kind": "re-export",
          "signature": "updatePacing",
          "summary": ""
        },
        {
          "name": "updatePerception",
          "kind": "re-export",
          "signature": "updatePerception",
          "summary": ""
        },
        {
          "name": "updatePlayerPosition",
          "kind": "re-export",
          "signature": "updatePlayerPosition",
          "summary": ""
        },
        {
          "name": "updatePlayerState",
          "kind": "re-export",
          "signature": "updatePlayerState",
          "summary": ""
        },
        {
          "name": "updateProductionBuilding",
          "kind": "re-export",
          "signature": "updateProductionBuilding",
          "summary": ""
        },
        {
          "name": "updateProjectile",
          "kind": "re-export",
          "signature": "updateProjectile",
          "summary": ""
        },
        {
          "name": "updateScentSystem",
          "kind": "re-export",
          "signature": "updateScentSystem",
          "summary": ""
        },
        {
          "name": "updateScheduler",
          "kind": "re-export",
          "signature": "updateScheduler",
          "summary": ""
        },
        {
          "name": "updateSoundSystem",
          "kind": "re-export",
          "signature": "updateSoundSystem",
          "summary": ""
        },
        {
          "name": "updateSpawnDirector",
          "kind": "re-export",
          "signature": "updateSpawnDirector",
          "summary": ""
        },
        {
          "name": "updateSquadFormations",
          "kind": "re-export",
          "signature": "updateSquadFormations",
          "summary": ""
        },
        {
          "name": "updateSquadTactics",
          "kind": "re-export",
          "signature": "updateSquadTactics",
          "summary": ""
        },
        {
          "name": "updateSteering",
          "kind": "re-export",
          "signature": "updateSteering",
          "summary": ""
        },
        {
          "name": "updateStrafe",
          "kind": "re-export",
          "signature": "updateStrafe",
          "summary": ""
        },
        {
          "name": "updateTargetMemory",
          "kind": "re-export",
          "signature": "updateTargetMemory",
          "summary": ""
        },
        {
          "name": "updateThreatInfluence",
          "kind": "re-export",
          "signature": "updateThreatInfluence",
          "summary": ""
        },
        {
          "name": "updateTrafficSystem",
          "kind": "re-export",
          "signature": "updateTrafficSystem",
          "summary": ""
        },
        {
          "name": "updateUtilityBrain",
          "kind": "re-export",
          "signature": "updateUtilityBrain",
          "summary": ""
        },
        {
          "name": "updateVehicleAI",
          "kind": "re-export",
          "signature": "updateVehicleAI",
          "summary": ""
        },
        {
          "name": "updateVehiclePhysics",
          "kind": "re-export",
          "signature": "updateVehiclePhysics",
          "summary": ""
        },
        {
          "name": "updateWeather",
          "kind": "re-export",
          "signature": "updateWeather",
          "summary": ""
        },
        {
          "name": "updateWorldState",
          "kind": "re-export",
          "signature": "updateWorldState",
          "summary": ""
        },
        {
          "name": "uploadAABBTargets",
          "kind": "re-export",
          "signature": "uploadAABBTargets",
          "summary": ""
        },
        {
          "name": "uploadRays",
          "kind": "re-export",
          "signature": "uploadRays",
          "summary": ""
        },
        {
          "name": "uploadSphereTargets",
          "kind": "re-export",
          "signature": "uploadSphereTargets",
          "summary": ""
        },
        {
          "name": "validatePerception",
          "kind": "re-export",
          "signature": "validatePerception",
          "summary": ""
        },
        {
          "name": "validatePersonality",
          "kind": "re-export",
          "signature": "validatePersonality",
          "summary": ""
        },
        {
          "name": "validateSteeringAgent",
          "kind": "re-export",
          "signature": "validateSteeringAgent",
          "summary": ""
        },
        {
          "name": "valuesPositively",
          "kind": "re-export",
          "signature": "valuesPositively",
          "summary": ""
        },
        {
          "name": "wander",
          "kind": "re-export",
          "signature": "wander",
          "summary": ""
        },
        {
          "name": "willHelp",
          "kind": "re-export",
          "signature": "willHelp",
          "summary": ""
        },
        {
          "name": "workingMemoryPush",
          "kind": "re-export",
          "signature": "workingMemoryPush",
          "summary": ""
        },
        {
          "name": "worldToGrid",
          "kind": "re-export",
          "signature": "worldToGrid",
          "summary": ""
        },
        {
          "name": "worldToInfluenceCell",
          "kind": "re-export",
          "signature": "worldToInfluenceCell",
          "summary": ""
        },
        {
          "name": "worldToTerrainCell",
          "kind": "re-export",
          "signature": "worldToTerrainCell",
          "summary": ""
        },
        {
          "name": "wouldDoAction",
          "kind": "re-export",
          "signature": "wouldDoAction",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/cloth/ClothSimWorld",
      "path": "engine/reference/sim/cloth/ClothSimWorld.md",
      "source": "engine/sim/cloth/ClothSimWorld.js",
      "import": "/engine/sim/cloth/ClothSimWorld.js",
      "sourceHash": "6d164b298bf0832b0451a7aafb33e8c3d98de0d3e19b1423bd5ec6743d47577d",
      "summary": "",
      "exports": [
        {
          "name": "createClothSimWorld",
          "kind": "function",
          "signature": "createClothSimWorld(options = {})",
          "summary": ""
        },
        {
          "name": "destroyClothSimWorld",
          "kind": "function",
          "signature": "destroyClothSimWorld(world)",
          "summary": ""
        },
        {
          "name": "addClothInstance",
          "kind": "function",
          "signature": "addClothInstance(world, descriptor)",
          "summary": ""
        },
        {
          "name": "removeClothInstance",
          "kind": "function",
          "signature": "removeClothInstance(world, instanceId)",
          "summary": ""
        },
        {
          "name": "stepClothSimWorld",
          "kind": "function",
          "signature": "stepClothSimWorld(world, deltaSeconds, options = {})",
          "summary": ""
        },
        {
          "name": "getClothInstanceRenderData",
          "kind": "function",
          "signature": "getClothInstanceRenderData(world, instanceId)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FDTDSolver",
      "path": "engine/reference/sim/fluids/FDTDSolver.md",
      "source": "engine/sim/fluids/FDTDSolver.js",
      "import": "/engine/sim/fluids/FDTDSolver.js",
      "sourceHash": "01adf43e7c4d726151478071d8074a86ece5883450f2723d34a6022ec08be1e3",
      "summary": "Yee cell field components Staggered grid: E at integers, H at half-integers",
      "exports": [
        {
          "name": "YeeCell",
          "kind": "class",
          "signature": "class YeeCell",
          "summary": "Yee cell field components Staggered grid: E at integers, H at half-integers"
        },
        {
          "name": "TimeVaryingMaterial",
          "kind": "class",
          "signature": "class TimeVaryingMaterial",
          "summary": "Time-varying material properties"
        },
        {
          "name": "FDTDSource",
          "kind": "class",
          "signature": "class FDTDSource",
          "summary": ""
        },
        {
          "name": "FDTDSolver",
          "kind": "class",
          "signature": "class FDTDSolver",
          "summary": ""
        },
        {
          "name": "PHYSICS",
          "kind": "constant",
          "signature": "PHYSICS",
          "summary": "Physical constants"
        },
        {
          "name": "MaterialType",
          "kind": "constant",
          "signature": "MaterialType",
          "summary": "Material types"
        },
        {
          "name": "BoundaryCondition",
          "kind": "constant",
          "signature": "BoundaryCondition",
          "summary": "Boundary conditions"
        },
        {
          "name": "SourceType",
          "kind": "constant",
          "signature": "SourceType",
          "summary": "Source types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidBoundary",
      "path": "engine/reference/sim/fluids/FluidBoundary.md",
      "source": "engine/sim/fluids/FluidBoundary.js",
      "import": "/engine/sim/fluids/FluidBoundary.js",
      "sourceHash": "b26f5abe060c42247dec6134be23f2bdeb0207c22dc9bc350d68c577bb55e6fe",
      "summary": "Generate WGSL shader for applying solid boundaries to velocity This should run after the pressure projection step",
      "exports": [
        {
          "name": "createBoundaryShader",
          "kind": "function",
          "signature": "createBoundaryShader(workgroupSize = 256)",
          "summary": "Generate WGSL shader for applying solid boundaries to velocity This should run after the pressure projection step"
        },
        {
          "name": "createPressureSolveWithBoundaryShader",
          "kind": "function",
          "signature": "createPressureSolveWithBoundaryShader(workgroupSize = 256)",
          "summary": "Generate WGSL shader for pressure solve with solid boundaries Modifies the Jacobi iteration to handle solid cells"
        },
        {
          "name": "createBoundaryPipeline",
          "kind": "function",
          "signature": "createBoundaryPipeline(device, options = {})",
          "summary": "Create boundary enforcement pipeline"
        },
        {
          "name": "applyBoundaries",
          "kind": "function",
          "signature": "applyBoundaries(encoder, config)",
          "summary": "Apply solid boundaries to velocity field"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidConfig",
      "path": "engine/reference/sim/fluids/FluidConfig.md",
      "source": "engine/sim/fluids/FluidConfig.js",
      "import": "/engine/sim/fluids/FluidConfig.js",
      "sourceHash": "31bce74b2726dd1c8e25465dbcb6b588f98c95e9130192517ed24ba9946397b5",
      "summary": "",
      "exports": [
        {
          "name": "normalizeFluidGridSize",
          "kind": "function",
          "signature": "normalizeFluidGridSize(input)",
          "summary": ""
        },
        {
          "name": "DEFAULT_FLUID_GRID_SIZE",
          "kind": "constant",
          "signature": "DEFAULT_FLUID_GRID_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidCpuWorld",
      "path": "engine/reference/sim/fluids/FluidCpuWorld.md",
      "source": "engine/sim/fluids/FluidCpuWorld.js",
      "import": "/engine/sim/fluids/FluidCpuWorld.js",
      "sourceHash": "10ab03c7926992cfce74e481fbe7bed3a2b8255108a5a0ea9d285766fae6c136",
      "summary": "",
      "exports": [
        {
          "name": "createFluidCpuWorld",
          "kind": "function",
          "signature": "createFluidCpuWorld(options = {})",
          "summary": ""
        },
        {
          "name": "destroyFluidCpuWorld",
          "kind": "function",
          "signature": "destroyFluidCpuWorld(world)",
          "summary": ""
        },
        {
          "name": "stepFluidCpuWorld",
          "kind": "function",
          "signature": "stepFluidCpuWorld(world, deltaSeconds)",
          "summary": ""
        },
        {
          "name": "applyFluidSourcesCpu",
          "kind": "function",
          "signature": "applyFluidSourcesCpu(world, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidMPM",
      "path": "engine/reference/sim/fluids/FluidMPM.md",
      "source": "engine/sim/fluids/FluidMPM.js",
      "import": "/engine/sim/fluids/FluidMPM.js",
      "sourceHash": "2ff1934cce0b34f40834e21d8aeeb26bb46a1c0614486838dc7bb7d1642421a8",
      "summary": "Create MPM-specific buffers for the fluid simulation",
      "exports": [
        {
          "name": "createMPMBuffers",
          "kind": "function",
          "signature": "createMPMBuffers(device, gridSize, maxParticles)",
          "summary": "Create MPM-specific buffers for the fluid simulation"
        },
        {
          "name": "destroyMPMBuffers",
          "kind": "function",
          "signature": "destroyMPMBuffers(mpm)",
          "summary": "Destroy MPM buffers"
        },
        {
          "name": "createP2GShader",
          "kind": "function",
          "signature": "createP2GShader(workgroupSize = 256)",
          "summary": "Generate the P2G (Particle to Grid) compute shader Uses linear kernel (tent function) for simplicity"
        },
        {
          "name": "createGridUpdateShader",
          "kind": "function",
          "signature": "createGridUpdateShader(workgroupSize = 256)",
          "summary": "Generate the Grid Update compute shader Converts accumulated momentum to velocity, applies forces and boundaries"
        },
        {
          "name": "createG2PShader",
          "kind": "function",
          "signature": "createG2PShader(workgroupSize = 256)",
          "summary": "Generate the G2P (Grid to Particle) compute shader"
        },
        {
          "name": "createMPMPipelines",
          "kind": "function",
          "signature": "createMPMPipelines(device, options = {})",
          "summary": "Create MPM compute pipelines"
        },
        {
          "name": "createMPMWorld",
          "kind": "function",
          "signature": "createMPMWorld(device, options = {})",
          "summary": "Create a complete MPM simulation world"
        },
        {
          "name": "destroyMPMWorld",
          "kind": "function",
          "signature": "destroyMPMWorld(world)",
          "summary": "Destroy MPM world"
        },
        {
          "name": "stepMPMWorld",
          "kind": "function",
          "signature": "stepMPMWorld(world, particles, dt, options = {})",
          "summary": "Step the MPM simulation"
        },
        {
          "name": "setMPMWorldBounds",
          "kind": "function",
          "signature": "setMPMWorldBounds(world, worldMin, worldMax)",
          "summary": "Update MPM world bounds"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidPhaseChange",
      "path": "engine/reference/sim/fluids/FluidPhaseChange.md",
      "source": "engine/sim/fluids/FluidPhaseChange.js",
      "import": "/engine/sim/fluids/FluidPhaseChange.js",
      "sourceHash": "2b94f59f3bf52fa9582c3d5f39114a21d9ba4bade7d41504742d6f8defd8299a",
      "summary": "Create phase change data structures",
      "exports": [
        {
          "name": "createPhaseChangeBuffers",
          "kind": "function",
          "signature": "createPhaseChangeBuffers(device, gridSize, maxParticles)",
          "summary": "Create phase change data structures"
        },
        {
          "name": "createSpellForce",
          "kind": "function",
          "signature": "createSpellForce(position, direction, power, element)",
          "summary": "Spell force injection point"
        },
        {
          "name": "createSpellForceShader",
          "kind": "function",
          "signature": "createSpellForceShader(workgroupSize = 256)",
          "summary": "Generate shader for applying spell forces to fluid"
        },
        {
          "name": "createFreezeShader",
          "kind": "function",
          "signature": "createFreezeShader(workgroupSize = 256)",
          "summary": "Generate shader for freeze effect (temperature-based phase transition)"
        },
        {
          "name": "createCrystallizationShader",
          "kind": "function",
          "signature": "createCrystallizationShader(workgroupSize = 256)",
          "summary": "Generate shader for particle-based crystallization chain reaction Physics-based with latent heat buffer, hysteresis, and asymmetric rates Key concepts from real physics: - Latent heat: Energy absorbed/released during phase change while temp stays constant - Hysteresis: Different thresholds for freezing vs melting (prevents flickering) - Supercooling: Fluid can stay liquid below freezing until nucleation occurs"
        },
        {
          "name": "createSolidCollisionShader",
          "kind": "function",
          "signature": "createSolidCollisionShader(workgroupSize = 256)",
          "summary": "Generate shader for solid particle collision Frozen particles get rigid collision with world, entities, AND other particles Also handles temperature transfer on contact"
        },
        {
          "name": "createCrystalBondShader",
          "kind": "function",
          "signature": "createCrystalBondShader(workgroupSize = 256)",
          "summary": "Generate shader for crystal bond formation Finds nearby frozen particles and creates rigid bonds between them"
        },
        {
          "name": "createBondConstraintShader",
          "kind": "function",
          "signature": "createBondConstraintShader(workgroupSize = 256)",
          "summary": "Generate shader for bond constraint solving (Position-Based Dynamics) Maintains rigid crystal structure by keeping bonded particles at fixed distances"
        },
        {
          "name": "createSolidCollisionPipeline",
          "kind": "function",
          "signature": "createSolidCollisionPipeline(device, workgroupSize = 256)",
          "summary": "Create compute pipeline for solid particle collision"
        },
        {
          "name": "createCrystalBondPipeline",
          "kind": "function",
          "signature": "createCrystalBondPipeline(device, workgroupSize = 256)",
          "summary": "Create compute pipeline for crystal bond formation"
        },
        {
          "name": "createBondConstraintPipeline",
          "kind": "function",
          "signature": "createBondConstraintPipeline(device, workgroupSize = 256)",
          "summary": "Create compute pipeline for bond constraint solving"
        },
        {
          "name": "stepSolidCollision",
          "kind": "function",
          "signature": "stepSolidCollision(device, collisionPipeline, phaseBuffers, particleWorld, colliderData, roomBounds, dt, options = {})",
          "summary": "Step the solid collision system"
        },
        {
          "name": "stepCrystalBonds",
          "kind": "function",
          "signature": "stepCrystalBonds(device, bondPipeline, phaseBuffers, particleWorld, options = {})",
          "summary": "Step the crystal bond formation system"
        },
        {
          "name": "stepBondConstraints",
          "kind": "function",
          "signature": "stepBondConstraints(device, constraintPipeline, phaseBuffers, particleWorld, bondCount, options = {})",
          "summary": "Step the bond constraint solver (PBD) Run multiple iterations for stability"
        },
        {
          "name": "readBondCount",
          "kind": "function",
          "signature": "async readBondCount(device, phaseBuffers)",
          "summary": "Read bond count from GPU (async)"
        },
        {
          "name": "clearBonds",
          "kind": "function",
          "signature": "clearBonds(device, phaseBuffers)",
          "summary": "Clear all bonds (for reset or when spawning rigid body)"
        },
        {
          "name": "stepCrystalSystem",
          "kind": "function",
          "signature": "stepCrystalSystem(device, systems, phaseBuffers, particleWorld, colliderData, roomBounds, dt, options = {})",
          "summary": "Full crystal system - combines all steps Call this each frame to handle solidification, collision, bonding, and constraints"
        },
        {
          "name": "createCrystalSystemPipelines",
          "kind": "function",
          "signature": "createCrystalSystemPipelines(device, workgroupSize = 256)",
          "summary": "Create all crystal system pipelines at once"
        },
        {
          "name": "extractCrystalClusters",
          "kind": "function",
          "signature": "async extractCrystalClusters(device, phaseBuffers, particleWorld, minClusterSize = 5)",
          "summary": "Extract connected crystal clusters from bonds for rigid body spawning Uses Union-Find algorithm to identify connected components"
        },
        {
          "name": "createSeedInjectionParams",
          "kind": "function",
          "signature": "createSeedInjectionParams(position, radius, seedStrength, temperature, magicSaturation)",
          "summary": "Inject seed particles at a position (ice spell impact, magic anchor, etc.)"
        },
        {
          "name": "createCrystallizationPipeline",
          "kind": "function",
          "signature": "createCrystallizationPipeline(device, workgroupSize = 256)",
          "summary": "Create compute pipeline for crystallization chain reaction"
        },
        {
          "name": "stepCrystallization",
          "kind": "function",
          "signature": "stepCrystallization(device, crystallization, phaseBuffers, particleWorld, dt, options = {})",
          "summary": "Step the crystallization system - run compute pass to propagate freezing"
        },
        {
          "name": "injectFreezeSeeds",
          "kind": "function",
          "signature": "injectFreezeSeeds(device, phaseBuffers, particleWorld, seedParams)",
          "summary": "Inject freeze seeds at a world position (for ice spell impact) Affects particles within radius - sets their temp/magic/seed values"
        },
        {
          "name": "injectHeatSeeds",
          "kind": "function",
          "signature": "injectHeatSeeds(device, phaseBuffers, particleWorld, seedParams)",
          "summary": ""
        },
        {
          "name": "applyPhaseVisuals",
          "kind": "function",
          "signature": "applyPhaseVisuals(device, phaseBuffers, particleWorld, options = {})",
          "summary": "Apply visual effects based on phase state (color frozen particles blue/white) Call this after stepCrystallization to update particle rendering"
        },
        {
          "name": "extractFrozenShape",
          "kind": "function",
          "signature": "async extractFrozenShape(device, phaseChangeBuffers, gridSize, worldMin, cellSize)",
          "summary": "Extract frozen region as convex hull for rigid body creation This runs on CPU after GPU freeze pass"
        },
        {
          "name": "clearFreezeRegion",
          "kind": "function",
          "signature": "clearFreezeRegion(device, phaseChangeBuffers)",
          "summary": "Clear freeze region after rigid body is spawned"
        },
        {
          "name": "injectMeltedFluid",
          "kind": "function",
          "signature": "injectMeltedFluid(device, fluidWorld, position, velocity, mass, radius)",
          "summary": "Inject mass/momentum when melting a rigid body"
        },
        {
          "name": "destroyPhaseChangeBuffers",
          "kind": "function",
          "signature": "destroyPhaseChangeBuffers(buffers)",
          "summary": "Destroy phase change buffers"
        },
        {
          "name": "destroyCrystalSystemPipelines",
          "kind": "function",
          "signature": "destroyCrystalSystemPipelines(systems)",
          "summary": "Destroy crystal system pipelines"
        },
        {
          "name": "extractFrozenParticles",
          "kind": "function",
          "signature": "async extractFrozenParticles(device, phaseBuffer, positionBuffer, particleCount, minClusterSize = 5)",
          "summary": "Extract frozen particle cluster for rigid body spawning Returns particles that are FROZEN phase and form a connected cluster"
        },
        {
          "name": "FluidPhase",
          "kind": "constant",
          "signature": "FluidPhase",
          "summary": "Phase states for fluid cells/particles"
        },
        {
          "name": "PARTICLE_PHASE_STRIDE",
          "kind": "constant",
          "signature": "PARTICLE_PHASE_STRIDE",
          "summary": "Particle solidification attributes (per-particle) - temperature: Current temp (ambient ~20, freezing < 0) - magicSaturation: 0-1, how much \"freeze magic\" has accumulated - solidPhase: 0=fluid, 1=freezing, 2=frozen - seedStrength: If > 0, this particle spreads solidification"
        },
        {
          "name": "BOND_STRIDE",
          "kind": "constant",
          "signature": "BOND_STRIDE",
          "summary": "Crystal bond attributes (per-bond) Stores connections between frozen particles forming crystal lattice - particleA: index of first particle - particleB: index of second particle - restDistance: original distance when bond formed (constraint target) - stiffness: bond strength (0-1, higher = more rigid)"
        },
        {
          "name": "MAX_BONDS_PER_PARTICLE",
          "kind": "constant",
          "signature": "MAX_BONDS_PER_PARTICLE",
          "summary": ""
        },
        {
          "name": "DEFAULT_CRYSTAL_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_CRYSTAL_PARAMS",
          "summary": "Default crystallization parameters - tuned for fast freeze, slow melt"
        },
        {
          "name": "DEFAULT_SOLID_COLLISION_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_SOLID_COLLISION_PARAMS",
          "summary": "Default solid collision parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidSimWorld",
      "path": "engine/reference/sim/fluids/FluidSimWorld.md",
      "source": "engine/sim/fluids/FluidSimWorld.js",
      "import": "/engine/sim/fluids/FluidSimWorld.js",
      "sourceHash": "037697cc4da869262c5332059293f8ff3aa319482908f1b5dc6f9c32daf8251e",
      "summary": "Clear/reset the density and velocity buffers to zero. Use this when bounds change significantly to prevent stale data from appearing at wrong world-space locations.",
      "exports": [
        {
          "name": "createFluidSimWorld",
          "kind": "function",
          "signature": "async createFluidSimWorld(gpuDevice, options = {})",
          "summary": ""
        },
        {
          "name": "destroyFluidSimWorld",
          "kind": "function",
          "signature": "destroyFluidSimWorld(world)",
          "summary": ""
        },
        {
          "name": "clearFluidSimWorld",
          "kind": "function",
          "signature": "clearFluidSimWorld(world)",
          "summary": "Clear/reset the density and velocity buffers to zero. Use this when bounds change significantly to prevent stale data from appearing at wrong world-space locations."
        },
        {
          "name": "stepFluidSimWorld",
          "kind": "function",
          "signature": "stepFluidSimWorld(world, deltaSeconds, options = {})",
          "summary": ""
        },
        {
          "name": "clearFluidDensity",
          "kind": "function",
          "signature": "clearFluidDensity(world, options = {})",
          "summary": "Clear the density and color buffers to zero. Used in particle-as-smoke mode to reset before splatting particle positions/colors."
        },
        {
          "name": "initFluidSimWorldLazy",
          "kind": "function",
          "signature": "async initFluidSimWorldLazy(options)",
          "summary": "Initialize fluid sim world lazily with bind group creation for smoke rendering. This is a convenience function that handles the full setup sequence."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidSimulation",
      "path": "engine/reference/sim/fluids/FluidSimulation.md",
      "source": "engine/sim/fluids/FluidSimulation.js",
      "import": "/engine/sim/fluids/FluidSimulation.js",
      "sourceHash": "1fd8b00464f1eb30af8ef2addb07c01849fc41e9fb9528075aa45fbe414dfe34",
      "summary": "Per-voxel simulation metadata Stored separately from material ID to avoid expanding chunks",
      "exports": [
        {
          "name": "FluidMetadata",
          "kind": "class",
          "signature": "class FluidMetadata",
          "summary": "Per-voxel simulation metadata Stored separately from material ID to avoid expanding chunks"
        },
        {
          "name": "FluidSimulator",
          "kind": "class",
          "signature": "class FluidSimulator",
          "summary": ""
        },
        {
          "name": "MATERIAL_PROPERTIES",
          "kind": "constant",
          "signature": "MATERIAL_PROPERTIES",
          "summary": "Physical properties for each material type Properties: - type: 'solid' | 'powder' | 'liquid' | 'gas' | 'fire' - density: Higher density sinks below lower density (0-100) - viscosity: How slowly liquid spreads (0=instant, 1=very slow) - flammable: Can catch fire - burnTime: Ticks until destroyed by fire - spreadRate: How many cells to check for spreading (liquids/gases)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidSourceSplat",
      "path": "engine/reference/sim/fluids/FluidSourceSplat.md",
      "source": "engine/sim/fluids/FluidSourceSplat.js",
      "import": "/engine/sim/fluids/FluidSourceSplat.js",
      "sourceHash": "fd6cea4442f86c5b9dfd46318e1ea95bfdd2f073323e025390bd694efba0f9bd",
      "summary": "PARTICLES AS SMOKE - splat density at each particle position. Each particle IS the smoke - not a separate effect. Inherits from particle: - Position → where density is splatted - Size (from meta.a) → splat radius - Color (from meta.rgb) → smoke color (sampled by smoke shader) - Age/Lifetime → fade behavior When raymarched, overlapping particles merge into smooth fluid blobs.",
      "exports": [
        {
          "name": "splatFluidSources",
          "kind": "function",
          "signature": "async splatFluidSources(fluidWorld, gpuDevice, options = {})",
          "summary": ""
        },
        {
          "name": "disposeFluidSourceSplat",
          "kind": "function",
          "signature": "disposeFluidSourceSplat(device)",
          "summary": ""
        },
        {
          "name": "splatParticleDensity",
          "kind": "function",
          "signature": "splatParticleDensity(fluidWorld, particleWorld, options = {})",
          "summary": "PARTICLES AS SMOKE - splat density at each particle position. Each particle IS the smoke - not a separate effect. Inherits from particle: - Position → where density is splatted - Size (from meta.a) → splat radius - Color (from meta.rgb) → smoke color (sampled by smoke shader) - Age/Lifetime → fade behavior When raymarched, overlapping particles merge into smooth fluid blobs."
        },
        {
          "name": "disposeParticleSplat",
          "kind": "function",
          "signature": "disposeParticleSplat(device)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/FluidWorldDomain",
      "path": "engine/reference/sim/fluids/FluidWorldDomain.md",
      "source": "engine/sim/fluids/FluidWorldDomain.js",
      "import": "/engine/sim/fluids/FluidWorldDomain.js",
      "sourceHash": "3e16ef46377dc6b75d6173e42655faaf92b0a68e12521e15e1393abdea78aed2",
      "summary": "Build fluid domain from ECS world colliders",
      "exports": [
        {
          "name": "buildFluidDomainFromColliders",
          "kind": "function",
          "signature": "buildFluidDomainFromColliders(ecsWorld, options = {})",
          "summary": "Build fluid domain from ECS world colliders"
        },
        {
          "name": "createSolidMaskTexture",
          "kind": "function",
          "signature": "createSolidMaskTexture(device, domain, gridSize)",
          "summary": "Create a 3D solid mask texture from colliders Each cell is 0 (fluid) or 1 (solid)"
        },
        {
          "name": "createWorldFluidDomain",
          "kind": "function",
          "signature": "createWorldFluidDomain(device, ecsWorld, options = {})",
          "summary": "Create a world fluid domain with solid mask"
        },
        {
          "name": "updateWorldFluidDomainParams",
          "kind": "function",
          "signature": "updateWorldFluidDomainParams(worldDomain)",
          "summary": "Update world fluid domain params buffer"
        },
        {
          "name": "destroyWorldFluidDomain",
          "kind": "function",
          "signature": "destroyWorldFluidDomain(worldDomain)",
          "summary": "Destroy world fluid domain"
        },
        {
          "name": "rebuildSolidMask",
          "kind": "function",
          "signature": "rebuildSolidMask(worldDomain, ecsWorld)",
          "summary": "Rebuild solid mask when scene changes"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/PhasorRays",
      "path": "engine/reference/sim/fluids/PhasorRays.md",
      "source": "engine/sim/fluids/PhasorRays.js",
      "import": "/engine/sim/fluids/PhasorRays.js",
      "sourceHash": "fa1b6e4da19bb9a35598468b023b7f28c65a87b483f5f93e09497a533bdb67c9",
      "summary": "Ray with wave properties (phasor representation)",
      "exports": [
        {
          "name": "PhasorRay",
          "kind": "class",
          "signature": "class PhasorRay",
          "summary": "Ray with wave properties (phasor representation)"
        },
        {
          "name": "RayMaterialInteraction",
          "kind": "class",
          "signature": "class RayMaterialInteraction",
          "summary": ""
        },
        {
          "name": "PhasorRayTracer",
          "kind": "class",
          "signature": "class PhasorRayTracer",
          "summary": ""
        },
        {
          "name": "frequencyToColor",
          "kind": "function",
          "signature": "frequencyToColor(frequency)",
          "summary": "Convert frequency to visible color (RGB)"
        },
        {
          "name": "wavelengthToColor",
          "kind": "function",
          "signature": "wavelengthToColor(wavelength)",
          "summary": "Convert wavelength to color"
        },
        {
          "name": "dopplerColor",
          "kind": "function",
          "signature": "dopplerColor(baseFrequency, observedFrequency)",
          "summary": "Apply Doppler shift color"
        },
        {
          "name": "generateRayVisualization",
          "kind": "function",
          "signature": "generateRayVisualization(rays, time)",
          "summary": "Generate visualization data for rays"
        },
        {
          "name": "VISIBLE_SPECTRUM",
          "kind": "constant",
          "signature": "VISIBLE_SPECTRUM",
          "summary": "Base visible light frequencies"
        },
        {
          "name": "RayInteraction",
          "kind": "constant",
          "signature": "RayInteraction",
          "summary": "Ray interaction types"
        },
        {
          "name": "RayState",
          "kind": "constant",
          "signature": "RayState",
          "summary": "Ray state"
        },
        {
          "name": "PhasorRays",
          "kind": "re-export",
          "signature": "PhasorRays",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/PhotonicCrystal",
      "path": "engine/reference/sim/fluids/PhotonicCrystal.md",
      "source": "engine/sim/fluids/PhotonicCrystal.js",
      "import": "/engine/sim/fluids/PhotonicCrystal.js",
      "sourceHash": "2eb897f52efbf7a1769ded056427914cf561c0315a346807b9446d3c3d8367ec",
      "summary": "Computes dispersion relation for time-varying medium For photonic time crystal: ω(k) has gaps in k-space (momentum gaps)",
      "exports": [
        {
          "name": "DispersionCalculator",
          "kind": "class",
          "signature": "class DispersionCalculator",
          "summary": "Computes dispersion relation for time-varying medium For photonic time crystal: ω(k) has gaps in k-space (momentum gaps)"
        },
        {
          "name": "PhotonicTimeCrystal",
          "kind": "class",
          "signature": "class PhotonicTimeCrystal",
          "summary": ""
        },
        {
          "name": "TimeReflectionEvent",
          "kind": "class",
          "signature": "class TimeReflectionEvent",
          "summary": "Represents a sudden change in ε that creates time reflection"
        },
        {
          "name": "TemporalCloak",
          "kind": "class",
          "signature": "class TemporalCloak",
          "summary": "Temporal cloaking using time lens approach Opens and closes a gap in the time domain"
        },
        {
          "name": "PhotonicCrystalManager",
          "kind": "class",
          "signature": "class PhotonicCrystalManager",
          "summary": ""
        },
        {
          "name": "CrystalType",
          "kind": "constant",
          "signature": "CrystalType",
          "summary": "Photonic crystal types"
        },
        {
          "name": "ModulationWaveform",
          "kind": "constant",
          "signature": "ModulationWaveform",
          "summary": "Modulation waveforms"
        },
        {
          "name": "TemporalEffect",
          "kind": "constant",
          "signature": "TemporalEffect",
          "summary": "Time crystal effects"
        },
        {
          "name": "PhotonicCrystal",
          "kind": "re-export",
          "signature": "PhotonicCrystal",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/VolumeFieldSmooth",
      "path": "engine/reference/sim/fluids/VolumeFieldSmooth.md",
      "source": "engine/sim/fluids/VolumeFieldSmooth.js",
      "import": "/engine/sim/fluids/VolumeFieldSmooth.js",
      "sourceHash": "b973442f5509944ba41964e148a63159767e24b17b19b1d8f07394c74cac7b5b",
      "summary": "",
      "exports": [
        {
          "name": "smoothVolumeField",
          "kind": "function",
          "signature": "smoothVolumeField(world, options = {})",
          "summary": ""
        },
        {
          "name": "disposeVolumeFieldSmooth",
          "kind": "function",
          "signature": "disposeVolumeFieldSmooth(device)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/VolumeFieldWorld",
      "path": "engine/reference/sim/fluids/VolumeFieldWorld.md",
      "source": "engine/sim/fluids/VolumeFieldWorld.js",
      "import": "/engine/sim/fluids/VolumeFieldWorld.js",
      "sourceHash": "8c7ae593147280829745b4d221dc7889ac63a67a709e9b7ee180cea1c8d8a901",
      "summary": "",
      "exports": [
        {
          "name": "createVolumeFieldWorld",
          "kind": "function",
          "signature": "async createVolumeFieldWorld(gpuDevice, options = {})",
          "summary": ""
        },
        {
          "name": "destroyVolumeFieldWorld",
          "kind": "function",
          "signature": "destroyVolumeFieldWorld(world)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/fluids/index",
      "path": "engine/reference/sim/fluids/index.md",
      "source": "engine/sim/fluids/index.js",
      "import": "/engine/sim/fluids/index.js",
      "sourceHash": "1f1b7fd7938f032c46549bc767dca52171091c432a2087ee00c743f798f2ac50",
      "summary": "",
      "exports": [
        {
          "name": "FDTDSolver",
          "kind": "re-export",
          "signature": "FDTDSolver",
          "summary": ""
        },
        {
          "name": "FluidBoundary",
          "kind": "re-export",
          "signature": "FluidBoundary",
          "summary": ""
        },
        {
          "name": "FluidConfig",
          "kind": "re-export",
          "signature": "FluidConfig",
          "summary": ""
        },
        {
          "name": "FluidCpuWorld",
          "kind": "re-export",
          "signature": "FluidCpuWorld",
          "summary": ""
        },
        {
          "name": "FluidMPM",
          "kind": "re-export",
          "signature": "FluidMPM",
          "summary": ""
        },
        {
          "name": "FluidPhaseChange",
          "kind": "re-export",
          "signature": "FluidPhaseChange",
          "summary": ""
        },
        {
          "name": "FluidSimWorld",
          "kind": "re-export",
          "signature": "FluidSimWorld",
          "summary": ""
        },
        {
          "name": "FluidSimulator",
          "kind": "re-export",
          "signature": "FluidSimulator",
          "summary": ""
        },
        {
          "name": "FluidSourceSplat",
          "kind": "re-export",
          "signature": "FluidSourceSplat",
          "summary": ""
        },
        {
          "name": "FluidWorldDomain",
          "kind": "re-export",
          "signature": "FluidWorldDomain",
          "summary": ""
        },
        {
          "name": "PhasorRays",
          "kind": "re-export",
          "signature": "PhasorRays",
          "summary": ""
        },
        {
          "name": "PhotonicCrystal",
          "kind": "re-export",
          "signature": "PhotonicCrystal",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/AsyncSnapshotManager",
      "path": "engine/reference/sim/particles/AsyncSnapshotManager.md",
      "source": "engine/sim/particles/AsyncSnapshotManager.js",
      "import": "/engine/sim/particles/AsyncSnapshotManager.js",
      "sourceHash": "b8cf0c38beceec7ce27cb0b782dd74e4258e963b318d0f2fc539e9d4288b83ff",
      "summary": "AsyncSnapshotManager.js - Async wrapper for worker-based snapshot capture Coordinates between main thread (GPU readback) and worker (compression). Uses TRIPLE buffering for completely non-blocking capture: Buffer A: Being filled from GPU readback Buffer B: Being processed by worker Buffer C: Completed and ready for use This ensures the render loop NEVER waits for GPU or worker.",
      "exports": [
        {
          "name": "initAsyncSnapshotSystem",
          "kind": "function",
          "signature": "initAsyncSnapshotSystem(options = {})",
          "summary": "Initialize the async snapshot system"
        },
        {
          "name": "captureFrameAsync",
          "kind": "function",
          "signature": "async captureFrameAsync(snapshot, particleState, emitters, currentTimeMs)",
          "summary": "Capture a frame asynchronously GPU readback happens on main thread, compression in worker"
        },
        {
          "name": "captureFrameTripleBuffered",
          "kind": "function",
          "signature": "captureFrameTripleBuffered(snapshot, particleState, emitters, currentTimeMs)",
          "summary": "Triple-buffered capture - completely non-blocking Returns immediately, GPU readback and worker processing happen in background"
        },
        {
          "name": "destroyAsyncSnapshot",
          "kind": "function",
          "signature": "destroyAsyncSnapshot()",
          "summary": "Clean up"
        },
        {
          "name": "setSnapshotCaptureInterval",
          "kind": "function",
          "signature": "setSnapshotCaptureInterval(intervalMs)",
          "summary": "Set capture interval (for quality/performance tradeoff)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/AttachedParticlesCompute",
      "path": "engine/reference/sim/particles/AttachedParticlesCompute.md",
      "source": "engine/sim/particles/AttachedParticlesCompute.js",
      "import": "/engine/sim/particles/AttachedParticlesCompute.js",
      "sourceHash": "be3341f5135f54995a29790807e00e8da1f453bd3884fdc54523b6200ee7fae1",
      "summary": "",
      "exports": [
        {
          "name": "updateAttachedParticlesIntoWorld",
          "kind": "function",
          "signature": "async updateAttachedParticlesIntoWorld(gpuDevice, meshBuffers, particleWorld, attachmentBuffer, options = {})",
          "summary": ""
        },
        {
          "name": "updateAttachedParticlesIntoParticlesState",
          "kind": "function",
          "signature": "async updateAttachedParticlesIntoParticlesState(particles, meshBuffers, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/BoneAttachedParticlesCompute",
      "path": "engine/reference/sim/particles/BoneAttachedParticlesCompute.md",
      "source": "engine/sim/particles/BoneAttachedParticlesCompute.js",
      "import": "/engine/sim/particles/BoneAttachedParticlesCompute.js",
      "sourceHash": "e10ce4bd99d1972dde5a2694bc15651ff89df781bf40e7332ca70d94d31e3a11",
      "summary": "",
      "exports": [
        {
          "name": "assignParticlesToBonesIntoWorld",
          "kind": "function",
          "signature": "async assignParticlesToBonesIntoWorld(gpuDevice, boneBuffer, particleWorld, attachmentBuffer, options = {})",
          "summary": ""
        },
        {
          "name": "updateBoneAttachedParticlesIntoWorld",
          "kind": "function",
          "signature": "async updateBoneAttachedParticlesIntoWorld(gpuDevice, boneBuffer, particleWorld, attachmentBuffer, options = {})",
          "summary": ""
        },
        {
          "name": "assignParticlesToBonesIntoParticlesState",
          "kind": "function",
          "signature": "async assignParticlesToBonesIntoParticlesState(particles, boneBuffer, options = {})",
          "summary": ""
        },
        {
          "name": "updateBoneAttachedParticlesIntoParticlesState",
          "kind": "function",
          "signature": "async updateBoneAttachedParticlesIntoParticlesState(particles, boneBuffer, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/CustomSDFCollisionBridge",
      "path": "engine/reference/sim/particles/CustomSDFCollisionBridge.md",
      "source": "engine/sim/particles/CustomSDFCollisionBridge.js",
      "import": "/engine/sim/particles/CustomSDFCollisionBridge.js",
      "sourceHash": "c853d547647cfc76c04faa083b133f888d114694a04ed9fcde31b765c8a61250",
      "summary": "CustomSDFCollisionBridge.js - Bridge Custom Particle Effects to Physics Collision Ensures visual SDF and collision SDF are IDENTICAL by: 1. Generating collision shaders from the same SDF code as visual effects 2. Providing a unified API for registering custom effects with physics 3. Syncing effect parameters between render and simulation This ensures \"what you see is what collides\" - particles collide exactly with the shape that's being rendered.",
      "exports": [
        {
          "name": "generateCustomEffectCollisionShader",
          "kind": "function",
          "signature": "generateCustomEffectCollisionShader(registeredEffects)",
          "summary": "Generate collision shader that uses the SAME SDF code as visual rendering This is the key to ensuring physics matches visuals exactly"
        },
        {
          "name": "createCustomEffectCollisionSystem",
          "kind": "function",
          "signature": "createCustomEffectCollisionSystem(device, registeredEffects = [])",
          "summary": "Create custom effect collision system Uses the same SDF code as visual rendering for exact physics/visual match"
        },
        {
          "name": "addCustomEffectCollider",
          "kind": "function",
          "signature": "addCustomEffectCollider(system, device, effectId, center, radius, effectParams = [0, 0, 0, 0])",
          "summary": "Add a custom effect collider Uses the same effect ID as visual rendering for exact match"
        },
        {
          "name": "updateCustomEffectCollider",
          "kind": "function",
          "signature": "updateCustomEffectCollider(system, device, index, center, radius, effectParams)",
          "summary": "Update collider transform (for moving effects)"
        },
        {
          "name": "initCustomEffectCollisionBindGroup",
          "kind": "function",
          "signature": "initCustomEffectCollisionBindGroup(system, device, positionsBuffer, velocitiesBuffer, metaBuffer = null)",
          "summary": "Initialize bind group with particle buffers"
        },
        {
          "name": "executeCustomEffectCollision",
          "kind": "function",
          "signature": "executeCustomEffectCollision(system, device, queue, particleCount, time, dt, bounciness = 0.3, friction = 0.1, fallbackRadius = 0.1)",
          "summary": "Execute custom effect collision pass"
        },
        {
          "name": "rebuildCustomEffectCollisionSystem",
          "kind": "function",
          "signature": "rebuildCustomEffectCollisionSystem(device, existingSystem)",
          "summary": "Rebuild collision system when effects change Call this after registering new custom effects"
        },
        {
          "name": "clearCustomEffectColliders",
          "kind": "function",
          "signature": "clearCustomEffectColliders(system)",
          "summary": "Clear all colliders"
        },
        {
          "name": "destroyCustomEffectCollisionSystem",
          "kind": "function",
          "signature": "destroyCustomEffectCollisionSystem(system)",
          "summary": "Destroy system and release GPU resources"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/GPUParticleSorter",
      "path": "engine/reference/sim/particles/GPUParticleSorter.md",
      "source": "engine/sim/particles/GPUParticleSorter.js",
      "import": "/engine/sim/particles/GPUParticleSorter.js",
      "sourceHash": "d8fb6ceaa89ad7a96bc44aa4e4ba77dca78d964a5d3bea049afdcdc483af3c48",
      "summary": "",
      "exports": [
        {
          "name": "GPUParticleSorter",
          "kind": "class",
          "signature": "class GPUParticleSorter",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/MeshToParticlesCompute",
      "path": "engine/reference/sim/particles/MeshToParticlesCompute.md",
      "source": "engine/sim/particles/MeshToParticlesCompute.js",
      "import": "/engine/sim/particles/MeshToParticlesCompute.js",
      "sourceHash": "7e7fa691cf94bf23012d8c9caeeb7f1bb25612ce442cd8b3de851151b8e58ef1",
      "summary": "",
      "exports": [
        {
          "name": "createMeshParticleBuffers",
          "kind": "function",
          "signature": "createMeshParticleBuffers(device, mesh)",
          "summary": ""
        },
        {
          "name": "getAttrOffsetFloats",
          "kind": "function",
          "signature": "getAttrOffsetFloats(attributes, key)",
          "summary": ""
        },
        {
          "name": "generateMeshParticlesIntoWorld",
          "kind": "function",
          "signature": "async generateMeshParticlesIntoWorld(gpuDevice, meshBuffers, particleWorld, options = {})",
          "summary": ""
        },
        {
          "name": "generateMeshParticlesIntoParticlesState",
          "kind": "function",
          "signature": "async generateMeshParticlesIntoParticlesState(particles, meshBuffers, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/MeshToParticlesPipelineCache",
      "path": "engine/reference/sim/particles/MeshToParticlesPipelineCache.md",
      "source": "engine/sim/particles/MeshToParticlesPipelineCache.js",
      "import": "/engine/sim/particles/MeshToParticlesPipelineCache.js",
      "sourceHash": "68f12bfafe67f2ca4c9eaf80287b463515f9b81eaae60aa7c0b3e0ad5d0af7eb",
      "summary": "",
      "exports": [
        {
          "name": "prewarmMeshToParticlesPipeline",
          "kind": "function",
          "signature": "async prewarmMeshToParticlesPipeline(gpuDevice)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleAdaptiveSubstep",
      "path": "engine/reference/sim/particles/ParticleAdaptiveSubstep.md",
      "source": "engine/sim/particles/ParticleAdaptiveSubstep.js",
      "import": "/engine/sim/particles/ParticleAdaptiveSubstep.js",
      "sourceHash": "a567cdddbd2ee784ffd32c5bd2f83fd34d738e94eb12a5d0487902a4e6de6046",
      "summary": "ParticleAdaptiveSubstep.js - Adaptive Substeps with CFL Condition (GAP 20) Automatically determines the number of simulation substeps per frame based on the maximum particle velocity (CFL condition), preventing tunneling for fast particles without wasting substeps on slow ones. CFL: dt_sub = cellSize * cflFactor / maxSpeed Substeps = ceil(dt_frame / dt_sub), clamped to [minSubsteps, maxSubsteps] Uses GPU readback of max velocity (from indirect dispatch counters or a separate reduction pass) when available, falls back to CPU-side estimate. Ref: Houdini POP Solver CFL, PhysX particle substeps",
      "exports": [
        {
          "name": "createAdaptiveSubstepController",
          "kind": "function",
          "signature": "createAdaptiveSubstepController(config = {})",
          "summary": "Create an adaptive substep controller."
        },
        {
          "name": "computeAdaptiveSubsteps",
          "kind": "function",
          "signature": "computeAdaptiveSubsteps(controller, frameDt, maxSpeed)",
          "summary": "Compute the number of substeps needed for this frame."
        },
        {
          "name": "estimateMaxSpeedCPU",
          "kind": "function",
          "signature": "estimateMaxSpeedCPU(velocityData, particleCount, sampleCount = 256)",
          "summary": "Estimate max particle speed from CPU-side velocity data. Use this as fallback when GPU readback is not available."
        },
        {
          "name": "resetAdaptiveSubsteps",
          "kind": "function",
          "signature": "resetAdaptiveSubsteps(controller)",
          "summary": "Reset the controller state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleAdvanced",
      "path": "engine/reference/sim/particles/ParticleAdvanced.md",
      "source": "engine/sim/particles/ParticleAdvanced.js",
      "import": "/engine/sim/particles/ParticleAdvanced.js",
      "sourceHash": "f8b5e46d39b950fd58d722f2139738525e4b4408b70ab514601d46dde14c5211",
      "summary": "ParticleAdvanced.js - GPU Sorting, Chunked Buffers, Wire Constraints, SDF Collision Advanced particle system features: - Bitonic GPU sorting for transparency - Chunked buffer management for 100M+ particles - Wire/spring constraints between particles - SDF mesh collision - GPU particle seeding - Volumetric lighting integration",
      "exports": [
        {
          "name": "createGPUSortSystem",
          "kind": "function",
          "signature": "createGPUSortSystem(device, maxParticles)",
          "summary": "Create GPU sorting system for transparent particle rendering"
        },
        {
          "name": "initSortBindGroup",
          "kind": "function",
          "signature": "initSortBindGroup(sortSystem, device, positionsBuffer)",
          "summary": "Initialize sort bind group with position buffer"
        },
        {
          "name": "executeGPUSort",
          "kind": "function",
          "signature": "executeGPUSort(sortSystem, device, particleCount, cameraPos)",
          "summary": "Execute GPU sort pass"
        },
        {
          "name": "createChunkedBufferSystem",
          "kind": "function",
          "signature": "createChunkedBufferSystem(device, maxParticles, bytesPerParticle = 16)",
          "summary": "Create chunked particle buffer system for 100M+ particles"
        },
        {
          "name": "getChunkForParticle",
          "kind": "function",
          "signature": "getChunkForParticle(chunkedSystem, particleIndex)",
          "summary": "Get chunk index for a particle index"
        },
        {
          "name": "getLocalIndex",
          "kind": "function",
          "signature": "getLocalIndex(chunkedSystem, particleIndex)",
          "summary": "Get local index within a chunk"
        },
        {
          "name": "destroyChunkedBufferSystem",
          "kind": "function",
          "signature": "destroyChunkedBufferSystem(chunkedSystem)",
          "summary": "Destroy chunked buffer system"
        },
        {
          "name": "createWireConstraintSystem",
          "kind": "function",
          "signature": "createWireConstraintSystem(device, maxWires = 10000)",
          "summary": "Create wire constraint system"
        },
        {
          "name": "addWireConstraint",
          "kind": "function",
          "signature": "addWireConstraint(wireSystem, device, particleA, particleB, restLength, stiffness = 0.5)",
          "summary": "Add a wire constraint between two particles"
        },
        {
          "name": "initWireBindGroup",
          "kind": "function",
          "signature": "initWireBindGroup(wireSystem, device, positionsBuffer, velocitiesBuffer)",
          "summary": "Initialize wire constraint bind group"
        },
        {
          "name": "solveWireConstraints",
          "kind": "function",
          "signature": "solveWireConstraints(wireSystem, device, iterations = 4)",
          "summary": "Solve wire constraints"
        },
        {
          "name": "createSDFCollisionSystem",
          "kind": "function",
          "signature": "createSDFCollisionSystem(device, initialCapacity = 64)",
          "summary": "Create SDF collision system"
        },
        {
          "name": "addSDFCollider",
          "kind": "function",
          "signature": "addSDFCollider(sdfSystem, device, type, center, radius, halfExtents = [1, 1, 1])",
          "summary": "Add an SDF collider"
        },
        {
          "name": "clearSDFColliders",
          "kind": "function",
          "signature": "clearSDFColliders(sdfSystem)",
          "summary": "Clear all SDF colliders (for per-frame rebuild from entity shapes)"
        },
        {
          "name": "rebuildSDFColliders",
          "kind": "function",
          "signature": "rebuildSDFColliders(sdfSystem, device, colliders)",
          "summary": "Batch-write SDF colliders from an array of collider descriptors. Much more efficient than calling addSDFCollider() in a loop."
        },
        {
          "name": "initSDFBindGroup",
          "kind": "function",
          "signature": "initSDFBindGroup(sdfSystem, device, positionsBuffer, velocitiesBuffer, metaBuffer = null)",
          "summary": "Initialize SDF collision bind group"
        },
        {
          "name": "executeSDFCollision",
          "kind": "function",
          "signature": "executeSDFCollision(sdfSystem, device, particleCount, bounciness = 0.3, friction = 0.1, options = {})",
          "summary": "Execute SDF collision pass"
        },
        {
          "name": "createSeedingSystem",
          "kind": "function",
          "signature": "createSeedingSystem(device)",
          "summary": "Create GPU particle seeding system"
        },
        {
          "name": "initSeedingBindGroup",
          "kind": "function",
          "signature": "initSeedingBindGroup(seedSystem, device, positionsBuffer, velocitiesBuffer)",
          "summary": "Initialize seeding bind group"
        },
        {
          "name": "seedParticlesGPU",
          "kind": "function",
          "signature": "seedParticlesGPU(seedSystem, device, particleCount, options = {})",
          "summary": "Seed particles on GPU"
        },
        {
          "name": "createVolumetricLightingSystem",
          "kind": "function",
          "signature": "createVolumetricLightingSystem(device, maxParticles)",
          "summary": "Create volumetric lighting system for particles"
        },
        {
          "name": "initVolumetricBindGroup",
          "kind": "function",
          "signature": "initVolumetricBindGroup(volSystem, device, positionsBuffer, thermalBuffer, velocitiesBuffer)",
          "summary": "Initialize volumetric lighting bind group"
        },
        {
          "name": "computeVolumetricLighting",
          "kind": "function",
          "signature": "computeVolumetricLighting(volSystem, device, particleCount, lightPos, lightColor, options = {})",
          "summary": "Compute volumetric lighting for particles"
        },
        {
          "name": "createDepthCollisionSystem",
          "kind": "function",
          "signature": "createDepthCollisionSystem(device, maxParticles)",
          "summary": "Create depth buffer collision system. Bind group is created separately via initDepthCollisionBindGroup (recreate on depth texture resize)."
        },
        {
          "name": "initDepthCollisionBindGroup",
          "kind": "function",
          "signature": "initDepthCollisionBindGroup(system, device, positionsBuffer, velocitiesBuffer, depthTextureView)",
          "summary": "Initialize or recreate the depth collision bind group. Must be called whenever the depth texture changes (e.g., on window resize)."
        },
        {
          "name": "executeDepthCollision",
          "kind": "function",
          "signature": "executeDepthCollision(system, device, particleCount, viewProj, invViewProj, options = {})",
          "summary": "Execute depth buffer collision compute pass."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleAttributeReader",
      "path": "engine/reference/sim/particles/ParticleAttributeReader.md",
      "source": "engine/sim/particles/ParticleAttributeReader.js",
      "import": "/engine/sim/particles/ParticleAttributeReader.js",
      "sourceHash": "489ec800ab3d1e0e1ec3e0bea254ec1eaee32cc71304cb81412696b92d8bc2cf",
      "summary": "ParticleAttributeReader.js - Cross-Emitter Attribute Reader (GAP 21) Allows one emitter to read particle data from another emitter's buffers. Enables leader-follower, flocking, synchronized multi-layer effects. Matches Niagara's Particle Attribute Reader data interface. Two modes: 1. Direct index: read specific particle by index (leader-follower) 2. Nearest query: find closest particle to a given position (via spatial grid) Usage: const reader = createAttributeReader(sourceWorld); // In consumer emitter logic: const pos = readParticlePosition(reader, particleIndex); const vel = readParticleVelocity(reader, particleIndex); const nearest = findNearestParticle(reader, queryPos);",
      "exports": [
        {
          "name": "createAttributeReader",
          "kind": "function",
          "signature": "createAttributeReader(sourceWorld, options = {})",
          "summary": "Create an attribute reader bound to a source particle world."
        },
        {
          "name": "refreshAttributeCache",
          "kind": "function",
          "signature": "async refreshAttributeCache(reader, frameIndex)",
          "summary": "Refresh CPU-side cache from GPU buffers (async). Call once per frame before reading attributes."
        },
        {
          "name": "readParticlePosition",
          "kind": "function",
          "signature": "readParticlePosition(reader, index)",
          "summary": "Read a particle's position and age."
        },
        {
          "name": "readParticleVelocity",
          "kind": "function",
          "signature": "readParticleVelocity(reader, index)",
          "summary": "Read a particle's velocity and lifetime."
        },
        {
          "name": "readParticleMeta",
          "kind": "function",
          "signature": "readParticleMeta(reader, index)",
          "summary": "Read a particle's color and packed meta."
        },
        {
          "name": "findNearestParticle",
          "kind": "function",
          "signature": "findNearestParticle(reader, queryPos, maxParticles)",
          "summary": "Find the nearest alive particle to a query position (brute force). For large counts, use the spatial grid instead."
        },
        {
          "name": "findParticlesInRadius",
          "kind": "function",
          "signature": "findParticlesInRadius(reader, queryPos, radius, maxResults = 32)",
          "summary": "Find all particles within a radius of a query position."
        },
        {
          "name": "destroyAttributeReader",
          "kind": "function",
          "signature": "destroyAttributeReader(reader)",
          "summary": "Destroy the reader."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleAudioBridge",
      "path": "engine/reference/sim/particles/ParticleAudioBridge.md",
      "source": "engine/sim/particles/ParticleAudioBridge.js",
      "import": "/engine/sim/particles/ParticleAudioBridge.js",
      "sourceHash": "c900b09bddf0e4c9b178db0075f54a6f3f8902655fdab24567e994cb63a1214b",
      "summary": "ParticleAudioBridge.js - Real-Time Procedural Spatial Audio for Particle Systems Zero-latency audio driven by GPU particle events via onParticleEvent callbacks. Every collision triggers sound immediately — no polling, no timers. Architecture informed by FMOD, PopcornFX, and Web Audio API perf research: - HRTF panning — binaural left/right ear simulation with elevation + front/back cues - Spatial clustering — nearby same-material impacts merge into single louder sound - Priority classes — critical/high/normal/low tiers (FMOD-style, not just volume) - Fade-out on voice steal — 5ms gain ramp prevents audible clicks - Separate ambient bus — continuous loops bypass transient compressor (no pumping) - Listener orientation — correct panning from camera forward/up vectors - Shared AudioContext — accepts external context to avoid browser resource limits - Per-material spatial cooldown — dedupes only within a radius, not globally - Dynamic compressor on impact bus — tames peak transients without affecting ambients Usage: const bridge = createAudioBridge({ maxVoices: 32, maxDistance: 100 }); wireEventCallbacks(bridge, world.eventSystem, getMaterialForEvent); // Per-frame (for ambient loops + listener tracking): updateListenerFromCamera(bridge, camera); updateEmitterAmbients(bridge, emitters); // Cleanup: destroyAudioBridge(bridge);",
      "exports": [
        {
          "name": "createAudioBridge",
          "kind": "function",
          "signature": "createAudioBridge(config = {})",
          "summary": "Create an audio bridge with full voice management."
        },
        {
          "name": "destroyAudioBridge",
          "kind": "function",
          "signature": "destroyAudioBridge(bridge)",
          "summary": "Destroy the bridge and release all audio resources."
        },
        {
          "name": "setAudioListenerPos",
          "kind": "function",
          "signature": "setAudioListenerPos(bridge, x, y, z)",
          "summary": ""
        },
        {
          "name": "updateListenerFromCamera",
          "kind": "function",
          "signature": "updateListenerFromCamera(bridge, camera)",
          "summary": "Update listener from a camera object. Sets both position AND orientation for correct spatial panning (research: without orientation, all panning is wrong)."
        },
        {
          "name": "flushImpactBatches",
          "kind": "function",
          "signature": "flushImpactBatches(bridge)",
          "summary": ""
        },
        {
          "name": "triggerImpact",
          "kind": "function",
          "signature": "triggerImpact(bridge, material, position, speed = 2, temperature = 300, priorityClass = PRIORITY_NORMAL, velocity = null)",
          "summary": "Trigger an impact sound immediately. Used for reaction events and manual triggers. For collision/death events, use the batched system (flushImpactBatches) instead."
        },
        {
          "name": "wireEventCallbacks",
          "kind": "function",
          "signature": "wireEventCallbacks(bridge, eventSystem, getMaterial)",
          "summary": "Wire the bridge into the ParticleEventSystem via onParticleEvent callbacks. Fires immediately when readbackEvents completes — zero polling, zero timers. Registers for collision events (type 2, 3) and death events (type 1)."
        },
        {
          "name": "unwireEventCallbacks",
          "kind": "function",
          "signature": "unwireEventCallbacks(bridge)",
          "summary": "Unwire event callbacks (for cleanup). Actually removes the callback functions from the event system's callback arrays."
        },
        {
          "name": "updateAmbientLoop",
          "kind": "function",
          "signature": "updateAmbientLoop(bridge, emitterId, material, position, params = {})",
          "summary": ""
        },
        {
          "name": "stopAmbientLoop",
          "kind": "function",
          "signature": "stopAmbientLoop(bridge, emitterId)",
          "summary": ""
        },
        {
          "name": "stopAllAmbientLoops",
          "kind": "function",
          "signature": "stopAllAmbientLoops(bridge)",
          "summary": ""
        },
        {
          "name": "stopAllSounds",
          "kind": "function",
          "signature": "stopAllSounds(bridge)",
          "summary": "Immediately silence ALL particle audio — impacts + ambients. Called when the editor exits play mode (Stop button)."
        },
        {
          "name": "updateEmitterAmbients",
          "kind": "function",
          "signature": "updateEmitterAmbients(bridge, emitters)",
          "summary": ""
        },
        {
          "name": "setParticleAudioVolume",
          "kind": "function",
          "signature": "setParticleAudioVolume(bridge, volume)",
          "summary": ""
        },
        {
          "name": "setReverbParams",
          "kind": "function",
          "signature": "setReverbParams(bridge, params = {})",
          "summary": "Update reverb parameters at runtime (e.g., when entering a cave or outdoor area)."
        },
        {
          "name": "setImpactVolume",
          "kind": "function",
          "signature": "setImpactVolume(bridge, volume)",
          "summary": "Set impact bus volume independently (0-1). Smoothed to avoid zipper noise."
        },
        {
          "name": "setAmbientVolume",
          "kind": "function",
          "signature": "setAmbientVolume(bridge, volume)",
          "summary": "Set ambient bus volume independently (0-1). Smoothed to avoid zipper noise."
        },
        {
          "name": "resumeAudioContext",
          "kind": "function",
          "signature": "resumeAudioContext(bridge)",
          "summary": "Resume AudioContext after browser autoplay policy suspension. Research (Chrome/Safari): Context starts 'suspended' until user gesture. Call this from your first click/keydown handler."
        },
        {
          "name": "autoUnlockAudioContext",
          "kind": "function",
          "signature": "autoUnlockAudioContext(bridge)",
          "summary": "Auto-unlock AudioContext on first user interaction (Safari/iOS workaround). Research (Matt Montag): Safari requires resume() from touch/click handler. Registers one-shot listeners that self-remove after first successful resume."
        },
        {
          "name": "pauseAllAudio",
          "kind": "function",
          "signature": "pauseAllAudio(bridge)",
          "summary": "Pause all audio (suspend context). Use when tab hidden or game paused. Research (web.dev Fieldrunners): every game should pause audio on tab hide to prevent wasted CPU and audio buildup."
        },
        {
          "name": "resumeAllAudio",
          "kind": "function",
          "signature": "resumeAllAudio(bridge)",
          "summary": "Resume all audio after pause."
        },
        {
          "name": "hookVisibilityAutoPause",
          "kind": "function",
          "signature": "hookVisibilityAutoPause(bridge)",
          "summary": "Hook into Page Visibility API to auto-pause/resume audio. Call once after createAudioBridge."
        },
        {
          "name": "getAudioBridgeStats",
          "kind": "function",
          "signature": "getAudioBridgeStats(bridge)",
          "summary": ""
        },
        {
          "name": "setOcclusionCallback",
          "kind": "function",
          "signature": "setOcclusionCallback(bridge, fn)",
          "summary": "Set an occlusion callback. The function receives (sourcePos, listenerPos) and returns 0-1 (0=fully occluded, 1=clear). Used to modulate LPF cutoff for obstruction. Game code provides the raycast logic; audio system just applies the result."
        },
        {
          "name": "soloMaterial",
          "kind": "function",
          "signature": "soloMaterial(bridge, patchKey)",
          "summary": "Debug: solo a specific material (only that material plays). Pass null to clear."
        },
        {
          "name": "muteMaterial",
          "kind": "function",
          "signature": "muteMaterial(bridge, patchKey)",
          "summary": "Debug: mute a specific material. Pass null to unmute all."
        },
        {
          "name": "resetAudioBridgeStats",
          "kind": "function",
          "signature": "resetAudioBridgeStats(bridge)",
          "summary": "Reset per-frame stats counters for delta profiling. Call after getAudioBridgeStats each frame."
        },
        {
          "name": "registerAudioCue",
          "kind": "function",
          "signature": "registerAudioCue()",
          "summary": ""
        },
        {
          "name": "processAudioEvents",
          "kind": "function",
          "signature": "processAudioEvents()",
          "summary": ""
        },
        {
          "name": "flushPendingAudio",
          "kind": "function",
          "signature": "flushPendingAudio()",
          "summary": ""
        },
        {
          "name": "unregisterAudioCue",
          "kind": "function",
          "signature": "unregisterAudioCue()",
          "summary": ""
        },
        {
          "name": "processParticleEvents",
          "kind": "function",
          "signature": "processParticleEvents()",
          "summary": ""
        },
        {
          "name": "PRIORITY_CRITICAL",
          "kind": "constant",
          "signature": "PRIORITY_CRITICAL",
          "summary": ""
        },
        {
          "name": "PRIORITY_HIGH",
          "kind": "constant",
          "signature": "PRIORITY_HIGH",
          "summary": ""
        },
        {
          "name": "PRIORITY_NORMAL",
          "kind": "constant",
          "signature": "PRIORITY_NORMAL",
          "summary": ""
        },
        {
          "name": "PRIORITY_LOW",
          "kind": "constant",
          "signature": "PRIORITY_LOW",
          "summary": ""
        },
        {
          "name": "PRIORITY_AMBIENT",
          "kind": "constant",
          "signature": "PRIORITY_AMBIENT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleBonds",
      "path": "engine/reference/sim/particles/ParticleBonds.md",
      "source": "engine/sim/particles/ParticleBonds.js",
      "import": "/engine/sim/particles/ParticleBonds.js",
      "sourceHash": "6dadff8e5d6710eaf288c3775f6cb08e74d1b59b7451e232abf33d6956c091fc",
      "summary": "ParticleBonds.js - Dynamic Bond Formation & Breaking System Manages runtime creation and destruction of particle bonds (WELD, STICKY constraints) driven by proximity, temperature, and particle flags. Features: - Bond formation: WELDABLE particles within threshold + temperature conditions → WELD constraint - Bond breaking: Constraints with FLAG_BROKEN get cleaned up + optional break effects - Temperature-driven dynamics: Freezing forms bonds, melting breaks them - Rate limiting: Max bonds per frame to prevent GPU stalls",
      "exports": [
        {
          "name": "createBondSystem",
          "kind": "function",
          "signature": "createBondSystem(world)",
          "summary": "Create a bond management system."
        },
        {
          "name": "stepBondFormation",
          "kind": "function",
          "signature": "stepBondFormation(world, bondSystem, options = {})",
          "summary": "Attempt to form bonds between nearby particles. Called each frame from the simulation loop."
        },
        {
          "name": "stepBondBreaking",
          "kind": "function",
          "signature": "stepBondBreaking(world, bondSystem, options = {})",
          "summary": "Process broken bonds and clean them up. Call after constraint solver has run."
        },
        {
          "name": "stepBondSystem",
          "kind": "function",
          "signature": "stepBondSystem(world, bondSystem, options = {})",
          "summary": "Step the full bond system (formation + breaking)."
        },
        {
          "name": "getBondStats",
          "kind": "function",
          "signature": "getBondStats(bondSystem)",
          "summary": "Get bond system stats."
        },
        {
          "name": "destroyBondSystem",
          "kind": "function",
          "signature": "destroyBondSystem(bondSystem)",
          "summary": "Destroy bond system and clear all bonds."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleChemistry",
      "path": "engine/reference/sim/particles/ParticleChemistry.md",
      "source": "engine/sim/particles/ParticleChemistry.js",
      "import": "/engine/sim/particles/ParticleChemistry.js",
      "sourceHash": "01d855dd87f332decf685bac74ff66d2bd9aee35ca4ad2c48a960635693b0407",
      "summary": "ParticleChemistry.js - Chemical Reaction System (GAP 38) GPU compute: valence-electron driven bond formation/breaking. Bonds form when electronegativity difference permits, release/absorb energy that feeds directly into the thermal system. Features: - Valence electron tracking per particle (from element table) - Bond formation: electronegativity difference → ionic vs covalent - Reaction energy ΔH → feeds thermal buffer - Temperature-dependent reaction rate (Arrhenius: k = A·e^(-Ea/RT)) - Bond dissociation at high temperature - Uses neighbor grid (GAP 25) for spatial queries - Outputs bond pairs to CPU for constraint creation (GAP existing) Two-pass approach: Pass 1 (GPU): scan neighbors, compute bond eligibility, write bond candidates Pass 2 (CPU): read back candidates, create constraints, update valence Usage: const chem = createChemistrySystem(device, maxParticles); initChemistryBindGroups(chem, device, posBuffer, velBuffer, gridBuffers, elementTable); executeChemistry(chem, device, particleCount, dt);",
      "exports": [
        {
          "name": "createChemistrySystem",
          "kind": "function",
          "signature": "createChemistrySystem(device, maxParticles)",
          "summary": "Create the chemistry system."
        },
        {
          "name": "initChemistryBindGroups",
          "kind": "function",
          "signature": "initChemistryBindGroups(system, device, positionBuffer, velocityBuffer, gridBuffers, elementTable, thermalBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "initParticleValence",
          "kind": "function",
          "signature": "initParticleValence(system, device, elementData, startIndex, count)",
          "summary": "Initialize valence electrons for a range of particles based on their element."
        },
        {
          "name": "executeChemistry",
          "kind": "function",
          "signature": "executeChemistry(system, device, particleCount, dt)",
          "summary": "Execute chemistry compute (bond formation + dissociation)."
        },
        {
          "name": "getValenceBuffer",
          "kind": "function",
          "signature": "getValenceBuffer(system)",
          "summary": "Get the valence buffer for external use."
        },
        {
          "name": "destroyChemistrySystem",
          "kind": "function",
          "signature": "destroyChemistrySystem(system)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleClassifier",
      "path": "engine/reference/sim/particles/ParticleClassifier.md",
      "source": "engine/sim/particles/ParticleClassifier.js",
      "import": "/engine/sim/particles/ParticleClassifier.js",
      "sourceHash": "2f3955f4ed42318faa3a9867f2dc7200af0abd4113df2c29d5b07caf3202e855",
      "summary": "ParticleClassifier.js - GPU Particle Classification for Fluid Rendering Classifies each liquid particle into categories based on SPH density and velocity. Used by renderers to route particles to different visual styles: - Bulk fluid → SSFR surface rendering (smooth continuous surface) - Surface → SSFR + edge highlight - Spray → Small SDF billboard with fading alpha - Foam → White-tinted SDF billboard on surface - Bubble → Tiny transparent rising sphere Output: per-particle u32 classification buffer (binding for vertex shaders). Classification IDs: 0 = unclassified / non-liquid 1 = bulk (dense interior) 2 = surface (boundary) 3 = spray (isolated, fast) 4 = foam (isolated, slow, near surface) 5 = bubble (isolated, rising) Usage: const cls = createClassifierSystem(device, maxParticles); initClassifierBindGroups(cls, device, posBuffer, velBuffer, thermalBuffer, sphDensityBuffer); executeClassifier(cls, device, particleCount); // cls.classBuffer is a storage buffer readable by vertex shaders",
      "exports": [
        {
          "name": "createClassifierSystem",
          "kind": "function",
          "signature": "createClassifierSystem(device, maxParticles)",
          "summary": "Create the classifier system."
        },
        {
          "name": "initClassifierBindGroups",
          "kind": "function",
          "signature": "initClassifierBindGroups(system, device, positionBuffer, velocityBuffer, thermalBuffer, sphDensityBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "executeClassifier",
          "kind": "function",
          "signature": "executeClassifier(system, device, particleCount)",
          "summary": "Execute the classification compute pass."
        },
        {
          "name": "getClassificationBuffer",
          "kind": "function",
          "signature": "getClassificationBuffer(system)",
          "summary": "Get the classification buffer for use by renderers."
        },
        {
          "name": "setClassifierParams",
          "kind": "function",
          "signature": "setClassifierParams(system, config)",
          "summary": "Update classifier thresholds at runtime."
        },
        {
          "name": "destroyClassifierSystem",
          "kind": "function",
          "signature": "destroyClassifierSystem(system)",
          "summary": "Destroy classifier system."
        },
        {
          "name": "CLASS_NONE",
          "kind": "constant",
          "signature": "CLASS_NONE",
          "summary": ""
        },
        {
          "name": "CLASS_BULK",
          "kind": "constant",
          "signature": "CLASS_BULK",
          "summary": ""
        },
        {
          "name": "CLASS_SURFACE",
          "kind": "constant",
          "signature": "CLASS_SURFACE",
          "summary": ""
        },
        {
          "name": "CLASS_SPRAY",
          "kind": "constant",
          "signature": "CLASS_SPRAY",
          "summary": ""
        },
        {
          "name": "CLASS_FOAM",
          "kind": "constant",
          "signature": "CLASS_FOAM",
          "summary": ""
        },
        {
          "name": "CLASS_BUBBLE",
          "kind": "constant",
          "signature": "CLASS_BUBBLE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleColorGradient",
      "path": "engine/reference/sim/particles/ParticleColorGradient.md",
      "source": "engine/sim/particles/ParticleColorGradient.js",
      "import": "/engine/sim/particles/ParticleColorGradient.js",
      "sourceHash": "d4c21a3e1d17794ce0947485cc381194801a0ac7a8d8a0dc3b68b834330fc82e",
      "summary": "ParticleColorGradient.js - N-point color gradient for particles Niagara/PopcornFX parity: arbitrary color ramps over particle lifetime. Replaces the 2-point linear (color → colorEnd) with full gradient control. CPU builds a 1D RGBA LUT texture, GPU samples with t = age/lifetime. Usage: const grad = createColorGradient([ { t: 0.0, color: [1, 0.6, 0.1, 0.0] },  // orange, transparent { t: 0.2, color: [1, 0.8, 0.2, 1.0] },  // bright yellow, full { t: 0.7, color: [0.8, 0.2, 0.0, 0.8] }, // red { t: 1.0, color: [0.3, 0.3, 0.3, 0.0] }, // grey smoke, fade out ]); const texture = uploadGradientTexture(device, grad);",
      "exports": [
        {
          "name": "createColorGradient",
          "kind": "function",
          "signature": "createColorGradient(stops, resolution = 64)",
          "summary": "Create a color gradient from an array of color stops Each color is [r, g, b] or [r, g, b, a] with values 0-1"
        },
        {
          "name": "sampleGradient",
          "kind": "function",
          "signature": "sampleGradient(stops, t)",
          "summary": "Sample a color gradient at a given t value"
        },
        {
          "name": "uploadGradientTexture",
          "kind": "function",
          "signature": "uploadGradientTexture(device, gradient)",
          "summary": "Upload a color gradient as a 1D GPU texture for shader sampling"
        },
        {
          "name": "destroyGradientTexture",
          "kind": "function",
          "signature": "destroyGradientTexture(gradientTexture)",
          "summary": "Destroy a gradient texture"
        },
        {
          "name": "gradientFromLegacy",
          "kind": "function",
          "signature": "gradientFromLegacy(color, colorEnd, alphaOverLife = [1, 1, 1])",
          "summary": "Convert a legacy color/colorEnd pair to a gradient"
        },
        {
          "name": "GRADIENT_PRESETS",
          "kind": "constant",
          "signature": "GRADIENT_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleCompression",
      "path": "engine/reference/sim/particles/ParticleCompression.md",
      "source": "engine/sim/particles/ParticleCompression.js",
      "import": "/engine/sim/particles/ParticleCompression.js",
      "sourceHash": "95ff42d96eaaff126c69e17a74133b3d39cfe6676c1e34ed6fd84126986e0a9a",
      "summary": "ParticleCompression.js - Compression utilities for particle snapshots Extracted from ParticleSnapshotDelta.js for modularity Includes: - Run-length encoding - Variable-length integer packing - PCA + DCT compression - Position/velocity quantization - Interpolation algorithms",
      "exports": [
        {
          "name": "runLengthEncode",
          "kind": "function",
          "signature": "runLengthEncode(indices)",
          "summary": ""
        },
        {
          "name": "runLengthDecode",
          "kind": "function",
          "signature": "runLengthDecode(encoded)",
          "summary": ""
        },
        {
          "name": "packSmallIntegers",
          "kind": "function",
          "signature": "packSmallIntegers(values)",
          "summary": ""
        },
        {
          "name": "unpackSmallIntegers",
          "kind": "function",
          "signature": "unpackSmallIntegers(packed)",
          "summary": ""
        },
        {
          "name": "computeCovarianceMatrix",
          "kind": "function",
          "signature": "computeCovarianceMatrix(trajectories)",
          "summary": ""
        },
        {
          "name": "powerIteration",
          "kind": "function",
          "signature": "powerIteration(matrix, iterations = 20)",
          "summary": ""
        },
        {
          "name": "dct1d",
          "kind": "function",
          "signature": "dct1d(signal)",
          "summary": ""
        },
        {
          "name": "idct1d",
          "kind": "function",
          "signature": "idct1d(coeffs)",
          "summary": ""
        },
        {
          "name": "quantizeDCT",
          "kind": "function",
          "signature": "quantizeDCT(coeffs, retention = 0.7)",
          "summary": ""
        },
        {
          "name": "quantizeFloat",
          "kind": "function",
          "signature": "quantizeFloat(value, range)",
          "summary": ""
        },
        {
          "name": "dequantizeFloat",
          "kind": "function",
          "signature": "dequantizeFloat(quantized, range)",
          "summary": ""
        },
        {
          "name": "quantizePosition",
          "kind": "function",
          "signature": "quantizePosition(x, y, z, age)",
          "summary": ""
        },
        {
          "name": "quantizeVelocity",
          "kind": "function",
          "signature": "quantizeVelocity(vx, vy, vz, lifetime)",
          "summary": ""
        },
        {
          "name": "dequantizePosition",
          "kind": "function",
          "signature": "dequantizePosition(quantized)",
          "summary": ""
        },
        {
          "name": "dequantizeVelocity",
          "kind": "function",
          "signature": "dequantizeVelocity(quantized)",
          "summary": ""
        },
        {
          "name": "quantizePositionArray",
          "kind": "function",
          "signature": "quantizePositionArray(positions)",
          "summary": ""
        },
        {
          "name": "quantizeVelocityArray",
          "kind": "function",
          "signature": "quantizeVelocityArray(velocities)",
          "summary": ""
        },
        {
          "name": "dequantizePositionArray",
          "kind": "function",
          "signature": "dequantizePositionArray(quantized)",
          "summary": ""
        },
        {
          "name": "dequantizeVelocityArray",
          "kind": "function",
          "signature": "dequantizeVelocityArray(quantized)",
          "summary": ""
        },
        {
          "name": "catmullRomInterpolate",
          "kind": "function",
          "signature": "catmullRomInterpolate(p0, p1, p2, p3, t, tension = 0.5)",
          "summary": ""
        },
        {
          "name": "hermiteInterpolate",
          "kind": "function",
          "signature": "hermiteInterpolate(p0, p1, v0, v1, t)",
          "summary": ""
        },
        {
          "name": "entropyEncodeResiduals",
          "kind": "function",
          "signature": "entropyEncodeResiduals(residuals)",
          "summary": ""
        },
        {
          "name": "entropyDecodeResiduals",
          "kind": "function",
          "signature": "entropyDecodeResiduals(encoded, length)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleConfig",
      "path": "engine/reference/sim/particles/ParticleConfig.md",
      "source": "engine/sim/particles/ParticleConfig.js",
      "import": "/engine/sim/particles/ParticleConfig.js",
      "sourceHash": "ca35999d7de429af97a3250bd3842a22a33bbbafbce0e4750165099c2e8b12df",
      "summary": "",
      "exports": [
        {
          "name": "DEFAULT_MAX_PARTICLES",
          "kind": "constant",
          "signature": "DEFAULT_MAX_PARTICLES",
          "summary": ""
        },
        {
          "name": "PARTICLE_CONFIG",
          "kind": "constant",
          "signature": "PARTICLE_CONFIG",
          "summary": ""
        },
        {
          "name": "WORKGROUP_SIZES",
          "kind": "constant",
          "signature": "WORKGROUP_SIZES",
          "summary": ""
        },
        {
          "name": "EMITTER_CONFIG_SCHEMA",
          "kind": "re-export",
          "signature": "EMITTER_CONFIG_SCHEMA",
          "summary": ""
        },
        {
          "name": "PARTICLE_BEHAVIORS",
          "kind": "re-export",
          "signature": "PARTICLE_BEHAVIORS",
          "summary": ""
        },
        {
          "name": "PARTICLE_BUFFER_SCHEMA",
          "kind": "re-export",
          "signature": "PARTICLE_BUFFER_SCHEMA",
          "summary": ""
        },
        {
          "name": "PARTICLE_PARAMS_SCHEMA",
          "kind": "re-export",
          "signature": "PARTICLE_PARAMS_SCHEMA",
          "summary": ""
        },
        {
          "name": "PARTICLE_SHAPES",
          "kind": "re-export",
          "signature": "PARTICLE_SHAPES",
          "summary": ""
        },
        {
          "name": "RENDER_MODES",
          "kind": "re-export",
          "signature": "RENDER_MODES",
          "summary": ""
        },
        {
          "name": "createDefaultEmitterConfig",
          "kind": "re-export",
          "signature": "createDefaultEmitterConfig",
          "summary": ""
        },
        {
          "name": "createDefaultParticleParams",
          "kind": "re-export",
          "signature": "createDefaultParticleParams",
          "summary": ""
        },
        {
          "name": "getBehaviorId",
          "kind": "re-export",
          "signature": "getBehaviorId",
          "summary": ""
        },
        {
          "name": "getRenderModeId",
          "kind": "re-export",
          "signature": "getRenderModeId",
          "summary": ""
        },
        {
          "name": "getShapeId",
          "kind": "re-export",
          "signature": "getShapeId",
          "summary": ""
        },
        {
          "name": "packParticleMeta",
          "kind": "re-export",
          "signature": "packParticleMeta",
          "summary": ""
        },
        {
          "name": "unpackParticleMeta",
          "kind": "re-export",
          "signature": "unpackParticleMeta",
          "summary": ""
        },
        {
          "name": "validateEmitterConfig",
          "kind": "re-export",
          "signature": "validateEmitterConfig",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleConstraints",
      "path": "engine/reference/sim/particles/ParticleConstraints.md",
      "source": "engine/sim/particles/ParticleConstraints.js",
      "import": "/engine/sim/particles/ParticleConstraints.js",
      "sourceHash": "94bb33c6ed35815e5fa87c36c77dd5fa49c5de6ac489301dadb21841fb5176f0",
      "summary": "ParticleConstraints.js - GPU Constraint Solver for Rope/Wire/Cloth Unified constraint system for particle-based physics: - Distance constraints (maintain rest length between particles) - Attachment constraints (pin particle to world position) - Angle constraints (maintain angle between 3 particles) [future] - Bending constraints (maintain curvature) [future] Part of the Unified Rope-Particle System (Phase 2)",
      "exports": [
        {
          "name": "createRopeConstraintSystem",
          "kind": "function",
          "signature": "createRopeConstraintSystem(device, maxConstraints = 100000)",
          "summary": "Create rope/constraint solver system"
        },
        {
          "name": "initRopeConstraintBindGroup",
          "kind": "function",
          "signature": "initRopeConstraintBindGroup(system, device, positionsBuffer, velocitiesBuffer, thermalBuffer)",
          "summary": "Initialize constraint system bind group"
        },
        {
          "name": "addDistanceConstraint",
          "kind": "function",
          "signature": "addDistanceConstraint(system, device, particleA, particleB, restLength, stiffness = 0.9)",
          "summary": "Add a distance constraint between two particles"
        },
        {
          "name": "addAttachmentConstraint",
          "kind": "function",
          "signature": "addAttachmentConstraint(system, device, particleIndex, worldPos, stiffness = 1.0)",
          "summary": "Add an attachment constraint (pin to world position)"
        },
        {
          "name": "addRopeInextensibleConstraint",
          "kind": "function",
          "signature": "addRopeInextensibleConstraint(system, device, particleA, particleB, restLength, opts = {})",
          "summary": "Add a rope inextensible constraint (mass-aware, with breaking support)"
        },
        {
          "name": "updateAttachmentTarget",
          "kind": "function",
          "signature": "updateAttachmentTarget(system, device, constraintIndex, worldPos)",
          "summary": "Update an attachment constraint's target position"
        },
        {
          "name": "updateRopeConstraintPhysics",
          "kind": "function",
          "signature": "updateRopeConstraintPhysics(system, device, constraintIndex, opts)",
          "summary": "Update rope constraint physics properties"
        },
        {
          "name": "addBendingConstraint",
          "kind": "function",
          "signature": "addBendingConstraint(system, device, particleA, particleB, particleC, restAngle = Math.PI, opts = {})",
          "summary": "Add a bending/angle constraint between 3 particles - UNTESTED Maintains angle at center particle (particleB)"
        },
        {
          "name": "addSpringConstraint",
          "kind": "function",
          "signature": "addSpringConstraint(system, device, particleA, particleB, restLength, opts = {})",
          "summary": "Add a spring constraint - UNTESTED Unlike distance, springs can compress AND extend (Hooke's law)"
        },
        {
          "name": "addStickyConstraint",
          "kind": "function",
          "signature": "addStickyConstraint(system, device, particleA, target, opts = {})",
          "summary": "Add a sticky/adhesion constraint - UNTESTED Particle sticks to a world position or another particle"
        },
        {
          "name": "addCohesionConstraint",
          "kind": "function",
          "signature": "addCohesionConstraint(system, device, particleA, particleB, opts = {})",
          "summary": "Add a cohesion constraint - UNTESTED Particles attract each other within a radius (like water droplets)"
        },
        {
          "name": "addCollisionConstraint",
          "kind": "function",
          "signature": "addCollisionConstraint(system, device, particleA, particleB, opts = {})",
          "summary": "Add a collision constraint - UNTESTED Particle-particle collision with friction and restitution (bounce)"
        },
        {
          "name": "addWeldConstraint",
          "kind": "function",
          "signature": "addWeldConstraint(system, device, particleA, particleB, restDistance = 0)",
          "summary": "Add a weld constraint - UNTESTED Permanently joins two particles (rigid connection)"
        },
        {
          "name": "applyMaterialPreset",
          "kind": "function",
          "signature": "applyMaterialPreset(system, device, presetName, constraintIndices)",
          "summary": "Apply a material preset to particle constraints - UNTESTED"
        },
        {
          "name": "createRopeConstraints",
          "kind": "function",
          "signature": "createRopeConstraints(system, device, particleStart, particleCount, opts = {})",
          "summary": "Create all constraints for a rope"
        },
        {
          "name": "solveRopeConstraints",
          "kind": "function",
          "signature": "solveRopeConstraints(system, device, iterations = 8, dt = 1/60, opts = {})",
          "summary": "Solve all constraints with rope physics options"
        },
        {
          "name": "clearRopeConstraints",
          "kind": "function",
          "signature": "clearRopeConstraints(system, entityId)",
          "summary": "Clear all constraints for a rope"
        },
        {
          "name": "destroyRopeConstraintSystem",
          "kind": "function",
          "signature": "destroyRopeConstraintSystem(system)",
          "summary": "Destroy constraint system"
        },
        {
          "name": "CONSTRAINT_TYPE",
          "kind": "constant",
          "signature": "CONSTRAINT_TYPE",
          "summary": ""
        },
        {
          "name": "PARTICLE_FLAGS",
          "kind": "constant",
          "signature": "PARTICLE_FLAGS",
          "summary": ""
        },
        {
          "name": "CHAIN_PHYSICS_DEFAULTS",
          "kind": "constant",
          "signature": "CHAIN_PHYSICS_DEFAULTS",
          "summary": ""
        },
        {
          "name": "ROPE_PHYSICS_DEFAULTS",
          "kind": "constant",
          "signature": "ROPE_PHYSICS_DEFAULTS",
          "summary": ""
        },
        {
          "name": "PARTICLE_MATERIAL_PRESETS",
          "kind": "constant",
          "signature": "PARTICLE_MATERIAL_PRESETS",
          "summary": ""
        },
        {
          "name": "PHASE_SOLID",
          "kind": "constant",
          "signature": "PHASE_SOLID",
          "summary": ""
        },
        {
          "name": "PHASE_LIQUID",
          "kind": "constant",
          "signature": "PHASE_LIQUID",
          "summary": ""
        },
        {
          "name": "PHASE_GAS",
          "kind": "constant",
          "signature": "PHASE_GAS",
          "summary": ""
        },
        {
          "name": "PHASE_PLASMA",
          "kind": "constant",
          "signature": "PHASE_PLASMA",
          "summary": ""
        },
        {
          "name": "THERMAL_MATERIAL_PRESETS",
          "kind": "constant",
          "signature": "THERMAL_MATERIAL_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleDecalSpawner",
      "path": "engine/reference/sim/particles/ParticleDecalSpawner.md",
      "source": "engine/sim/particles/ParticleDecalSpawner.js",
      "import": "/engine/sim/particles/ParticleDecalSpawner.js",
      "sourceHash": "f5fae34903db83f2089be5c1b5d4b53d8f10011fc08eb23eddb5f67cb6b96869",
      "summary": "ParticleDecalSpawner.js - Spawn Decals from Particle Collisions (GAP 22) Consumes GPU event readback data (collision events) to spawn projected texture decals at impact points. Integrates with the GPU event system (GAP 6) via CPU readback callbacks. Each collision event provides: position, velocity (impact direction), and event type. The spawner creates decal descriptors that the game's decal system can render (projected quads aligned to surface normal). Usage: const spawner = createDecalSpawner({ maxDecals: 200 }); // Register with event system: onParticleEvent(world.eventSystem, (events) => { feedCollisionEvents(spawner, events); }); // Each frame: const decals = getActiveDecals(spawner); // Render decals with your decal system",
      "exports": [
        {
          "name": "createDecalSpawner",
          "kind": "function",
          "signature": "createDecalSpawner(config = {})",
          "summary": "Create a decal spawner with a fixed-size ring buffer pool."
        },
        {
          "name": "feedCollisionEvents",
          "kind": "function",
          "signature": "feedCollisionEvents(spawner, eventData, eventCount, options = {})",
          "summary": "Feed collision events from GPU event readback into the decal spawner. Events are expected to be Float32Array with 8 floats per event: [posX, posY, posZ, velX, velY, velZ, eventType, particleIndex]"
        },
        {
          "name": "updateDecals",
          "kind": "function",
          "signature": "updateDecals(spawner, dt)",
          "summary": "Update decal ages, fade, and expire old decals."
        },
        {
          "name": "getActiveDecals",
          "kind": "function",
          "signature": "getActiveDecals(spawner)",
          "summary": "Get all active decals as an array of descriptors."
        },
        {
          "name": "getDecalCount",
          "kind": "function",
          "signature": "getDecalCount(spawner)",
          "summary": "Get active decal count."
        },
        {
          "name": "clearDecals",
          "kind": "function",
          "signature": "clearDecals(spawner)",
          "summary": "Clear all decals."
        },
        {
          "name": "destroyDecalSpawner",
          "kind": "function",
          "signature": "destroyDecalSpawner(spawner)",
          "summary": "Destroy the spawner."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleEffects",
      "path": "engine/reference/sim/particles/ParticleEffects.md",
      "source": "engine/sim/particles/ParticleEffects.js",
      "import": "/engine/sim/particles/ParticleEffects.js",
      "sourceHash": "fdc0158736d07c5cab9c3a9be97e8fdd48085932ff0b70a78c6d3a9406ba75a5",
      "summary": "Create force point buffer for attractors/repellers Each force point: [x, y, z, strength] where negative = repel",
      "exports": [
        {
          "name": "createForcePointBuffer",
          "kind": "function",
          "signature": "createForcePointBuffer(device, maxPoints = MAX_FORCE_POINTS)",
          "summary": "Create force point buffer for attractors/repellers Each force point: [x, y, z, strength] where negative = repel"
        },
        {
          "name": "updateForcePoints",
          "kind": "function",
          "signature": "updateForcePoints(device, buffer, forcePoints)",
          "summary": "Update force points in the buffer"
        },
        {
          "name": "calculateDissolve",
          "kind": "function",
          "signature": "calculateDissolve(startTime, duration, direction = 'in')",
          "summary": "Calculate dissolve factor for fade in/out"
        },
        {
          "name": "processSubEmitters",
          "kind": "function",
          "signature": "processSubEmitters(particles, subEmitterConfig, currentTime)",
          "summary": "Process sub-emitter spawning from dead particles This CPU fallback scans all slots and has 1-2 frame latency from GPU readback."
        },
        {
          "name": "createTrailBuffer",
          "kind": "function",
          "signature": "createTrailBuffer(device, maxParticles, historyLength = 8)",
          "summary": "Create trail history buffer Stores N previous positions per particle for trail rendering"
        },
        {
          "name": "generateParticleAtlas",
          "kind": "function",
          "signature": "generateParticleAtlas(device, size = 512, tilesPerRow = 4)",
          "summary": "Generate a procedural particle texture atlas"
        },
        {
          "name": "SUB_EMITTER_EVENTS",
          "kind": "constant",
          "signature": "SUB_EMITTER_EVENTS",
          "summary": "Sub-emitter configuration"
        },
        {
          "name": "PARTICLE_TEXTURES",
          "kind": "constant",
          "signature": "PARTICLE_TEXTURES",
          "summary": "Particle texture atlas configuration"
        },
        {
          "name": "BITONIC_SORT_SHADER",
          "kind": "re-export",
          "signature": "BITONIC_SORT_SHADER",
          "summary": ""
        },
        {
          "name": "CURL_NOISE_SNIPPET",
          "kind": "re-export",
          "signature": "CURL_NOISE_SNIPPET",
          "summary": ""
        },
        {
          "name": "FORCE_POINTS_SNIPPET",
          "kind": "re-export",
          "signature": "FORCE_POINTS_SNIPPET",
          "summary": ""
        },
        {
          "name": "LINE_COMPUTE_SHADER",
          "kind": "re-export",
          "signature": "LINE_COMPUTE_SHADER",
          "summary": ""
        },
        {
          "name": "LINE_RENDER_SHADER",
          "kind": "re-export",
          "signature": "LINE_RENDER_SHADER",
          "summary": ""
        },
        {
          "name": "MAX_FORCE_POINTS",
          "kind": "re-export",
          "signature": "MAX_FORCE_POINTS",
          "summary": ""
        },
        {
          "name": "MOUSE_INTERACTION_SNIPPET",
          "kind": "re-export",
          "signature": "MOUSE_INTERACTION_SNIPPET",
          "summary": ""
        },
        {
          "name": "TRAIL_UPDATE_SNIPPET",
          "kind": "re-export",
          "signature": "TRAIL_UPDATE_SNIPPET",
          "summary": ""
        },
        {
          "name": "VOLUMETRIC_LIGHTING_SNIPPET",
          "kind": "re-export",
          "signature": "VOLUMETRIC_LIGHTING_SNIPPET",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleElectromagnetic",
      "path": "engine/reference/sim/particles/ParticleElectromagnetic.md",
      "source": "engine/sim/particles/ParticleElectromagnetic.js",
      "import": "/engine/sim/particles/ParticleElectromagnetic.js",
      "sourceHash": "0845b909409efb75663fe99711b052e45ca94ef2fe97ef5319c0e8e0846773b7",
      "summary": "ParticleElectromagnetic.js - Electromagnetic Forces (GAP 35) GPU compute: Coulomb electrostatic + Lorentz magnetic force. F_coulomb = k · q₁·q₂ / r²  (along r) F_lorentz = q · (v × B)       (perpendicular to v and B) Per-particle charge from element table (GAP 33) charge buffer. Optional: sample E/H fields from FDTDSolver.js if attached. Uses neighbor grid (GAP 25) for O(N) spatial queries. Debye shielding at high density to prevent runaway forces. Usage: const em = createElectromagneticSystem(device, maxParticles); initEMBindGroups(em, device, positionBuffer, velocityBuffer, gridBuffers, chargeBuffer); setExternalField(em, { Ex, Ey, Ez, Bx, By, Bz }); executeElectromagnetic(em, device, particleCount, dt);",
      "exports": [
        {
          "name": "createElectromagneticSystem",
          "kind": "function",
          "signature": "createElectromagneticSystem(device, maxParticles)",
          "summary": "Create the electromagnetic system."
        },
        {
          "name": "initEMBindGroups",
          "kind": "function",
          "signature": "initEMBindGroups(system, device, positionBuffer, velocityBuffer, gridBuffers, chargeBuffer, thermalBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "setExternalField",
          "kind": "function",
          "signature": "setExternalField(system, fields)",
          "summary": "Set external E and B fields."
        },
        {
          "name": "executeElectromagnetic",
          "kind": "function",
          "signature": "executeElectromagnetic(system, device, particleCount, dt)",
          "summary": "Execute the electromagnetic compute pass."
        },
        {
          "name": "destroyElectromagneticSystem",
          "kind": "function",
          "signature": "destroyElectromagneticSystem(system)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleElementRegistry",
      "path": "engine/reference/sim/particles/ParticleElementRegistry.md",
      "source": "engine/sim/particles/ParticleElementRegistry.js",
      "import": "/engine/sim/particles/ParticleElementRegistry.js",
      "sourceHash": "2d10dd544d2720d8578380d870de3ff85819f1e2c946d8ac813ce2b9f7e6fe27",
      "summary": "ParticleElementRegistry.js - Unified Element Registry Bridges the two previously disconnected element systems: - Particle ELEMENTS (fire, water, magic, smoke) from ParticleEmitterSystem.js - Spell SPELL_ELEMENTS (fire, ice, lightning, arcane, nature, dark, holy) from SpellGenerator.js Each unified element defines particle properties (color, materialIndex, temperature, physics modifiers), spell properties (spellColors, effects, damageType), and combination rules (from SpellElementMixer). Also provides bridge functions: - elementMixToEmitterConfig(elements[]) → full emitter config derived from mix - getElementCombination(a, b) → combination result",
      "exports": [
        {
          "name": "setRegistryTrace",
          "kind": "function",
          "signature": "setRegistryTrace(enabled, throttleMs = 500)",
          "summary": "Enable or disable element registry trace logging. When enabled, logs every element mix derivation with full pipeline details."
        },
        {
          "name": "getRegistryElement",
          "kind": "function",
          "signature": "getRegistryElement(id)",
          "summary": "Get a registry element by ID. Handles backward-compat aliases (e.g., \"magic\" → \"arcane\"). Falls back to REACTION_PRODUCTS for byproduct IDs (e.g., \"smoke\")."
        },
        {
          "name": "isPrimaryElement",
          "kind": "function",
          "signature": "isPrimaryElement(id)",
          "summary": "Check if an element ID is a primary element (user-selectable) vs reaction product."
        },
        {
          "name": "getAllRegistryElements",
          "kind": "function",
          "signature": "getAllRegistryElements()",
          "summary": "Get all registry elements as an array."
        },
        {
          "name": "getRegistryElementsByCategory",
          "kind": "function",
          "signature": "getRegistryElementsByCategory()",
          "summary": "Get element IDs grouped by category."
        },
        {
          "name": "getElementCombination",
          "kind": "function",
          "signature": "getElementCombination(elementA, elementB)",
          "summary": "Look up the combination result for two elements."
        },
        {
          "name": "getCombinationsFor",
          "kind": "function",
          "signature": "getCombinationsFor(elementId)",
          "summary": "Get all combinations involving a specific element."
        },
        {
          "name": "elementMixToEmitterConfig",
          "kind": "function",
          "signature": "elementMixToEmitterConfig(elements)",
          "summary": "Given an array of active element layers [{id, power, enabled}], derive a complete emitter property set: color, colorEnd, temperature, materialIndex, gravityMod, and combination info. This replaces the separate deriveColorFromElements + deriveTemperatureFromElements + deriveMaterialIndexFromElements calls with one unified function."
        },
        {
          "name": "metaSlidersToPhysics",
          "kind": "function",
          "signature": "metaSlidersToPhysics(meta)",
          "summary": "Convert meta-slider values (Intensity 0-1, Spread 0-1, Lifetime 0-1) into concrete emitter physics parameters. Used by Simple Mode to provide easy controls."
        },
        {
          "name": "elementMixToSpellParams",
          "kind": "function",
          "signature": "elementMixToSpellParams(elements)",
          "summary": "Convert an active element mix into spell generator parameters. Used by the \"Create Spell From This\" button."
        },
        {
          "name": "REGISTRY_ELEMENTS",
          "kind": "constant",
          "signature": "REGISTRY_ELEMENTS",
          "summary": ""
        },
        {
          "name": "REACTION_PRODUCTS",
          "kind": "constant",
          "signature": "REACTION_PRODUCTS",
          "summary": ""
        },
        {
          "name": "AUTO_BYPRODUCTS",
          "kind": "constant",
          "signature": "AUTO_BYPRODUCTS",
          "summary": ""
        },
        {
          "name": "COMBINATION_BYPRODUCTS",
          "kind": "constant",
          "signature": "COMBINATION_BYPRODUCTS",
          "summary": ""
        },
        {
          "name": "ELEMENT_ALIASES",
          "kind": "constant",
          "signature": "ELEMENT_ALIASES",
          "summary": ""
        },
        {
          "name": "ELEMENT_COMBINATIONS",
          "kind": "constant",
          "signature": "ELEMENT_COMBINATIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleElementTable",
      "path": "engine/reference/sim/particles/ParticleElementTable.md",
      "source": "engine/sim/particles/ParticleElementTable.js",
      "import": "/engine/sim/particles/ParticleElementTable.js",
      "sourceHash": "90c1935622e7ef7859d64c104df6aab1a6f3b67d535bdd049292f502151c2f97",
      "summary": "ParticleElementTable.js - Element Property System / Periodic Table (GAP 33) Data foundation for universal matter simulation. Every other physics system (Lennard-Jones, Coulomb, SPH, Chemistry) reads element properties from here. Provides: - Full periodic table data for 118 elements - Per-particle element buffer (GPU storage, u32 per particle) - Element lookup by atomic number or symbol - Common molecule/compound presets - LJ parameters (epsilon, sigma) per element - Integration with existing thermal material system Usage: const table = createElementTable(device, maxParticles); setParticleElement(table, device, particleIndex, ELEMENTS.Fe); const iron = getElement(26); // by atomic number const gold = getElementBySymbol('Au');",
      "exports": [
        {
          "name": "getElement",
          "kind": "function",
          "signature": "getElement(atomicNumber)",
          "summary": "Get element by atomic number (1-118)."
        },
        {
          "name": "getElementBySymbol",
          "kind": "function",
          "signature": "getElementBySymbol(symbol)",
          "summary": "Get element by symbol ('H', 'Fe', 'Au', etc.)."
        },
        {
          "name": "getAllElements",
          "kind": "function",
          "signature": "getAllElements()",
          "summary": "Get all elements."
        },
        {
          "name": "ljMixingRule",
          "kind": "function",
          "signature": "ljMixingRule(z1, z2)",
          "summary": "Compute Lennard-Jones cross-interaction parameters using Lorentz-Berthelot rules."
        },
        {
          "name": "createElementTable",
          "kind": "function",
          "signature": "createElementTable(device, maxParticles)",
          "summary": "Create the element table system with per-particle element buffer."
        },
        {
          "name": "setParticleElements",
          "kind": "function",
          "signature": "setParticleElements(system, device, startIndex, count, atomicNumber)",
          "summary": "Set element type for a range of particles."
        },
        {
          "name": "setParticleCharges",
          "kind": "function",
          "signature": "setParticleCharges(system, device, startIndex, count, charge)",
          "summary": "Set charge for a range of particles (overrides element default)."
        },
        {
          "name": "destroyElementTable",
          "kind": "function",
          "signature": "destroyElementTable(system)",
          "summary": "Destroy the element table system."
        },
        {
          "name": "ELEMENTS",
          "kind": "constant",
          "signature": "ELEMENTS",
          "summary": "Quick access: ELEMENTS.H = 1, ELEMENTS.Fe = 26, etc."
        },
        {
          "name": "MOLECULE_PRESETS",
          "kind": "constant",
          "signature": "MOLECULE_PRESETS",
          "summary": "Common molecule presets — arrays of { element, count, charge }."
        },
        {
          "name": "ELEMENT_LUT_WGSL",
          "kind": "constant",
          "signature": "ELEMENT_LUT_WGSL",
          "summary": "WGSL struct and accessor for element LUT. Bind elementLUT as storage buffer, elementTypes and charges as storage buffers."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleEmitterLOD",
      "path": "engine/reference/sim/particles/ParticleEmitterLOD.md",
      "source": "engine/sim/particles/ParticleEmitterLOD.js",
      "import": "/engine/sim/particles/ParticleEmitterLOD.js",
      "sourceHash": "6178a093a2da8c2aba13a3e3ff0919844f24c28e93050270d96e13e26b2db91d",
      "summary": "ParticleEmitterLOD.js - Emitter-Level LOD System (GAP 19) Distance/screen-size based LOD for particle emitters. Unlike per-particle quality fade, this operates at the EMITTER level: - Reduce spawn rate by LOD tier - Disable expensive features (collision, turbulence) at distance - Switch renderer (billboard → point → cull) by distance - Scale particle lifetime to reduce total particle count Matches Niagara scalability / PopcornFX LOD layers. Usage: const lod = createEmitterLOD({ tiers: [...] }); // Each frame: const tier = evaluateEmitterLOD(lod, cameraPos, emitterPos); // Use tier.spawnRateScale, tier.features, etc. to drive emitter config",
      "exports": [
        {
          "name": "createEmitterLOD",
          "kind": "function",
          "signature": "createEmitterLOD(config = {})",
          "summary": "Create an emitter LOD controller."
        },
        {
          "name": "evaluateEmitterLOD",
          "kind": "function",
          "signature": "evaluateEmitterLOD(lod, cameraPos, emitterPos, dt = 1/60)",
          "summary": "Evaluate LOD tier for an emitter based on camera distance. Returns the active tier config with interpolated values."
        },
        {
          "name": "evaluateEmitterLODByScreenSize",
          "kind": "function",
          "signature": "evaluateEmitterLODByScreenSize(lod, screenSize, screenThresholds)",
          "summary": "Evaluate LOD by screen-space size instead of distance. Useful for effects that vary in world scale."
        },
        {
          "name": "getCurrentLODTier",
          "kind": "function",
          "signature": "getCurrentLODTier(lod)",
          "summary": "Get the current LOD tier without re-evaluation."
        },
        {
          "name": "setForcedLODTier",
          "kind": "function",
          "signature": "setForcedLODTier(lod, tierIndex)",
          "summary": "Force a specific LOD tier."
        },
        {
          "name": "DEFAULT_LOD_TIERS",
          "kind": "constant",
          "signature": "DEFAULT_LOD_TIERS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleEmitterSystem",
      "path": "engine/reference/sim/particles/ParticleEmitterSystem.md",
      "source": "engine/sim/particles/ParticleEmitterSystem.js",
      "import": "/engine/sim/particles/ParticleEmitterSystem.js",
      "sourceHash": "a630d7934bb38580c11c734eb5f0efff8f9ea9b8a178534f9c87c3b9a1effd84",
      "summary": "Resolve a substance string to { atomicNumber, temperature, charge, element }. Accepts element symbols (\"Fe\"), compound keys (\"H2O\"), preset names (\"fire\"), or null.",
      "exports": [
        {
          "name": "resolveSubstance",
          "kind": "function",
          "signature": "resolveSubstance(substance)",
          "summary": "Resolve a substance string to { atomicNumber, temperature, charge, element }. Accepts element symbols (\"Fe\"), compound keys (\"H2O\"), preset names (\"fire\"), or null."
        },
        {
          "name": "deriveState",
          "kind": "function",
          "signature": "deriveState(temperature, element)",
          "summary": "Derive the state of matter from temperature and element melt/boil points."
        },
        {
          "name": "derivePhysicsProfile",
          "kind": "function",
          "signature": "derivePhysicsProfile(substance, temperatureOverride)",
          "summary": "Derive which physics systems an emitter needs based on substance + temperature. Returns a physics profile object."
        },
        {
          "name": "deriveColorFromElements",
          "kind": "function",
          "signature": "deriveColorFromElements(elements)",
          "summary": "Derive color from element layers (weighted blend)"
        },
        {
          "name": "deriveTemperatureFromElements",
          "kind": "function",
          "signature": "deriveTemperatureFromElements(elements)",
          "summary": ""
        },
        {
          "name": "deriveMaterialIndexFromElements",
          "kind": "function",
          "signature": "deriveMaterialIndexFromElements(elements)",
          "summary": "Derive materialIndex from element layers (picks highest-power element's material)"
        },
        {
          "name": "getStates",
          "kind": "function",
          "signature": "getStates()",
          "summary": "Get available states of matter"
        },
        {
          "name": "getElements",
          "kind": "function",
          "signature": "getElements()",
          "summary": "Get available elements"
        },
        {
          "name": "getPresetList",
          "kind": "function",
          "signature": "getPresetList()",
          "summary": "Get all presets grouped by category for UI consumption."
        },
        {
          "name": "applyPreset",
          "kind": "function",
          "signature": "applyPreset(emitterCfg, presetKey)",
          "summary": "Apply a preset to an emitter config object, mutating it in place. Sets substance, temperature, charge, emitter type, elements, and physics."
        },
        {
          "name": "getEmitterTypes",
          "kind": "function",
          "signature": "getEmitterTypes()",
          "summary": "Get available emitter type IDs."
        },
        {
          "name": "getEmitterPreset",
          "kind": "function",
          "signature": "getEmitterPreset(typeId)",
          "summary": "Get emitter type preset by ID."
        },
        {
          "name": "normalizeElementPower",
          "kind": "function",
          "signature": "normalizeElementPower(elementPower)",
          "summary": ""
        },
        {
          "name": "mixElementPower",
          "kind": "function",
          "signature": "mixElementPower(a, b, options = {})",
          "summary": ""
        },
        {
          "name": "buildEffectKeyFromElements",
          "kind": "function",
          "signature": "buildEffectKeyFromElements(elementPower, options = {})",
          "summary": ""
        },
        {
          "name": "computeVisualPower",
          "kind": "function",
          "signature": "computeVisualPower(elementPower, options = {})",
          "summary": ""
        },
        {
          "name": "createEmittersForEffect",
          "kind": "function",
          "signature": "createEmittersForEffect(effectId, options = {})",
          "summary": ""
        },
        {
          "name": "createEmitter",
          "kind": "function",
          "signature": "createEmitter(options = {})",
          "summary": "============================================================================ CREATE PARTICLE EMITTER ============================================================================ Creates an emitter instance from a preset type. The emitter controls all aspects of its particles: visual appearance, physics, and timing."
        },
        {
          "name": "stepEmitters",
          "kind": "function",
          "signature": "stepEmitters(emitters, particleWorld, dt, options = {})",
          "summary": "Step all emitters and emit particles into the particle world. Returns the number of new particles emitted."
        },
        {
          "name": "updateParticleCounts",
          "kind": "function",
          "signature": "updateParticleCounts(particles, currentTime)",
          "summary": "Update particle counts by scanning for dead particles. Adds dead slots to freeSlots array and updates live/dead counts. Call this periodically (e.g., every 0.5s) to refresh counts."
        },
        {
          "name": "ageAndCullParticles",
          "kind": "function",
          "signature": "ageAndCullParticles(particles, hiddenDuration, options = {})",
          "summary": "Age all particles by a given duration and cull those that died. Call this when resuming from hidden/minimized to skip dead particles."
        },
        {
          "name": "initSlotTracking",
          "kind": "function",
          "signature": "initSlotTracking(particles, maxCount)",
          "summary": "Initialize slot tracking for a particle system. Call once after creating particles state."
        },
        {
          "name": "buildColliderBuffer",
          "kind": "function",
          "signature": "buildColliderBuffer(particleWorld, entities, options = {})",
          "summary": "Build AABB collider buffer from ECS entities for particle collisions. Returns the number of colliders written."
        },
        {
          "name": "buildFluidSources",
          "kind": "function",
          "signature": "buildFluidSources(emitters, options = {})",
          "summary": "Build fluid sources from emitters for density splatting."
        },
        {
          "name": "SUBSTANCE_PRESETS",
          "kind": "constant",
          "signature": "SUBSTANCE_PRESETS",
          "summary": ""
        },
        {
          "name": "ELEMENTS",
          "kind": "constant",
          "signature": "ELEMENTS",
          "summary": ""
        },
        {
          "name": "STATES",
          "kind": "constant",
          "signature": "STATES",
          "summary": ""
        },
        {
          "name": "EMITTER_TYPES",
          "kind": "constant",
          "signature": "EMITTER_TYPES",
          "summary": ""
        },
        {
          "name": "EMITTER_PRESETS",
          "kind": "constant",
          "signature": "EMITTER_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleEulerianFluid",
      "path": "engine/reference/sim/particles/ParticleEulerianFluid.md",
      "source": "engine/sim/particles/ParticleEulerianFluid.js",
      "import": "/engine/sim/particles/ParticleEulerianFluid.js",
      "sourceHash": "60141cf590a4049dca8aea9fac4785881a208d5707529c23ed1f25a8df1f03a8",
      "summary": "ParticleEulerianFluid.js - Self-Contained Eulerian Fluid Solver (GAP 32) GPU grid-based 3D fluid simulation using the Stable Fluids algorithm: 1. Advect velocity field (semi-Lagrangian) 2. Apply external forces (buoyancy, source injection) 3. Compute divergence 4. Pressure solve (Jacobi iteration) 5. Subtract pressure gradient (make divergence-free) 6. Advect density/temperature fields Particles can sample this velocity field via the existing fluidVelocity binding in ParticleSimWorld (attachFluidWorld). Matches Niagara Fluids Grid3D Gas simulation. Usage: const fluid = createEulerianFluidSolver(device, { gridSize: [32, 32, 32] }); addFluidSource(fluid, { position: [0, 0, 0], density: 1, temperature: 500 }); // Each frame: stepEulerianFluid(fluid, device, dt); // Connect to particles: attachFluidWorld(particleWorld, fluid, worldMin, worldMax);",
      "exports": [
        {
          "name": "createEulerianFluidSolver",
          "kind": "function",
          "signature": "createEulerianFluidSolver(device, config = {})",
          "summary": "Create a self-contained Eulerian fluid solver."
        },
        {
          "name": "initFluidBindGroups",
          "kind": "function",
          "signature": "initFluidBindGroups(solver)",
          "summary": "Build bind groups (call once after creation)."
        },
        {
          "name": "addFluidSource",
          "kind": "function",
          "signature": "addFluidSource(solver, source)",
          "summary": "Add a fluid source (emitter of density/temperature/velocity)."
        },
        {
          "name": "stepEulerianFluid",
          "kind": "function",
          "signature": "stepEulerianFluid(solver, device, dt)",
          "summary": "Step the fluid simulation."
        },
        {
          "name": "destroyEulerianFluidSolver",
          "kind": "function",
          "signature": "destroyEulerianFluidSolver(solver)",
          "summary": "Destroy the solver."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleEventSpawn",
      "path": "engine/reference/sim/particles/ParticleEventSpawn.md",
      "source": "engine/sim/particles/ParticleEventSpawn.js",
      "import": "/engine/sim/particles/ParticleEventSpawn.js",
      "sourceHash": "3999d8b2ff2d2e4376b5153f7919253b04fc4e39a98f370ee7617b7abeb9b67b",
      "summary": "ParticleEventSpawn.js - GPU-driven sub-emitter spawning from particle events Exceeds Niagara parity: Niagara events are CPU-only, this is fully GPU. Zero-frame latency — sub-particles appear the same frame as the trigger event. Pipeline: 1. Main sim shader appends events to eventBuffer (death, collision, kill zone) 2. IndirectDispatch builds freeList of dead particle slot indices 3. THIS SHADER reads events + consumes free slots + writes new particles Each workgroup handles one event. Threads within the workgroup spawn sub-particles. Free slots are consumed atomically from the free list (no CPU involvement).",
      "exports": [
        {
          "name": "createEventSpawnSystem",
          "kind": "function",
          "signature": "createEventSpawnSystem(device, options = {})",
          "summary": "Create the GPU event spawn system"
        },
        {
          "name": "initEventSpawnBindGroups",
          "kind": "function",
          "signature": "initEventSpawnBindGroups(system, world)",
          "summary": "Initialize bind groups for the event spawn system"
        },
        {
          "name": "setEventSpawnConfig",
          "kind": "function",
          "signature": "setEventSpawnConfig(system, config = {})",
          "summary": "Update sub-emitter spawn configuration"
        },
        {
          "name": "executeEventSpawn",
          "kind": "function",
          "signature": "executeEventSpawn(encoder, system, world)",
          "summary": "Execute the event spawn compute pass Call AFTER stepParticleSimWorld (events generated) and AFTER executeIndirectScan (free list built)"
        },
        {
          "name": "destroyEventSpawnSystem",
          "kind": "function",
          "signature": "destroyEventSpawnSystem(system)",
          "summary": "Destroy event spawn system"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleEventSystem",
      "path": "engine/reference/sim/particles/ParticleEventSystem.md",
      "source": "engine/sim/particles/ParticleEventSystem.js",
      "import": "/engine/sim/particles/ParticleEventSystem.js",
      "sourceHash": "0359af12a5f05e92acd2b8acd0728114023eac573c38ca4ba1078573826db3ae",
      "summary": "ParticleEventSystem.js - GPU Particle Event System (exceeds Niagara parity) Niagara events are CPU-only. This system is fully GPU-driven with zero-frame latency. Architecture: 1. Main sim shader appends events to eventBuffer (death, collision, kill zone) 2. IndirectDispatch builds freeList of dead particle slot indices 3. EventSpawn compute shader reads events + consumes free slots + writes new particles 4. (Optional) CPU readback for gameplay callbacks (sound, damage, etc.) Usage: const evtSys = initParticleEventSystem(world); registerEventHandler(evtSys, { event: 'death', subCount: 4, speed: 2 }); // In render loop (after stepParticleSimWorld + executeIndirectScan): stepEventSystem(evtSys, world); // Optional async readback for gameplay: const events = await readbackEvents(evtSys);",
      "exports": [
        {
          "name": "initParticleEventSystem",
          "kind": "function",
          "signature": "initParticleEventSystem(world, options = {})",
          "summary": "Initialize the GPU particle event system on a particle world. Call after createParticleSimWorld + initAllAdvancedSystems (needs indirectSystem.freeList)."
        },
        {
          "name": "registerEventHandler",
          "kind": "function",
          "signature": "registerEventHandler(system, config = {})",
          "summary": "Register/update the sub-emitter event handler configuration."
        },
        {
          "name": "onParticleEvent",
          "kind": "function",
          "signature": "onParticleEvent(system, eventType, callback)",
          "summary": "Register a CPU callback for a specific event type (called after readback)"
        },
        {
          "name": "offParticleEvent",
          "kind": "function",
          "signature": "offParticleEvent(system, eventType)",
          "summary": "Remove all callbacks for an event type"
        },
        {
          "name": "stepEventSystem",
          "kind": "function",
          "signature": "stepEventSystem(system)",
          "summary": "Step the event system: execute GPU event spawn. Call AFTER stepParticleSimWorld + executeIndirectScan."
        },
        {
          "name": "readbackEvents",
          "kind": "function",
          "signature": "async readbackEvents(system)",
          "summary": "Async readback of particle events from GPU for gameplay callbacks. Returns array of events. Tolerates 1-2 frame latency."
        },
        {
          "name": "getLastEvents",
          "kind": "function",
          "signature": "getLastEvents(system)",
          "summary": "Get the last readback events (non-async, returns cached result)"
        },
        {
          "name": "enableEventSystem",
          "kind": "function",
          "signature": "enableEventSystem(system)",
          "summary": ""
        },
        {
          "name": "disableEventSystem",
          "kind": "function",
          "signature": "disableEventSystem(system)",
          "summary": ""
        },
        {
          "name": "destroyParticleEventSystem",
          "kind": "function",
          "signature": "destroyParticleEventSystem(system)",
          "summary": ""
        },
        {
          "name": "EVENT_DEATH",
          "kind": "constant",
          "signature": "EVENT_DEATH",
          "summary": ""
        },
        {
          "name": "EVENT_GROUND_COLLISION",
          "kind": "constant",
          "signature": "EVENT_GROUND_COLLISION",
          "summary": ""
        },
        {
          "name": "EVENT_ENTITY_COLLISION",
          "kind": "constant",
          "signature": "EVENT_ENTITY_COLLISION",
          "summary": ""
        },
        {
          "name": "EVENT_KILL_ZONE",
          "kind": "constant",
          "signature": "EVENT_KILL_ZONE",
          "summary": ""
        },
        {
          "name": "EVENT_REACTION",
          "kind": "constant",
          "signature": "EVENT_REACTION",
          "summary": ""
        },
        {
          "name": "EVENT_MASK_DEATH",
          "kind": "constant",
          "signature": "EVENT_MASK_DEATH",
          "summary": ""
        },
        {
          "name": "EVENT_MASK_GROUND_COLLISION",
          "kind": "constant",
          "signature": "EVENT_MASK_GROUND_COLLISION",
          "summary": ""
        },
        {
          "name": "EVENT_MASK_ENTITY_COLLISION",
          "kind": "constant",
          "signature": "EVENT_MASK_ENTITY_COLLISION",
          "summary": ""
        },
        {
          "name": "EVENT_MASK_KILL_ZONE",
          "kind": "constant",
          "signature": "EVENT_MASK_KILL_ZONE",
          "summary": ""
        },
        {
          "name": "EVENT_MASK_REACTION",
          "kind": "constant",
          "signature": "EVENT_MASK_REACTION",
          "summary": ""
        },
        {
          "name": "EVENT_MASK_ALL",
          "kind": "constant",
          "signature": "EVENT_MASK_ALL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleFMM",
      "path": "engine/reference/sim/particles/ParticleFMM.md",
      "source": "engine/sim/particles/ParticleFMM.js",
      "import": "/engine/sim/particles/ParticleFMM.js",
      "sourceHash": "9e09e95d78ab7fcc4fbf36891c3c96497067d3ab7297aea73cfcb5c18ef7fc78",
      "summary": "Uniform-octree Fast Multipole Method for open-boundary gravitational forces. The GPU path is deliberately self-contained and opt-in. It performs the full FMM sequence P2M -> M2M -> M2L -> L2L -> L2P + P2P. The first implementation uses monopole source expansions and first-order Cartesian local expansions; the direct solver remains the accuracy oracle and small-N fallback.",
      "exports": [
        {
          "name": "createFmmSystem",
          "kind": "function",
          "signature": "createFmmSystem(device, maxParticles, options = {})",
          "summary": ""
        },
        {
          "name": "initFmmBindGroups",
          "kind": "function",
          "signature": "initFmmBindGroups(system, device, positionBuffer, velocityBuffer, metaBuffer, thermalBuffer,)",
          "summary": ""
        },
        {
          "name": "setFmmParams",
          "kind": "function",
          "signature": "setFmmParams(system, config = {})",
          "summary": ""
        },
        {
          "name": "executeFmm",
          "kind": "function",
          "signature": "executeFmm(system, device, particleCount, dt, options = {})",
          "summary": ""
        },
        {
          "name": "readFmmDiagnostics",
          "kind": "function",
          "signature": "async readFmmDiagnostics(system)",
          "summary": ""
        },
        {
          "name": "destroyFmmSystem",
          "kind": "function",
          "signature": "destroyFmmSystem(system)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleFlocking",
      "path": "engine/reference/sim/particles/ParticleFlocking.md",
      "source": "engine/sim/particles/ParticleFlocking.js",
      "import": "/engine/sim/particles/ParticleFlocking.js",
      "sourceHash": "5efaa7ef75a27406266315f017d26aa36b0e1da1983cf0a4de5f38902a7afa5e",
      "summary": "ParticleFlocking.js - GPU Flocking / Boids System (GAP 27) Dedicated GPU compute shader implementing classic boid rules: 1. Separation — steer away from nearby neighbors 2. Alignment — match velocity direction of nearby neighbors 3. Cohesion — steer toward center of mass of nearby neighbors 4. Goal seeking — steer toward target position(s) 5. Obstacle avoidance — steer away from repulsion points 6. Speed regulation — maintain target speed range Uses the NeighborGrid (GAP 25) for O(N) spatial queries instead of O(N²). Each force has independent radius + weight for fine-tuned behavior. Matches PopcornFX CParticleEvolver_Flocking. Usage: const flock = createFlockingSystem(device, maxParticles); initFlockingBindGroups(flock, device, positionBuffer, velocityBuffer, gridBuffers); setFlockingParams(flock, { separationWeight: 1.5, alignmentWeight: 1.0, ... }); // Each frame (after neighbor grid is built): executeFlocking(flock, device, particleCount, dt);",
      "exports": [
        {
          "name": "createFlockingSystem",
          "kind": "function",
          "signature": "createFlockingSystem(device, maxParticles)",
          "summary": "Create the flocking system."
        },
        {
          "name": "initFlockingBindGroups",
          "kind": "function",
          "signature": "initFlockingBindGroups(system, device, positionBuffer, velocityBuffer, gridBuffers)",
          "summary": "Initialize bind groups. Requires neighbor grid buffers."
        },
        {
          "name": "setFlockingParams",
          "kind": "function",
          "signature": "setFlockingParams(system, params)",
          "summary": "Update flocking parameters."
        },
        {
          "name": "executeFlocking",
          "kind": "function",
          "signature": "executeFlocking(system, device, particleCount, dt)",
          "summary": "Execute the flocking compute pass."
        },
        {
          "name": "destroyFlockingSystem",
          "kind": "function",
          "signature": "destroyFlockingSystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleFxApi",
      "path": "engine/reference/sim/particles/ParticleFxApi.md",
      "source": "engine/sim/particles/ParticleFxApi.js",
      "import": "/engine/sim/particles/ParticleFxApi.js",
      "sourceHash": "742dad7247d928357d7977aa7f88f822a75bf0f243a14a29bf4116d070d07376",
      "summary": "",
      "exports": [
        {
          "name": "spawnParticleEmitterEntity",
          "kind": "function",
          "signature": "spawnParticleEmitterEntity(world, options = {})",
          "summary": ""
        },
        {
          "name": "attachParticleEmitter",
          "kind": "function",
          "signature": "attachParticleEmitter(world, entityId, emitterDesc)",
          "summary": ""
        },
        {
          "name": "updateParticleEmitter",
          "kind": "function",
          "signature": "updateParticleEmitter(world, entityId, changes)",
          "summary": ""
        },
        {
          "name": "disableParticleEmitter",
          "kind": "function",
          "signature": "disableParticleEmitter(world, entityId)",
          "summary": ""
        },
        {
          "name": "removeParticleEmitter",
          "kind": "function",
          "signature": "removeParticleEmitter(world, entityId)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleIndirectDispatch",
      "path": "engine/reference/sim/particles/ParticleIndirectDispatch.md",
      "source": "engine/sim/particles/ParticleIndirectDispatch.js",
      "import": "/engine/sim/particles/ParticleIndirectDispatch.js",
      "sourceHash": "a57ed42ce62f909c2a49cde72f7038d53cbe11c0075f681a292616adb33df43c",
      "summary": "ParticleIndirectDispatch.js - GPU-driven indirect draw + dispatch Replaces CPU-side particle count tracking for rendering and compute dispatch. A small \"scan alive\" compute pass runs once per frame, atomically counting alive particles and finding the highest alive slot. A \"finalize\" micro-pass writes the results into draw indirect and dispatch indirect buffers. Benefits: - Eliminates CPU→GPU sync for particle counts - drawIndirect uses GPU-computed instance count - dispatchWorkgroupsIndirect uses GPU-computed workgroup count - Prepares infrastructure for full alive list compaction (Phase 3) Ref: Wicked Engine GPU particle architecture, UE5 Niagara indirect dispatch",
      "exports": [
        {
          "name": "createIndirectDispatchSystem",
          "kind": "function",
          "signature": "createIndirectDispatchSystem(device, maxParticles, workgroupSize = 256)",
          "summary": "Create the indirect dispatch system."
        },
        {
          "name": "initIndirectDispatchBindGroups",
          "kind": "function",
          "signature": "initIndirectDispatchBindGroups(system, device, positionsBuffer, velocitiesBuffer)",
          "summary": "Initialize bind groups. Call after position/velocity buffers are available."
        },
        {
          "name": "executeIndirectScan",
          "kind": "function",
          "signature": "executeIndirectScan(system, device, options = {})",
          "summary": "Execute the scan + finalize passes. Run ONCE per frame, before any other particle work. After this call, drawIndirectBuffer and dispatchIndirectBuffer contain GPU-computed values."
        },
        {
          "name": "updateIndirectMaxSlots",
          "kind": "function",
          "signature": "updateIndirectMaxSlots(system, device, maxSlots)",
          "summary": "Update maxSlots (e.g., when particle capacity changes)."
        },
        {
          "name": "destroyIndirectDispatchSystem",
          "kind": "function",
          "signature": "destroyIndirectDispatchSystem(system)",
          "summary": "Destroy indirect dispatch system resources."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleLennardJones",
      "path": "engine/reference/sim/particles/ParticleLennardJones.md",
      "source": "engine/sim/particles/ParticleLennardJones.js",
      "import": "/engine/sim/particles/ParticleLennardJones.js",
      "sourceHash": "36c81178e32972c1c31c32240ef47306f489beda6d11e4626baa2c28796a36b5",
      "summary": "ParticleLennardJones.js - Lennard-Jones Intermolecular Potential (GAP 34) GPU compute shader implementing the Lennard-Jones 12-6 potential: V(r) = 4ε[(σ/r)¹² - (σ/r)⁶] F(r) = 24ε/r [2(σ/r)¹² - (σ/r)⁶] This single equation creates realistic solid/liquid/gas behavior: - r < σ: strong repulsion (Pauli exclusion) - r = σ·2^(1/6): equilibrium (minimum energy) - r > σ·2^(1/6): weak attraction (van der Waals) - r > 2.5σ: effectively zero (cutoff) Per-element ε and σ from element table (GAP 33). Cross-element interactions use Lorentz-Berthelot mixing rules. Uses neighbor grid (GAP 25) for O(N) spatial queries. Usage: const lj = createLennardJonesSystem(device, maxParticles); initLJBindGroups(lj, device, positionBuffer, velocityBuffer, gridBuffers, elementTable); executeLennardJones(lj, device, particleCount, dt);",
      "exports": [
        {
          "name": "createLennardJonesSystem",
          "kind": "function",
          "signature": "createLennardJonesSystem(device, maxParticles)",
          "summary": "Create the Lennard-Jones system."
        },
        {
          "name": "initLJBindGroups",
          "kind": "function",
          "signature": "initLJBindGroups(system, device, positionBuffer, velocityBuffer, gridBuffers, elementTable, thermalBuffer)",
          "summary": "Initialize bind groups. Requires neighbor grid + element table buffers."
        },
        {
          "name": "executeLennardJones",
          "kind": "function",
          "signature": "executeLennardJones(system, device, particleCount, dt)",
          "summary": "Execute the Lennard-Jones compute pass."
        },
        {
          "name": "destroyLennardJonesSystem",
          "kind": "function",
          "signature": "destroyLennardJonesSystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleLifetimeCurves",
      "path": "engine/reference/sim/particles/ParticleLifetimeCurves.md",
      "source": "engine/sim/particles/ParticleLifetimeCurves.js",
      "import": "/engine/sim/particles/ParticleLifetimeCurves.js",
      "sourceHash": "d3c1a7bf7059f6262d22dec1419b234fa03867faa07d1f7b906c3e6c33b9f674",
      "summary": "ParticleLifetimeCurves.js - GPU N-point Bezier curves for particle properties over lifetime Extends the color gradient LUT pattern to size, alpha, and velocity. Generates a 1D RGBA16float texture (256 texels): R = size multiplier G = alpha multiplier B = velocity multiplier A = reserved (1.0) Sampled in vertex shader (size), fragment shader (alpha), and optionally sim shader (velocity). Supports N-point curves with Catmull-Rom interpolation for smooth results.",
      "exports": [
        {
          "name": "curveFromLegacy3",
          "kind": "function",
          "signature": "curveFromLegacy3(arr)",
          "summary": "Convert a legacy 3-point array [start, mid, end] to a curve."
        },
        {
          "name": "generateCurveLUT",
          "kind": "function",
          "signature": "generateCurveLUT(config = {})",
          "summary": "Generate the RGBA LUT data (Float16 or Float32 depending on use)."
        },
        {
          "name": "createCurveLUTTexture",
          "kind": "function",
          "signature": "createCurveLUTTexture(device, config = {})",
          "summary": "Create a GPU 1D LUT texture for lifetime curves."
        },
        {
          "name": "updateCurveLUTTexture",
          "kind": "function",
          "signature": "updateCurveLUTTexture(device, texture, config = {})",
          "summary": "Update an existing LUT texture with new curve data."
        },
        {
          "name": "createLifetimeCurvesSystem",
          "kind": "function",
          "signature": "createLifetimeCurvesSystem(device, config = {})",
          "summary": "Create a lifetime curves system for a particle world."
        },
        {
          "name": "setLifetimeCurves",
          "kind": "function",
          "signature": "setLifetimeCurves(system, config)",
          "summary": "Update curves at runtime."
        },
        {
          "name": "destroyLifetimeCurvesSystem",
          "kind": "function",
          "signature": "destroyLifetimeCurvesSystem(system)",
          "summary": "Destroy the system."
        },
        {
          "name": "CURVE_PRESETS",
          "kind": "constant",
          "signature": "CURVE_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleLightEmission",
      "path": "engine/reference/sim/particles/ParticleLightEmission.md",
      "source": "engine/sim/particles/ParticleLightEmission.js",
      "import": "/engine/sim/particles/ParticleLightEmission.js",
      "sourceHash": "f4b8b7c63c9ca48505922860397d104f4a11ba2d7b26ee509adf3118e5ba1959",
      "summary": "ParticleLightEmission.js - Particles as dynamic point lights Niagara/PopcornFX parity: emissive particles contribute point lights to the scene. Pipeline: 1. GPU compute shader finds the top-N brightest/hottest particles 2. Results are read back to CPU as an array of point light descriptors 3. Any lighting system can consume these as dynamic lights This avoids tight coupling to a specific lighting implementation. The consumer (LightingPass, voxel lighting, etc.) reads the light array each frame.",
      "exports": [
        {
          "name": "createParticleLightSystem",
          "kind": "function",
          "signature": "createParticleLightSystem(device, options = {})",
          "summary": "Create particle light emission system"
        },
        {
          "name": "initParticleLightBindGroup",
          "kind": "function",
          "signature": "initParticleLightBindGroup(system, particleWorld)",
          "summary": "Initialize bind group (call once when particle buffers are ready)"
        },
        {
          "name": "extractParticleLights",
          "kind": "function",
          "signature": "extractParticleLights(encoder, system, particleCount)",
          "summary": "Execute the light extraction compute pass"
        },
        {
          "name": "readbackParticleLights",
          "kind": "function",
          "signature": "async readbackParticleLights(system)",
          "summary": "Read back extracted lights from GPU (async, call after command buffer submit) Returns array of { position: [x,y,z], radius, color: [r,g,b], intensity }"
        },
        {
          "name": "getParticleLights",
          "kind": "function",
          "signature": "getParticleLights(system)",
          "summary": "Get the current particle lights (non-async, returns last readback result)"
        },
        {
          "name": "destroyParticleLightSystem",
          "kind": "function",
          "signature": "destroyParticleLightSystem(system)",
          "summary": "Destroy particle light system"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleLocalSpace",
      "path": "engine/reference/sim/particles/ParticleLocalSpace.md",
      "source": "engine/sim/particles/ParticleLocalSpace.js",
      "import": "/engine/sim/particles/ParticleLocalSpace.js",
      "sourceHash": "034a3b5e00160a190753c720afca89e1a8cc7fd0359af7252e2888a409589ab1",
      "summary": "ParticleLocalSpace.js - Local/World Space Toggle (GAP 30) Per-emitter transform for local-space simulation. When enabled, particles are simulated in the emitter's local coordinate frame and transformed to world space only for rendering. Moving the emitter moves all its particles. When disabled (default), particles are emitted in world space and the emitter can move without affecting existing particles. GPU compute shader transforms between local and world space using the emitter's model matrix each frame. Matches PopcornFX CParticleEvolver_Localspace. Usage: const ls = createLocalSpaceSystem(device, maxParticles); initLocalSpaceBindGroups(ls, device, positionBuffer, velocityBuffer); setEmitterTransform(ls, modelMatrix); // Before sim step: transform world→local executeWorldToLocal(ls, device, particleCount); // ... run simulation in local space ... // After sim step: transform local→world executeLocalToWorld(ls, device, particleCount);",
      "exports": [
        {
          "name": "createLocalSpaceSystem",
          "kind": "function",
          "signature": "createLocalSpaceSystem(device, maxParticles)",
          "summary": "Create local space transform system."
        },
        {
          "name": "initLocalSpaceBindGroups",
          "kind": "function",
          "signature": "initLocalSpaceBindGroups(system, device, positionBuffer, velocityBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "setEmitterTransform",
          "kind": "function",
          "signature": "setEmitterTransform(system, matrix)",
          "summary": "Set the emitter transform (4x4 column-major matrix). Automatically computes the inverse."
        },
        {
          "name": "setEmitterTransformFromPosRot",
          "kind": "function",
          "signature": "setEmitterTransformFromPosRot(system, pos, rotation)",
          "summary": "Set emitter transform from position + rotation (Euler angles in radians)."
        },
        {
          "name": "executeWorldToLocal",
          "kind": "function",
          "signature": "executeWorldToLocal(system, device, particleCount)",
          "summary": "Transform particles from world space to local space (run before sim step)."
        },
        {
          "name": "executeLocalToWorld",
          "kind": "function",
          "signature": "executeLocalToWorld(system, device, particleCount)",
          "summary": "Transform particles from local space to world space (run after sim step)."
        },
        {
          "name": "destroyLocalSpaceSystem",
          "kind": "function",
          "signature": "destroyLocalSpaceSystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleLongRangeMath",
      "path": "engine/reference/sim/particles/ParticleLongRangeMath.md",
      "source": "engine/sim/particles/ParticleLongRangeMath.js",
      "import": "/engine/sim/particles/ParticleLongRangeMath.js",
      "sourceHash": "be43617b49172533f8fde165074bbe161fe2cb181842b4264c95cecfb104dba0",
      "summary": "Pure configuration, layout, and validation math shared by long-range particle solvers.",
      "exports": [
        {
          "name": "fmmLevelCellCount",
          "kind": "function",
          "signature": "fmmLevelCellCount(level)",
          "summary": ""
        },
        {
          "name": "fmmLevelOffset",
          "kind": "function",
          "signature": "fmmLevelOffset(level)",
          "summary": ""
        },
        {
          "name": "fmmTotalCellCount",
          "kind": "function",
          "signature": "fmmTotalCellCount(depth)",
          "summary": ""
        },
        {
          "name": "fmmSelectDepth",
          "kind": "function",
          "signature": "fmmSelectDepth(particleCount, options = {})",
          "summary": ""
        },
        {
          "name": "normalizeFmmConfig",
          "kind": "function",
          "signature": "normalizeFmmConfig(config = {})",
          "summary": ""
        },
        {
          "name": "estimateFmmMemory",
          "kind": "function",
          "signature": "estimateFmmMemory(config = {})",
          "summary": ""
        },
        {
          "name": "normalizeParticleMeshConfig",
          "kind": "function",
          "signature": "normalizeParticleMeshConfig(config = {})",
          "summary": ""
        },
        {
          "name": "estimateParticleMeshMemory",
          "kind": "function",
          "signature": "estimateParticleMeshMemory(config = {})",
          "summary": ""
        },
        {
          "name": "generateProlateWindowTable",
          "kind": "function",
          "signature": "generateProlateWindowTable(options = {})",
          "summary": "Samples the positive, even, order-zero PSWF. Inverse iteration solves the spheroidal Sturm-Liouville operator in an orthonormal even-Legendre basis; the GPU linearly interpolates the resulting half-window."
        },
        {
          "name": "generateProlateSplitTable",
          "kind": "function",
          "signature": "generateProlateSplitTable(windowTable)",
          "summary": "Builds the normalized radial density and complementary local kernel used by the PSWF Ewald split. The density integrates to one on [0, 1], while the complement falls from one to zero at the real-space cutoff."
        },
        {
          "name": "prolateSplitFourierResponse",
          "kind": "function",
          "signature": "prolateSplitFourierResponse(splitDensity, angularFrequency)",
          "summary": "Cosine transform of the normalized even PSWF splitting kernel."
        },
        {
          "name": "fmmCellCoordinate",
          "kind": "function",
          "signature": "fmmCellCoordinate(index, level)",
          "summary": ""
        },
        {
          "name": "fmmMortonCellIndex",
          "kind": "function",
          "signature": "fmmMortonCellIndex(x, y, z, level)",
          "summary": ""
        },
        {
          "name": "fmmInteractionCells",
          "kind": "function",
          "signature": "fmmInteractionCells(targetIndex, level)",
          "summary": ""
        },
        {
          "name": "directLongRangeAccelerations",
          "kind": "function",
          "signature": "directLongRangeAccelerations(positions, sources, options = {})",
          "summary": ""
        },
        {
          "name": "compareLongRangeVectors",
          "kind": "function",
          "signature": "compareLongRangeVectors(reference, approximate)",
          "summary": ""
        },
        {
          "name": "PARTICLE_LONG_RANGE_BACKENDS",
          "kind": "constant",
          "signature": "PARTICLE_LONG_RANGE_BACKENDS",
          "summary": "Pure configuration, layout, and validation math shared by long-range particle solvers."
        },
        {
          "name": "PARTICLE_LONG_RANGE_BOUNDARIES",
          "kind": "constant",
          "signature": "PARTICLE_LONG_RANGE_BOUNDARIES",
          "summary": ""
        },
        {
          "name": "FMM_MIN_DEPTH",
          "kind": "constant",
          "signature": "FMM_MIN_DEPTH",
          "summary": ""
        },
        {
          "name": "FMM_MAX_DEPTH",
          "kind": "constant",
          "signature": "FMM_MAX_DEPTH",
          "summary": ""
        },
        {
          "name": "FMM_DEFAULT_LEAF_OCCUPANCY",
          "kind": "constant",
          "signature": "FMM_DEFAULT_LEAF_OCCUPANCY",
          "summary": ""
        },
        {
          "name": "FMM_CELL_MOMENT_BYTES",
          "kind": "constant",
          "signature": "FMM_CELL_MOMENT_BYTES",
          "summary": ""
        },
        {
          "name": "FMM_CELL_LOCAL_BYTES",
          "kind": "constant",
          "signature": "FMM_CELL_LOCAL_BYTES",
          "summary": ""
        },
        {
          "name": "PARTICLE_MESH_MIN_GRID_SIZE",
          "kind": "constant",
          "signature": "PARTICLE_MESH_MIN_GRID_SIZE",
          "summary": ""
        },
        {
          "name": "PARTICLE_MESH_MAX_GRID_SIZE",
          "kind": "constant",
          "signature": "PARTICLE_MESH_MAX_GRID_SIZE",
          "summary": ""
        },
        {
          "name": "PARTICLE_MESH_WINDOW_SAMPLES",
          "kind": "constant",
          "signature": "PARTICLE_MESH_WINDOW_SAMPLES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleMeshEwald",
      "path": "engine/reference/sim/particles/ParticleMeshEwald.md",
      "source": "engine/sim/particles/ParticleMeshEwald.js",
      "import": "/engine/sim/particles/ParticleMeshEwald.js",
      "sourceHash": "1583f6d568b0412f2f2051f44c70ef83fb0af90e113df67598b075910e8160a1",
      "summary": "Periodic particle-mesh Ewald solver with cubic B-spline PME and an experimental numerically sampled prolate-spheroidal (ESP) split and window. The solver uses exact integer cell counting/scatter, a separable 3D complex FFT, reciprocal-space screened Poisson solve, interpolated mesh gradients, and the complementary short-range Ewald force.",
      "exports": [
        {
          "name": "createParticleMeshEwaldSystem",
          "kind": "function",
          "signature": "createParticleMeshEwaldSystem(device, maxParticles, options = {})",
          "summary": ""
        },
        {
          "name": "initParticleMeshEwaldBindGroups",
          "kind": "function",
          "signature": "initParticleMeshEwaldBindGroups(system, device, positionBuffer, velocityBuffer, metaBuffer, thermalBuffer,)",
          "summary": ""
        },
        {
          "name": "setParticleMeshEwaldParams",
          "kind": "function",
          "signature": "setParticleMeshEwaldParams(system, config = {})",
          "summary": ""
        },
        {
          "name": "executeParticleMeshEwald",
          "kind": "function",
          "signature": "executeParticleMeshEwald(system, device, particleCount, dt, options = {})",
          "summary": ""
        },
        {
          "name": "readParticleMeshEwaldDiagnostics",
          "kind": "function",
          "signature": "async readParticleMeshEwaldDiagnostics(system)",
          "summary": ""
        },
        {
          "name": "destroyParticleMeshEwaldSystem",
          "kind": "function",
          "signature": "destroyParticleMeshEwaldSystem(system)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleNBody",
      "path": "engine/reference/sim/particles/ParticleNBody.md",
      "source": "engine/sim/particles/ParticleNBody.js",
      "import": "/engine/sim/particles/ParticleNBody.js",
      "sourceHash": "dea7f42546235777a0261ff298bf41ed4105242b9fdd814181c0cfa668f12f8f",
      "summary": "ParticleNBody.js - N-Body Gravitational Dynamics (GAP 37) GPU compute: every particle attracts every other via gravity. F = G · m₁·m₂ / (r² + ε²)^(3/2) Direct summation O(N²) — suitable for up to ~100K particles on modern GPUs. Softening parameter ε prevents singularities at close range. Configurable G for different scales (molecular, macro, celestial). Uses tiled shared-memory approach: each workgroup loads a tile of particles into shared memory, computes interactions, then loads next tile. Usage: const nb = createNBodySystem(device, maxParticles); initNBodyBindGroups(nb, device, positionBuffer, velocityBuffer, metaBuffer); executeNBody(nb, device, particleCount, dt);",
      "exports": [
        {
          "name": "createNBodySystem",
          "kind": "function",
          "signature": "createNBodySystem(device, maxParticles)",
          "summary": "Create the N-body gravity system."
        },
        {
          "name": "initNBodyBindGroups",
          "kind": "function",
          "signature": "initNBodyBindGroups(system, device, positionBuffer, velocityBuffer, metaBuffer, thermalBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "setNBodyParams",
          "kind": "function",
          "signature": "setNBodyParams(system, config)",
          "summary": "Set N-body parameters at runtime."
        },
        {
          "name": "executeNBody",
          "kind": "function",
          "signature": "executeNBody(system, device, particleCount, dt, options = {})",
          "summary": "Execute the N-body compute pass."
        },
        {
          "name": "destroyNBodySystem",
          "kind": "function",
          "signature": "destroyNBodySystem(system)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleNeighborGrid",
      "path": "engine/reference/sim/particles/ParticleNeighborGrid.md",
      "source": "engine/sim/particles/ParticleNeighborGrid.js",
      "import": "/engine/sim/particles/ParticleNeighborGrid.js",
      "sourceHash": "3f7aa96213f7e299541b20d4e89fdd0c1df01f9a3a4f436f6d880c2ab66f62e3",
      "summary": "ParticleNeighborGrid.js - General-Purpose Neighbor Grid (GAP 25) GPU spatial query structure for arbitrary particle-to-particle interactions. Unlike the collision-specific spatial grid, this is a general-purpose 3D grid that any system can query: flocking, color transfer, interaction, etc. Matches Niagara Neighbor Grid 3D and PopcornFX Spatial Layers. Architecture (hash-modulo bucket approach — inspired by NVIDIA CUDA Particles): 1. Clear cell counts via encoder.clearBuffer (GPU memset, no dispatch limit) 2. Insert particles into hash buckets (compute pass, atomic append) 3. Query neighbors from any other compute pass via grid lookup Instead of allocating one bucket per 3D cell (can exceed millions), we use numBuckets = min(totalCells, maxParticles). The flat cell index is modulo'd into this smaller range. Hash collisions are harmless — consumer shaders already do distance checks that filter false positives. Grid stores up to maxNeighborsPerCell particle indices per bucket. Query returns indices of particles in same + adjacent cells (27-cell neighborhood).",
      "exports": [
        {
          "name": "createNeighborGridSystem",
          "kind": "function",
          "signature": "createNeighborGridSystem(device, config = {})",
          "summary": "Create a general-purpose neighbor grid."
        },
        {
          "name": "initNeighborGridBindGroups",
          "kind": "function",
          "signature": "initNeighborGridBindGroups(system, device, positionBuffer, velocityBuffer)",
          "summary": "Initialize bind groups (call after particle buffers are created)."
        },
        {
          "name": "setNeighborGridParticleCount",
          "kind": "function",
          "signature": "setNeighborGridParticleCount(system, particleCount)",
          "summary": "Update the particle count in params (call each frame if count changes)."
        },
        {
          "name": "buildNeighborGrid",
          "kind": "function",
          "signature": "buildNeighborGrid(system, device, particleCount)",
          "summary": "Execute clear + insert passes. Call once per frame before any queries."
        },
        {
          "name": "getNeighborGridBuffers",
          "kind": "function",
          "signature": "getNeighborGridBuffers(system)",
          "summary": "Get the grid buffers for use in consumer compute shaders. Consumer shaders should bind cellCountsBuffer and cellEntriesBuffer as read-only storage."
        },
        {
          "name": "destroyNeighborGridSystem",
          "kind": "function",
          "signature": "destroyNeighborGridSystem(system)",
          "summary": "Destroy the system."
        },
        {
          "name": "NEIGHBOR_QUERY_WGSL",
          "kind": "constant",
          "signature": "NEIGHBOR_QUERY_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleNoiseTexture",
      "path": "engine/reference/sim/particles/ParticleNoiseTexture.md",
      "source": "engine/sim/particles/ParticleNoiseTexture.js",
      "import": "/engine/sim/particles/ParticleNoiseTexture.js",
      "sourceHash": "764823344fbde5b66b9100b61d5e6d4a687357568855fabdeacdd65e212c0c15",
      "summary": "ParticleNoiseTexture.js - Pre-baked 3D curl noise volume texture Replaces expensive per-particle gradientNoise calls with one filtered sample from a two-pass vector-potential -> discrete-curl 3D texture bake. 6-24× cheaper turbulence depending on octave count. The noise is tileable: baked with periodic boundary conditions and sampled with repeat addressing mode for seamless spatial tiling. Ref: GPU Gems 3 Ch.1 \"Generating Complex Procedural Terrains Using the GPU\"",
      "exports": [
        {
          "name": "createNoiseTextureSystem",
          "kind": "function",
          "signature": "async createNoiseTextureSystem(device, resolution = 64, period = DEFAULT_NOISE_PERIOD)",
          "summary": "Create the 3D noise texture system."
        },
        {
          "name": "bakeNoiseTexture",
          "kind": "function",
          "signature": "bakeNoiseTexture(system, device)",
          "summary": "Bake the noise volume texture. Call once after creation. This is a one-time GPU operation (~1ms for 64³, ~8ms for 128³)."
        },
        {
          "name": "createDummyNoiseTexture",
          "kind": "function",
          "signature": "createDummyNoiseTexture(device)",
          "summary": "Create a 1×1×1 dummy noise texture for use when the real texture isn't ready. Returns { textureView, sampler, paramsBuffer } suitable for bind group creation."
        },
        {
          "name": "destroyNoiseTextureSystem",
          "kind": "function",
          "signature": "destroyNoiseTextureSystem(system)",
          "summary": "Destroy noise texture system resources."
        },
        {
          "name": "NOISE_TEXTURE_BINDINGS_SNIPPET",
          "kind": "constant",
          "signature": "NOISE_TEXTURE_BINDINGS_SNIPPET",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleRadixSort",
      "path": "engine/reference/sim/particles/ParticleRadixSort.md",
      "source": "engine/sim/particles/ParticleRadixSort.js",
      "import": "/engine/sim/particles/ParticleRadixSort.js",
      "sourceHash": "826d4aec433706085a923b997ab16c1f443cca09902906c297b9ad5797a00f6c",
      "summary": "ParticleRadixSort.js - GPU 4-way radix sort for particle distance sorting Replaces bitonic sort (O(n log²n) dispatches) with radix sort (O(n), fixed 8 passes). For 100K particles: bitonic = ~289 dispatches, radix = ~24 dispatches (12× fewer). Architecture: - 4-bit radix: 16 buckets per pass, 8 passes for 32-bit keys - Float-to-sortable-uint conversion for correct float ordering - Per-pass: histogram → prefix sum → scatter (3 dispatches) - Double-buffered keys+values for ping-pong between passes - \"Order check\" optimization: skip sort when data is already sorted Ref: \"Fast 4-way parallel radix sorting on GPUs\" (Ha et al.) kishimisu/WebGPU-Radix-Sort",
      "exports": [
        {
          "name": "createRadixSortSystem",
          "kind": "function",
          "signature": "createRadixSortSystem(device, maxParticles)",
          "summary": "Create GPU radix sort system for transparent particle rendering. Drop-in replacement for the bitonic sort system."
        },
        {
          "name": "initRadixSortBindGroups",
          "kind": "function",
          "signature": "initRadixSortBindGroups(system, device, positionsBuffer)",
          "summary": ""
        },
        {
          "name": "executeRadixSort",
          "kind": "function",
          "signature": "executeRadixSort(system, device, particleCount, cameraPos)",
          "summary": "Execute GPU radix sort. Drop-in replacement for executeGPUSort."
        },
        {
          "name": "destroyRadixSortSystem",
          "kind": "function",
          "signature": "destroyRadixSortSystem(system)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleReactionTable",
      "path": "engine/reference/sim/particles/ParticleReactionTable.md",
      "source": "engine/sim/particles/ParticleReactionTable.js",
      "import": "/engine/sim/particles/ParticleReactionTable.js",
      "sourceHash": "ad3c963517ea10ed4f1d95e1d6bb94245bc2f446b37b41236b9ceda0f46eed73",
      "summary": "ParticleReactionTable.js - Cross-Emitter Particle Reaction System GPU-driven reaction table: when particles with different materialIdx collide, the collision shader scans this table for a matching (matA, matB) rule. If found: apply energy, optionally kill reactants, emit reaction event (type 5). EventSpawn reads the rule index to spawn product particles with correct properties. Exceeds Niagara/PopcornFX/Unity VFX Graph — none support particle-particle reactions. Usage: const table = createReactionTable(device); addReaction(table, MATERIAL.FIRE, MATERIAL.WATER, { ... }); registerDefaultReactions(table); // Bind table.buffer to sim shader group",
      "exports": [
        {
          "name": "createReactionTable",
          "kind": "function",
          "signature": "createReactionTable(device)",
          "summary": "Create a reaction table with GPU uniform buffer."
        },
        {
          "name": "destroyReactionTable",
          "kind": "function",
          "signature": "destroyReactionTable(table)",
          "summary": "Destroy the reaction table and release GPU resources."
        },
        {
          "name": "addReaction",
          "kind": "function",
          "signature": "addReaction(table, matA, matB, config = {})",
          "summary": "Add a reaction rule to the table."
        },
        {
          "name": "removeReaction",
          "kind": "function",
          "signature": "removeReaction(table, index)",
          "summary": "Remove a reaction rule by index."
        },
        {
          "name": "clearReactions",
          "kind": "function",
          "signature": "clearReactions(table)",
          "summary": "Remove all reaction rules."
        },
        {
          "name": "uploadReactionTable",
          "kind": "function",
          "signature": "uploadReactionTable(table)",
          "summary": "Upload the reaction table to the GPU uniform buffer. Call once after adding/removing reactions (not every frame)."
        },
        {
          "name": "registerDefaultReactions",
          "kind": "function",
          "signature": "registerDefaultReactions(table)",
          "summary": "Register built-in reaction presets."
        },
        {
          "name": "getReactions",
          "kind": "function",
          "signature": "getReactions(table)",
          "summary": "Get the current reaction rules."
        },
        {
          "name": "getMaterialName",
          "kind": "function",
          "signature": "getMaterialName(matId)",
          "summary": "Get a material name from its ID."
        },
        {
          "name": "getMaterialForSubstance",
          "kind": "function",
          "signature": "getMaterialForSubstance(substanceKey)",
          "summary": "Look up the material ID for a substance preset key."
        },
        {
          "name": "MATERIAL",
          "kind": "constant",
          "signature": "MATERIAL",
          "summary": ""
        },
        {
          "name": "SUBSTANCE_TO_MATERIAL",
          "kind": "constant",
          "signature": "SUBSTANCE_TO_MATERIAL",
          "summary": ""
        },
        {
          "name": "REACTION_KILL_A",
          "kind": "constant",
          "signature": "REACTION_KILL_A",
          "summary": ""
        },
        {
          "name": "REACTION_KILL_B",
          "kind": "constant",
          "signature": "REACTION_KILL_B",
          "summary": ""
        },
        {
          "name": "REACTION_SPAWN_PRODUCT",
          "kind": "constant",
          "signature": "REACTION_SPAWN_PRODUCT",
          "summary": ""
        },
        {
          "name": "REACTION_KILL_BOTH",
          "kind": "constant",
          "signature": "REACTION_KILL_BOTH",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleRibbonTrail",
      "path": "engine/reference/sim/particles/ParticleRibbonTrail.md",
      "source": "engine/sim/particles/ParticleRibbonTrail.js",
      "import": "/engine/sim/particles/ParticleRibbonTrail.js",
      "sourceHash": "10ca8d9603093690de50cfffdafa723179772dbff06c03840b8101c77e7271e2",
      "summary": "ParticleRibbonTrail.js - GPU ribbon/trail rendering for particles Connects particle position history into continuous camera-facing triangle strips for smoke trails, magic effects, and motion streaks. Architecture: 1. Trail Update (compute): shifts history ring buffer back, inserts current position 2. Ribbon Render (vertex+fragment): reads trail history, generates camera-facing triangle strip with width tapering and alpha fade Each particle trail is rendered as one triangle strip instance. Vertex count per instance = historyLength × 2. No intermediate vertex buffer needed — the vertex shader reads history directly. Ref: GPU Gems 3 Ch.23, UE5 Niagara ribbon renderer",
      "exports": [
        {
          "name": "createRibbonTrailSystem",
          "kind": "function",
          "signature": "createRibbonTrailSystem(device, maxParticles, historyLength = 8, targetFormat = 'bgra8unorm', options = {})",
          "summary": "Create ribbon trail system."
        },
        {
          "name": "initRibbonTrailBindGroups",
          "kind": "function",
          "signature": "initRibbonTrailBindGroups(system, device, positionsBuffer, velocitiesBuffer)",
          "summary": "Initialize bind groups for the trail system. Call after the position buffer is available."
        },
        {
          "name": "updateTrailHistory",
          "kind": "function",
          "signature": "updateTrailHistory(system, device)",
          "summary": "Update trail history for all particles (compute pass). Call once per frame AFTER the main sim step."
        },
        {
          "name": "renderRibbonTrails",
          "kind": "function",
          "signature": "renderRibbonTrails(pass, system, viewProjMatrix, cameraPos, instanceCount)",
          "summary": "Render ribbon trails into the current render pass."
        },
        {
          "name": "destroyRibbonTrailSystem",
          "kind": "function",
          "signature": "destroyRibbonTrailSystem(system)",
          "summary": "Destroy ribbon trail system resources."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSDFAttraction",
      "path": "engine/reference/sim/particles/ParticleSDFAttraction.md",
      "source": "engine/sim/particles/ParticleSDFAttraction.js",
      "import": "/engine/sim/particles/ParticleSDFAttraction.js",
      "sourceHash": "41566f192a61f37b548eabcd712779e5441e37e14ca156b86b6daf8d7b49971c",
      "summary": "ParticleSDFAttraction.js - SDF Attraction/Repulsion Force (GAP 15) Attract or repel particles toward/from SDF surfaces. Unlike SDF collision (hard boundary), this applies a smooth force field based on signed distance, so particles orbit, hover near, or flee from surfaces. Force = -gradient(SDF) × strength / (|SDF| + softness) Modes: - attract: particles pulled toward surface (strength > 0) - repel: particles pushed away from surface (strength < 0) - orbit: attract + tangential velocity (strength > 0, orbitalFactor > 0) - surface-lock: very strong attraction with damping (particles stick to surface) Uses a GPU compute shader that evaluates SDF primitives and applies forces.",
      "exports": [
        {
          "name": "createSDFAttractionSystem",
          "kind": "function",
          "signature": "createSDFAttractionSystem(device)",
          "summary": "Create an SDF attraction system."
        },
        {
          "name": "addSDFAttractor",
          "kind": "function",
          "signature": "addSDFAttractor(system, config = {})",
          "summary": "Add an SDF attractor."
        },
        {
          "name": "updateSDFAttractor",
          "kind": "function",
          "signature": "updateSDFAttractor(system, index, config)",
          "summary": "Update an existing attractor."
        },
        {
          "name": "initSDFAttractionBindGroup",
          "kind": "function",
          "signature": "initSDFAttractionBindGroup(system, device, positionBuffer, velocityBuffer)",
          "summary": "Initialize bind group (call after particle buffers are created)."
        },
        {
          "name": "executeSDFAttraction",
          "kind": "function",
          "signature": "executeSDFAttraction(system, device, particleCount, dt = 1/60, time = 0)",
          "summary": "Execute SDF attraction compute pass."
        },
        {
          "name": "clearSDFAttractors",
          "kind": "function",
          "signature": "clearSDFAttractors(system)",
          "summary": "Clear all attractors."
        },
        {
          "name": "destroySDFAttractionSystem",
          "kind": "function",
          "signature": "destroySDFAttractionSystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSPH",
      "path": "engine/reference/sim/particles/ParticleSPH.md",
      "source": "engine/sim/particles/ParticleSPH.js",
      "import": "/engine/sim/particles/ParticleSPH.js",
      "sourceHash": "f76044e081e6826fbfab2405ccc8050600582d21941e54c7662b035058143f7a",
      "summary": "ParticleSPH.js - Smoothed Particle Hydrodynamics (GAP 36) True Lagrangian particle-based fluid simulation where particles ARE the fluid. Complements Eulerian grid solver (GAP 32) for free-surface liquids. Two-pass GPU compute: Pass 1 (density): estimate density at each particle via Poly6 kernel Pass 2 (forces):  pressure (Spiky), viscosity, surface tension, XSPH correction Navier-Stokes in SPH form: ρᵢ = Σⱼ mⱼ W(rᵢ-rⱼ, h)           (density) aᵢ = -Σⱼ mⱼ(Pᵢ/ρᵢ² + Pⱼ/ρⱼ²)∇W  (pressure) aᵢ += μ Σⱼ mⱼ(vⱼ-vᵢ)/ρⱼ ∇²W      (viscosity) Per-element rest density and viscosity from element table (GAP 33). Uses neighbor grid (GAP 25) for O(N) spatial queries. Usage: const sph = createSPHSystem(device, maxParticles); initSPHBindGroups(sph, device, posBuffer, velBuffer, gridBuffers); executeSPH(sph, device, particleCount, dt);",
      "exports": [
        {
          "name": "createSPHSystem",
          "kind": "function",
          "signature": "createSPHSystem(device, maxParticles)",
          "summary": "Create the SPH fluid system."
        },
        {
          "name": "initSPHBindGroups",
          "kind": "function",
          "signature": "initSPHBindGroups(system, device, positionBuffer, velocityBuffer, gridBuffers, thermalBuffer)",
          "summary": "Initialize bind groups. Requires neighbor grid buffers."
        },
        {
          "name": "setSPHParams",
          "kind": "function",
          "signature": "setSPHParams(system, config)",
          "summary": "Set SPH parameters at runtime."
        },
        {
          "name": "executeSPH",
          "kind": "function",
          "signature": "executeSPH(system, device, particleCount, dt)",
          "summary": "Execute the two-pass SPH compute."
        },
        {
          "name": "getSPHDensityBuffer",
          "kind": "function",
          "signature": "getSPHDensityBuffer(system)",
          "summary": "Get the density/pressure buffer for use by surface renderers."
        },
        {
          "name": "destroySPHSystem",
          "kind": "function",
          "signature": "destroySPHSystem(system)",
          "summary": "Destroy."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSchema",
      "path": "engine/reference/sim/particles/ParticleSchema.md",
      "source": "engine/sim/particles/ParticleSchema.js",
      "import": "/engine/sim/particles/ParticleSchema.js",
      "sourceHash": "37b23558db7206e04ca88e0460b24f39af3e6e40667523a1641e43085c26aaf9",
      "summary": "Pack meta.w value from individual components (full format with physics) Format: mass * 1e8 + drag * 1e6 + size * 1e4 + renderMode * 1e3 + shape * 10 + behavior",
      "exports": [
        {
          "name": "packParticleMeta",
          "kind": "function",
          "signature": "packParticleMeta(size, renderMode, shape, behavior = 0, mass = 1.0, drag = 0.02)",
          "summary": "Pack meta.w value from individual components (full format with physics) Format: mass * 1e8 + drag * 1e6 + size * 1e4 + renderMode * 1e3 + shape * 10 + behavior"
        },
        {
          "name": "unpackParticleMeta",
          "kind": "function",
          "signature": "unpackParticleMeta(packed)",
          "summary": "Unpack meta.w value to individual components"
        },
        {
          "name": "getBehaviorId",
          "kind": "function",
          "signature": "getBehaviorId(behaviorName)",
          "summary": "Get behavior ID from behavior name"
        },
        {
          "name": "validateField",
          "kind": "function",
          "signature": "validateField(value, fieldSchema)",
          "summary": "Validate a value against a schema field"
        },
        {
          "name": "validateEmitterConfig",
          "kind": "function",
          "signature": "validateEmitterConfig(config)",
          "summary": "Validate an emitter config against schema"
        },
        {
          "name": "createDefaultEmitterConfig",
          "kind": "function",
          "signature": "createDefaultEmitterConfig(overrides = {})",
          "summary": "Create a default emitter config"
        },
        {
          "name": "createDefaultParticleParams",
          "kind": "function",
          "signature": "createDefaultParticleParams(overrides = {})",
          "summary": "Create a default particle params uniform buffer data"
        },
        {
          "name": "createEmptySnapshot",
          "kind": "function",
          "signature": "createEmptySnapshot(time, frameIndex)",
          "summary": "Create an empty particle snapshot"
        },
        {
          "name": "createEmitterSnapshot",
          "kind": "function",
          "signature": "createEmitterSnapshot(emitter)",
          "summary": "Create an emitter snapshot from live emitter state"
        },
        {
          "name": "getShapeId",
          "kind": "function",
          "signature": "getShapeId(shapeName)",
          "summary": "Get shape ID from shape name"
        },
        {
          "name": "getRenderModeId",
          "kind": "function",
          "signature": "getRenderModeId(modeName)",
          "summary": "Get render mode ID from mode name"
        },
        {
          "name": "getShapeName",
          "kind": "function",
          "signature": "getShapeName(shapeId)",
          "summary": "Get shape name from ID"
        },
        {
          "name": "getRenderModeName",
          "kind": "function",
          "signature": "getRenderModeName(modeId)",
          "summary": "Get render mode name from ID"
        },
        {
          "name": "serializeEmitterConfig",
          "kind": "function",
          "signature": "serializeEmitterConfig(config)",
          "summary": "Serialize emitter config to JSON-safe object"
        },
        {
          "name": "deserializeEmitterConfig",
          "kind": "function",
          "signature": "deserializeEmitterConfig(json)",
          "summary": "Deserialize emitter config from JSON"
        },
        {
          "name": "serializeSnapshot",
          "kind": "function",
          "signature": "serializeSnapshot(snapshot)",
          "summary": "Serialize particle snapshot to JSON-safe object"
        },
        {
          "name": "deserializeSnapshot",
          "kind": "function",
          "signature": "deserializeSnapshot(json)",
          "summary": "Deserialize particle snapshot from JSON"
        },
        {
          "name": "PARTICLE_BUFFER_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_BUFFER_SCHEMA",
          "summary": "Per-particle data layout in GPU buffers. Each particle uses 3 vec4s (48 bytes total)."
        },
        {
          "name": "FRAME_UNIFORMS_SCHEMA",
          "kind": "constant",
          "signature": "FRAME_UNIFORMS_SCHEMA",
          "summary": "Frame uniforms passed to all particle shaders"
        },
        {
          "name": "PARTICLE_PARAMS_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_PARAMS_SCHEMA",
          "summary": "Per-draw particle parameters"
        },
        {
          "name": "FORCE_PARAMS_SCHEMA",
          "kind": "constant",
          "signature": "FORCE_PARAMS_SCHEMA",
          "summary": "Force parameters uniform (group 2 binding 0 in main particle compute shader) Controls global wind, turbulence, force points, vortex, and velocity clamping."
        },
        {
          "name": "PARTICLE_SHAPES",
          "kind": "constant",
          "signature": "PARTICLE_SHAPES",
          "summary": "Shape types for particle rendering"
        },
        {
          "name": "RENDER_MODES",
          "kind": "constant",
          "signature": "RENDER_MODES",
          "summary": "Render modes for particle blending"
        },
        {
          "name": "PARTICLE_BEHAVIORS",
          "kind": "constant",
          "signature": "PARTICLE_BEHAVIORS",
          "summary": "Behavior types for particle movement patterns"
        },
        {
          "name": "EMITTER_CONFIG_SCHEMA",
          "kind": "constant",
          "signature": "EMITTER_CONFIG_SCHEMA",
          "summary": "Complete emitter configuration schema"
        },
        {
          "name": "ELEMENT_LAYER_SCHEMA",
          "kind": "constant",
          "signature": "ELEMENT_LAYER_SCHEMA",
          "summary": "Element layer for emitter mixing"
        },
        {
          "name": "PARTICLE_SNAPSHOT_ENTRY_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_SNAPSHOT_ENTRY_SCHEMA",
          "summary": "Single particle snapshot entry"
        },
        {
          "name": "EMITTER_SNAPSHOT_SCHEMA",
          "kind": "constant",
          "signature": "EMITTER_SNAPSHOT_SCHEMA",
          "summary": "Emitter state snapshot"
        },
        {
          "name": "PARTICLE_SYSTEM_SNAPSHOT_SCHEMA",
          "kind": "constant",
          "signature": "PARTICLE_SYSTEM_SNAPSHOT_SCHEMA",
          "summary": "Complete particle system snapshot"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSharedMemCollision",
      "path": "engine/reference/sim/particles/ParticleSharedMemCollision.md",
      "source": "engine/sim/particles/ParticleSharedMemCollision.js",
      "import": "/engine/sim/particles/ParticleSharedMemCollision.js",
      "sourceHash": "89b5425fdec31d8e93ee866995c90e3749373a28cf5117b07915c2d8ce96f17d",
      "summary": "ParticleSharedMemCollision.js - Workgroup shared memory particle collision Drop-in replacement for the grid collision `collide` pass that uses workgroup shared memory to eliminate random global memory reads. Architecture: - Uses the same grid infrastructure (clearGrid + binParticles are unchanged) - Dispatches one workgroup PER grid cell (cell-centric) - All threads in a workgroup share the same cell → same neighbor cells - Neighbor particles loaded into shared memory in tiles of TILE_SIZE - Each thread checks its particle against shared memory (fast L1/register access) Memory access improvement: - Old: Each thread reads random global positions/velocities for neighbors - New: Workgroup cooperatively loads sequential global reads → shared memory Then all threads read from shared memory (100× faster than global) Uses the SAME bind group layout as the existing grid collision system, so the existing bind group can be reused directly. Ref: GPU Gems 3 Ch.31 \"Fast N-Body Simulation with CUDA\"",
      "exports": [
        {
          "name": "createSharedMemCollidePipeline",
          "kind": "function",
          "signature": "createSharedMemCollidePipeline(device, bindGroupLayout, tileSize = 256)",
          "summary": "Create the shared-memory collide pipeline. This pipeline uses the SAME bind group layout as the existing grid collision system."
        },
        {
          "name": "dispatchSharedMemCollide",
          "kind": "function",
          "signature": "dispatchSharedMemCollide(pipeline, bindGroup, pass, gridDims)",
          "summary": "Execute the shared-memory collide pass. Dispatches one workgroup per grid cell. Uses the existing grid bind group."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSimWorld",
      "path": "engine/reference/sim/particles/ParticleSimWorld.md",
      "source": "engine/sim/particles/ParticleSimWorld.js",
      "import": "/engine/sim/particles/ParticleSimWorld.js",
      "sourceHash": "52d6382d8cf822e0e756f6eb2e9694eeed32863524b7b8b324937a0eb1809e0d",
      "summary": "Initialize spatial grid and line buffers for advanced particle features. Call this after createParticleSimWorld to enable line connections and neighbor lookups.",
      "exports": [
        {
          "name": "createParticleSimWorld",
          "kind": "function",
          "signature": "async createParticleSimWorld(gpuDevice, options = {})",
          "summary": ""
        },
        {
          "name": "destroyParticleSimWorld",
          "kind": "function",
          "signature": "destroyParticleSimWorld(world)",
          "summary": ""
        },
        {
          "name": "initAdvancedParticleBuffers",
          "kind": "function",
          "signature": "initAdvancedParticleBuffers(world, options = {})",
          "summary": "Initialize spatial grid and line buffers for advanced particle features. Call this after createParticleSimWorld to enable line connections and neighbor lookups."
        },
        {
          "name": "initAllAdvancedSystems",
          "kind": "function",
          "signature": "async initAllAdvancedSystems(world, options = {})",
          "summary": "Initialize all advanced particle systems (sorting, wire constraints, SDF collision, etc.) Call after createParticleSimWorld and initAdvancedParticleBuffers."
        },
        {
          "name": "createHeatConductionSystem",
          "kind": "function",
          "signature": "createHeatConductionSystem(world)",
          "summary": "Create heat conduction + phase transition compute system. Requires spatial grid to be initialized (gridCountsBuffer, gridIndicesBuffer)."
        },
        {
          "name": "stepHeatConduction",
          "kind": "function",
          "signature": "stepHeatConduction(world, dt)",
          "summary": "Execute heat conduction compute pass."
        },
        {
          "name": "stepAdvancedSystems",
          "kind": "function",
          "signature": "stepAdvancedSystems(world, dt, options = {})",
          "summary": "Execute all active advanced particle systems in the simulation step."
        },
        {
          "name": "renderWorldRibbonTrails",
          "kind": "function",
          "signature": "renderWorldRibbonTrails(pass, world, viewProjMatrix, cameraPos, instanceCount)",
          "summary": "Render ribbon trails into the given render pass. Call during the render loop AFTER particle rendering."
        },
        {
          "name": "sortParticlesForRendering",
          "kind": "function",
          "signature": "sortParticlesForRendering(world, cameraPos)",
          "summary": "Execute GPU sorting for transparent particle rendering. Call before rendering particles back-to-front. Respects world.sortFrameInterval to skip sorting on intermediate frames (e.g. interval=2 sorts every other frame, reducing GPU cost for large counts)."
        },
        {
          "name": "addParticleWire",
          "kind": "function",
          "signature": "addParticleWire(world, particleA, particleB, restLength, stiffness = 0.5)",
          "summary": "Add a wire constraint between two particles."
        },
        {
          "name": "createGPURope",
          "kind": "function",
          "signature": "createGPURope(world, startPos, endPos, segments, opts = {})",
          "summary": "Create a GPU-simulated rope with particles and constraints"
        },
        {
          "name": "uploadParticleVelocities",
          "kind": "function",
          "signature": "uploadParticleVelocities(world, particleOffset, velocities)",
          "summary": "Upload particle velocities to GPU buffer"
        },
        {
          "name": "updateRopeAttachment",
          "kind": "function",
          "signature": "updateRopeAttachment(world, entityId, which, worldPos)",
          "summary": "Update attachment constraint target position"
        },
        {
          "name": "destroyGPURope",
          "kind": "function",
          "signature": "destroyGPURope(world, entityId)",
          "summary": "Destroy a GPU rope and release its resources"
        },
        {
          "name": "addParticleCollider",
          "kind": "function",
          "signature": "addParticleCollider(world, type, center, radius, halfExtents)",
          "summary": "Add an SDF collider to the particle system."
        },
        {
          "name": "clearParticleColliders",
          "kind": "function",
          "signature": "clearParticleColliders(world)",
          "summary": "Clear all SDF colliders (call before per-frame rebuild)."
        },
        {
          "name": "rebuildParticleColliders",
          "kind": "function",
          "signature": "rebuildParticleColliders(world, colliders)",
          "summary": "Batch-rebuild SDF colliders from an array of descriptors. Call each frame with entity SDF shapes for proper mesh collision."
        },
        {
          "name": "seedParticles",
          "kind": "function",
          "signature": "seedParticles(world, count, options = {})",
          "summary": "Seed particles on GPU with random positions/velocities."
        },
        {
          "name": "setParticleAtlasMode",
          "kind": "function",
          "signature": "setParticleAtlasMode(world, mode)",
          "summary": "Set texture atlas sprite assignment mode."
        },
        {
          "name": "initSnapshotSystem",
          "kind": "function",
          "signature": "initSnapshotSystem(world, options = {})",
          "summary": "Initialize snapshot system for time rewind."
        },
        {
          "name": "updateSnapshots",
          "kind": "function",
          "signature": "updateSnapshots(world, emitters, currentTimeMs)",
          "summary": "Auto-capture snapshots during simulation (call each frame)."
        },
        {
          "name": "captureSnapshot",
          "kind": "function",
          "signature": "captureSnapshot(world, emitters, currentTimeMs)",
          "summary": "Manually take a snapshot."
        },
        {
          "name": "beginRewind",
          "kind": "function",
          "signature": "beginRewind(world)",
          "summary": "Start time rewind mode."
        },
        {
          "name": "endRewind",
          "kind": "function",
          "signature": "endRewind(world)",
          "summary": "Stop time rewind and resume simulation."
        },
        {
          "name": "updateRewind",
          "kind": "function",
          "signature": "updateRewind(world, emitters, dt)",
          "summary": "Step rewind playback (call each frame while rewinding)."
        },
        {
          "name": "rewindToTime",
          "kind": "function",
          "signature": "rewindToTime(world, emitters, targetTimeMs)",
          "summary": "Seek to a specific time in history."
        },
        {
          "name": "rewindToFrame",
          "kind": "function",
          "signature": "rewindToFrame(world, emitters, frameIndex)",
          "summary": "Restore a specific frame from history."
        },
        {
          "name": "setRewindSpeed",
          "kind": "function",
          "signature": "setRewindSpeed(world, speed)",
          "summary": "Set rewind playback speed (-1 = reverse, 1 = forward, 0.5 = slow, etc.)"
        },
        {
          "name": "getRewindInfo",
          "kind": "function",
          "signature": "getRewindInfo(world)",
          "summary": "Get snapshot/rewind status info."
        },
        {
          "name": "isRewinding",
          "kind": "function",
          "signature": "isRewinding(world)",
          "summary": "Check if currently in rewind mode."
        },
        {
          "name": "clearSnapshots",
          "kind": "function",
          "signature": "clearSnapshots(world)",
          "summary": "Clear all snapshot history."
        },
        {
          "name": "updateAdaptiveQuality",
          "kind": "function",
          "signature": "updateAdaptiveQuality(world, frameTimeMs)",
          "summary": "Update adaptive quality based on frame time. Automatically adjusts activeParticleCount to maintain target FPS. TECHNIQUES FROM AAA GAME INDUSTRY (DRS Best Practices): 1. Frame-rate independent exponential smoothing 2. Spike filtering - only reduce after sustained poor performance 3. Panic mode - aggressive drop when critically over budget 4. Fast recovery - don't be over-cautious when headroom exists 5. Proportional response - bigger adjustments when further from target 6. Target slightly under budget for safety margin"
        },
        {
          "name": "getParticleStats",
          "kind": "function",
          "signature": "getParticleStats(world)",
          "summary": "Get particle system stats for performance overlay."
        },
        {
          "name": "readbackPositionsFromGPU",
          "kind": "function",
          "signature": "async readbackPositionsFromGPU(world, targetPositions, particleCount)",
          "summary": ""
        },
        {
          "name": "readbackVelocitiesFromGPU",
          "kind": "function",
          "signature": "async readbackVelocitiesFromGPU(world, targetVelocities, particleCount)",
          "summary": ""
        },
        {
          "name": "readbackThermalFromGPU",
          "kind": "function",
          "signature": "async readbackThermalFromGPU(world, targetThermal, particleCount)",
          "summary": ""
        },
        {
          "name": "attachFluidWorld",
          "kind": "function",
          "signature": "attachFluidWorld(particleWorld, fluidWorld, worldMin, worldMax)",
          "summary": "Attach a fluid world to the particle simulation. Particles will sample and follow the fluid velocity field."
        },
        {
          "name": "stepParticleSimWorld",
          "kind": "function",
          "signature": "stepParticleSimWorld(world, deltaSeconds, options = {})",
          "summary": ""
        },
        {
          "name": "createLineRenderPipeline",
          "kind": "function",
          "signature": "createLineRenderPipeline(device, format)",
          "summary": "Create line rendering pipeline for particle connections"
        },
        {
          "name": "createLineComputePipelines",
          "kind": "function",
          "signature": "createLineComputePipelines(device)",
          "summary": "Create line compute pipelines for spatial grid and line generation"
        },
        {
          "name": "createLineUniformBuffer",
          "kind": "function",
          "signature": "createLineUniformBuffer(device)",
          "summary": "Create line uniform buffer for compute and render"
        },
        {
          "name": "initLineRenderingSystem",
          "kind": "function",
          "signature": "initLineRenderingSystem(world, format)",
          "summary": "Initialize complete line rendering system"
        },
        {
          "name": "stepLineGeneration",
          "kind": "function",
          "signature": "stepLineGeneration(world, options = {})",
          "summary": "Execute line generation compute passes"
        },
        {
          "name": "renderParticleLines",
          "kind": "function",
          "signature": "renderParticleLines(world, pass, viewProj)",
          "summary": "Render particle connection lines"
        },
        {
          "name": "updateMouseInteraction",
          "kind": "function",
          "signature": "updateMouseInteraction(ndcX, ndcY, active = true)",
          "summary": "Update mouse state for particle interaction"
        },
        {
          "name": "getMouseState",
          "kind": "function",
          "signature": "getMouseState()",
          "summary": "Get current mouse state"
        },
        {
          "name": "addForcePoint",
          "kind": "function",
          "signature": "addForcePoint(point)",
          "summary": "Add an attractor or repeller force point"
        },
        {
          "name": "removeForcePoint",
          "kind": "function",
          "signature": "removeForcePoint(index)",
          "summary": "Remove a force point by index"
        },
        {
          "name": "clearForcePoints",
          "kind": "function",
          "signature": "clearForcePoints()",
          "summary": "Clear all force points"
        },
        {
          "name": "getForcePoints",
          "kind": "function",
          "signature": "getForcePoints()",
          "summary": "Get all force points"
        },
        {
          "name": "updateForcePoint",
          "kind": "function",
          "signature": "updateForcePoint(index, x, y, z, strength)",
          "summary": "Update force point position"
        },
        {
          "name": "attachWindSystem",
          "kind": "function",
          "signature": "attachWindSystem(world, windSystem)",
          "summary": "Attach a WindSystem instance to the particle world. Once attached, stepParticleSimWorld will automatically read wind params each frame."
        },
        {
          "name": "detachWindSystem",
          "kind": "function",
          "signature": "detachWindSystem(world)",
          "summary": "Detach wind system from particle world"
        },
        {
          "name": "updateKillZones",
          "kind": "function",
          "signature": "updateKillZones(world, zones)",
          "summary": "Update kill zones for a particle world. Particles inside kill zones are killed."
        },
        {
          "name": "clearKillZones",
          "kind": "function",
          "signature": "clearKillZones(world)",
          "summary": "Clear all kill zones"
        },
        {
          "name": "startDissolve",
          "kind": "function",
          "signature": "startDissolve(groupId, duration = 1.0, direction = 'out')",
          "summary": "Start a dissolve effect for a particle group"
        },
        {
          "name": "getDissolve",
          "kind": "function",
          "signature": "getDissolve(groupId)",
          "summary": "Get dissolve factor for a group (0 = invisible, 1 = fully visible)"
        },
        {
          "name": "sampleCurlNoise",
          "kind": "function",
          "signature": "sampleCurlNoise(x, y, z, scale = 1, time = 0)",
          "summary": "Sample curl noise at a position (CPU version for debugging)"
        },
        {
          "name": "initTrailSystem",
          "kind": "function",
          "signature": "initTrailSystem(world, historyLength = 8)",
          "summary": "Initialize trail history buffer for particles"
        },
        {
          "name": "registerSubEmitter",
          "kind": "function",
          "signature": "registerSubEmitter(parentType, config)",
          "summary": "Register a sub-emitter configuration"
        },
        {
          "name": "getSubEmitterConfig",
          "kind": "function",
          "signature": "getSubEmitterConfig(parentType)",
          "summary": "Get sub-emitter config for a particle type"
        },
        {
          "name": "clearSubEmitters",
          "kind": "function",
          "signature": "clearSubEmitters()",
          "summary": "Clear all sub-emitter configs"
        },
        {
          "name": "configureParticleLongRange",
          "kind": "function",
          "signature": "configureParticleLongRange(world, config = {})",
          "summary": "Select exactly one long-range force backend without changing the legacy default."
        },
        {
          "name": "getParticleLongRangeState",
          "kind": "function",
          "signature": "getParticleLongRangeState(world)",
          "summary": ""
        },
        {
          "name": "ensureSystemEnabled",
          "kind": "function",
          "signature": "ensureSystemEnabled(world, systemName, config)",
          "summary": "Lazily enable a particle system on an existing world if not already initialized. Call from editor/runtime when an emitter's physics profile requires a system that wasn't enabled at init time."
        },
        {
          "name": "warmUpParticleWorld",
          "kind": "function",
          "signature": "warmUpParticleWorld(world, warmUpSeconds = 2.0, options = {})",
          "summary": "Pre-simulate a particle world for N seconds before the first visible frame. Runs stepParticleSimWorld repeatedly with fixed timestep so effects look \"established\" immediately (e.g. fire already burning, smoke already rising)."
        },
        {
          "name": "reserveParticles",
          "kind": "function",
          "signature": "reserveParticles(particleWorld, count, backend = 'free')",
          "summary": "Reserve a range of particles for a specific backend"
        },
        {
          "name": "releaseParticles",
          "kind": "function",
          "signature": "releaseParticles(particleWorld, count, backend)",
          "summary": "Release reserved particles (e.g., when rope is destroyed)"
        },
        {
          "name": "uploadParticles",
          "kind": "function",
          "signature": "uploadParticles(particleWorld, particleOffset, positions)",
          "summary": ""
        },
        {
          "name": "registerRopeChain",
          "kind": "function",
          "signature": "registerRopeChain(particleWorld, ropeMetadata)",
          "summary": "Register a rope chain in the particle system"
        },
        {
          "name": "unregisterRopeChain",
          "kind": "function",
          "signature": "unregisterRopeChain(particleWorld, entityId)",
          "summary": "Unregister a rope chain from the particle system"
        },
        {
          "name": "getTotalReservedParticles",
          "kind": "function",
          "signature": "getTotalReservedParticles(particleWorld)",
          "summary": "Get total particle count across all backends"
        },
        {
          "name": "CLASS_BUBBLE",
          "kind": "re-export",
          "signature": "CLASS_BUBBLE",
          "summary": ""
        },
        {
          "name": "CLASS_BULK",
          "kind": "re-export",
          "signature": "CLASS_BULK",
          "summary": ""
        },
        {
          "name": "CLASS_FOAM",
          "kind": "re-export",
          "signature": "CLASS_FOAM",
          "summary": ""
        },
        {
          "name": "CLASS_NONE",
          "kind": "re-export",
          "signature": "CLASS_NONE",
          "summary": ""
        },
        {
          "name": "CLASS_SPRAY",
          "kind": "re-export",
          "signature": "CLASS_SPRAY",
          "summary": ""
        },
        {
          "name": "CLASS_SURFACE",
          "kind": "re-export",
          "signature": "CLASS_SURFACE",
          "summary": ""
        },
        {
          "name": "CURVE_PRESETS",
          "kind": "re-export",
          "signature": "CURVE_PRESETS",
          "summary": ""
        },
        {
          "name": "DEFAULT_LOD_TIERS",
          "kind": "re-export",
          "signature": "DEFAULT_LOD_TIERS",
          "summary": ""
        },
        {
          "name": "ELEMENTS",
          "kind": "re-export",
          "signature": "ELEMENTS",
          "summary": ""
        },
        {
          "name": "ELEMENT_LUT_WGSL",
          "kind": "re-export",
          "signature": "ELEMENT_LUT_WGSL",
          "summary": ""
        },
        {
          "name": "EVENT_DEATH",
          "kind": "re-export",
          "signature": "EVENT_DEATH",
          "summary": ""
        },
        {
          "name": "EVENT_ENTITY_COLLISION",
          "kind": "re-export",
          "signature": "EVENT_ENTITY_COLLISION",
          "summary": ""
        },
        {
          "name": "EVENT_GROUND_COLLISION",
          "kind": "re-export",
          "signature": "EVENT_GROUND_COLLISION",
          "summary": ""
        },
        {
          "name": "EVENT_KILL_ZONE",
          "kind": "re-export",
          "signature": "EVENT_KILL_ZONE",
          "summary": ""
        },
        {
          "name": "EVENT_MASK_ALL",
          "kind": "re-export",
          "signature": "EVENT_MASK_ALL",
          "summary": ""
        },
        {
          "name": "INTERACTION_COOL",
          "kind": "re-export",
          "signature": "INTERACTION_COOL",
          "summary": ""
        },
        {
          "name": "INTERACTION_CORRODE",
          "kind": "re-export",
          "signature": "INTERACTION_CORRODE",
          "summary": ""
        },
        {
          "name": "INTERACTION_HEAT",
          "kind": "re-export",
          "signature": "INTERACTION_HEAT",
          "summary": ""
        },
        {
          "name": "INTERACTION_MOISTURE",
          "kind": "re-export",
          "signature": "INTERACTION_MOISTURE",
          "summary": ""
        },
        {
          "name": "MOLECULE_PRESETS",
          "kind": "re-export",
          "signature": "MOLECULE_PRESETS",
          "summary": ""
        },
        {
          "name": "ROPE_INTERACTION_MATERIALS",
          "kind": "re-export",
          "signature": "ROPE_INTERACTION_MATERIALS",
          "summary": ""
        },
        {
          "name": "addContainmentVolume",
          "kind": "re-export",
          "signature": "addContainmentVolume",
          "summary": ""
        },
        {
          "name": "addFluidSource",
          "kind": "re-export",
          "signature": "addFluidSource",
          "summary": ""
        },
        {
          "name": "addProjectionSurface",
          "kind": "re-export",
          "signature": "addProjectionSurface",
          "summary": ""
        },
        {
          "name": "addSDFAttractor",
          "kind": "re-export",
          "signature": "addSDFAttractor",
          "summary": ""
        },
        {
          "name": "buildNeighborGrid",
          "kind": "re-export",
          "signature": "buildNeighborGrid",
          "summary": ""
        },
        {
          "name": "clearContainmentVolumes",
          "kind": "re-export",
          "signature": "clearContainmentVolumes",
          "summary": ""
        },
        {
          "name": "clearDecals",
          "kind": "re-export",
          "signature": "clearDecals",
          "summary": ""
        },
        {
          "name": "clearProjectionSurfaces",
          "kind": "re-export",
          "signature": "clearProjectionSurfaces",
          "summary": ""
        },
        {
          "name": "clearSDFAttractors",
          "kind": "re-export",
          "signature": "clearSDFAttractors",
          "summary": ""
        },
        {
          "name": "computeAdaptiveSubsteps",
          "kind": "re-export",
          "signature": "computeAdaptiveSubsteps",
          "summary": ""
        },
        {
          "name": "createAdaptiveSubstepController",
          "kind": "re-export",
          "signature": "createAdaptiveSubstepController",
          "summary": ""
        },
        {
          "name": "createAttributeReader",
          "kind": "re-export",
          "signature": "createAttributeReader",
          "summary": ""
        },
        {
          "name": "createAudioBridge",
          "kind": "re-export",
          "signature": "createAudioBridge",
          "summary": ""
        },
        {
          "name": "createChemistrySystem",
          "kind": "re-export",
          "signature": "createChemistrySystem",
          "summary": ""
        },
        {
          "name": "createClassifierSystem",
          "kind": "re-export",
          "signature": "createClassifierSystem",
          "summary": ""
        },
        {
          "name": "createDecalSpawner",
          "kind": "re-export",
          "signature": "createDecalSpawner",
          "summary": ""
        },
        {
          "name": "createElectromagneticSystem",
          "kind": "re-export",
          "signature": "createElectromagneticSystem",
          "summary": ""
        },
        {
          "name": "createElementTable",
          "kind": "re-export",
          "signature": "createElementTable",
          "summary": ""
        },
        {
          "name": "createEmitterLOD",
          "kind": "re-export",
          "signature": "createEmitterLOD",
          "summary": ""
        },
        {
          "name": "createEulerianFluidSolver",
          "kind": "re-export",
          "signature": "createEulerianFluidSolver",
          "summary": ""
        },
        {
          "name": "createFlockingSystem",
          "kind": "re-export",
          "signature": "createFlockingSystem",
          "summary": ""
        },
        {
          "name": "createFmmSystem",
          "kind": "re-export",
          "signature": "createFmmSystem",
          "summary": ""
        },
        {
          "name": "createLennardJonesSystem",
          "kind": "re-export",
          "signature": "createLennardJonesSystem",
          "summary": ""
        },
        {
          "name": "createLifetimeCurvesSystem",
          "kind": "re-export",
          "signature": "createLifetimeCurvesSystem",
          "summary": ""
        },
        {
          "name": "createLocalSpaceSystem",
          "kind": "re-export",
          "signature": "createLocalSpaceSystem",
          "summary": ""
        },
        {
          "name": "createNBodySystem",
          "kind": "re-export",
          "signature": "createNBodySystem",
          "summary": ""
        },
        {
          "name": "createNeighborGridSystem",
          "kind": "re-export",
          "signature": "createNeighborGridSystem",
          "summary": ""
        },
        {
          "name": "createParticleMeshEwaldSystem",
          "kind": "re-export",
          "signature": "createParticleMeshEwaldSystem",
          "summary": ""
        },
        {
          "name": "createRopeInteractionSystem",
          "kind": "re-export",
          "signature": "createRopeInteractionSystem",
          "summary": ""
        },
        {
          "name": "createRopeNodeState",
          "kind": "re-export",
          "signature": "createRopeNodeState",
          "summary": ""
        },
        {
          "name": "createSDFAttractionSystem",
          "kind": "re-export",
          "signature": "createSDFAttractionSystem",
          "summary": ""
        },
        {
          "name": "createSPHSystem",
          "kind": "re-export",
          "signature": "createSPHSystem",
          "summary": ""
        },
        {
          "name": "createSoftContainmentSystem",
          "kind": "re-export",
          "signature": "createSoftContainmentSystem",
          "summary": ""
        },
        {
          "name": "createSplineFollowSystem",
          "kind": "re-export",
          "signature": "createSplineFollowSystem",
          "summary": ""
        },
        {
          "name": "createSurfaceProjectionSystem",
          "kind": "re-export",
          "signature": "createSurfaceProjectionSystem",
          "summary": ""
        },
        {
          "name": "createVectorFieldSystem",
          "kind": "re-export",
          "signature": "createVectorFieldSystem",
          "summary": ""
        },
        {
          "name": "curveFromLegacy3",
          "kind": "re-export",
          "signature": "curveFromLegacy3",
          "summary": ""
        },
        {
          "name": "destroyAttributeReader",
          "kind": "re-export",
          "signature": "destroyAttributeReader",
          "summary": ""
        },
        {
          "name": "destroyAudioBridge",
          "kind": "re-export",
          "signature": "destroyAudioBridge",
          "summary": ""
        },
        {
          "name": "destroyChemistrySystem",
          "kind": "re-export",
          "signature": "destroyChemistrySystem",
          "summary": ""
        },
        {
          "name": "destroyClassifierSystem",
          "kind": "re-export",
          "signature": "destroyClassifierSystem",
          "summary": ""
        },
        {
          "name": "destroyDecalSpawner",
          "kind": "re-export",
          "signature": "destroyDecalSpawner",
          "summary": ""
        },
        {
          "name": "destroyElectromagneticSystem",
          "kind": "re-export",
          "signature": "destroyElectromagneticSystem",
          "summary": ""
        },
        {
          "name": "destroyElementTable",
          "kind": "re-export",
          "signature": "destroyElementTable",
          "summary": ""
        },
        {
          "name": "destroyEulerianFluidSolver",
          "kind": "re-export",
          "signature": "destroyEulerianFluidSolver",
          "summary": ""
        },
        {
          "name": "destroyFlockingSystem",
          "kind": "re-export",
          "signature": "destroyFlockingSystem",
          "summary": ""
        },
        {
          "name": "destroyFmmSystem",
          "kind": "re-export",
          "signature": "destroyFmmSystem",
          "summary": ""
        },
        {
          "name": "destroyLennardJonesSystem",
          "kind": "re-export",
          "signature": "destroyLennardJonesSystem",
          "summary": ""
        },
        {
          "name": "destroyLifetimeCurvesSystem",
          "kind": "re-export",
          "signature": "destroyLifetimeCurvesSystem",
          "summary": ""
        },
        {
          "name": "destroyLocalSpaceSystem",
          "kind": "re-export",
          "signature": "destroyLocalSpaceSystem",
          "summary": ""
        },
        {
          "name": "destroyNBodySystem",
          "kind": "re-export",
          "signature": "destroyNBodySystem",
          "summary": ""
        },
        {
          "name": "destroyNeighborGridSystem",
          "kind": "re-export",
          "signature": "destroyNeighborGridSystem",
          "summary": ""
        },
        {
          "name": "destroyParticleMeshEwaldSystem",
          "kind": "re-export",
          "signature": "destroyParticleMeshEwaldSystem",
          "summary": ""
        },
        {
          "name": "destroyRopeInteractionSystem",
          "kind": "re-export",
          "signature": "destroyRopeInteractionSystem",
          "summary": ""
        },
        {
          "name": "destroySDFAttractionSystem",
          "kind": "re-export",
          "signature": "destroySDFAttractionSystem",
          "summary": ""
        },
        {
          "name": "destroySPHSystem",
          "kind": "re-export",
          "signature": "destroySPHSystem",
          "summary": ""
        },
        {
          "name": "destroySoftContainmentSystem",
          "kind": "re-export",
          "signature": "destroySoftContainmentSystem",
          "summary": ""
        },
        {
          "name": "destroySplineFollowSystem",
          "kind": "re-export",
          "signature": "destroySplineFollowSystem",
          "summary": ""
        },
        {
          "name": "destroySurfaceProjectionSystem",
          "kind": "re-export",
          "signature": "destroySurfaceProjectionSystem",
          "summary": ""
        },
        {
          "name": "destroyVectorFieldSystem",
          "kind": "re-export",
          "signature": "destroyVectorFieldSystem",
          "summary": ""
        },
        {
          "name": "disableEventSystem",
          "kind": "re-export",
          "signature": "disableEventSystem",
          "summary": ""
        },
        {
          "name": "enableEventSystem",
          "kind": "re-export",
          "signature": "enableEventSystem",
          "summary": ""
        },
        {
          "name": "estimateMaxSpeedCPU",
          "kind": "re-export",
          "signature": "estimateMaxSpeedCPU",
          "summary": ""
        },
        {
          "name": "evaluateEmitterLOD",
          "kind": "re-export",
          "signature": "evaluateEmitterLOD",
          "summary": ""
        },
        {
          "name": "evaluateEmitterLODByScreenSize",
          "kind": "re-export",
          "signature": "evaluateEmitterLODByScreenSize",
          "summary": ""
        },
        {
          "name": "executeChemistry",
          "kind": "re-export",
          "signature": "executeChemistry",
          "summary": ""
        },
        {
          "name": "executeClassifier",
          "kind": "re-export",
          "signature": "executeClassifier",
          "summary": ""
        },
        {
          "name": "executeElectromagnetic",
          "kind": "re-export",
          "signature": "executeElectromagnetic",
          "summary": ""
        },
        {
          "name": "executeFlocking",
          "kind": "re-export",
          "signature": "executeFlocking",
          "summary": ""
        },
        {
          "name": "executeFmm",
          "kind": "re-export",
          "signature": "executeFmm",
          "summary": ""
        },
        {
          "name": "executeLennardJones",
          "kind": "re-export",
          "signature": "executeLennardJones",
          "summary": ""
        },
        {
          "name": "executeLocalToWorld",
          "kind": "re-export",
          "signature": "executeLocalToWorld",
          "summary": ""
        },
        {
          "name": "executeNBody",
          "kind": "re-export",
          "signature": "executeNBody",
          "summary": ""
        },
        {
          "name": "executeParticleMeshEwald",
          "kind": "re-export",
          "signature": "executeParticleMeshEwald",
          "summary": ""
        },
        {
          "name": "executeSDFAttraction",
          "kind": "re-export",
          "signature": "executeSDFAttraction",
          "summary": ""
        },
        {
          "name": "executeSPH",
          "kind": "re-export",
          "signature": "executeSPH",
          "summary": ""
        },
        {
          "name": "executeSoftContainment",
          "kind": "re-export",
          "signature": "executeSoftContainment",
          "summary": ""
        },
        {
          "name": "executeSplineFollow",
          "kind": "re-export",
          "signature": "executeSplineFollow",
          "summary": ""
        },
        {
          "name": "executeSurfaceProjection",
          "kind": "re-export",
          "signature": "executeSurfaceProjection",
          "summary": ""
        },
        {
          "name": "executeWorldToLocal",
          "kind": "re-export",
          "signature": "executeWorldToLocal",
          "summary": ""
        },
        {
          "name": "feedCollisionEvents",
          "kind": "re-export",
          "signature": "feedCollisionEvents",
          "summary": ""
        },
        {
          "name": "findNearestParticle",
          "kind": "re-export",
          "signature": "findNearestParticle",
          "summary": ""
        },
        {
          "name": "findParticlesInRadius",
          "kind": "re-export",
          "signature": "findParticlesInRadius",
          "summary": ""
        },
        {
          "name": "flushPendingAudio",
          "kind": "re-export",
          "signature": "flushPendingAudio",
          "summary": ""
        },
        {
          "name": "generateProceduralVectorField",
          "kind": "re-export",
          "signature": "generateProceduralVectorField",
          "summary": ""
        },
        {
          "name": "getActiveDecals",
          "kind": "re-export",
          "signature": "getActiveDecals",
          "summary": ""
        },
        {
          "name": "getClassificationBuffer",
          "kind": "re-export",
          "signature": "getClassificationBuffer",
          "summary": ""
        },
        {
          "name": "getCurrentLODTier",
          "kind": "re-export",
          "signature": "getCurrentLODTier",
          "summary": ""
        },
        {
          "name": "getDecalCount",
          "kind": "re-export",
          "signature": "getDecalCount",
          "summary": ""
        },
        {
          "name": "getElement",
          "kind": "re-export",
          "signature": "getElement",
          "summary": ""
        },
        {
          "name": "getElementBySymbol",
          "kind": "re-export",
          "signature": "getElementBySymbol",
          "summary": ""
        },
        {
          "name": "getLastEvents",
          "kind": "re-export",
          "signature": "getLastEvents",
          "summary": ""
        },
        {
          "name": "getNeighborGridBuffers",
          "kind": "re-export",
          "signature": "getNeighborGridBuffers",
          "summary": ""
        },
        {
          "name": "getRopeInteractionMaterial",
          "kind": "re-export",
          "signature": "getRopeInteractionMaterial",
          "summary": ""
        },
        {
          "name": "getRopeInteractionState",
          "kind": "re-export",
          "signature": "getRopeInteractionState",
          "summary": ""
        },
        {
          "name": "getSPHDensityBuffer",
          "kind": "re-export",
          "signature": "getSPHDensityBuffer",
          "summary": ""
        },
        {
          "name": "getSubstanceInteraction",
          "kind": "re-export",
          "signature": "getSubstanceInteraction",
          "summary": ""
        },
        {
          "name": "getValenceBuffer",
          "kind": "re-export",
          "signature": "getValenceBuffer",
          "summary": ""
        },
        {
          "name": "initChemistryBindGroups",
          "kind": "re-export",
          "signature": "initChemistryBindGroups",
          "summary": ""
        },
        {
          "name": "initClassifierBindGroups",
          "kind": "re-export",
          "signature": "initClassifierBindGroups",
          "summary": ""
        },
        {
          "name": "initContainmentBindGroups",
          "kind": "re-export",
          "signature": "initContainmentBindGroups",
          "summary": ""
        },
        {
          "name": "initEMBindGroups",
          "kind": "re-export",
          "signature": "initEMBindGroups",
          "summary": ""
        },
        {
          "name": "initFlockingBindGroups",
          "kind": "re-export",
          "signature": "initFlockingBindGroups",
          "summary": ""
        },
        {
          "name": "initFluidBindGroups",
          "kind": "re-export",
          "signature": "initFluidBindGroups",
          "summary": ""
        },
        {
          "name": "initFmmBindGroups",
          "kind": "re-export",
          "signature": "initFmmBindGroups",
          "summary": ""
        },
        {
          "name": "initLJBindGroups",
          "kind": "re-export",
          "signature": "initLJBindGroups",
          "summary": ""
        },
        {
          "name": "initLocalSpaceBindGroups",
          "kind": "re-export",
          "signature": "initLocalSpaceBindGroups",
          "summary": ""
        },
        {
          "name": "initNBodyBindGroups",
          "kind": "re-export",
          "signature": "initNBodyBindGroups",
          "summary": ""
        },
        {
          "name": "initNeighborGridBindGroups",
          "kind": "re-export",
          "signature": "initNeighborGridBindGroups",
          "summary": ""
        },
        {
          "name": "initParticleMeshEwaldBindGroups",
          "kind": "re-export",
          "signature": "initParticleMeshEwaldBindGroups",
          "summary": ""
        },
        {
          "name": "initParticleValence",
          "kind": "re-export",
          "signature": "initParticleValence",
          "summary": ""
        },
        {
          "name": "initProjectionBindGroups",
          "kind": "re-export",
          "signature": "initProjectionBindGroups",
          "summary": ""
        },
        {
          "name": "initSDFAttractionBindGroup",
          "kind": "re-export",
          "signature": "initSDFAttractionBindGroup",
          "summary": ""
        },
        {
          "name": "initSPHBindGroups",
          "kind": "re-export",
          "signature": "initSPHBindGroups",
          "summary": ""
        },
        {
          "name": "initSplineFollowBindGroups",
          "kind": "re-export",
          "signature": "initSplineFollowBindGroups",
          "summary": ""
        },
        {
          "name": "ljMixingRule",
          "kind": "re-export",
          "signature": "ljMixingRule",
          "summary": ""
        },
        {
          "name": "loadVectorFieldFromData",
          "kind": "re-export",
          "signature": "loadVectorFieldFromData",
          "summary": ""
        },
        {
          "name": "offParticleEvent",
          "kind": "re-export",
          "signature": "offParticleEvent",
          "summary": ""
        },
        {
          "name": "onParticleEvent",
          "kind": "re-export",
          "signature": "onParticleEvent",
          "summary": ""
        },
        {
          "name": "parseFGA",
          "kind": "re-export",
          "signature": "parseFGA",
          "summary": ""
        },
        {
          "name": "processAudioEvents",
          "kind": "re-export",
          "signature": "processAudioEvents",
          "summary": ""
        },
        {
          "name": "readFmmDiagnostics",
          "kind": "re-export",
          "signature": "readFmmDiagnostics",
          "summary": ""
        },
        {
          "name": "readParticleMeshEwaldDiagnostics",
          "kind": "re-export",
          "signature": "readParticleMeshEwaldDiagnostics",
          "summary": ""
        },
        {
          "name": "readParticleMeta",
          "kind": "re-export",
          "signature": "readParticleMeta",
          "summary": ""
        },
        {
          "name": "readParticlePosition",
          "kind": "re-export",
          "signature": "readParticlePosition",
          "summary": ""
        },
        {
          "name": "readParticleVelocity",
          "kind": "re-export",
          "signature": "readParticleVelocity",
          "summary": ""
        },
        {
          "name": "readbackEvents",
          "kind": "re-export",
          "signature": "readbackEvents",
          "summary": ""
        },
        {
          "name": "refreshAttributeCache",
          "kind": "re-export",
          "signature": "refreshAttributeCache",
          "summary": ""
        },
        {
          "name": "registerAudioCue",
          "kind": "re-export",
          "signature": "registerAudioCue",
          "summary": ""
        },
        {
          "name": "registerEventHandler",
          "kind": "re-export",
          "signature": "registerEventHandler",
          "summary": ""
        },
        {
          "name": "registerRopeForInteraction",
          "kind": "re-export",
          "signature": "registerRopeForInteraction",
          "summary": ""
        },
        {
          "name": "resetAdaptiveSubsteps",
          "kind": "re-export",
          "signature": "resetAdaptiveSubsteps",
          "summary": ""
        },
        {
          "name": "setAudioListenerPos",
          "kind": "re-export",
          "signature": "setAudioListenerPos",
          "summary": ""
        },
        {
          "name": "setClassifierParams",
          "kind": "re-export",
          "signature": "setClassifierParams",
          "summary": ""
        },
        {
          "name": "setEmitterTransform",
          "kind": "re-export",
          "signature": "setEmitterTransform",
          "summary": ""
        },
        {
          "name": "setEmitterTransformFromPosRot",
          "kind": "re-export",
          "signature": "setEmitterTransformFromPosRot",
          "summary": ""
        },
        {
          "name": "setExternalField",
          "kind": "re-export",
          "signature": "setExternalField",
          "summary": ""
        },
        {
          "name": "setFlockingParams",
          "kind": "re-export",
          "signature": "setFlockingParams",
          "summary": ""
        },
        {
          "name": "setFmmParams",
          "kind": "re-export",
          "signature": "setFmmParams",
          "summary": ""
        },
        {
          "name": "setForcedLODTier",
          "kind": "re-export",
          "signature": "setForcedLODTier",
          "summary": ""
        },
        {
          "name": "setLifetimeCurves",
          "kind": "re-export",
          "signature": "setLifetimeCurves",
          "summary": ""
        },
        {
          "name": "setNBodyParams",
          "kind": "re-export",
          "signature": "setNBodyParams",
          "summary": ""
        },
        {
          "name": "setParticleCharges",
          "kind": "re-export",
          "signature": "setParticleCharges",
          "summary": ""
        },
        {
          "name": "setParticleElements",
          "kind": "re-export",
          "signature": "setParticleElements",
          "summary": ""
        },
        {
          "name": "setParticleMeshEwaldParams",
          "kind": "re-export",
          "signature": "setParticleMeshEwaldParams",
          "summary": ""
        },
        {
          "name": "setSPHParams",
          "kind": "re-export",
          "signature": "setSPHParams",
          "summary": ""
        },
        {
          "name": "setSplineControlPoints",
          "kind": "re-export",
          "signature": "setSplineControlPoints",
          "summary": ""
        },
        {
          "name": "setSplineFollowParams",
          "kind": "re-export",
          "signature": "setSplineFollowParams",
          "summary": ""
        },
        {
          "name": "setVectorFieldParams",
          "kind": "re-export",
          "signature": "setVectorFieldParams",
          "summary": ""
        },
        {
          "name": "stepEulerianFluid",
          "kind": "re-export",
          "signature": "stepEulerianFluid",
          "summary": ""
        },
        {
          "name": "stepRopeInteraction",
          "kind": "re-export",
          "signature": "stepRopeInteraction",
          "summary": ""
        },
        {
          "name": "unregisterRopeInteraction",
          "kind": "re-export",
          "signature": "unregisterRopeInteraction",
          "summary": ""
        },
        {
          "name": "updateDecals",
          "kind": "re-export",
          "signature": "updateDecals",
          "summary": ""
        },
        {
          "name": "updateSDFAttractor",
          "kind": "re-export",
          "signature": "updateSDFAttractor",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSnapshot",
      "path": "engine/reference/sim/particles/ParticleSnapshot.md",
      "source": "engine/sim/particles/ParticleSnapshot.js",
      "import": "/engine/sim/particles/ParticleSnapshot.js",
      "sourceHash": "3e2abf3b5bd98569c6dfd6d48b19659cba32d18167bed862002c7f6e1f5ddc18",
      "summary": "Create particle snapshot system for time rewind",
      "exports": [
        {
          "name": "createSnapshotSystem",
          "kind": "function",
          "signature": "createSnapshotSystem(device, maxParticles, options = {})",
          "summary": "Create particle snapshot system for time rewind"
        },
        {
          "name": "initSnapshotBindGroups",
          "kind": "function",
          "signature": "initSnapshotBindGroups(snapshot, positionBuffer, velocityBuffer, metaBuffer, thermalBuffer)",
          "summary": "Initialize bind groups with particle buffers"
        },
        {
          "name": "takeSnapshot",
          "kind": "function",
          "signature": "takeSnapshot(snapshot, emitters, currentTimeMs)",
          "summary": "Take a snapshot of current state"
        },
        {
          "name": "autoSnapshot",
          "kind": "function",
          "signature": "autoSnapshot(snapshot, emitters, currentTimeMs)",
          "summary": "Auto-snapshot based on interval (call every frame)"
        },
        {
          "name": "restoreFrame",
          "kind": "function",
          "signature": "restoreFrame(snapshot, emitters, frameIndex)",
          "summary": "Restore exact frame from history"
        },
        {
          "name": "restoreInterpolated",
          "kind": "function",
          "signature": "restoreInterpolated(snapshot, emitters, frameA, frameB, t)",
          "summary": "Restore with interpolation between two frames"
        },
        {
          "name": "seekToTime",
          "kind": "function",
          "signature": "seekToTime(snapshot, emitters, targetTimeMs)",
          "summary": "Seek to a specific time in history"
        },
        {
          "name": "startRewind",
          "kind": "function",
          "signature": "startRewind(snapshot)",
          "summary": "Start rewind mode"
        },
        {
          "name": "stopRewind",
          "kind": "function",
          "signature": "stopRewind(snapshot)",
          "summary": "Stop rewind and resume simulation"
        },
        {
          "name": "stepRewind",
          "kind": "function",
          "signature": "stepRewind(snapshot, emitters, dt)",
          "summary": "Step rewind playback (call each frame while rewinding)"
        },
        {
          "name": "setPlaybackSpeed",
          "kind": "function",
          "signature": "setPlaybackSpeed(snapshot, speed)",
          "summary": "Set playback speed (-1 = reverse, 1 = forward, 0.5 = slow forward, etc.)"
        },
        {
          "name": "getSnapshotInfo",
          "kind": "function",
          "signature": "getSnapshotInfo(snapshot)",
          "summary": "Get current playback info"
        },
        {
          "name": "clearHistory",
          "kind": "function",
          "signature": "clearHistory(snapshot)",
          "summary": "Clear all history"
        },
        {
          "name": "destroySnapshotSystem",
          "kind": "function",
          "signature": "destroySnapshotSystem(snapshot)",
          "summary": "Destroy snapshot system"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSnapshotDelta",
      "path": "engine/reference/sim/particles/ParticleSnapshotDelta.md",
      "source": "engine/sim/particles/ParticleSnapshotDelta.js",
      "import": "/engine/sim/particles/ParticleSnapshotDelta.js",
      "sourceHash": "39a100183e2fffbf0923c93f67f1d733c8e6873e0cca7ad082a6d0e59719947c",
      "summary": "ParticleSnapshotDelta.js - Delta-Compressed Particle State History Like the WorldTimeline system, uses delta compression to store only changes: - Keyframes: Full state snapshots at intervals - Delta frames: Only particles that moved significantly - No max frame limit - unlimited history with efficient storage Compression approach: - Track which particles changed since last frame - Store only changed particle indices + their new state - Periodic keyframes for random access",
      "exports": [
        {
          "name": "hashParticleKeyframe",
          "kind": "function",
          "signature": "hashParticleKeyframe(frame)",
          "summary": ""
        },
        {
          "name": "hashParticleKeyframeSemantic",
          "kind": "function",
          "signature": "hashParticleKeyframeSemantic(frame, sampleVec4Count = 1024)",
          "summary": ""
        },
        {
          "name": "createDeltaSnapshotSystem",
          "kind": "function",
          "signature": "createDeltaSnapshotSystem(options = {})",
          "summary": "Create delta-compressed particle snapshot system"
        },
        {
          "name": "captureFrame",
          "kind": "function",
          "signature": "async captureFrame(snapshot, particleState, emitters, currentTimeMs)",
          "summary": "Capture a snapshot (keyframe or delta based on interval) Captures EVERYTHING: positions, velocities, meta, slotInfo, liveCount, freeSlots"
        },
        {
          "name": "autoCapture",
          "kind": "function",
          "signature": "async autoCapture(snapshot, particleState, emitters, currentTimeMs)",
          "summary": "Auto-capture based on interval - NON-BLOCKING version Uses double-buffered GPU readback to avoid blocking the main thread"
        },
        {
          "name": "reconstructState",
          "kind": "function",
          "signature": "reconstructState(snapshot, frameIndex)",
          "summary": "Reconstruct FULL particle state at a specific frame by applying deltas from keyframe Includes positions, velocities, meta, slotInfo, liveCount, freeSlots - everything needed for complete rewind Handles both quantized (Int16) and unquantized (Float32) data formats"
        },
        {
          "name": "restoreToFrame",
          "kind": "function",
          "signature": "restoreToFrame(snapshot, particleState, emitters, frameIndex)",
          "summary": "Restore FULL particle state to a specific frame"
        },
        {
          "name": "restoreInterpolated",
          "kind": "function",
          "signature": "restoreInterpolated(snapshot, particleState, emitters, frameA, frameB, t)",
          "summary": "Restore with interpolation between two frames"
        },
        {
          "name": "seekToTime",
          "kind": "function",
          "signature": "seekToTime(snapshot, particleState, emitters, targetTimeMs)",
          "summary": "Seek to specific time"
        },
        {
          "name": "startRewind",
          "kind": "function",
          "signature": "startRewind(snapshot)",
          "summary": "Start rewind mode"
        },
        {
          "name": "stopRewind",
          "kind": "function",
          "signature": "stopRewind(snapshot)",
          "summary": "Stop rewind"
        },
        {
          "name": "stepRewind",
          "kind": "function",
          "signature": "stepRewind(snapshot, particleState, emitters, dtMs)",
          "summary": "Step rewind playback - restores FULL particle state including spawn/death"
        },
        {
          "name": "setPlaybackSpeed",
          "kind": "function",
          "signature": "setPlaybackSpeed(snapshot, speed)",
          "summary": "Set playback speed"
        },
        {
          "name": "setEasingType",
          "kind": "function",
          "signature": "setEasingType(snapshot, easingType)",
          "summary": "Set easing type for interpolation"
        },
        {
          "name": "getEasingTypes",
          "kind": "function",
          "signature": "getEasingTypes()",
          "summary": "Get available easing types"
        },
        {
          "name": "getSnapshotInfo",
          "kind": "function",
          "signature": "getSnapshotInfo(snapshot)",
          "summary": "Get snapshot info"
        },
        {
          "name": "truncateHistoryAfterTime",
          "kind": "function",
          "signature": "truncateHistoryAfterTime(snapshot, timeMs)",
          "summary": ""
        },
        {
          "name": "clearHistory",
          "kind": "function",
          "signature": "clearHistory(snapshot)",
          "summary": "Clear all history"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSoftContainment",
      "path": "engine/reference/sim/particles/ParticleSoftContainment.md",
      "source": "engine/sim/particles/ParticleSoftContainment.js",
      "import": "/engine/sim/particles/ParticleSoftContainment.js",
      "sourceHash": "346761529124fa5ced66d2943c96aa19b0914cf86a502f3eb62232c1be561248",
      "summary": "ParticleSoftContainment.js - Soft Containment Volumes (GAP 31) GPU compute shader that keeps particles inside shape volumes using soft bounce forces instead of hard kill zones. Particles approaching the boundary receive a proportional repulsion force pushing them back inside. Supports: sphere, box, cylinder containment volumes. Unlike kill zones (hard removal), soft containment preserves particles and creates natural-looking bounded effects. Matches PopcornFX CParticleEvolver_Containment. Usage: const cont = createSoftContainmentSystem(device, maxParticles); addContainmentVolume(cont, { type: 'sphere', center: [0,5,0], radius: 10 }); initContainmentBindGroups(cont, device, positionBuffer, velocityBuffer); executeSoftContainment(cont, device, particleCount, dt);",
      "exports": [
        {
          "name": "createSoftContainmentSystem",
          "kind": "function",
          "signature": "createSoftContainmentSystem(device, maxParticles)",
          "summary": "Create the soft containment system."
        },
        {
          "name": "addContainmentVolume",
          "kind": "function",
          "signature": "addContainmentVolume(system, volume)",
          "summary": "Add a containment volume."
        },
        {
          "name": "initContainmentBindGroups",
          "kind": "function",
          "signature": "initContainmentBindGroups(system, device, positionBuffer, velocityBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "executeSoftContainment",
          "kind": "function",
          "signature": "executeSoftContainment(system, device, particleCount, dt)",
          "summary": "Execute the soft containment compute pass."
        },
        {
          "name": "clearContainmentVolumes",
          "kind": "function",
          "signature": "clearContainmentVolumes(system)",
          "summary": "Clear all volumes."
        },
        {
          "name": "destroySoftContainmentSystem",
          "kind": "function",
          "signature": "destroySoftContainmentSystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSpawnShapes",
      "path": "engine/reference/sim/particles/ParticleSpawnShapes.md",
      "source": "engine/sim/particles/ParticleSpawnShapes.js",
      "import": "/engine/sim/particles/ParticleSpawnShapes.js",
      "sourceHash": "48638ee6686e3bc43005b9b2758418d7ce0e7647143c67fe16da463bceda8501",
      "summary": "ParticleSpawnShapes.js - Spawn shape primitives for particle emission Niagara/PopcornFX/Houdini parity: spawn particles in structured shapes instead of just point + random spread. Each function returns { position: [x,y,z], normal: [nx,ny,nz] } Normal points outward from the shape surface — useful for initial velocity direction. ⚠️ MULTIPLAYER: Uses deterministic RNG from AIRandom.js",
      "exports": [
        {
          "name": "spawnSphere",
          "kind": "function",
          "signature": "spawnSphere(center, radius, surfaceOnly = false)",
          "summary": "Spawn inside or on a sphere"
        },
        {
          "name": "spawnHemisphere",
          "kind": "function",
          "signature": "spawnHemisphere(center, radius, axis = [0, 1, 0], surfaceOnly = false)",
          "summary": "Spawn on a hemisphere (oriented along axis)"
        },
        {
          "name": "spawnBox",
          "kind": "function",
          "signature": "spawnBox(min, max, surfaceOnly = false)",
          "summary": "Spawn inside or on a box (AABB)"
        },
        {
          "name": "spawnBoxCenter",
          "kind": "function",
          "signature": "spawnBoxCenter(center, halfExtents, surfaceOnly = false)",
          "summary": "Spawn inside or on a box defined by center + half-extents"
        },
        {
          "name": "spawnCylinder",
          "kind": "function",
          "signature": "spawnCylinder(center, axis, radius, height, surfaceOnly = false)",
          "summary": "Spawn inside or on a cylinder"
        },
        {
          "name": "spawnCone",
          "kind": "function",
          "signature": "spawnCone(apex, axis, angle, height, surfaceOnly = false)",
          "summary": "Spawn inside or on a cone"
        },
        {
          "name": "spawnRing",
          "kind": "function",
          "signature": "spawnRing(center, axis, radius, thickness = 0)",
          "summary": "Spawn on a ring (circle in 3D space)"
        },
        {
          "name": "spawnTorus",
          "kind": "function",
          "signature": "spawnTorus(center, axis, majorRadius, minorRadius, surfaceOnly = false)",
          "summary": "Spawn inside or on a torus"
        },
        {
          "name": "spawnLine",
          "kind": "function",
          "signature": "spawnLine(a, b, thickness = 0)",
          "summary": "Spawn along a line segment"
        },
        {
          "name": "spawnDisc",
          "kind": "function",
          "signature": "spawnDisc(center, normal, radius, innerRadius = 0)",
          "summary": "Spawn on a disc (filled circle in 3D space)"
        },
        {
          "name": "spawnGrid",
          "kind": "function",
          "signature": "spawnGrid(origin, axisU, axisV, countU, countV, index, jitter = 0)",
          "summary": "Spawn at grid positions (deterministic placement, good for walls/floors of particles)"
        },
        {
          "name": "spawnFromShape",
          "kind": "function",
          "signature": "spawnFromShape(shape, emitterPos, index = 0)",
          "summary": "Spawn a particle using a shape configuration object"
        },
        {
          "name": "velocityFromNormal",
          "kind": "function",
          "signature": "velocityFromNormal(normal, speed, spread = 0.2)",
          "summary": "Generate initial velocity from spawn shape result"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSplineFollow",
      "path": "engine/reference/sim/particles/ParticleSplineFollow.md",
      "source": "engine/sim/particles/ParticleSplineFollow.js",
      "import": "/engine/sim/particles/ParticleSplineFollow.js",
      "sourceHash": "355820138465f1bfbe55001c16910f385d08a088ce7f37356b43181a0b93c6f3",
      "summary": "ParticleSplineFollow.js - Spline/Path Following (GAP 28) GPU compute shader that steers particles along bezier or catmull-rom spline paths. Each particle tracks its progress (t parameter) along the curve and applies a steering force toward the next point on the path. Supports: - Cubic Bezier paths (4 control points per segment) - Catmull-Rom splines (N control points, smooth interpolation) - Per-particle speed along path - Spread: particles can deviate from path center by a configurable radius - Looping and ping-pong modes Control points are uploaded as a storage buffer (max 64 points). Each particle stores its path progress in thermalData.w (repurposed when not using thermal system) or a dedicated progress buffer. Usage: const spline = createSplineFollowSystem(device, maxParticles); setSplineControlPoints(spline, device, points); initSplineFollowBindGroups(spline, device, positionBuffer, velocityBuffer); executeSplineFollow(spline, device, particleCount, dt);",
      "exports": [
        {
          "name": "createSplineFollowSystem",
          "kind": "function",
          "signature": "createSplineFollowSystem(device, maxParticles)",
          "summary": "Create the spline follow system."
        },
        {
          "name": "setSplineControlPoints",
          "kind": "function",
          "signature": "setSplineControlPoints(system, device, points)",
          "summary": "Upload control points (array of [x, y, z])."
        },
        {
          "name": "initSplineFollowBindGroups",
          "kind": "function",
          "signature": "initSplineFollowBindGroups(system, device, positionBuffer, velocityBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "setSplineFollowParams",
          "kind": "function",
          "signature": "setSplineFollowParams(system, params)",
          "summary": "Update spline follow parameters."
        },
        {
          "name": "executeSplineFollow",
          "kind": "function",
          "signature": "executeSplineFollow(system, device, particleCount, dt)",
          "summary": "Execute the spline follow compute pass."
        },
        {
          "name": "destroySplineFollowSystem",
          "kind": "function",
          "signature": "destroySplineFollowSystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSplitting",
      "path": "engine/reference/sim/particles/ParticleSplitting.md",
      "source": "engine/sim/particles/ParticleSplitting.js",
      "import": "/engine/sim/particles/ParticleSplitting.js",
      "sourceHash": "14404283683d59eff768665af3ad1f1c11fdbb56521d6919971c8a84cde96918",
      "summary": "ParticleSplitting.js - Adaptive Particle Refinement for Fluid When water stretches thin (low SPH density, high velocity, few neighbors), particles split into smaller child particles. When many small particles cluster in a dense area, they merge back. This is how water naturally breaks apart into spray/droplets and reforms. GPU compute shader scans liquid particles, identifies split candidates, and uses atomic counters to claim dead particle slots for children. Split trigger: density < threshold AND speed > threshold Merge trigger: two particles within close range, both small, low relative velocity Mass conservation: Split: parent shrinks to 0.7× size, child spawns at 0.7× size (2 × 0.7³ ≈ 0.686 volume — slight loss acceptable for stability) Merge: surviving particle grows by merged particle's volume^(1/3) Usage: const split = createSplittingSystem(device, maxParticles); initSplittingBindGroups(split, device, posBuffer, velBuffer, thermalBuffer, metaBuffer, sphDensityBuffer); executeSplitting(split, device, particleCount, dt);",
      "exports": [
        {
          "name": "createSplittingSystem",
          "kind": "function",
          "signature": "createSplittingSystem(device, maxParticles)",
          "summary": "Create the splitting system."
        },
        {
          "name": "initSplittingBindGroups",
          "kind": "function",
          "signature": "initSplittingBindGroups(system, device, positionBuffer, velocityBuffer, thermalBuffer, metaBuffer, sphDensityBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "executeSplitting",
          "kind": "function",
          "signature": "executeSplitting(system, device, particleCount, dt)",
          "summary": "Execute the splitting compute pass."
        },
        {
          "name": "setSplittingParams",
          "kind": "function",
          "signature": "setSplittingParams(system, config)",
          "summary": "Update splitting parameters at runtime."
        },
        {
          "name": "destroySplittingSystem",
          "kind": "function",
          "signature": "destroySplittingSystem(system)",
          "summary": "Destroy splitting system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleSurfaceProjection",
      "path": "engine/reference/sim/particles/ParticleSurfaceProjection.md",
      "source": "engine/sim/particles/ParticleSurfaceProjection.js",
      "import": "/engine/sim/particles/ParticleSurfaceProjection.js",
      "sourceHash": "02b2a2e45688347809af333f95a35273c63b9203699426bd18ad9736994d6b2a",
      "summary": "ParticleSurfaceProjection.js - Surface Projection / Conform (GAP 29) GPU compute shader that projects particles onto shape surfaces. Particles are snapped or attracted to the nearest point on a surface, enabling effects like particles crawling along walls, flowing over terrain, or conforming to mesh silhouettes. Supports analytical shapes (sphere, box, plane, cylinder) on GPU. For arbitrary meshes, uses a signed distance field (SDF) with gradient descent to find the nearest surface point. Matches PopcornFX CParticleEvolver_Projection. Usage: const proj = createSurfaceProjectionSystem(device, maxParticles); addProjectionSurface(proj, { type: 'sphere', center: [0,0,0], radius: 5 }); initProjectionBindGroups(proj, device, positionBuffer, velocityBuffer); executeSurfaceProjection(proj, device, particleCount, dt);",
      "exports": [
        {
          "name": "createSurfaceProjectionSystem",
          "kind": "function",
          "signature": "createSurfaceProjectionSystem(device, maxParticles)",
          "summary": "Create the surface projection system."
        },
        {
          "name": "addProjectionSurface",
          "kind": "function",
          "signature": "addProjectionSurface(system, surface)",
          "summary": "Add a projection surface."
        },
        {
          "name": "initProjectionBindGroups",
          "kind": "function",
          "signature": "initProjectionBindGroups(system, device, positionBuffer, velocityBuffer)",
          "summary": "Initialize bind groups."
        },
        {
          "name": "executeSurfaceProjection",
          "kind": "function",
          "signature": "executeSurfaceProjection(system, device, particleCount, dt)",
          "summary": "Execute the surface projection compute pass."
        },
        {
          "name": "clearProjectionSurfaces",
          "kind": "function",
          "signature": "clearProjectionSurfaces(system)",
          "summary": "Clear all surfaces."
        },
        {
          "name": "destroySurfaceProjectionSystem",
          "kind": "function",
          "signature": "destroySurfaceProjectionSystem(system)",
          "summary": "Destroy the system."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleTextureAtlas",
      "path": "engine/reference/sim/particles/ParticleTextureAtlas.md",
      "source": "engine/sim/particles/ParticleTextureAtlas.js",
      "import": "/engine/sim/particles/ParticleTextureAtlas.js",
      "sourceHash": "2bdef5a5390df8ee67baefd4d4dd35169c3cb549ba238a41497d10ee0ff210ee",
      "summary": "Create texture atlas configuration",
      "exports": [
        {
          "name": "createAtlasConfig",
          "kind": "function",
          "signature": "createAtlasConfig(options = {})",
          "summary": "Create texture atlas configuration"
        },
        {
          "name": "createTextureAtlasSystem",
          "kind": "function",
          "signature": "createTextureAtlasSystem(device, maxParticles, config = {})",
          "summary": "Create texture atlas system"
        },
        {
          "name": "loadAtlasTexture",
          "kind": "function",
          "signature": "async loadAtlasTexture(atlasSystem, device, imageUrl)",
          "summary": "Load texture atlas from image"
        },
        {
          "name": "createProceduralAtlas",
          "kind": "function",
          "signature": "createProceduralAtlas(atlasSystem, device, options = {})",
          "summary": "Create procedural atlas texture (for testing)"
        },
        {
          "name": "initAtlasBindGroup",
          "kind": "function",
          "signature": "initAtlasBindGroup(atlasSystem, device, positionsBuffer, velocitiesBuffer)",
          "summary": "Initialize sprite assignment bind group"
        },
        {
          "name": "assignSpritesGPU",
          "kind": "function",
          "signature": "assignSpritesGPU(atlasSystem, device, particleCount, time)",
          "summary": "Assign sprites to particles via GPU"
        },
        {
          "name": "getAtlasUniforms",
          "kind": "function",
          "signature": "getAtlasUniforms(atlasSystem, time)",
          "summary": "Get atlas uniforms for rendering"
        },
        {
          "name": "setAssignmentMode",
          "kind": "function",
          "signature": "setAssignmentMode(atlasSystem, mode)",
          "summary": "Set sprite assignment mode"
        },
        {
          "name": "destroyTextureAtlasSystem",
          "kind": "function",
          "signature": "destroyTextureAtlasSystem(atlasSystem)",
          "summary": "Destroy texture atlas system"
        },
        {
          "name": "TEXTURE_ATLAS_TYPES",
          "kind": "constant",
          "signature": "TEXTURE_ATLAS_TYPES",
          "summary": ""
        },
        {
          "name": "TEXTURE_ATLAS_FUNCTIONS",
          "kind": "constant",
          "signature": "TEXTURE_ATLAS_FUNCTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticleVectorField",
      "path": "engine/reference/sim/particles/ParticleVectorField.md",
      "source": "engine/sim/particles/ParticleVectorField.js",
      "import": "/engine/sim/particles/ParticleVectorField.js",
      "sourceHash": "724488039996cad3d586630fc26f6f56840492979eac51f0c94454b302b77673",
      "summary": "Create a filterable 3D vector-field texture compatible with linear sampling.",
      "exports": [
        {
          "name": "createVectorFieldTexture",
          "kind": "function",
          "signature": "createVectorFieldTexture(device, resolution, label = 'VectorField.texture')",
          "summary": "Create a filterable 3D vector-field texture compatible with linear sampling."
        },
        {
          "name": "createVectorFieldSystem",
          "kind": "function",
          "signature": "createVectorFieldSystem(device, options = {})",
          "summary": "Create a vector field system."
        },
        {
          "name": "loadVectorFieldFromData",
          "kind": "function",
          "signature": "loadVectorFieldFromData(system, data, size)",
          "summary": "Load raw velocity data into the vector field."
        },
        {
          "name": "generateProceduralVectorField",
          "kind": "function",
          "signature": "generateProceduralVectorField(system, type = 'tornado')",
          "summary": "Generate a procedural vector field."
        },
        {
          "name": "setVectorFieldParams",
          "kind": "function",
          "signature": "setVectorFieldParams(system, params = {})",
          "summary": "Update vector field parameters."
        },
        {
          "name": "parseFGA",
          "kind": "function",
          "signature": "parseFGA(fgaText)",
          "summary": "Parse FGA format (FluidNinja/Houdini vector field export). FGA is a simple text format: header lines then XYZ velocity per voxel."
        },
        {
          "name": "destroyVectorFieldSystem",
          "kind": "function",
          "signature": "destroyVectorFieldSystem(system)",
          "summary": "Destroy the vector field system."
        },
        {
          "name": "PARTICLE_VECTOR_FIELD_TEXTURE_FORMAT",
          "kind": "constant",
          "signature": "PARTICLE_VECTOR_FIELD_TEXTURE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/ParticlesStateRegistry",
      "path": "engine/reference/sim/particles/ParticlesStateRegistry.md",
      "source": "engine/sim/particles/ParticlesStateRegistry.js",
      "import": "/engine/sim/particles/ParticlesStateRegistry.js",
      "sourceHash": "046469a146ada821d18d120ff7b67265352ac702d04b34a0a4ba78731c7ca0ac",
      "summary": "",
      "exports": [
        {
          "name": "setActiveParticlesState",
          "kind": "function",
          "signature": "setActiveParticlesState(particlesState)",
          "summary": ""
        },
        {
          "name": "getActiveParticlesState",
          "kind": "function",
          "signature": "getActiveParticlesState()",
          "summary": ""
        },
        {
          "name": "clearActiveParticlesState",
          "kind": "function",
          "signature": "clearActiveParticlesState()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/RopeMaterial",
      "path": "engine/reference/sim/particles/RopeMaterial.md",
      "source": "engine/sim/particles/RopeMaterial.js",
      "import": "/engine/sim/particles/RopeMaterial.js",
      "sourceHash": "e4a7f9dce6243ee6d6d31186469fa11301c4646e11dcbb6a14a5764d18f76713",
      "summary": "RopeMaterial.js — Thermal & interaction properties for rope/chain fiber materials. Extends the visual-only FIBER_MATERIALS from RopeSchema with physics properties needed for particle↔rope interaction: flammability, moisture absorption, thermal conductivity, burn/break temperatures, mass modifiers. EVERY material (including steel and chain) participates in interactions — metal softens and breaks at high enough temperatures, organic materials burn, all materials conduct heat along the chain. Thresholds differ per material. Interaction types by substance: - Fire/lava/plasma → heat transfer → softening → burning/melting → chain split - Water/blood/honey → moisture absorption → heavier → sag → wet stiffness change - Ice/snow → cooling → stiffening → freeze-brittle - Acid → corrosion → integrity loss → chain split - Sparks/debris → minor heat transfer",
      "exports": [
        {
          "name": "getSubstanceInteraction",
          "kind": "function",
          "signature": "getSubstanceInteraction(substance)",
          "summary": "Map particle substance to interaction type and intensity. Returns null if the substance doesn't interact with rope."
        },
        {
          "name": "createRopeNodeState",
          "kind": "function",
          "signature": "createRopeNodeState(nodeCount, ambientTemp = 293)",
          "summary": "Create per-node interaction state for a rope."
        },
        {
          "name": "getRopeInteractionMaterial",
          "kind": "function",
          "signature": "getRopeInteractionMaterial(fiberMaterial)",
          "summary": "Get the interaction material for a fiber material name. Falls back to hemp if unknown."
        },
        {
          "name": "ROPE_INTERACTION_MATERIALS",
          "kind": "constant",
          "signature": "ROPE_INTERACTION_MATERIALS",
          "summary": ""
        },
        {
          "name": "INTERACTION_HEAT",
          "kind": "constant",
          "signature": "INTERACTION_HEAT",
          "summary": ""
        },
        {
          "name": "INTERACTION_MOISTURE",
          "kind": "constant",
          "signature": "INTERACTION_MOISTURE",
          "summary": ""
        },
        {
          "name": "INTERACTION_COOL",
          "kind": "constant",
          "signature": "INTERACTION_COOL",
          "summary": ""
        },
        {
          "name": "INTERACTION_CORRODE",
          "kind": "constant",
          "signature": "INTERACTION_CORRODE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/RopeParticleInteraction",
      "path": "engine/reference/sim/particles/RopeParticleInteraction.md",
      "source": "engine/sim/particles/RopeParticleInteraction.js",
      "import": "/engine/sim/particles/RopeParticleInteraction.js",
      "sourceHash": "5bc3ecd4a0717be3c499261d61c1cec26b34ad7b5c10e9a11407a8a3781d9818",
      "summary": "RopeParticleInteraction.js — CPU-side per-tick bridge between free particles and ropes. Runs each simulation frame and performs: 1. Spatial proximity query: find free particles near each rope node 2. Heat transfer: fire/lava/plasma → rope heats up; ice/snow → rope cools 3. Moisture absorption: water/blood/honey near rope → rope gets heavier, sags 4. Corrosion: acid particles eat away rope integrity 5. Thermal conduction: heat spreads along the rope between adjacent nodes 6. Burning: when node temperature exceeds burn threshold → ignite, char, break 7. Chain splitting: when integrity reaches 0 → break constraint → 2 separate chains Works with ALL materials including steel/chain — metal softens and eventually breaks at high enough temperatures (lava, plasma). Thresholds differ per material. This is a CPU-side system because it needs to: - Make topology decisions (break constraints, split chains) - Spawn new emitters (fire/smoke on burning rope) - Modify per-constraint mass values (moisture → heavier)",
      "exports": [
        {
          "name": "createRopeInteractionSystem",
          "kind": "function",
          "signature": "createRopeInteractionSystem()",
          "summary": "Create the rope↔particle interaction system. Attach to the particle world and call stepRopeInteraction() each tick."
        },
        {
          "name": "registerRopeForInteraction",
          "kind": "function",
          "signature": "registerRopeForInteraction(system, entityId, ropeMetadata, fiberMaterial, ambientTemp = 293)",
          "summary": "Register a rope for interaction tracking. Call this after createGPURope."
        },
        {
          "name": "unregisterRopeInteraction",
          "kind": "function",
          "signature": "unregisterRopeInteraction(system, entityId)",
          "summary": "Unregister a rope (cleanup)."
        },
        {
          "name": "stepRopeInteraction",
          "kind": "function",
          "signature": "stepRopeInteraction(system, world, positionsCPU, thermalCPU, metaCPU, dt, callbacks = {})",
          "summary": "Step the rope↔particle interaction system."
        },
        {
          "name": "getRopeInteractionState",
          "kind": "function",
          "signature": "getRopeInteractionState(system, entityId)",
          "summary": "Get the current interaction state for a rope."
        },
        {
          "name": "getRopeAverageTemperature",
          "kind": "function",
          "signature": "getRopeAverageTemperature(system, entityId)",
          "summary": "Get average temperature of a rope."
        },
        {
          "name": "getRopeAverageMoisture",
          "kind": "function",
          "signature": "getRopeAverageMoisture(system, entityId)",
          "summary": "Get average moisture saturation of a rope."
        },
        {
          "name": "destroyRopeInteractionSystem",
          "kind": "function",
          "signature": "destroyRopeInteractionSystem(system)",
          "summary": "Destroy the interaction system and release all state."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/RopePhysics",
      "path": "engine/reference/sim/particles/RopePhysics.md",
      "source": "engine/sim/particles/RopePhysics.js",
      "import": "/engine/sim/particles/RopePhysics.js",
      "sourceHash": "02dccea675fe37457f09c27cefdfe669f186a4b9b5070e8319430bb3e23c5908",
      "summary": "RopePhysics.js - Advanced Rope Physics System GPU-accelerated rope physics with: - Tension/slack simulation - Attachment constraints (fixed points, entity attachments) - Rope cutting and rejoining - Stretching/compression limits - Wind/external force response",
      "exports": [
        {
          "name": "RopePhysicsSystem",
          "kind": "class",
          "signature": "class RopePhysicsSystem",
          "summary": ""
        },
        {
          "name": "createRopePhysicsSystem",
          "kind": "function",
          "signature": "createRopePhysicsSystem(device, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/SnapshotWorker",
      "path": "engine/reference/sim/particles/SnapshotWorker.md",
      "source": "engine/sim/particles/SnapshotWorker.js",
      "import": "/engine/sim/particles/SnapshotWorker.js",
      "sourceHash": "a22d8fc06e9de8a48bb7db99411b558c76de1533145805cd5908cbf651b5488d",
      "summary": "SnapshotWorker.js - Offload heavy snapshot compression to a separate thread This worker handles: - Delta calculation between frames - Quantization of position/velocity data - Compression of frame data - Memory management for snapshot history The main thread only does GPU readback (can't be done in workers) and sends the raw data here for processing.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/SpellEffectComposer",
      "path": "engine/reference/sim/particles/SpellEffectComposer.md",
      "source": "engine/sim/particles/SpellEffectComposer.js",
      "import": "/engine/sim/particles/SpellEffectComposer.js",
      "sourceHash": "d23e8bf23c22aabb8b6b0273c1b3cb25be54e0814e7d2ce7eec7060f2276674b",
      "summary": "SpellEffectComposer.js — Auto-blending multi-layer VFX composition ==================== ARCHITECTURE (for future AI/developers) ==================== Industry VFX standard (Niagara, Unity VFX Graph, PopcornFX, Houdini POP): A spell/effect is composed of MULTIPLE visual layers, each serving a distinct role: 1. CORE    — Main volumetric body (SDF particles, standard blend) 2. GLOW    — Larger, softer aura around core (bright color, low alpha, additive feel) 3. ACCENT  — Small bright particles: embers, snowflakes, sparkles, droplets 4. WISPS   — Secondary volumetric layer: smoke tendrils, mist, steam 5. RING    — Expanding shockwave/halo (burst spawn, grows outward) 6. TRAILS  — Ribbon trails following particles 7. LIGHT   — Dynamic point light matching effect color This system auto-generates these layers from an element mix. Given elements like [fire(0.8), ice(0.6)], it produces an array of emitter configs — one per visual layer. Each config is a complete Emitter component that can be passed to editor.createEntity(). USAGE: import { composeSpellEffect } from './SpellEffectComposer.js'; const layers = composeSpellEffect(activeElements, baseEmitterConfig); // layers = [{ name, layerType, emitterConfig }, ...] // Each layer.emitterConfig is a full Emitter component for createEntity The \"Create Spell From This\" button in EmitterInspectorCard.js calls this, then EditorParticles.createComposedSpellEffect() creates child emitter entities.",
      "exports": [
        {
          "name": "composeSpellEffect",
          "kind": "function",
          "signature": "composeSpellEffect(elements, baseConfig = {}, options = {})",
          "summary": "Compose a multi-layer spell effect from an element mix."
        },
        {
          "name": "getAvailableRecipes",
          "kind": "function",
          "signature": "getAvailableRecipes()",
          "summary": "Get available element recipe IDs."
        },
        {
          "name": "COMBINATION_RECIPES",
          "kind": "re-export",
          "signature": "COMBINATION_RECIPES",
          "summary": ""
        },
        {
          "name": "ELEMENT_RECIPES",
          "kind": "re-export",
          "signature": "ELEMENT_RECIPES",
          "summary": ""
        },
        {
          "name": "LAYER_TEMPLATES",
          "kind": "re-export",
          "signature": "LAYER_TEMPLATES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/data/index",
      "path": "engine/reference/sim/particles/data/index.md",
      "source": "engine/sim/particles/data/index.js",
      "import": "/engine/sim/particles/data/index.js",
      "sourceHash": "dac103de92c71848adee777df4c465b162d10b1b067064cffd9e1e827265e07d",
      "summary": "data/index.js — Re-exports for schema, config, attributes, and compression.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/effects/index",
      "path": "engine/reference/sim/particles/effects/index.md",
      "source": "engine/sim/particles/effects/index.js",
      "import": "/engine/sim/particles/effects/index.js",
      "sourceHash": "686751b9865818e092dbc5af4f0de8fbb0c9750f418972d5000418ad67737c6e",
      "summary": "effects/index.js — Re-exports for visual effects, trails, and lines.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/emitters/index",
      "path": "engine/reference/sim/particles/emitters/index.md",
      "source": "engine/sim/particles/emitters/index.js",
      "import": "/engine/sim/particles/emitters/index.js",
      "sourceHash": "f9d56b0c0ccee18b4869368025467e90aec01bd2dec826218c56b5b29e84ef7a",
      "summary": "emitters/index.js — Organized re-exports for emitter creation, presets, and lifecycle. New code should import from here. Original files remain in parent directory.",
      "exports": [
        {
          "name": "EMITTER_PRESETS",
          "kind": "re-export",
          "signature": "EMITTER_PRESETS",
          "summary": ""
        },
        {
          "name": "EMITTER_TYPES",
          "kind": "re-export",
          "signature": "EMITTER_TYPES",
          "summary": ""
        },
        {
          "name": "EmitterLOD",
          "kind": "re-export",
          "signature": "EmitterLOD",
          "summary": ""
        },
        {
          "name": "STATES",
          "kind": "re-export",
          "signature": "STATES",
          "summary": ""
        },
        {
          "name": "SUBSTANCE_PRESETS",
          "kind": "re-export",
          "signature": "SUBSTANCE_PRESETS",
          "summary": ""
        },
        {
          "name": "applyPreset",
          "kind": "re-export",
          "signature": "applyPreset",
          "summary": ""
        },
        {
          "name": "createEmitter",
          "kind": "re-export",
          "signature": "createEmitter",
          "summary": ""
        },
        {
          "name": "derivePhysicsProfile",
          "kind": "re-export",
          "signature": "derivePhysicsProfile",
          "summary": ""
        },
        {
          "name": "deriveState",
          "kind": "re-export",
          "signature": "deriveState",
          "summary": ""
        },
        {
          "name": "destroyEmitter",
          "kind": "re-export",
          "signature": "destroyEmitter",
          "summary": ""
        },
        {
          "name": "getEmitterPreset",
          "kind": "re-export",
          "signature": "getEmitterPreset",
          "summary": ""
        },
        {
          "name": "getEmitterTypes",
          "kind": "re-export",
          "signature": "getEmitterTypes",
          "summary": ""
        },
        {
          "name": "getStates",
          "kind": "re-export",
          "signature": "getStates",
          "summary": ""
        },
        {
          "name": "hasLiquidEmitters",
          "kind": "re-export",
          "signature": "hasLiquidEmitters",
          "summary": ""
        },
        {
          "name": "resolveSubstance",
          "kind": "re-export",
          "signature": "resolveSubstance",
          "summary": ""
        },
        {
          "name": "syncWorldSystemsToEmitters",
          "kind": "re-export",
          "signature": "syncWorldSystemsToEmitters",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/events/index",
      "path": "engine/reference/sim/particles/events/index.md",
      "source": "engine/sim/particles/events/index.js",
      "import": "/engine/sim/particles/events/index.js",
      "sourceHash": "8facf82059b09aa134c80f224ba011f04433b2dbe7b1525d6a10c721c509c68c",
      "summary": "events/index.js — Re-exports for event system, audio, and decals.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/mesh/index",
      "path": "engine/reference/sim/particles/mesh/index.md",
      "source": "engine/sim/particles/mesh/index.js",
      "import": "/engine/sim/particles/mesh/index.js",
      "sourceHash": "35fc111566ebe0dcde93231c2072894f921cd99f6fc6ed0d4f265b7a29f523e2",
      "summary": "mesh/index.js — Re-exports for mesh-to-particle conversion and instancing.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/physics/collision/index",
      "path": "engine/reference/sim/particles/physics/collision/index.md",
      "source": "engine/sim/particles/physics/collision/index.js",
      "import": "/engine/sim/particles/physics/collision/index.js",
      "sourceHash": "9334650ad747542a8db65b1d5ccc9db49ba00a093558eab1168a4fff74e65e6b",
      "summary": "physics/collision/index.js — Re-exports for collision systems.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/physics/compute/index",
      "path": "engine/reference/sim/particles/physics/compute/index.md",
      "source": "engine/sim/particles/physics/compute/index.js",
      "import": "/engine/sim/particles/physics/compute/index.js",
      "sourceHash": "f84a923a38fa8fa233f39c935423fad0dc00ae2ecccc3c53b199e6633384bc6a",
      "summary": "physics/compute/index.js — Re-exports for compute utilities.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/physics/constraints/index",
      "path": "engine/reference/sim/particles/physics/constraints/index.md",
      "source": "engine/sim/particles/physics/constraints/index.js",
      "import": "/engine/sim/particles/physics/constraints/index.js",
      "sourceHash": "22e1a4f97e6727e5819276182973552a917afe5659606f0eb4a833e58975f14c",
      "summary": "physics/constraints/index.js — Re-exports for constraint solvers.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/physics/fluids/index",
      "path": "engine/reference/sim/particles/physics/fluids/index.md",
      "source": "engine/sim/particles/physics/fluids/index.js",
      "import": "/engine/sim/particles/physics/fluids/index.js",
      "sourceHash": "851ac9784314f532cfb7abf44c9bc0ef81ee53933b4130742fec555cb7c78259",
      "summary": "physics/fluids/index.js — Re-exports for fluid solvers.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/physics/forces/index",
      "path": "engine/reference/sim/particles/physics/forces/index.md",
      "source": "engine/sim/particles/physics/forces/index.js",
      "import": "/engine/sim/particles/physics/forces/index.js",
      "sourceHash": "b2f552296d0a004b55d3487f1df06e482590a5f4b092f2368e90bb634a83f67c",
      "summary": "physics/forces/index.js — Re-exports for force systems.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/physics/index",
      "path": "engine/reference/sim/particles/physics/index.md",
      "source": "engine/sim/particles/physics/index.js",
      "import": "/engine/sim/particles/physics/index.js",
      "sourceHash": "8baccd3837667c1d09ad0a25015f85bc98ff53ee3a8b1fd42033ea6d9deb1ffd",
      "summary": "physics/index.js — Organized re-exports for GPU physics compute solvers. New code should import from here. Original files remain in parent directory.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/rope/index",
      "path": "engine/reference/sim/particles/rope/index.md",
      "source": "engine/sim/particles/rope/index.js",
      "import": "/engine/sim/particles/rope/index.js",
      "sourceHash": "3192d3bbab47767d8605680d1b06377d7c55d8c7ac6dadaba6aab8291a20cc82",
      "summary": "rope/index.js — Re-exports for rope/wire constraint systems.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/snapshots/index",
      "path": "engine/reference/sim/particles/snapshots/index.md",
      "source": "engine/sim/particles/snapshots/index.js",
      "import": "/engine/sim/particles/snapshots/index.js",
      "sourceHash": "5a2fda2c36842026aa0fa6b2c7097f6de3a3c5ca99ac8f4e1169c2ba56730545",
      "summary": "snapshots/index.js — Re-exports for snapshot, playback, and async management.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/SandboxMaterialCatalog",
      "path": "engine/reference/sim/particles/substances/SandboxMaterialCatalog.md",
      "source": "engine/sim/particles/substances/SandboxMaterialCatalog.js",
      "import": "/engine/sim/particles/substances/SandboxMaterialCatalog.js",
      "sourceHash": "a16e62bbbe549969258b2edaff3a636c28abe87b73484c30a693fe9c53e98c5a",
      "summary": "Engine-owned material facade for dense cellular sandboxes. Atomic numbers, particle material IDs, and sandbox cell codes are separate identities.  A sandbox code is only a compact runtime index.  The catalog keeps the canonical references beside it so the Editor, demos, and future authoring tools can share labels and properties without conflating those identity spaces. The generated behaviour is qualitative and mesoscale.  It does not claim that a grid cell is an atom or that periodic-table properties alone predict chemistry.  Only explicitly flagged reaction classes react in a solver.",
      "exports": [
        {
          "name": "createSandboxMaterialCatalog",
          "kind": "function",
          "signature": "createSandboxMaterialCatalog()",
          "summary": "Build an immutable shared element/substance/object view for dense sandboxes."
        },
        {
          "name": "createSandboxSpeciesLut",
          "kind": "function",
          "signature": "createSandboxSpeciesLut(catalog = createSandboxMaterialCatalog()",
          "summary": "Compile the shared catalog into one vec4<u32> record per cell code."
        },
        {
          "name": "temperatureToSandboxBucket",
          "kind": "function",
          "signature": "temperatureToSandboxBucket(temperatureK)",
          "summary": ""
        },
        {
          "name": "sandboxBucketToTemperature",
          "kind": "function",
          "signature": "sandboxBucketToTemperature(bucket)",
          "summary": ""
        },
        {
          "name": "packSandboxCell",
          "kind": "function",
          "signature": "packSandboxCell(speciesCode, temperatureK = SANDBOX_REFERENCE_TEMPERATURE_K, life = 255, variant = 0)",
          "summary": ""
        },
        {
          "name": "unpackSandboxCell",
          "kind": "function",
          "signature": "unpackSandboxCell(cell)",
          "summary": ""
        },
        {
          "name": "packSandboxObject",
          "kind": "function",
          "signature": "packSandboxObject(objectId, sourceSpeciesCode = 0, strength = 255, direction = 0)",
          "summary": ""
        },
        {
          "name": "unpackSandboxObject",
          "kind": "function",
          "signature": "unpackSandboxObject(objectWord)",
          "summary": ""
        },
        {
          "name": "sandboxSpeciesIdForSubstance",
          "kind": "function",
          "signature": "sandboxSpeciesIdForSubstance(materialId)",
          "summary": ""
        },
        {
          "name": "validateSandboxMaterialCatalog",
          "kind": "function",
          "signature": "validateSandboxMaterialCatalog(catalog)",
          "summary": ""
        },
        {
          "name": "SANDBOX_REFERENCE_TEMPERATURE_K",
          "kind": "constant",
          "signature": "SANDBOX_REFERENCE_TEMPERATURE_K",
          "summary": ""
        },
        {
          "name": "SANDBOX_TEMPERATURE_STEP_K",
          "kind": "constant",
          "signature": "SANDBOX_TEMPERATURE_STEP_K",
          "summary": ""
        },
        {
          "name": "SANDBOX_SPECIES_CAPACITY",
          "kind": "constant",
          "signature": "SANDBOX_SPECIES_CAPACITY",
          "summary": ""
        },
        {
          "name": "SANDBOX_SUBSTANCE_CODE_BASE",
          "kind": "constant",
          "signature": "SANDBOX_SUBSTANCE_CODE_BASE",
          "summary": ""
        },
        {
          "name": "SANDBOX_BEHAVIOR",
          "kind": "constant",
          "signature": "SANDBOX_BEHAVIOR",
          "summary": ""
        },
        {
          "name": "SANDBOX_PHASE",
          "kind": "constant",
          "signature": "SANDBOX_PHASE",
          "summary": ""
        },
        {
          "name": "SANDBOX_FLAGS",
          "kind": "constant",
          "signature": "SANDBOX_FLAGS",
          "summary": ""
        },
        {
          "name": "SANDBOX_REACTION",
          "kind": "constant",
          "signature": "SANDBOX_REACTION",
          "summary": ""
        },
        {
          "name": "SANDBOX_INTERACTION",
          "kind": "constant",
          "signature": "SANDBOX_INTERACTION",
          "summary": "Pairwise interaction traits compiled into the high byte of LUT word 3."
        },
        {
          "name": "SANDBOX_OBJECT",
          "kind": "constant",
          "signature": "SANDBOX_OBJECT",
          "summary": ""
        },
        {
          "name": "SANDBOX_OBJECTS",
          "kind": "constant",
          "signature": "SANDBOX_OBJECTS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/SubstanceMixer",
      "path": "engine/reference/sim/particles/substances/SubstanceMixer.md",
      "source": "engine/sim/particles/substances/SubstanceMixer.js",
      "import": "/engine/sim/particles/substances/SubstanceMixer.js",
      "sourceHash": "335e479d1a54781412ebe1b944c0defc05afba93198fd8f287bc25518159b6a5",
      "summary": "SubstanceMixer.js — Multi-substance blending for mixed emitters. When an emitter uses multiple elements (e.g. fire 0.8 + smoke 0.3), this module blends their substance properties into a single effective definition. Replaces scattered mixing logic in ParticleEmitterSystem.js (deriveTemperatureFromElements, deriveMaterialIndexFromElements, elementMixToEmitterConfig).",
      "exports": [
        {
          "name": "mixSubstances",
          "kind": "function",
          "signature": "mixSubstances(layers)",
          "summary": "Mix multiple substances into a blended definition."
        },
        {
          "name": "deriveFromElements",
          "kind": "function",
          "signature": "deriveFromElements(elementLayers)",
          "summary": "Derive a substance approximation from element layers (used by emitter system). Maps element IDs to substance IDs and mixes them."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/SubstanceRegistry",
      "path": "engine/reference/sim/particles/substances/SubstanceRegistry.md",
      "source": "engine/sim/particles/substances/SubstanceRegistry.js",
      "import": "/engine/sim/particles/substances/SubstanceRegistry.js",
      "sourceHash": "b59f63f78599cb75cbfccbcafc18ad8cf15748051cf5c32791056356548ef23e",
      "summary": "SubstanceRegistry.js — Central registry for all substance definitions. Provides a unified API to: - Register/unregister substance definitions - Look up substances by id, materialId, category, or tag - Derive physics profiles, phase state, thermal presets, SSFR tint, etc. Each substance is a plain object assembled from per-substance sub-files: { id, materialId, label, icon, category, tags, chemistry, thermal, physics, sph, visual, emitter, audio, decals, reactions, spell } Replaces scattered lookups across ParticleEmitterSystem, ParticleConstraints, ParticleReactionTable, EditorParticles, and ParticleElementRegistry.",
      "exports": [
        {
          "name": "registerSubstance",
          "kind": "function",
          "signature": "registerSubstance(def)",
          "summary": "Register a substance definition. Overwrites if id already exists."
        },
        {
          "name": "unregisterSubstance",
          "kind": "function",
          "signature": "unregisterSubstance(id)",
          "summary": "Unregister a substance by id."
        },
        {
          "name": "getSubstance",
          "kind": "function",
          "signature": "getSubstance(id)",
          "summary": "Get substance by id (e.g. 'water', 'lava', 'fire')."
        },
        {
          "name": "getSubstanceByMaterialId",
          "kind": "function",
          "signature": "getSubstanceByMaterialId(matId)",
          "summary": "Get substance by material ID number."
        },
        {
          "name": "getAllSubstances",
          "kind": "function",
          "signature": "getAllSubstances()",
          "summary": "Get all registered substances."
        },
        {
          "name": "getSubstancesByCategory",
          "kind": "function",
          "signature": "getSubstancesByCategory(category)",
          "summary": "Get substances filtered by category."
        },
        {
          "name": "getSubstancesByTag",
          "kind": "function",
          "signature": "getSubstancesByTag(tag)",
          "summary": "Get substances filtered by tag."
        },
        {
          "name": "getSubstanceIds",
          "kind": "function",
          "signature": "getSubstanceIds()",
          "summary": "Get substance IDs as an array."
        },
        {
          "name": "resolveSubstance",
          "kind": "function",
          "signature": "resolveSubstance(key)",
          "summary": "Resolve a substance key (preset name, element symbol, compound) to a substance definition. Falls back to partial matching."
        },
        {
          "name": "deriveState",
          "kind": "function",
          "signature": "deriveState(substanceId, temperature)",
          "summary": "Derive the phase of matter for a substance at a given temperature."
        },
        {
          "name": "derivePhysicsProfile",
          "kind": "function",
          "signature": "derivePhysicsProfile(substanceId, temperature)",
          "summary": "Derive which physics systems to enable for a substance at a given temperature."
        },
        {
          "name": "getSSFRTint",
          "kind": "function",
          "signature": "getSSFRTint(substanceId)",
          "summary": "Get SSFR tint for a substance."
        },
        {
          "name": "getThermalPreset",
          "kind": "function",
          "signature": "getThermalPreset(substanceId)",
          "summary": "Get thermal preset for a substance."
        },
        {
          "name": "getSPHParams",
          "kind": "function",
          "signature": "getSPHParams(substanceId)",
          "summary": "Get SPH fluid parameters for a substance."
        },
        {
          "name": "getEmitterDefaults",
          "kind": "function",
          "signature": "getEmitterDefaults(substanceId)",
          "summary": "Get emitter defaults for a substance."
        },
        {
          "name": "getAudioCues",
          "kind": "function",
          "signature": "getAudioCues(substanceId)",
          "summary": "Get audio cues for a substance."
        },
        {
          "name": "getReactions",
          "kind": "function",
          "signature": "getReactions(substanceId)",
          "summary": "Get reactions for a substance."
        },
        {
          "name": "getMaterialForSubstance",
          "kind": "function",
          "signature": "getMaterialForSubstance(key)",
          "summary": "Get material ID for a substance key (replaces SUBSTANCE_TO_MATERIAL lookup)."
        },
        {
          "name": "buildThermalPresets",
          "kind": "function",
          "signature": "buildThermalPresets()",
          "summary": "Build THERMAL_MATERIAL_PRESETS-compatible object from all registered substances. For backward compatibility with ParticleConstraints.js consumers."
        },
        {
          "name": "buildSubstanceToMaterial",
          "kind": "function",
          "signature": "buildSubstanceToMaterial()",
          "summary": "Build SUBSTANCE_TO_MATERIAL-compatible object from all registered substances. For backward compatibility with ParticleReactionTable.js consumers."
        },
        {
          "name": "getSubstanceCount",
          "kind": "function",
          "signature": "getSubstanceCount()",
          "summary": "Total number of registered substances."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/SubstanceSchema",
      "path": "engine/reference/sim/particles/substances/SubstanceSchema.md",
      "source": "engine/sim/particles/substances/SubstanceSchema.js",
      "import": "/engine/sim/particles/substances/SubstanceSchema.js",
      "sourceHash": "70a2bbf79772e3fdcca4f6220cb93a1699c1695c367881cbbaf721b8d707d626",
      "summary": "SubstanceSchema.js — Shared constants and type definitions for the substance system. Single source of truth for: - Phase constants (PHASE_SOLID, PHASE_LIQUID, PHASE_GAS, PHASE_PLASMA) - Material ID enum (MATERIAL) - Reverse lookup helpers Replaces scattered definitions in ParticleConstraints.js and ParticleReactionTable.js. Those files re-export from here for backward compatibility.",
      "exports": [
        {
          "name": "getPhaseName",
          "kind": "function",
          "signature": "getPhaseName(phase)",
          "summary": "Get phase name string from phase constant."
        },
        {
          "name": "getPhaseFromName",
          "kind": "function",
          "signature": "getPhaseFromName(name)",
          "summary": "Get phase constant from name string."
        },
        {
          "name": "getMaterialName",
          "kind": "function",
          "signature": "getMaterialName(materialId)",
          "summary": "Get material name from material ID."
        },
        {
          "name": "getMaterialId",
          "kind": "function",
          "signature": "getMaterialId(name)",
          "summary": "Get material ID from name string."
        },
        {
          "name": "PHASE_SOLID",
          "kind": "constant",
          "signature": "PHASE_SOLID",
          "summary": ""
        },
        {
          "name": "PHASE_LIQUID",
          "kind": "constant",
          "signature": "PHASE_LIQUID",
          "summary": ""
        },
        {
          "name": "PHASE_GAS",
          "kind": "constant",
          "signature": "PHASE_GAS",
          "summary": ""
        },
        {
          "name": "PHASE_PLASMA",
          "kind": "constant",
          "signature": "PHASE_PLASMA",
          "summary": ""
        },
        {
          "name": "PHASE_NAMES",
          "kind": "constant",
          "signature": "PHASE_NAMES",
          "summary": ""
        },
        {
          "name": "MATERIAL",
          "kind": "constant",
          "signature": "MATERIAL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/elements/MoleculePresets",
      "path": "engine/reference/sim/particles/substances/elements/MoleculePresets.md",
      "source": "engine/sim/particles/substances/elements/MoleculePresets.js",
      "import": "/engine/sim/particles/substances/elements/MoleculePresets.js",
      "sourceHash": "c469d81acee690af74e73fd2b4b451e5a756170cf32cf97ce541514c7ffebd45",
      "summary": "MoleculePresets.js — Common molecule/compound definitions. Re-export of MOLECULE_PRESETS from ParticleElementTable.js. Lives in substances/elements/ for organizational clarity.",
      "exports": [
        {
          "name": "MOLECULE_PRESETS",
          "kind": "re-export",
          "signature": "MOLECULE_PRESETS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/elements/PeriodicTable",
      "path": "engine/reference/sim/particles/substances/elements/PeriodicTable.md",
      "source": "engine/sim/particles/substances/elements/PeriodicTable.js",
      "import": "/engine/sim/particles/substances/elements/PeriodicTable.js",
      "sourceHash": "bce1185029723e3d520d770d61bc8e58ec642383940f74c5beeccd3295022ba1",
      "summary": "PeriodicTable.js — Full periodic table data for 118 elements. Re-export of the core element data from ParticleElementTable.js. This file lives in the new substances/elements/ folder for organizational clarity. The original ParticleElementTable.js remains functional and re-exports from here for backward compatibility. Provides: - ELEMENT_DATA raw array - ELEMENTS_BY_Z / ELEMENTS_BY_SYMBOL parsed lookups - getElement, getElementBySymbol, getAllElements - ELEMENTS shorthand constants - ljMixingRule for LJ cross-interactions - GPU buffer creation (createElementTable, etc.)",
      "exports": [
        {
          "name": "ELEMENTS",
          "kind": "re-export",
          "signature": "ELEMENTS",
          "summary": ""
        },
        {
          "name": "ELEMENT_LUT_WGSL",
          "kind": "re-export",
          "signature": "ELEMENT_LUT_WGSL",
          "summary": ""
        },
        {
          "name": "createElementTable",
          "kind": "re-export",
          "signature": "createElementTable",
          "summary": ""
        },
        {
          "name": "destroyElementTable",
          "kind": "re-export",
          "signature": "destroyElementTable",
          "summary": ""
        },
        {
          "name": "getAllElements",
          "kind": "re-export",
          "signature": "getAllElements",
          "summary": ""
        },
        {
          "name": "getElement",
          "kind": "re-export",
          "signature": "getElement",
          "summary": ""
        },
        {
          "name": "getElementBySymbol",
          "kind": "re-export",
          "signature": "getElementBySymbol",
          "summary": ""
        },
        {
          "name": "ljMixingRule",
          "kind": "re-export",
          "signature": "ljMixingRule",
          "summary": ""
        },
        {
          "name": "setParticleCharges",
          "kind": "re-export",
          "signature": "setParticleCharges",
          "summary": ""
        },
        {
          "name": "setParticleElements",
          "kind": "re-export",
          "signature": "setParticleElements",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/index",
      "path": "engine/reference/sim/particles/substances/index.md",
      "source": "engine/sim/particles/substances/index.js",
      "import": "/engine/sim/particles/substances/index.js",
      "sourceHash": "295f04b9fe4d1c81dd6c1c695649c8cd44620a4df77248f392c3c53f3f2e87b9",
      "summary": "substances/index.js — Barrel export for the substance system. Single import point: import { getSubstance, MATERIAL, PHASE_LIQUID, ... } from './substances/index.js';",
      "exports": [
        {
          "name": "ELEMENTS",
          "kind": "re-export",
          "signature": "ELEMENTS",
          "summary": ""
        },
        {
          "name": "ELEMENT_LUT_WGSL",
          "kind": "re-export",
          "signature": "ELEMENT_LUT_WGSL",
          "summary": ""
        },
        {
          "name": "MATERIAL",
          "kind": "re-export",
          "signature": "MATERIAL",
          "summary": ""
        },
        {
          "name": "MOLECULE_PRESETS",
          "kind": "re-export",
          "signature": "MOLECULE_PRESETS",
          "summary": ""
        },
        {
          "name": "PHASE_GAS",
          "kind": "re-export",
          "signature": "PHASE_GAS",
          "summary": ""
        },
        {
          "name": "PHASE_LIQUID",
          "kind": "re-export",
          "signature": "PHASE_LIQUID",
          "summary": ""
        },
        {
          "name": "PHASE_NAMES",
          "kind": "re-export",
          "signature": "PHASE_NAMES",
          "summary": ""
        },
        {
          "name": "PHASE_PLASMA",
          "kind": "re-export",
          "signature": "PHASE_PLASMA",
          "summary": ""
        },
        {
          "name": "PHASE_SOLID",
          "kind": "re-export",
          "signature": "PHASE_SOLID",
          "summary": ""
        },
        {
          "name": "SANDBOX_BEHAVIOR",
          "kind": "re-export",
          "signature": "SANDBOX_BEHAVIOR",
          "summary": ""
        },
        {
          "name": "SANDBOX_FLAGS",
          "kind": "re-export",
          "signature": "SANDBOX_FLAGS",
          "summary": ""
        },
        {
          "name": "SANDBOX_INTERACTION",
          "kind": "re-export",
          "signature": "SANDBOX_INTERACTION",
          "summary": ""
        },
        {
          "name": "SANDBOX_OBJECT",
          "kind": "re-export",
          "signature": "SANDBOX_OBJECT",
          "summary": ""
        },
        {
          "name": "SANDBOX_OBJECTS",
          "kind": "re-export",
          "signature": "SANDBOX_OBJECTS",
          "summary": ""
        },
        {
          "name": "SANDBOX_PHASE",
          "kind": "re-export",
          "signature": "SANDBOX_PHASE",
          "summary": ""
        },
        {
          "name": "SANDBOX_REACTION",
          "kind": "re-export",
          "signature": "SANDBOX_REACTION",
          "summary": ""
        },
        {
          "name": "SANDBOX_REFERENCE_TEMPERATURE_K",
          "kind": "re-export",
          "signature": "SANDBOX_REFERENCE_TEMPERATURE_K",
          "summary": ""
        },
        {
          "name": "SANDBOX_SPECIES_CAPACITY",
          "kind": "re-export",
          "signature": "SANDBOX_SPECIES_CAPACITY",
          "summary": ""
        },
        {
          "name": "SANDBOX_SUBSTANCE_CODE_BASE",
          "kind": "re-export",
          "signature": "SANDBOX_SUBSTANCE_CODE_BASE",
          "summary": ""
        },
        {
          "name": "SANDBOX_TEMPERATURE_STEP_K",
          "kind": "re-export",
          "signature": "SANDBOX_TEMPERATURE_STEP_K",
          "summary": ""
        },
        {
          "name": "buildSubstanceToMaterial",
          "kind": "re-export",
          "signature": "buildSubstanceToMaterial",
          "summary": ""
        },
        {
          "name": "buildThermalPresets",
          "kind": "re-export",
          "signature": "buildThermalPresets",
          "summary": ""
        },
        {
          "name": "createElementTable",
          "kind": "re-export",
          "signature": "createElementTable",
          "summary": ""
        },
        {
          "name": "createSandboxMaterialCatalog",
          "kind": "re-export",
          "signature": "createSandboxMaterialCatalog",
          "summary": ""
        },
        {
          "name": "createSandboxSpeciesLut",
          "kind": "re-export",
          "signature": "createSandboxSpeciesLut",
          "summary": ""
        },
        {
          "name": "deriveFromElements",
          "kind": "re-export",
          "signature": "deriveFromElements",
          "summary": ""
        },
        {
          "name": "derivePhysicsProfile",
          "kind": "re-export",
          "signature": "derivePhysicsProfile",
          "summary": ""
        },
        {
          "name": "deriveState",
          "kind": "re-export",
          "signature": "deriveState",
          "summary": ""
        },
        {
          "name": "destroyElementTable",
          "kind": "re-export",
          "signature": "destroyElementTable",
          "summary": ""
        },
        {
          "name": "getAllElements",
          "kind": "re-export",
          "signature": "getAllElements",
          "summary": ""
        },
        {
          "name": "getAllSubstances",
          "kind": "re-export",
          "signature": "getAllSubstances",
          "summary": ""
        },
        {
          "name": "getAudioCues",
          "kind": "re-export",
          "signature": "getAudioCues",
          "summary": ""
        },
        {
          "name": "getElement",
          "kind": "re-export",
          "signature": "getElement",
          "summary": ""
        },
        {
          "name": "getElementBySymbol",
          "kind": "re-export",
          "signature": "getElementBySymbol",
          "summary": ""
        },
        {
          "name": "getEmitterDefaults",
          "kind": "re-export",
          "signature": "getEmitterDefaults",
          "summary": ""
        },
        {
          "name": "getMaterialForSubstance",
          "kind": "re-export",
          "signature": "getMaterialForSubstance",
          "summary": ""
        },
        {
          "name": "getMaterialId",
          "kind": "re-export",
          "signature": "getMaterialId",
          "summary": ""
        },
        {
          "name": "getMaterialName",
          "kind": "re-export",
          "signature": "getMaterialName",
          "summary": ""
        },
        {
          "name": "getPhaseFromName",
          "kind": "re-export",
          "signature": "getPhaseFromName",
          "summary": ""
        },
        {
          "name": "getPhaseName",
          "kind": "re-export",
          "signature": "getPhaseName",
          "summary": ""
        },
        {
          "name": "getReactions",
          "kind": "re-export",
          "signature": "getReactions",
          "summary": ""
        },
        {
          "name": "getSPHParams",
          "kind": "re-export",
          "signature": "getSPHParams",
          "summary": ""
        },
        {
          "name": "getSSFRTint",
          "kind": "re-export",
          "signature": "getSSFRTint",
          "summary": ""
        },
        {
          "name": "getSubstance",
          "kind": "re-export",
          "signature": "getSubstance",
          "summary": ""
        },
        {
          "name": "getSubstanceByMaterialId",
          "kind": "re-export",
          "signature": "getSubstanceByMaterialId",
          "summary": ""
        },
        {
          "name": "getSubstanceCount",
          "kind": "re-export",
          "signature": "getSubstanceCount",
          "summary": ""
        },
        {
          "name": "getSubstanceIds",
          "kind": "re-export",
          "signature": "getSubstanceIds",
          "summary": ""
        },
        {
          "name": "getSubstancesByCategory",
          "kind": "re-export",
          "signature": "getSubstancesByCategory",
          "summary": ""
        },
        {
          "name": "getSubstancesByTag",
          "kind": "re-export",
          "signature": "getSubstancesByTag",
          "summary": ""
        },
        {
          "name": "getThermalPreset",
          "kind": "re-export",
          "signature": "getThermalPreset",
          "summary": ""
        },
        {
          "name": "ljMixingRule",
          "kind": "re-export",
          "signature": "ljMixingRule",
          "summary": ""
        },
        {
          "name": "mixSubstances",
          "kind": "re-export",
          "signature": "mixSubstances",
          "summary": ""
        },
        {
          "name": "packSandboxCell",
          "kind": "re-export",
          "signature": "packSandboxCell",
          "summary": ""
        },
        {
          "name": "packSandboxObject",
          "kind": "re-export",
          "signature": "packSandboxObject",
          "summary": ""
        },
        {
          "name": "registerSubstance",
          "kind": "re-export",
          "signature": "registerSubstance",
          "summary": ""
        },
        {
          "name": "resolveSubstance",
          "kind": "re-export",
          "signature": "resolveSubstance",
          "summary": ""
        },
        {
          "name": "sandboxBucketToTemperature",
          "kind": "re-export",
          "signature": "sandboxBucketToTemperature",
          "summary": ""
        },
        {
          "name": "sandboxSpeciesIdForSubstance",
          "kind": "re-export",
          "signature": "sandboxSpeciesIdForSubstance",
          "summary": ""
        },
        {
          "name": "setParticleCharges",
          "kind": "re-export",
          "signature": "setParticleCharges",
          "summary": ""
        },
        {
          "name": "setParticleElements",
          "kind": "re-export",
          "signature": "setParticleElements",
          "summary": ""
        },
        {
          "name": "temperatureToSandboxBucket",
          "kind": "re-export",
          "signature": "temperatureToSandboxBucket",
          "summary": ""
        },
        {
          "name": "unpackSandboxCell",
          "kind": "re-export",
          "signature": "unpackSandboxCell",
          "summary": ""
        },
        {
          "name": "unpackSandboxObject",
          "kind": "re-export",
          "signature": "unpackSandboxObject",
          "summary": ""
        },
        {
          "name": "unregisterSubstance",
          "kind": "re-export",
          "signature": "unregisterSubstance",
          "summary": ""
        },
        {
          "name": "validateSandboxMaterialCatalog",
          "kind": "re-export",
          "signature": "validateSandboxMaterialCatalog",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/audio",
      "path": "engine/reference/sim/particles/substances/materials/acid/audio.md",
      "source": "engine/sim/particles/substances/materials/acid/audio.js",
      "import": "/engine/sim/particles/substances/materials/acid/audio.js",
      "sourceHash": "5258e9f441432004e44a974df49617d7bc744f555fb571d1688da8972e1effdb",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/acid/chemistry.md",
      "source": "engine/sim/particles/substances/materials/acid/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/acid/chemistry.js",
      "sourceHash": "920a7aa460d9df9eaac8d98c5fb86545ab992864d4110fe77de8cc939b234c92",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/decals",
      "path": "engine/reference/sim/particles/substances/materials/acid/decals.md",
      "source": "engine/sim/particles/substances/materials/acid/decals.js",
      "import": "/engine/sim/particles/substances/materials/acid/decals.js",
      "sourceHash": "3071f517192cca2e0b6129567f491e95306a37dc0ccbc1779c2d90ed3cedf9d7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/emitter",
      "path": "engine/reference/sim/particles/substances/materials/acid/emitter.md",
      "source": "engine/sim/particles/substances/materials/acid/emitter.js",
      "import": "/engine/sim/particles/substances/materials/acid/emitter.js",
      "sourceHash": "e1900cb022b846851af92a988ffda16f0e00c07f4a790db82904cdfac819d094",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/identity",
      "path": "engine/reference/sim/particles/substances/materials/acid/identity.md",
      "source": "engine/sim/particles/substances/materials/acid/identity.js",
      "import": "/engine/sim/particles/substances/materials/acid/identity.js",
      "sourceHash": "ef3652cce39be3dff6752e75dc09c84a01c2427515d3ea971ad6b9ddce6431cb",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/index",
      "path": "engine/reference/sim/particles/substances/materials/acid/index.md",
      "source": "engine/sim/particles/substances/materials/acid/index.js",
      "import": "/engine/sim/particles/substances/materials/acid/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/physics",
      "path": "engine/reference/sim/particles/substances/materials/acid/physics.md",
      "source": "engine/sim/particles/substances/materials/acid/physics.js",
      "import": "/engine/sim/particles/substances/materials/acid/physics.js",
      "sourceHash": "6f890935b2370c1ca48026922cedd4a61fa215efe6af7be69140fa53e87d8b9d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/reactions",
      "path": "engine/reference/sim/particles/substances/materials/acid/reactions.md",
      "source": "engine/sim/particles/substances/materials/acid/reactions.js",
      "import": "/engine/sim/particles/substances/materials/acid/reactions.js",
      "sourceHash": "17d70664fbd5bfc0105508bcda2b4071c30d47afe3439408c30a8eda17d2e887",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/spell",
      "path": "engine/reference/sim/particles/substances/materials/acid/spell.md",
      "source": "engine/sim/particles/substances/materials/acid/spell.js",
      "import": "/engine/sim/particles/substances/materials/acid/spell.js",
      "sourceHash": "8cf69cdf401acf6e52467e904080c51996d0930adff55b833346a87442754490",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/sph",
      "path": "engine/reference/sim/particles/substances/materials/acid/sph.md",
      "source": "engine/sim/particles/substances/materials/acid/sph.js",
      "import": "/engine/sim/particles/substances/materials/acid/sph.js",
      "sourceHash": "eadfcab225b62ee6d4a1a1367da2303c5045da9e162477eee4b2bf30cbf60645",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/thermal",
      "path": "engine/reference/sim/particles/substances/materials/acid/thermal.md",
      "source": "engine/sim/particles/substances/materials/acid/thermal.js",
      "import": "/engine/sim/particles/substances/materials/acid/thermal.js",
      "sourceHash": "1cacc1a4dac76fabf744f310ae000b9e8c03c32301d4a071336c9e706e501e8f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/acid/visual",
      "path": "engine/reference/sim/particles/substances/materials/acid/visual.md",
      "source": "engine/sim/particles/substances/materials/acid/visual.js",
      "import": "/engine/sim/particles/substances/materials/acid/visual.js",
      "sourceHash": "18f428279e8c728f67b82f7e2302315fcc42df5b8ec90aef49b3066424c5bdcc",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/audio",
      "path": "engine/reference/sim/particles/substances/materials/blood/audio.md",
      "source": "engine/sim/particles/substances/materials/blood/audio.js",
      "import": "/engine/sim/particles/substances/materials/blood/audio.js",
      "sourceHash": "706ff0bb072a682222dd3294384986a3f8f8f73afffb9e95a889b478f6a7a632",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/blood/chemistry.md",
      "source": "engine/sim/particles/substances/materials/blood/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/blood/chemistry.js",
      "sourceHash": "47df2e1b97ad02549a4366cb290ec210ff3691baed8d46722cbe4c4936d4a09d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/decals",
      "path": "engine/reference/sim/particles/substances/materials/blood/decals.md",
      "source": "engine/sim/particles/substances/materials/blood/decals.js",
      "import": "/engine/sim/particles/substances/materials/blood/decals.js",
      "sourceHash": "39bc77895069fcc46d523d333a12030d637a425bdeddb4dc2b08ae64b598e9d5",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/emitter",
      "path": "engine/reference/sim/particles/substances/materials/blood/emitter.md",
      "source": "engine/sim/particles/substances/materials/blood/emitter.js",
      "import": "/engine/sim/particles/substances/materials/blood/emitter.js",
      "sourceHash": "69453d5007c7cfab7204746605db7e3d04a307fd1a0460d1af29df7e54924b1d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/identity",
      "path": "engine/reference/sim/particles/substances/materials/blood/identity.md",
      "source": "engine/sim/particles/substances/materials/blood/identity.js",
      "import": "/engine/sim/particles/substances/materials/blood/identity.js",
      "sourceHash": "02dbfa50af18b549006af3c66463827b5c9e44842588b89310f32f827678bad1",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/index",
      "path": "engine/reference/sim/particles/substances/materials/blood/index.md",
      "source": "engine/sim/particles/substances/materials/blood/index.js",
      "import": "/engine/sim/particles/substances/materials/blood/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/physics",
      "path": "engine/reference/sim/particles/substances/materials/blood/physics.md",
      "source": "engine/sim/particles/substances/materials/blood/physics.js",
      "import": "/engine/sim/particles/substances/materials/blood/physics.js",
      "sourceHash": "67f6fab40c39ec56a3334527216969d9b7603296458d42c77958fcb5b1ee1e73",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/reactions",
      "path": "engine/reference/sim/particles/substances/materials/blood/reactions.md",
      "source": "engine/sim/particles/substances/materials/blood/reactions.js",
      "import": "/engine/sim/particles/substances/materials/blood/reactions.js",
      "sourceHash": "e2c4282a5f58bd615466e0ed52df2f86e3ca759c36f3b35cbf78b678bc7df0d0",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/spell",
      "path": "engine/reference/sim/particles/substances/materials/blood/spell.md",
      "source": "engine/sim/particles/substances/materials/blood/spell.js",
      "import": "/engine/sim/particles/substances/materials/blood/spell.js",
      "sourceHash": "8817dc527300274071eadbf21f7fb709851a9149f68c0df991b426d3443bfc4e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/sph",
      "path": "engine/reference/sim/particles/substances/materials/blood/sph.md",
      "source": "engine/sim/particles/substances/materials/blood/sph.js",
      "import": "/engine/sim/particles/substances/materials/blood/sph.js",
      "sourceHash": "869e209d8ed8097a34b9af823e146febe153843c44c5d9ec16df4ef2cf230d41",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/thermal",
      "path": "engine/reference/sim/particles/substances/materials/blood/thermal.md",
      "source": "engine/sim/particles/substances/materials/blood/thermal.js",
      "import": "/engine/sim/particles/substances/materials/blood/thermal.js",
      "sourceHash": "cdeb8de1e91f071dfb052ff45323284fa20f276bc135ed0c85ca3c7d886a517b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/blood/visual",
      "path": "engine/reference/sim/particles/substances/materials/blood/visual.md",
      "source": "engine/sim/particles/substances/materials/blood/visual.js",
      "import": "/engine/sim/particles/substances/materials/blood/visual.js",
      "sourceHash": "e690c3109fa7c0e7168de2159b20f854422b81886b96813342ba0126b06b3608",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/audio",
      "path": "engine/reference/sim/particles/substances/materials/debris/audio.md",
      "source": "engine/sim/particles/substances/materials/debris/audio.js",
      "import": "/engine/sim/particles/substances/materials/debris/audio.js",
      "sourceHash": "bb2d29b61e155ec27f99295c6d4a20c67a22c3d86f98402be1efb0a22dde71fe",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/debris/chemistry.md",
      "source": "engine/sim/particles/substances/materials/debris/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/debris/chemistry.js",
      "sourceHash": "9ec1ec2e724dfb0a3449d160b55c828451f29d4376ce349050e4cc88ce7c6b54",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/decals",
      "path": "engine/reference/sim/particles/substances/materials/debris/decals.md",
      "source": "engine/sim/particles/substances/materials/debris/decals.js",
      "import": "/engine/sim/particles/substances/materials/debris/decals.js",
      "sourceHash": "df5cf13e94544a74d456f651213e9798ea23a7018a8476e927d6419227afe9de",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/emitter",
      "path": "engine/reference/sim/particles/substances/materials/debris/emitter.md",
      "source": "engine/sim/particles/substances/materials/debris/emitter.js",
      "import": "/engine/sim/particles/substances/materials/debris/emitter.js",
      "sourceHash": "571e63af88b196c8ca0ddf3f79c2e1d46bca550714a26c7fd031e80b5ea38d3b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/identity",
      "path": "engine/reference/sim/particles/substances/materials/debris/identity.md",
      "source": "engine/sim/particles/substances/materials/debris/identity.js",
      "import": "/engine/sim/particles/substances/materials/debris/identity.js",
      "sourceHash": "f210d991c17b06930500f14b62328a4563fcde2831d6828c11ed43b6b5b30afd",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/index",
      "path": "engine/reference/sim/particles/substances/materials/debris/index.md",
      "source": "engine/sim/particles/substances/materials/debris/index.js",
      "import": "/engine/sim/particles/substances/materials/debris/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/physics",
      "path": "engine/reference/sim/particles/substances/materials/debris/physics.md",
      "source": "engine/sim/particles/substances/materials/debris/physics.js",
      "import": "/engine/sim/particles/substances/materials/debris/physics.js",
      "sourceHash": "dca9e13732eecfb0e254373746bd4788e6c725c3ae4891cb8b4e33f73194c8dd",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/reactions",
      "path": "engine/reference/sim/particles/substances/materials/debris/reactions.md",
      "source": "engine/sim/particles/substances/materials/debris/reactions.js",
      "import": "/engine/sim/particles/substances/materials/debris/reactions.js",
      "sourceHash": "b79fb6f98f498b8ca9149efd302a8287c33174c4b7a36a141d4c17b88f16de02",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/spell",
      "path": "engine/reference/sim/particles/substances/materials/debris/spell.md",
      "source": "engine/sim/particles/substances/materials/debris/spell.js",
      "import": "/engine/sim/particles/substances/materials/debris/spell.js",
      "sourceHash": "729eaa612122348131c89241073b4a841e7bde5b4bf4f47dc99ccf83c5acb1aa",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/sph",
      "path": "engine/reference/sim/particles/substances/materials/debris/sph.md",
      "source": "engine/sim/particles/substances/materials/debris/sph.js",
      "import": "/engine/sim/particles/substances/materials/debris/sph.js",
      "sourceHash": "d01e0b897d6eea9d7191bd12b836303394fee3ec5b2bdd1c8fed01613e2cc56d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/thermal",
      "path": "engine/reference/sim/particles/substances/materials/debris/thermal.md",
      "source": "engine/sim/particles/substances/materials/debris/thermal.js",
      "import": "/engine/sim/particles/substances/materials/debris/thermal.js",
      "sourceHash": "022e312eba5c7730439ede04e7901d22fa77b0ac26879c0c0e6ce2011dbf8fed",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/debris/visual",
      "path": "engine/reference/sim/particles/substances/materials/debris/visual.md",
      "source": "engine/sim/particles/substances/materials/debris/visual.js",
      "import": "/engine/sim/particles/substances/materials/debris/visual.js",
      "sourceHash": "6f69d464d8273cac5dbee5a99788bf4a47d7293e2eccc017384bdc14d090d695",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/audio",
      "path": "engine/reference/sim/particles/substances/materials/fire/audio.md",
      "source": "engine/sim/particles/substances/materials/fire/audio.js",
      "import": "/engine/sim/particles/substances/materials/fire/audio.js",
      "sourceHash": "91ecbaeb8967905af99c41e1c3765fbdd24e3c4378c06178222e309153136324",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/fire/chemistry.md",
      "source": "engine/sim/particles/substances/materials/fire/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/fire/chemistry.js",
      "sourceHash": "413ba9c326c5b632af5c70408bac1bd5ac91071d9469f6121b77caebdbd282b4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/decals",
      "path": "engine/reference/sim/particles/substances/materials/fire/decals.md",
      "source": "engine/sim/particles/substances/materials/fire/decals.js",
      "import": "/engine/sim/particles/substances/materials/fire/decals.js",
      "sourceHash": "a188e60f905ea8c856aa666f57eac0016ad9130b2f07e0ff3a259c69f0d3b58f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/emitter",
      "path": "engine/reference/sim/particles/substances/materials/fire/emitter.md",
      "source": "engine/sim/particles/substances/materials/fire/emitter.js",
      "import": "/engine/sim/particles/substances/materials/fire/emitter.js",
      "sourceHash": "8ae745503a085c8d9da74f25214f24038e7a678253105704ff8875bbbb448bc9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/identity",
      "path": "engine/reference/sim/particles/substances/materials/fire/identity.md",
      "source": "engine/sim/particles/substances/materials/fire/identity.js",
      "import": "/engine/sim/particles/substances/materials/fire/identity.js",
      "sourceHash": "37c2d004d91775c3298254978a0a1ef0c4efc98888dc2930e7d54979a40ee196",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/index",
      "path": "engine/reference/sim/particles/substances/materials/fire/index.md",
      "source": "engine/sim/particles/substances/materials/fire/index.js",
      "import": "/engine/sim/particles/substances/materials/fire/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/physics",
      "path": "engine/reference/sim/particles/substances/materials/fire/physics.md",
      "source": "engine/sim/particles/substances/materials/fire/physics.js",
      "import": "/engine/sim/particles/substances/materials/fire/physics.js",
      "sourceHash": "507d0026a7af34250c93b812e5cc3f5d2674d48930644ef9d613468de28331a1",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/reactions",
      "path": "engine/reference/sim/particles/substances/materials/fire/reactions.md",
      "source": "engine/sim/particles/substances/materials/fire/reactions.js",
      "import": "/engine/sim/particles/substances/materials/fire/reactions.js",
      "sourceHash": "5d766fd447cd5f2b5b9aafd61311bdfb7821a8c7a08270239d354ff22dc19bb7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/spell",
      "path": "engine/reference/sim/particles/substances/materials/fire/spell.md",
      "source": "engine/sim/particles/substances/materials/fire/spell.js",
      "import": "/engine/sim/particles/substances/materials/fire/spell.js",
      "sourceHash": "89064877da5d7ff5b32b2fcd34bd4507533f66381596293496d7089cc0f72ffe",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/sph",
      "path": "engine/reference/sim/particles/substances/materials/fire/sph.md",
      "source": "engine/sim/particles/substances/materials/fire/sph.js",
      "import": "/engine/sim/particles/substances/materials/fire/sph.js",
      "sourceHash": "d01e0b897d6eea9d7191bd12b836303394fee3ec5b2bdd1c8fed01613e2cc56d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/thermal",
      "path": "engine/reference/sim/particles/substances/materials/fire/thermal.md",
      "source": "engine/sim/particles/substances/materials/fire/thermal.js",
      "import": "/engine/sim/particles/substances/materials/fire/thermal.js",
      "sourceHash": "739c1e84cdb9d592022cd476522ead95cb11e2fa8851a31ea98622f3d9940899",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/fire/visual",
      "path": "engine/reference/sim/particles/substances/materials/fire/visual.md",
      "source": "engine/sim/particles/substances/materials/fire/visual.js",
      "import": "/engine/sim/particles/substances/materials/fire/visual.js",
      "sourceHash": "2cd05a8def3d10da4dcb5e86200c1e322c7f0a995aadfc0beff197d3d2e60590",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/audio",
      "path": "engine/reference/sim/particles/substances/materials/glass/audio.md",
      "source": "engine/sim/particles/substances/materials/glass/audio.js",
      "import": "/engine/sim/particles/substances/materials/glass/audio.js",
      "sourceHash": "5d6052bd553721b74aa93ac30cc1bfa02520adc7e88c3e1359c409ab02ae66ce",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/glass/chemistry.md",
      "source": "engine/sim/particles/substances/materials/glass/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/glass/chemistry.js",
      "sourceHash": "9ec1ec2e724dfb0a3449d160b55c828451f29d4376ce349050e4cc88ce7c6b54",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/decals",
      "path": "engine/reference/sim/particles/substances/materials/glass/decals.md",
      "source": "engine/sim/particles/substances/materials/glass/decals.js",
      "import": "/engine/sim/particles/substances/materials/glass/decals.js",
      "sourceHash": "10520a3b2c78f7fb1d6585a01b78fc304dbd6712558a67050d00d0ce173cf937",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/emitter",
      "path": "engine/reference/sim/particles/substances/materials/glass/emitter.md",
      "source": "engine/sim/particles/substances/materials/glass/emitter.js",
      "import": "/engine/sim/particles/substances/materials/glass/emitter.js",
      "sourceHash": "bef3d7f9d27c14fd6ca8662d751a2fae5492b52d20da4c10d9fe55357effc7c4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/identity",
      "path": "engine/reference/sim/particles/substances/materials/glass/identity.md",
      "source": "engine/sim/particles/substances/materials/glass/identity.js",
      "import": "/engine/sim/particles/substances/materials/glass/identity.js",
      "sourceHash": "594dffd6d5a4bc96cc2ccd2490a3a5b0758614ea1b79e816f27dfa15f04035a9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/index",
      "path": "engine/reference/sim/particles/substances/materials/glass/index.md",
      "source": "engine/sim/particles/substances/materials/glass/index.js",
      "import": "/engine/sim/particles/substances/materials/glass/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/physics",
      "path": "engine/reference/sim/particles/substances/materials/glass/physics.md",
      "source": "engine/sim/particles/substances/materials/glass/physics.js",
      "import": "/engine/sim/particles/substances/materials/glass/physics.js",
      "sourceHash": "2c9200731900cbe6377be7c5fa38e0245911673efbd2b9b91cdbb877ce7b4db3",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/reactions",
      "path": "engine/reference/sim/particles/substances/materials/glass/reactions.md",
      "source": "engine/sim/particles/substances/materials/glass/reactions.js",
      "import": "/engine/sim/particles/substances/materials/glass/reactions.js",
      "sourceHash": "ee4587bd89ec979cbe9371dca91f76fe57a502b4b499d18785b0fe5541d504a3",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/spell",
      "path": "engine/reference/sim/particles/substances/materials/glass/spell.md",
      "source": "engine/sim/particles/substances/materials/glass/spell.js",
      "import": "/engine/sim/particles/substances/materials/glass/spell.js",
      "sourceHash": "5747be8b3c8f98df70819eec6bd146e5d6648d9b41cbbcfe66742667192837bd",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/sph",
      "path": "engine/reference/sim/particles/substances/materials/glass/sph.md",
      "source": "engine/sim/particles/substances/materials/glass/sph.js",
      "import": "/engine/sim/particles/substances/materials/glass/sph.js",
      "sourceHash": "d8c2378cbdc829a8b3d6d2f82ae5b1e6b92d5730e3cf2b1fa799cbafa5743a43",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/thermal",
      "path": "engine/reference/sim/particles/substances/materials/glass/thermal.md",
      "source": "engine/sim/particles/substances/materials/glass/thermal.js",
      "import": "/engine/sim/particles/substances/materials/glass/thermal.js",
      "sourceHash": "937811c18f48724390bb1dbf10271977620d0635c76ef45fbf8b900d9b906093",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/glass/visual",
      "path": "engine/reference/sim/particles/substances/materials/glass/visual.md",
      "source": "engine/sim/particles/substances/materials/glass/visual.js",
      "import": "/engine/sim/particles/substances/materials/glass/visual.js",
      "sourceHash": "e5b5e3ddcf373401b5229dbdac28c6665680f755b585fda3b4e65d1ddd4e9e98",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/audio",
      "path": "engine/reference/sim/particles/substances/materials/honey/audio.md",
      "source": "engine/sim/particles/substances/materials/honey/audio.js",
      "import": "/engine/sim/particles/substances/materials/honey/audio.js",
      "sourceHash": "ede9caedec32ead0100fc2e30c4a662f026a3ed772a647d08f272695bc4e5f1e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/honey/chemistry.md",
      "source": "engine/sim/particles/substances/materials/honey/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/honey/chemistry.js",
      "sourceHash": "413ba9c326c5b632af5c70408bac1bd5ac91071d9469f6121b77caebdbd282b4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/decals",
      "path": "engine/reference/sim/particles/substances/materials/honey/decals.md",
      "source": "engine/sim/particles/substances/materials/honey/decals.js",
      "import": "/engine/sim/particles/substances/materials/honey/decals.js",
      "sourceHash": "eb626c2a34ea41e20abc14041203c5e3845b58c293d33c4f50f3852c24702de2",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/emitter",
      "path": "engine/reference/sim/particles/substances/materials/honey/emitter.md",
      "source": "engine/sim/particles/substances/materials/honey/emitter.js",
      "import": "/engine/sim/particles/substances/materials/honey/emitter.js",
      "sourceHash": "c1639d760c0a0395ad840cad769677b7797773eacd36ef2aef174fabf7f899da",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/identity",
      "path": "engine/reference/sim/particles/substances/materials/honey/identity.md",
      "source": "engine/sim/particles/substances/materials/honey/identity.js",
      "import": "/engine/sim/particles/substances/materials/honey/identity.js",
      "sourceHash": "48990e68e89e69033c8e39e89d366f8ed141255fd8127384d122b8d81e57b72e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/index",
      "path": "engine/reference/sim/particles/substances/materials/honey/index.md",
      "source": "engine/sim/particles/substances/materials/honey/index.js",
      "import": "/engine/sim/particles/substances/materials/honey/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/physics",
      "path": "engine/reference/sim/particles/substances/materials/honey/physics.md",
      "source": "engine/sim/particles/substances/materials/honey/physics.js",
      "import": "/engine/sim/particles/substances/materials/honey/physics.js",
      "sourceHash": "d8e064e2ccc04a2a193d723a8ec1bca55d2e6ef884a8e3494b255d0293ac39dc",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/reactions",
      "path": "engine/reference/sim/particles/substances/materials/honey/reactions.md",
      "source": "engine/sim/particles/substances/materials/honey/reactions.js",
      "import": "/engine/sim/particles/substances/materials/honey/reactions.js",
      "sourceHash": "7cc4f9179db01278834fcbcf465ce73f5dff1d58a71117b0d3be966860e9fd6f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/spell",
      "path": "engine/reference/sim/particles/substances/materials/honey/spell.md",
      "source": "engine/sim/particles/substances/materials/honey/spell.js",
      "import": "/engine/sim/particles/substances/materials/honey/spell.js",
      "sourceHash": "aa3a9d993457201e5c1a79af220ad39d303d186b8cb0a06b78af73bdb0da2f6a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/sph",
      "path": "engine/reference/sim/particles/substances/materials/honey/sph.md",
      "source": "engine/sim/particles/substances/materials/honey/sph.js",
      "import": "/engine/sim/particles/substances/materials/honey/sph.js",
      "sourceHash": "59d6475928cf04e167a197a0e801afab6d9cdf6d48d61b29d75eaff24f73634a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/thermal",
      "path": "engine/reference/sim/particles/substances/materials/honey/thermal.md",
      "source": "engine/sim/particles/substances/materials/honey/thermal.js",
      "import": "/engine/sim/particles/substances/materials/honey/thermal.js",
      "sourceHash": "676db215c1fa538393f41cd97c6a242793c3ce0a06af008736254241fbc63bcb",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/honey/visual",
      "path": "engine/reference/sim/particles/substances/materials/honey/visual.md",
      "source": "engine/sim/particles/substances/materials/honey/visual.js",
      "import": "/engine/sim/particles/substances/materials/honey/visual.js",
      "sourceHash": "c8b4b978bcb6b252788f225118b4a63dd309930f6cf426645b634a44ec6e8da4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/audio",
      "path": "engine/reference/sim/particles/substances/materials/ice/audio.md",
      "source": "engine/sim/particles/substances/materials/ice/audio.js",
      "import": "/engine/sim/particles/substances/materials/ice/audio.js",
      "sourceHash": "645146b988520275f9421befdf6598066f32c53e840d035e2b8f0d9f45d019b1",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/ice/chemistry.md",
      "source": "engine/sim/particles/substances/materials/ice/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/ice/chemistry.js",
      "sourceHash": "cc0bdc2d1d97712c71c31f40f48ff372d257f3ec5053f7b8333992d492773890",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/decals",
      "path": "engine/reference/sim/particles/substances/materials/ice/decals.md",
      "source": "engine/sim/particles/substances/materials/ice/decals.js",
      "import": "/engine/sim/particles/substances/materials/ice/decals.js",
      "sourceHash": "6e2b95ab3abf003f0ef03c90c0e4621a20d659a3056c09798c100a074e7c20bc",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/emitter",
      "path": "engine/reference/sim/particles/substances/materials/ice/emitter.md",
      "source": "engine/sim/particles/substances/materials/ice/emitter.js",
      "import": "/engine/sim/particles/substances/materials/ice/emitter.js",
      "sourceHash": "643654627bce4e4152e5668848273dad5e71b20e268df48aeb6b50c7873e19dc",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/identity",
      "path": "engine/reference/sim/particles/substances/materials/ice/identity.md",
      "source": "engine/sim/particles/substances/materials/ice/identity.js",
      "import": "/engine/sim/particles/substances/materials/ice/identity.js",
      "sourceHash": "4ad0e85aff3002b522acca08484d68c2d9243382ff3a5845a6c2e451a262f7b4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/index",
      "path": "engine/reference/sim/particles/substances/materials/ice/index.md",
      "source": "engine/sim/particles/substances/materials/ice/index.js",
      "import": "/engine/sim/particles/substances/materials/ice/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/physics",
      "path": "engine/reference/sim/particles/substances/materials/ice/physics.md",
      "source": "engine/sim/particles/substances/materials/ice/physics.js",
      "import": "/engine/sim/particles/substances/materials/ice/physics.js",
      "sourceHash": "5200b0d75881fa35f3d85bdf9f8424368833cbc542515b6650f2c9f318af4681",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/reactions",
      "path": "engine/reference/sim/particles/substances/materials/ice/reactions.md",
      "source": "engine/sim/particles/substances/materials/ice/reactions.js",
      "import": "/engine/sim/particles/substances/materials/ice/reactions.js",
      "sourceHash": "1ce97456f0376ba71a966467c068bc4c4111d7918b5868521311b498475f0fea",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/spell",
      "path": "engine/reference/sim/particles/substances/materials/ice/spell.md",
      "source": "engine/sim/particles/substances/materials/ice/spell.js",
      "import": "/engine/sim/particles/substances/materials/ice/spell.js",
      "sourceHash": "f5a19de8dd6dad62020e1515ff63b5b70e2cdc7ba72dfc06c95192fa8163ed65",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/sph",
      "path": "engine/reference/sim/particles/substances/materials/ice/sph.md",
      "source": "engine/sim/particles/substances/materials/ice/sph.js",
      "import": "/engine/sim/particles/substances/materials/ice/sph.js",
      "sourceHash": "420fd4e2984de17f6e1c96eda767d734342383e48607274f8a9b137a7352e9d4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/thermal",
      "path": "engine/reference/sim/particles/substances/materials/ice/thermal.md",
      "source": "engine/sim/particles/substances/materials/ice/thermal.js",
      "import": "/engine/sim/particles/substances/materials/ice/thermal.js",
      "sourceHash": "7c34cf70f06ba337632932ce4d687a8fa0802ef35cf94ca542498de3d5ba333d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/ice/visual",
      "path": "engine/reference/sim/particles/substances/materials/ice/visual.md",
      "source": "engine/sim/particles/substances/materials/ice/visual.js",
      "import": "/engine/sim/particles/substances/materials/ice/visual.js",
      "sourceHash": "904b95cb709257f06695a1e4f3c00e047b1c9c1e61616fd08eca52ea50eec884",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/index",
      "path": "engine/reference/sim/particles/substances/materials/index.md",
      "source": "engine/sim/particles/substances/materials/index.js",
      "import": "/engine/sim/particles/substances/materials/index.js",
      "sourceHash": "3b05954e9f732b2b426dd2c1a846b5759dbb0f5ca035b01ba0250af26ae9f588",
      "summary": "materials/index.js — Auto-registers all substance definitions with SubstanceRegistry. Import this file to ensure all built-in substances are registered. Each substance folder exports a default object assembled from its sub-files.",
      "exports": [
        {
          "name": "ALL_SUBSTANCES",
          "kind": "re-export",
          "signature": "ALL_SUBSTANCES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/audio",
      "path": "engine/reference/sim/particles/substances/materials/lava/audio.md",
      "source": "engine/sim/particles/substances/materials/lava/audio.js",
      "import": "/engine/sim/particles/substances/materials/lava/audio.js",
      "sourceHash": "99cbe55b5684de7916d12d2062f4ff7c9af5fd1d9013c7b268188f4f84460d6b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/lava/chemistry.md",
      "source": "engine/sim/particles/substances/materials/lava/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/lava/chemistry.js",
      "sourceHash": "9ec1ec2e724dfb0a3449d160b55c828451f29d4376ce349050e4cc88ce7c6b54",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/decals",
      "path": "engine/reference/sim/particles/substances/materials/lava/decals.md",
      "source": "engine/sim/particles/substances/materials/lava/decals.js",
      "import": "/engine/sim/particles/substances/materials/lava/decals.js",
      "sourceHash": "a755beedb92ab9dd0056130bd2d473a91ae2e733b17a44fbe637d3a545c8d8df",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/emitter",
      "path": "engine/reference/sim/particles/substances/materials/lava/emitter.md",
      "source": "engine/sim/particles/substances/materials/lava/emitter.js",
      "import": "/engine/sim/particles/substances/materials/lava/emitter.js",
      "sourceHash": "7a38043ab22c5194d6ba9e2efddbd2c23c8f183910dd8a4363ec2ae75a9976ab",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/identity",
      "path": "engine/reference/sim/particles/substances/materials/lava/identity.md",
      "source": "engine/sim/particles/substances/materials/lava/identity.js",
      "import": "/engine/sim/particles/substances/materials/lava/identity.js",
      "sourceHash": "b198ba7417e2fbc3a2501844df17995e314a7c6ad92819f481367b0db19026a9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/index",
      "path": "engine/reference/sim/particles/substances/materials/lava/index.md",
      "source": "engine/sim/particles/substances/materials/lava/index.js",
      "import": "/engine/sim/particles/substances/materials/lava/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/physics",
      "path": "engine/reference/sim/particles/substances/materials/lava/physics.md",
      "source": "engine/sim/particles/substances/materials/lava/physics.js",
      "import": "/engine/sim/particles/substances/materials/lava/physics.js",
      "sourceHash": "adc5712a98872908d513c2a9ce9ee1a8222dfef4435fec47b18b5c91e21c26a9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/reactions",
      "path": "engine/reference/sim/particles/substances/materials/lava/reactions.md",
      "source": "engine/sim/particles/substances/materials/lava/reactions.js",
      "import": "/engine/sim/particles/substances/materials/lava/reactions.js",
      "sourceHash": "2fbf22a36a90702730b4543e6544fb2bbb971b74200d13570fc74e1ae8acca21",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/spell",
      "path": "engine/reference/sim/particles/substances/materials/lava/spell.md",
      "source": "engine/sim/particles/substances/materials/lava/spell.js",
      "import": "/engine/sim/particles/substances/materials/lava/spell.js",
      "sourceHash": "e2842d9795437574d16ff048f4662780a3c4504027f5ac089194c9f60bc312e3",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/sph",
      "path": "engine/reference/sim/particles/substances/materials/lava/sph.md",
      "source": "engine/sim/particles/substances/materials/lava/sph.js",
      "import": "/engine/sim/particles/substances/materials/lava/sph.js",
      "sourceHash": "bbd15a58eb3a346900c3b0274bea19e90edf917d20225bcc22bccf595833f602",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/thermal",
      "path": "engine/reference/sim/particles/substances/materials/lava/thermal.md",
      "source": "engine/sim/particles/substances/materials/lava/thermal.js",
      "import": "/engine/sim/particles/substances/materials/lava/thermal.js",
      "sourceHash": "4e7b0d917a9f9998454620177d1aeb8b11db9ed81802948f9b8a3d5894d0173c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/lava/visual",
      "path": "engine/reference/sim/particles/substances/materials/lava/visual.md",
      "source": "engine/sim/particles/substances/materials/lava/visual.js",
      "import": "/engine/sim/particles/substances/materials/lava/visual.js",
      "sourceHash": "f37fa763968ab1f3617971a6f276eac7e40fa07d6bcd79218b85b6a74655d698",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/audio",
      "path": "engine/reference/sim/particles/substances/materials/mercury/audio.md",
      "source": "engine/sim/particles/substances/materials/mercury/audio.js",
      "import": "/engine/sim/particles/substances/materials/mercury/audio.js",
      "sourceHash": "5c9e76e038e5d34387f1fed104e06277320d8f74db6237e05fd247a4284b300a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/mercury/chemistry.md",
      "source": "engine/sim/particles/substances/materials/mercury/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/mercury/chemistry.js",
      "sourceHash": "902ed78183358567b4fb8cca8277a0045e26d89724e9b4f307e41595ca4db337",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/decals",
      "path": "engine/reference/sim/particles/substances/materials/mercury/decals.md",
      "source": "engine/sim/particles/substances/materials/mercury/decals.js",
      "import": "/engine/sim/particles/substances/materials/mercury/decals.js",
      "sourceHash": "547b9c0add00abee6ae43cf157bba92854dc14a746aee7820e742df0a8b0ff66",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/emitter",
      "path": "engine/reference/sim/particles/substances/materials/mercury/emitter.md",
      "source": "engine/sim/particles/substances/materials/mercury/emitter.js",
      "import": "/engine/sim/particles/substances/materials/mercury/emitter.js",
      "sourceHash": "faa15094eddf0d5d2490b9bf2408f94e2787d3a8361a9d1262bde2c0bdef7548",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/identity",
      "path": "engine/reference/sim/particles/substances/materials/mercury/identity.md",
      "source": "engine/sim/particles/substances/materials/mercury/identity.js",
      "import": "/engine/sim/particles/substances/materials/mercury/identity.js",
      "sourceHash": "5eb6b68f5e18906c0ea170d6992953f2115e477f5890fd7460a2bbaf31fd0867",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/index",
      "path": "engine/reference/sim/particles/substances/materials/mercury/index.md",
      "source": "engine/sim/particles/substances/materials/mercury/index.js",
      "import": "/engine/sim/particles/substances/materials/mercury/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/physics",
      "path": "engine/reference/sim/particles/substances/materials/mercury/physics.md",
      "source": "engine/sim/particles/substances/materials/mercury/physics.js",
      "import": "/engine/sim/particles/substances/materials/mercury/physics.js",
      "sourceHash": "bb07616b3913572e3c5d3c51057966d055e890ab30ade08fe1b1bea4779043ee",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/reactions",
      "path": "engine/reference/sim/particles/substances/materials/mercury/reactions.md",
      "source": "engine/sim/particles/substances/materials/mercury/reactions.js",
      "import": "/engine/sim/particles/substances/materials/mercury/reactions.js",
      "sourceHash": "8f00a6f210cfdbd5b2a2811370cebdd98321c9a196ed058574d6a3d30dd4b7da",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/spell",
      "path": "engine/reference/sim/particles/substances/materials/mercury/spell.md",
      "source": "engine/sim/particles/substances/materials/mercury/spell.js",
      "import": "/engine/sim/particles/substances/materials/mercury/spell.js",
      "sourceHash": "e7b7c25a24784b9a4721080f15293327a0df9c7bbfc18a0863be2125cbcd80e7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/sph",
      "path": "engine/reference/sim/particles/substances/materials/mercury/sph.md",
      "source": "engine/sim/particles/substances/materials/mercury/sph.js",
      "import": "/engine/sim/particles/substances/materials/mercury/sph.js",
      "sourceHash": "8e89471cdb62d146a7e20ef3602a4aebbb86d6baa6677433e9d16122cd1bfc55",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/thermal",
      "path": "engine/reference/sim/particles/substances/materials/mercury/thermal.md",
      "source": "engine/sim/particles/substances/materials/mercury/thermal.js",
      "import": "/engine/sim/particles/substances/materials/mercury/thermal.js",
      "sourceHash": "3a01364146eb996efed0e4d432de55a6115bec6c8a021d7724644bc79889371a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/mercury/visual",
      "path": "engine/reference/sim/particles/substances/materials/mercury/visual.md",
      "source": "engine/sim/particles/substances/materials/mercury/visual.js",
      "import": "/engine/sim/particles/substances/materials/mercury/visual.js",
      "sourceHash": "59768504b264f858fc4716b8c59fa792468ca53e0e4e2ed0077935734dbb9395",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/audio",
      "path": "engine/reference/sim/particles/substances/materials/metal/audio.md",
      "source": "engine/sim/particles/substances/materials/metal/audio.js",
      "import": "/engine/sim/particles/substances/materials/metal/audio.js",
      "sourceHash": "67c751c7edc17919ed8cf672c4fd82baeeedc0296e16d1d5820f0458f257c0cb",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/metal/chemistry.md",
      "source": "engine/sim/particles/substances/materials/metal/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/metal/chemistry.js",
      "sourceHash": "433010aa32c0f92d51d6424faa294ed93fc31c04b17655dbc52f082b09bebb08",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/decals",
      "path": "engine/reference/sim/particles/substances/materials/metal/decals.md",
      "source": "engine/sim/particles/substances/materials/metal/decals.js",
      "import": "/engine/sim/particles/substances/materials/metal/decals.js",
      "sourceHash": "85afda68fcffdeab379d7a973657bd029d769afd7912031c947823203ed90a44",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/emitter",
      "path": "engine/reference/sim/particles/substances/materials/metal/emitter.md",
      "source": "engine/sim/particles/substances/materials/metal/emitter.js",
      "import": "/engine/sim/particles/substances/materials/metal/emitter.js",
      "sourceHash": "c6ba9ea31dec38cb6e4409c4a1570ee3f5b957d8fd8e8f795c255d1101dd1d85",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/identity",
      "path": "engine/reference/sim/particles/substances/materials/metal/identity.md",
      "source": "engine/sim/particles/substances/materials/metal/identity.js",
      "import": "/engine/sim/particles/substances/materials/metal/identity.js",
      "sourceHash": "89dc2d315be796ea26bfbd2a19b527dfc474d7788c8107ce3f6c6353bb15632a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/index",
      "path": "engine/reference/sim/particles/substances/materials/metal/index.md",
      "source": "engine/sim/particles/substances/materials/metal/index.js",
      "import": "/engine/sim/particles/substances/materials/metal/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/physics",
      "path": "engine/reference/sim/particles/substances/materials/metal/physics.md",
      "source": "engine/sim/particles/substances/materials/metal/physics.js",
      "import": "/engine/sim/particles/substances/materials/metal/physics.js",
      "sourceHash": "d866d975dc82f405e0fd3dfaabdbf44c4061cb1c07f289e0fc51910a1f927f65",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/reactions",
      "path": "engine/reference/sim/particles/substances/materials/metal/reactions.md",
      "source": "engine/sim/particles/substances/materials/metal/reactions.js",
      "import": "/engine/sim/particles/substances/materials/metal/reactions.js",
      "sourceHash": "3b4847a8e2857d4b45f0d023852f7ef7107f74f189c2de3a77c6281b6513abc5",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/spell",
      "path": "engine/reference/sim/particles/substances/materials/metal/spell.md",
      "source": "engine/sim/particles/substances/materials/metal/spell.js",
      "import": "/engine/sim/particles/substances/materials/metal/spell.js",
      "sourceHash": "becb6ba739c64a8ef68b29d44fb7136cda1447be731adac6f15bbc05377ee10c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/sph",
      "path": "engine/reference/sim/particles/substances/materials/metal/sph.md",
      "source": "engine/sim/particles/substances/materials/metal/sph.js",
      "import": "/engine/sim/particles/substances/materials/metal/sph.js",
      "sourceHash": "9b8f588ef70baa0b0c77a7e6780c52427a55c8dae8b8c90600bd8421a69f6fe0",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/thermal",
      "path": "engine/reference/sim/particles/substances/materials/metal/thermal.md",
      "source": "engine/sim/particles/substances/materials/metal/thermal.js",
      "import": "/engine/sim/particles/substances/materials/metal/thermal.js",
      "sourceHash": "e081fe5406ecb825d2941a762f8f83f9449a9eab3fe624d74b6ca1acfcf143e4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/metal/visual",
      "path": "engine/reference/sim/particles/substances/materials/metal/visual.md",
      "source": "engine/sim/particles/substances/materials/metal/visual.js",
      "import": "/engine/sim/particles/substances/materials/metal/visual.js",
      "sourceHash": "124ad1785033d1d2a65ca0a665586e050a4ee1390cacf432a1b288a20b5da868",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/audio",
      "path": "engine/reference/sim/particles/substances/materials/oil/audio.md",
      "source": "engine/sim/particles/substances/materials/oil/audio.js",
      "import": "/engine/sim/particles/substances/materials/oil/audio.js",
      "sourceHash": "9c29a6b2421c994b54bdcb330efa8889d0ff4b4587079356346241b807172ae9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/oil/chemistry.md",
      "source": "engine/sim/particles/substances/materials/oil/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/oil/chemistry.js",
      "sourceHash": "e5da9dbf5524da9209aa78cd4a86c7baea0c126ad3d1cb16297d32e0f87184bb",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/decals",
      "path": "engine/reference/sim/particles/substances/materials/oil/decals.md",
      "source": "engine/sim/particles/substances/materials/oil/decals.js",
      "import": "/engine/sim/particles/substances/materials/oil/decals.js",
      "sourceHash": "491dd2330bc53b46a83b64856d8fba9fb8f5101c3934467683f3dc468e8e9d48",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/emitter",
      "path": "engine/reference/sim/particles/substances/materials/oil/emitter.md",
      "source": "engine/sim/particles/substances/materials/oil/emitter.js",
      "import": "/engine/sim/particles/substances/materials/oil/emitter.js",
      "sourceHash": "f3a9179aa665caaadf7f676be93fd85439385a675146abaeba6847ebec1961b4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/identity",
      "path": "engine/reference/sim/particles/substances/materials/oil/identity.md",
      "source": "engine/sim/particles/substances/materials/oil/identity.js",
      "import": "/engine/sim/particles/substances/materials/oil/identity.js",
      "sourceHash": "b0e2a2ad97ad3d4b17e5a1d454dba0b8e4ca831401e4854ce7178916ec32bcec",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/index",
      "path": "engine/reference/sim/particles/substances/materials/oil/index.md",
      "source": "engine/sim/particles/substances/materials/oil/index.js",
      "import": "/engine/sim/particles/substances/materials/oil/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/physics",
      "path": "engine/reference/sim/particles/substances/materials/oil/physics.md",
      "source": "engine/sim/particles/substances/materials/oil/physics.js",
      "import": "/engine/sim/particles/substances/materials/oil/physics.js",
      "sourceHash": "3119a49550b8e3036081978f23198a4903ea15ce96289b6d073540ef1c2de8b2",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/reactions",
      "path": "engine/reference/sim/particles/substances/materials/oil/reactions.md",
      "source": "engine/sim/particles/substances/materials/oil/reactions.js",
      "import": "/engine/sim/particles/substances/materials/oil/reactions.js",
      "sourceHash": "b61abe5ef4c636e334fd651bd07e484aa4705dde4602940acb75b10e3eb9860a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/spell",
      "path": "engine/reference/sim/particles/substances/materials/oil/spell.md",
      "source": "engine/sim/particles/substances/materials/oil/spell.js",
      "import": "/engine/sim/particles/substances/materials/oil/spell.js",
      "sourceHash": "d117abe61d91ebade8ec8c810b687a0ffc787123e928b43154d8bea7d96205f1",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/sph",
      "path": "engine/reference/sim/particles/substances/materials/oil/sph.md",
      "source": "engine/sim/particles/substances/materials/oil/sph.js",
      "import": "/engine/sim/particles/substances/materials/oil/sph.js",
      "sourceHash": "2fa5fbf90fba177254441c2f410a018d0d4cf7f7a117c4d1d07d0f61029e181e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/thermal",
      "path": "engine/reference/sim/particles/substances/materials/oil/thermal.md",
      "source": "engine/sim/particles/substances/materials/oil/thermal.js",
      "import": "/engine/sim/particles/substances/materials/oil/thermal.js",
      "sourceHash": "1cedae6ea7650caf50de9e31f309255921d91aebefef67c03c44a9822ab3c7b9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/oil/visual",
      "path": "engine/reference/sim/particles/substances/materials/oil/visual.md",
      "source": "engine/sim/particles/substances/materials/oil/visual.js",
      "import": "/engine/sim/particles/substances/materials/oil/visual.js",
      "sourceHash": "a340634a82502b8a726d1ad307b2657cfa07fe9e0eca1a7527fc998f8787656c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/audio",
      "path": "engine/reference/sim/particles/substances/materials/plasma/audio.md",
      "source": "engine/sim/particles/substances/materials/plasma/audio.js",
      "import": "/engine/sim/particles/substances/materials/plasma/audio.js",
      "sourceHash": "8ea8efbb514a255fbf414069426053b63436b953c2114d3b5e6ff3f96b3e2c9d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/plasma/chemistry.md",
      "source": "engine/sim/particles/substances/materials/plasma/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/plasma/chemistry.js",
      "sourceHash": "80a73c4fd427fce91eebebe390c74c50c119e5be7ec6b695aa728394dd4ab9d6",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/decals",
      "path": "engine/reference/sim/particles/substances/materials/plasma/decals.md",
      "source": "engine/sim/particles/substances/materials/plasma/decals.js",
      "import": "/engine/sim/particles/substances/materials/plasma/decals.js",
      "sourceHash": "0f48b1fe24a9c1a8a360b2a590d9b9b8e5ff4dfa4ec15ae3011e6f377f09d4c1",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/emitter",
      "path": "engine/reference/sim/particles/substances/materials/plasma/emitter.md",
      "source": "engine/sim/particles/substances/materials/plasma/emitter.js",
      "import": "/engine/sim/particles/substances/materials/plasma/emitter.js",
      "sourceHash": "a3aec70bf84349bde7dd7c3a279d77bc3931cd97dddce2e90e8b731fa7013142",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/identity",
      "path": "engine/reference/sim/particles/substances/materials/plasma/identity.md",
      "source": "engine/sim/particles/substances/materials/plasma/identity.js",
      "import": "/engine/sim/particles/substances/materials/plasma/identity.js",
      "sourceHash": "8d6724518e9130853b4a14c21100b8862aeb173ef977695b65f8881c3b811327",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/index",
      "path": "engine/reference/sim/particles/substances/materials/plasma/index.md",
      "source": "engine/sim/particles/substances/materials/plasma/index.js",
      "import": "/engine/sim/particles/substances/materials/plasma/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/physics",
      "path": "engine/reference/sim/particles/substances/materials/plasma/physics.md",
      "source": "engine/sim/particles/substances/materials/plasma/physics.js",
      "import": "/engine/sim/particles/substances/materials/plasma/physics.js",
      "sourceHash": "d936e33c19d102f12aaa84c2ead6b8cde36c9b1786bc17082d81d8b8aac6ae20",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/reactions",
      "path": "engine/reference/sim/particles/substances/materials/plasma/reactions.md",
      "source": "engine/sim/particles/substances/materials/plasma/reactions.js",
      "import": "/engine/sim/particles/substances/materials/plasma/reactions.js",
      "sourceHash": "e3a67960385f8a045c61045b193f6905863701ffd737adbdc1976a16675388f4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/spell",
      "path": "engine/reference/sim/particles/substances/materials/plasma/spell.md",
      "source": "engine/sim/particles/substances/materials/plasma/spell.js",
      "import": "/engine/sim/particles/substances/materials/plasma/spell.js",
      "sourceHash": "ebfff341ed23b671c80782c5d9362e2a3d93e4f828fc926229b4128b62b6b0c4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/sph",
      "path": "engine/reference/sim/particles/substances/materials/plasma/sph.md",
      "source": "engine/sim/particles/substances/materials/plasma/sph.js",
      "import": "/engine/sim/particles/substances/materials/plasma/sph.js",
      "sourceHash": "d01e0b897d6eea9d7191bd12b836303394fee3ec5b2bdd1c8fed01613e2cc56d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/thermal",
      "path": "engine/reference/sim/particles/substances/materials/plasma/thermal.md",
      "source": "engine/sim/particles/substances/materials/plasma/thermal.js",
      "import": "/engine/sim/particles/substances/materials/plasma/thermal.js",
      "sourceHash": "195c20cd8d7b817c7ccdc7750b4b5596a1cb2fa557238b84df5f0e8985b3d6c5",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/plasma/visual",
      "path": "engine/reference/sim/particles/substances/materials/plasma/visual.md",
      "source": "engine/sim/particles/substances/materials/plasma/visual.js",
      "import": "/engine/sim/particles/substances/materials/plasma/visual.js",
      "sourceHash": "a9562688e979b604e9b8911e99f38cdb5f255d28721c461c7608a5081d36bcbb",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/audio",
      "path": "engine/reference/sim/particles/substances/materials/sand/audio.md",
      "source": "engine/sim/particles/substances/materials/sand/audio.js",
      "import": "/engine/sim/particles/substances/materials/sand/audio.js",
      "sourceHash": "09586f539c046036cf438243ed67b099989fe6117835beaef8bcd39156263f9c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/sand/chemistry.md",
      "source": "engine/sim/particles/substances/materials/sand/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/sand/chemistry.js",
      "sourceHash": "9ec1ec2e724dfb0a3449d160b55c828451f29d4376ce349050e4cc88ce7c6b54",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/decals",
      "path": "engine/reference/sim/particles/substances/materials/sand/decals.md",
      "source": "engine/sim/particles/substances/materials/sand/decals.js",
      "import": "/engine/sim/particles/substances/materials/sand/decals.js",
      "sourceHash": "0940bdf9e97fd911eed29601a48c14fca5d493747d98e019ba063607ff046872",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/emitter",
      "path": "engine/reference/sim/particles/substances/materials/sand/emitter.md",
      "source": "engine/sim/particles/substances/materials/sand/emitter.js",
      "import": "/engine/sim/particles/substances/materials/sand/emitter.js",
      "sourceHash": "bb4715ad6c528241a6ad17b45cb257c5163d799c36c1e77eca4d3d361c5ff36f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/identity",
      "path": "engine/reference/sim/particles/substances/materials/sand/identity.md",
      "source": "engine/sim/particles/substances/materials/sand/identity.js",
      "import": "/engine/sim/particles/substances/materials/sand/identity.js",
      "sourceHash": "112908d65d0761865e0e3aecd43f85f4ec24880d68c54d60293f454ddf8042e4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/index",
      "path": "engine/reference/sim/particles/substances/materials/sand/index.md",
      "source": "engine/sim/particles/substances/materials/sand/index.js",
      "import": "/engine/sim/particles/substances/materials/sand/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/physics",
      "path": "engine/reference/sim/particles/substances/materials/sand/physics.md",
      "source": "engine/sim/particles/substances/materials/sand/physics.js",
      "import": "/engine/sim/particles/substances/materials/sand/physics.js",
      "sourceHash": "aef030e5fc85c9a5be6970b7138f40e861891c2b2bae4785f23fda5d8b08a9bc",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/reactions",
      "path": "engine/reference/sim/particles/substances/materials/sand/reactions.md",
      "source": "engine/sim/particles/substances/materials/sand/reactions.js",
      "import": "/engine/sim/particles/substances/materials/sand/reactions.js",
      "sourceHash": "dfe5c12b7a4de8325ecffb91eafc6d2295d3f7a3633c845c0ae1d452c422d3f5",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/spell",
      "path": "engine/reference/sim/particles/substances/materials/sand/spell.md",
      "source": "engine/sim/particles/substances/materials/sand/spell.js",
      "import": "/engine/sim/particles/substances/materials/sand/spell.js",
      "sourceHash": "91e22ddf248a18fd375d0cef965c74fe49ea15f2f44aaf72d620b8939d32ad0e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/sph",
      "path": "engine/reference/sim/particles/substances/materials/sand/sph.md",
      "source": "engine/sim/particles/substances/materials/sand/sph.js",
      "import": "/engine/sim/particles/substances/materials/sand/sph.js",
      "sourceHash": "ff093c67acd1b750ed1d33954fc8d168182327c7567e4eadb92259d047448f9e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/thermal",
      "path": "engine/reference/sim/particles/substances/materials/sand/thermal.md",
      "source": "engine/sim/particles/substances/materials/sand/thermal.js",
      "import": "/engine/sim/particles/substances/materials/sand/thermal.js",
      "sourceHash": "1fdce1b2a665d51c18994faad6eb8ddc4a604d7f9b771b98d4ba718c2d267327",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sand/visual",
      "path": "engine/reference/sim/particles/substances/materials/sand/visual.md",
      "source": "engine/sim/particles/substances/materials/sand/visual.js",
      "import": "/engine/sim/particles/substances/materials/sand/visual.js",
      "sourceHash": "c80aa5e34abced8b5eb7d23b4e96101d1d59a0d8bd90915ccff6ddc14fc18e6f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/audio",
      "path": "engine/reference/sim/particles/substances/materials/smoke/audio.md",
      "source": "engine/sim/particles/substances/materials/smoke/audio.js",
      "import": "/engine/sim/particles/substances/materials/smoke/audio.js",
      "sourceHash": "b50db4c034712354e056f01fa3d1c3bb42c6e4aa9bc10d06bd4fa8e5078cf13f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/smoke/chemistry.md",
      "source": "engine/sim/particles/substances/materials/smoke/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/smoke/chemistry.js",
      "sourceHash": "84874534aadefdeb690be05d92f0a7ebd4ecf2a2e5429f0ec7cebf945acd56f6",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/decals",
      "path": "engine/reference/sim/particles/substances/materials/smoke/decals.md",
      "source": "engine/sim/particles/substances/materials/smoke/decals.js",
      "import": "/engine/sim/particles/substances/materials/smoke/decals.js",
      "sourceHash": "9fa5670d3b70562935caff4e435ab5d2b9426fd0e596b394fc8e0d5e73d1f783",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/emitter",
      "path": "engine/reference/sim/particles/substances/materials/smoke/emitter.md",
      "source": "engine/sim/particles/substances/materials/smoke/emitter.js",
      "import": "/engine/sim/particles/substances/materials/smoke/emitter.js",
      "sourceHash": "6e97af19eca2a4a77107dc2d1569d64c7a2a20ecd9d504b054c2d94542e8b831",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/identity",
      "path": "engine/reference/sim/particles/substances/materials/smoke/identity.md",
      "source": "engine/sim/particles/substances/materials/smoke/identity.js",
      "import": "/engine/sim/particles/substances/materials/smoke/identity.js",
      "sourceHash": "8c8a9ba67dbe32c230fd9942fcba50a82ced07c613a63498dcda0d7885a35d13",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/index",
      "path": "engine/reference/sim/particles/substances/materials/smoke/index.md",
      "source": "engine/sim/particles/substances/materials/smoke/index.js",
      "import": "/engine/sim/particles/substances/materials/smoke/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/physics",
      "path": "engine/reference/sim/particles/substances/materials/smoke/physics.md",
      "source": "engine/sim/particles/substances/materials/smoke/physics.js",
      "import": "/engine/sim/particles/substances/materials/smoke/physics.js",
      "sourceHash": "a0efb42aa36354deb991ed248dbcaccf32076356af3847f0d6013df6b2919237",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/reactions",
      "path": "engine/reference/sim/particles/substances/materials/smoke/reactions.md",
      "source": "engine/sim/particles/substances/materials/smoke/reactions.js",
      "import": "/engine/sim/particles/substances/materials/smoke/reactions.js",
      "sourceHash": "e3a67960385f8a045c61045b193f6905863701ffd737adbdc1976a16675388f4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/spell",
      "path": "engine/reference/sim/particles/substances/materials/smoke/spell.md",
      "source": "engine/sim/particles/substances/materials/smoke/spell.js",
      "import": "/engine/sim/particles/substances/materials/smoke/spell.js",
      "sourceHash": "53399a68a3c8ff906291c15c43abbf5cd19853917a633c52a2d9ac8b200edf73",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/sph",
      "path": "engine/reference/sim/particles/substances/materials/smoke/sph.md",
      "source": "engine/sim/particles/substances/materials/smoke/sph.js",
      "import": "/engine/sim/particles/substances/materials/smoke/sph.js",
      "sourceHash": "d01e0b897d6eea9d7191bd12b836303394fee3ec5b2bdd1c8fed01613e2cc56d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/thermal",
      "path": "engine/reference/sim/particles/substances/materials/smoke/thermal.md",
      "source": "engine/sim/particles/substances/materials/smoke/thermal.js",
      "import": "/engine/sim/particles/substances/materials/smoke/thermal.js",
      "sourceHash": "e8d2eba0356531df009f88050a864bda57f22ea2299e4a33ea59b8e61cd5439a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/smoke/visual",
      "path": "engine/reference/sim/particles/substances/materials/smoke/visual.md",
      "source": "engine/sim/particles/substances/materials/smoke/visual.js",
      "import": "/engine/sim/particles/substances/materials/smoke/visual.js",
      "sourceHash": "db84296e164e475d83413db1552e88278f1d2348c4ffca0300f8ec7e732cc98f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/audio",
      "path": "engine/reference/sim/particles/substances/materials/snow/audio.md",
      "source": "engine/sim/particles/substances/materials/snow/audio.js",
      "import": "/engine/sim/particles/substances/materials/snow/audio.js",
      "sourceHash": "ae641a3aee2fd83161ea60ae804d94356caf2f9bfac66c7a13238e99d4607e4b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/snow/chemistry.md",
      "source": "engine/sim/particles/substances/materials/snow/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/snow/chemistry.js",
      "sourceHash": "cc0bdc2d1d97712c71c31f40f48ff372d257f3ec5053f7b8333992d492773890",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/decals",
      "path": "engine/reference/sim/particles/substances/materials/snow/decals.md",
      "source": "engine/sim/particles/substances/materials/snow/decals.js",
      "import": "/engine/sim/particles/substances/materials/snow/decals.js",
      "sourceHash": "2075f61ce1c11404770539d35371bf220d203815f6964fd9356f4b2f3804fc58",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/emitter",
      "path": "engine/reference/sim/particles/substances/materials/snow/emitter.md",
      "source": "engine/sim/particles/substances/materials/snow/emitter.js",
      "import": "/engine/sim/particles/substances/materials/snow/emitter.js",
      "sourceHash": "911fd0901e7a758153595f7b76106964012e40f04a288edd16ebf9afd32ae17e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/identity",
      "path": "engine/reference/sim/particles/substances/materials/snow/identity.md",
      "source": "engine/sim/particles/substances/materials/snow/identity.js",
      "import": "/engine/sim/particles/substances/materials/snow/identity.js",
      "sourceHash": "817c8cc6ea57b427687b0f4c7f17471543dc3e6129295cc089ee9ddbaec0eb90",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/index",
      "path": "engine/reference/sim/particles/substances/materials/snow/index.md",
      "source": "engine/sim/particles/substances/materials/snow/index.js",
      "import": "/engine/sim/particles/substances/materials/snow/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/physics",
      "path": "engine/reference/sim/particles/substances/materials/snow/physics.md",
      "source": "engine/sim/particles/substances/materials/snow/physics.js",
      "import": "/engine/sim/particles/substances/materials/snow/physics.js",
      "sourceHash": "73dd4d03bccc50302f7f9478f970a83c97e6d62e5b73dbb061a591d9b4fe576b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/reactions",
      "path": "engine/reference/sim/particles/substances/materials/snow/reactions.md",
      "source": "engine/sim/particles/substances/materials/snow/reactions.js",
      "import": "/engine/sim/particles/substances/materials/snow/reactions.js",
      "sourceHash": "7385e4c70f6a92c923df306789e9582cc689e690485fe658da07560431acf253",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/spell",
      "path": "engine/reference/sim/particles/substances/materials/snow/spell.md",
      "source": "engine/sim/particles/substances/materials/snow/spell.js",
      "import": "/engine/sim/particles/substances/materials/snow/spell.js",
      "sourceHash": "aa460e8c3d5fcbd161f23f52ecc68bfb2390bbf7d346627623ebb1e6e9077d61",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/sph",
      "path": "engine/reference/sim/particles/substances/materials/snow/sph.md",
      "source": "engine/sim/particles/substances/materials/snow/sph.js",
      "import": "/engine/sim/particles/substances/materials/snow/sph.js",
      "sourceHash": "59a5fa01723cc267e03be44725a615c562546b927bd3af933b5eb42c4bb0372a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/thermal",
      "path": "engine/reference/sim/particles/substances/materials/snow/thermal.md",
      "source": "engine/sim/particles/substances/materials/snow/thermal.js",
      "import": "/engine/sim/particles/substances/materials/snow/thermal.js",
      "sourceHash": "f7bd5fb425992aedf4571f7976976f456e3f6bda4c20a724318be0a8e9dbdf4d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/snow/visual",
      "path": "engine/reference/sim/particles/substances/materials/snow/visual.md",
      "source": "engine/sim/particles/substances/materials/snow/visual.js",
      "import": "/engine/sim/particles/substances/materials/snow/visual.js",
      "sourceHash": "88677d42a742a121492712f85e9c17ebe0c274cdb097114f38e1ad692c723337",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/audio",
      "path": "engine/reference/sim/particles/substances/materials/sparks/audio.md",
      "source": "engine/sim/particles/substances/materials/sparks/audio.js",
      "import": "/engine/sim/particles/substances/materials/sparks/audio.js",
      "sourceHash": "ee321c51874fbc79e202ad918850e051a56ef6ad6e6e9e324b1f111b35f5c1f3",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/sparks/chemistry.md",
      "source": "engine/sim/particles/substances/materials/sparks/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/sparks/chemistry.js",
      "sourceHash": "433010aa32c0f92d51d6424faa294ed93fc31c04b17655dbc52f082b09bebb08",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/decals",
      "path": "engine/reference/sim/particles/substances/materials/sparks/decals.md",
      "source": "engine/sim/particles/substances/materials/sparks/decals.js",
      "import": "/engine/sim/particles/substances/materials/sparks/decals.js",
      "sourceHash": "35fc167edf9e3b8fa4de0bbf6ac28dc83391c06688462d9c48f86eef8b3b917b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/emitter",
      "path": "engine/reference/sim/particles/substances/materials/sparks/emitter.md",
      "source": "engine/sim/particles/substances/materials/sparks/emitter.js",
      "import": "/engine/sim/particles/substances/materials/sparks/emitter.js",
      "sourceHash": "fe2c77feca636a4518f55ac7e8c34cda1bcdad4a122cf8d9a9893f78feba439e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/identity",
      "path": "engine/reference/sim/particles/substances/materials/sparks/identity.md",
      "source": "engine/sim/particles/substances/materials/sparks/identity.js",
      "import": "/engine/sim/particles/substances/materials/sparks/identity.js",
      "sourceHash": "e290afa99344c23712503d5ddf32ea58be9b9c503179393050a1a7d7ab12ef1a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/index",
      "path": "engine/reference/sim/particles/substances/materials/sparks/index.md",
      "source": "engine/sim/particles/substances/materials/sparks/index.js",
      "import": "/engine/sim/particles/substances/materials/sparks/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/physics",
      "path": "engine/reference/sim/particles/substances/materials/sparks/physics.md",
      "source": "engine/sim/particles/substances/materials/sparks/physics.js",
      "import": "/engine/sim/particles/substances/materials/sparks/physics.js",
      "sourceHash": "2af754bc2c2091400b61a7b5e5134b415f89e4afab04b0bc35484d5e39df21c2",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/reactions",
      "path": "engine/reference/sim/particles/substances/materials/sparks/reactions.md",
      "source": "engine/sim/particles/substances/materials/sparks/reactions.js",
      "import": "/engine/sim/particles/substances/materials/sparks/reactions.js",
      "sourceHash": "e3a67960385f8a045c61045b193f6905863701ffd737adbdc1976a16675388f4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/spell",
      "path": "engine/reference/sim/particles/substances/materials/sparks/spell.md",
      "source": "engine/sim/particles/substances/materials/sparks/spell.js",
      "import": "/engine/sim/particles/substances/materials/sparks/spell.js",
      "sourceHash": "665a2713adbeba987b69f6b10b7ed3b7b268b14a3bfdf843afe65d59ea8ccf90",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/sph",
      "path": "engine/reference/sim/particles/substances/materials/sparks/sph.md",
      "source": "engine/sim/particles/substances/materials/sparks/sph.js",
      "import": "/engine/sim/particles/substances/materials/sparks/sph.js",
      "sourceHash": "d01e0b897d6eea9d7191bd12b836303394fee3ec5b2bdd1c8fed01613e2cc56d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/thermal",
      "path": "engine/reference/sim/particles/substances/materials/sparks/thermal.md",
      "source": "engine/sim/particles/substances/materials/sparks/thermal.js",
      "import": "/engine/sim/particles/substances/materials/sparks/thermal.js",
      "sourceHash": "1304be92ab86d682b1b04e83dcc1c2ceb68642d044736ccd732c304e2bd94920",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/sparks/visual",
      "path": "engine/reference/sim/particles/substances/materials/sparks/visual.md",
      "source": "engine/sim/particles/substances/materials/sparks/visual.js",
      "import": "/engine/sim/particles/substances/materials/sparks/visual.js",
      "sourceHash": "a52418de92fbe0a73d4b5919d86044b6fbda388a7c3051c2591b4f40ed5392b7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/audio",
      "path": "engine/reference/sim/particles/substances/materials/steam/audio.md",
      "source": "engine/sim/particles/substances/materials/steam/audio.js",
      "import": "/engine/sim/particles/substances/materials/steam/audio.js",
      "sourceHash": "fe1460b471cbea9b17432ab8b317909640d5de1971644915dfa4a562606219eb",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/steam/chemistry.md",
      "source": "engine/sim/particles/substances/materials/steam/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/steam/chemistry.js",
      "sourceHash": "cc0bdc2d1d97712c71c31f40f48ff372d257f3ec5053f7b8333992d492773890",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/decals",
      "path": "engine/reference/sim/particles/substances/materials/steam/decals.md",
      "source": "engine/sim/particles/substances/materials/steam/decals.js",
      "import": "/engine/sim/particles/substances/materials/steam/decals.js",
      "sourceHash": "f8f3f48dfe7c5594da75c7c8cfe5040f2acc90b0d218d3997f934cdbd5256572",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/emitter",
      "path": "engine/reference/sim/particles/substances/materials/steam/emitter.md",
      "source": "engine/sim/particles/substances/materials/steam/emitter.js",
      "import": "/engine/sim/particles/substances/materials/steam/emitter.js",
      "sourceHash": "f6c5e488ae3ac0dbf8fac7c241c33bb7684861ffd49c570041a1dc37356ccad1",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/identity",
      "path": "engine/reference/sim/particles/substances/materials/steam/identity.md",
      "source": "engine/sim/particles/substances/materials/steam/identity.js",
      "import": "/engine/sim/particles/substances/materials/steam/identity.js",
      "sourceHash": "e55a822f5ff16d90559c1a62ef4b3cc17544e8c89d9146e67625fcebfc6e9aad",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/index",
      "path": "engine/reference/sim/particles/substances/materials/steam/index.md",
      "source": "engine/sim/particles/substances/materials/steam/index.js",
      "import": "/engine/sim/particles/substances/materials/steam/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/physics",
      "path": "engine/reference/sim/particles/substances/materials/steam/physics.md",
      "source": "engine/sim/particles/substances/materials/steam/physics.js",
      "import": "/engine/sim/particles/substances/materials/steam/physics.js",
      "sourceHash": "fdebcdf9cd87c3ecf428e5ef4557b2945655d142dfc7567a613a68d7afa618c0",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/reactions",
      "path": "engine/reference/sim/particles/substances/materials/steam/reactions.md",
      "source": "engine/sim/particles/substances/materials/steam/reactions.js",
      "import": "/engine/sim/particles/substances/materials/steam/reactions.js",
      "sourceHash": "79bf9a94807d40050ed9b98a0f17716f75eb496828d1a515f34c470df6308c58",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/spell",
      "path": "engine/reference/sim/particles/substances/materials/steam/spell.md",
      "source": "engine/sim/particles/substances/materials/steam/spell.js",
      "import": "/engine/sim/particles/substances/materials/steam/spell.js",
      "sourceHash": "65838a79d099717aba0fd7f369442f8362e1eb790a4aee4047c48bcdd9baee3a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/sph",
      "path": "engine/reference/sim/particles/substances/materials/steam/sph.md",
      "source": "engine/sim/particles/substances/materials/steam/sph.js",
      "import": "/engine/sim/particles/substances/materials/steam/sph.js",
      "sourceHash": "d01e0b897d6eea9d7191bd12b836303394fee3ec5b2bdd1c8fed01613e2cc56d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/thermal",
      "path": "engine/reference/sim/particles/substances/materials/steam/thermal.md",
      "source": "engine/sim/particles/substances/materials/steam/thermal.js",
      "import": "/engine/sim/particles/substances/materials/steam/thermal.js",
      "sourceHash": "858f76917b47b3c0624bfe346fcd13a097647205a1b7dfdabfc681926d1c665f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/steam/visual",
      "path": "engine/reference/sim/particles/substances/materials/steam/visual.md",
      "source": "engine/sim/particles/substances/materials/steam/visual.js",
      "import": "/engine/sim/particles/substances/materials/steam/visual.js",
      "sourceHash": "0e7f5e6b99fe861611acfff174fd745128098d0962a14060bd343aae7ee641fe",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/audio",
      "path": "engine/reference/sim/particles/substances/materials/stone/audio.md",
      "source": "engine/sim/particles/substances/materials/stone/audio.js",
      "import": "/engine/sim/particles/substances/materials/stone/audio.js",
      "sourceHash": "13a21038180a55236eb3515a50adc9e3dbbdce72bb8d92c0ad1fc8da700224a3",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/stone/chemistry.md",
      "source": "engine/sim/particles/substances/materials/stone/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/stone/chemistry.js",
      "sourceHash": "9ec1ec2e724dfb0a3449d160b55c828451f29d4376ce349050e4cc88ce7c6b54",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/decals",
      "path": "engine/reference/sim/particles/substances/materials/stone/decals.md",
      "source": "engine/sim/particles/substances/materials/stone/decals.js",
      "import": "/engine/sim/particles/substances/materials/stone/decals.js",
      "sourceHash": "34d92b9fb1d37edf3c42d533535e77d8cdee2274ced6e0ff1a17e28923b90e25",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/emitter",
      "path": "engine/reference/sim/particles/substances/materials/stone/emitter.md",
      "source": "engine/sim/particles/substances/materials/stone/emitter.js",
      "import": "/engine/sim/particles/substances/materials/stone/emitter.js",
      "sourceHash": "b44b4e264c374658f71d18cd9d359baee6a3c61f1355878ed72b267e6ece3436",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/identity",
      "path": "engine/reference/sim/particles/substances/materials/stone/identity.md",
      "source": "engine/sim/particles/substances/materials/stone/identity.js",
      "import": "/engine/sim/particles/substances/materials/stone/identity.js",
      "sourceHash": "a3b9648e770428364c9a80b7ea3be5917fa8e2f59a99b66089a60e7ff2d95c7b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/index",
      "path": "engine/reference/sim/particles/substances/materials/stone/index.md",
      "source": "engine/sim/particles/substances/materials/stone/index.js",
      "import": "/engine/sim/particles/substances/materials/stone/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/physics",
      "path": "engine/reference/sim/particles/substances/materials/stone/physics.md",
      "source": "engine/sim/particles/substances/materials/stone/physics.js",
      "import": "/engine/sim/particles/substances/materials/stone/physics.js",
      "sourceHash": "e98491edd414e29ac7da1bc3935aa136946009877a93f46b72800c84d346731b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/reactions",
      "path": "engine/reference/sim/particles/substances/materials/stone/reactions.md",
      "source": "engine/sim/particles/substances/materials/stone/reactions.js",
      "import": "/engine/sim/particles/substances/materials/stone/reactions.js",
      "sourceHash": "b79fb6f98f498b8ca9149efd302a8287c33174c4b7a36a141d4c17b88f16de02",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/spell",
      "path": "engine/reference/sim/particles/substances/materials/stone/spell.md",
      "source": "engine/sim/particles/substances/materials/stone/spell.js",
      "import": "/engine/sim/particles/substances/materials/stone/spell.js",
      "sourceHash": "e284fb97686237ddf096c9aa225d6d976e7c58e4eb6d25e724d5aad00d99d62b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/sph",
      "path": "engine/reference/sim/particles/substances/materials/stone/sph.md",
      "source": "engine/sim/particles/substances/materials/stone/sph.js",
      "import": "/engine/sim/particles/substances/materials/stone/sph.js",
      "sourceHash": "9d758336deaf224f570ab529b726619bca146558c41e1e7405503d55f0a53452",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/thermal",
      "path": "engine/reference/sim/particles/substances/materials/stone/thermal.md",
      "source": "engine/sim/particles/substances/materials/stone/thermal.js",
      "import": "/engine/sim/particles/substances/materials/stone/thermal.js",
      "sourceHash": "60bddfb22670d3c1527b7d4e58632c8a4e9dfa5469044b6f97e69972b86319af",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/stone/visual",
      "path": "engine/reference/sim/particles/substances/materials/stone/visual.md",
      "source": "engine/sim/particles/substances/materials/stone/visual.js",
      "import": "/engine/sim/particles/substances/materials/stone/visual.js",
      "sourceHash": "339081b6ae3b56935c77d1750789e2696f2994dd39e05de1e9cbe540318a99a7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/audio",
      "path": "engine/reference/sim/particles/substances/materials/water/audio.md",
      "source": "engine/sim/particles/substances/materials/water/audio.js",
      "import": "/engine/sim/particles/substances/materials/water/audio.js",
      "sourceHash": "d26f3ebc6fa14b3f56e9dfb8d83d5039d5fca6c182f1e1405a8f3073c0c1aece",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/water/chemistry.md",
      "source": "engine/sim/particles/substances/materials/water/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/water/chemistry.js",
      "sourceHash": "cc0bdc2d1d97712c71c31f40f48ff372d257f3ec5053f7b8333992d492773890",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/decals",
      "path": "engine/reference/sim/particles/substances/materials/water/decals.md",
      "source": "engine/sim/particles/substances/materials/water/decals.js",
      "import": "/engine/sim/particles/substances/materials/water/decals.js",
      "sourceHash": "0538b9e3e82a5287ac44f2f96b9cce85908d1e5d973bd41d1d6355980c47100e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/emitter",
      "path": "engine/reference/sim/particles/substances/materials/water/emitter.md",
      "source": "engine/sim/particles/substances/materials/water/emitter.js",
      "import": "/engine/sim/particles/substances/materials/water/emitter.js",
      "sourceHash": "51ca05a89c831da0f0b7389901b671374388475bb22d1aa4620c63cba60e6f36",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/identity",
      "path": "engine/reference/sim/particles/substances/materials/water/identity.md",
      "source": "engine/sim/particles/substances/materials/water/identity.js",
      "import": "/engine/sim/particles/substances/materials/water/identity.js",
      "sourceHash": "e3dca444f99ddd49ee71c82a57f96b4d033b93978ebc4160cbd2b85ac58c4f89",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/index",
      "path": "engine/reference/sim/particles/substances/materials/water/index.md",
      "source": "engine/sim/particles/substances/materials/water/index.js",
      "import": "/engine/sim/particles/substances/materials/water/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/physics",
      "path": "engine/reference/sim/particles/substances/materials/water/physics.md",
      "source": "engine/sim/particles/substances/materials/water/physics.js",
      "import": "/engine/sim/particles/substances/materials/water/physics.js",
      "sourceHash": "8174b1a302d4ca010c13cb336f29271e8077a4f668ffc49d3012cc7545da7a3b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/reactions",
      "path": "engine/reference/sim/particles/substances/materials/water/reactions.md",
      "source": "engine/sim/particles/substances/materials/water/reactions.js",
      "import": "/engine/sim/particles/substances/materials/water/reactions.js",
      "sourceHash": "05ceaa994fc260e0c17ebcfac8e650a9d2ffdb9a69fc985d253952f065d55450",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/spell",
      "path": "engine/reference/sim/particles/substances/materials/water/spell.md",
      "source": "engine/sim/particles/substances/materials/water/spell.js",
      "import": "/engine/sim/particles/substances/materials/water/spell.js",
      "sourceHash": "09ca75f97be7c97fda27748f9c0041eafc9e3e2b70002718f7ee7c28fd20fc14",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/sph",
      "path": "engine/reference/sim/particles/substances/materials/water/sph.md",
      "source": "engine/sim/particles/substances/materials/water/sph.js",
      "import": "/engine/sim/particles/substances/materials/water/sph.js",
      "sourceHash": "dcef15a8db414311379ab6c7ee47a7d74adda427a1043a3d137643588ec3817b",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/thermal",
      "path": "engine/reference/sim/particles/substances/materials/water/thermal.md",
      "source": "engine/sim/particles/substances/materials/water/thermal.js",
      "import": "/engine/sim/particles/substances/materials/water/thermal.js",
      "sourceHash": "7868bc2656836e88a2ff90c2b8545ee03ef56c606ec6107585259572851d4749",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/water/visual",
      "path": "engine/reference/sim/particles/substances/materials/water/visual.md",
      "source": "engine/sim/particles/substances/materials/water/visual.js",
      "import": "/engine/sim/particles/substances/materials/water/visual.js",
      "sourceHash": "39eacd4baf16d2d254b4ccf0fe95203711244bb85d5f2cd48b6d9817054088a4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/audio",
      "path": "engine/reference/sim/particles/substances/materials/wax/audio.md",
      "source": "engine/sim/particles/substances/materials/wax/audio.js",
      "import": "/engine/sim/particles/substances/materials/wax/audio.js",
      "sourceHash": "48c8450e7873287843b4477815f39ba16444189773e4401e2da2535aa3a3b412",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/wax/chemistry.md",
      "source": "engine/sim/particles/substances/materials/wax/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/wax/chemistry.js",
      "sourceHash": "413ba9c326c5b632af5c70408bac1bd5ac91071d9469f6121b77caebdbd282b4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/decals",
      "path": "engine/reference/sim/particles/substances/materials/wax/decals.md",
      "source": "engine/sim/particles/substances/materials/wax/decals.js",
      "import": "/engine/sim/particles/substances/materials/wax/decals.js",
      "sourceHash": "0cd79c91fe84e787d122c551df48ee40a8f2a788dccf9f9738568ebdd0671d01",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/emitter",
      "path": "engine/reference/sim/particles/substances/materials/wax/emitter.md",
      "source": "engine/sim/particles/substances/materials/wax/emitter.js",
      "import": "/engine/sim/particles/substances/materials/wax/emitter.js",
      "sourceHash": "58bfbdd7b520b4b86249326f55bb7f297e82d8ceb81cc6ec764447eaab9b6ba5",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/identity",
      "path": "engine/reference/sim/particles/substances/materials/wax/identity.md",
      "source": "engine/sim/particles/substances/materials/wax/identity.js",
      "import": "/engine/sim/particles/substances/materials/wax/identity.js",
      "sourceHash": "d553b0a3dfef8fbf1eaff305ed295bf3826ec336cc9fe7de4e18e70dca732b60",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/index",
      "path": "engine/reference/sim/particles/substances/materials/wax/index.md",
      "source": "engine/sim/particles/substances/materials/wax/index.js",
      "import": "/engine/sim/particles/substances/materials/wax/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/physics",
      "path": "engine/reference/sim/particles/substances/materials/wax/physics.md",
      "source": "engine/sim/particles/substances/materials/wax/physics.js",
      "import": "/engine/sim/particles/substances/materials/wax/physics.js",
      "sourceHash": "525a09b646a3fe6f85e37682cb1d64d274860c1360a2db2d72441d8365439ab1",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/reactions",
      "path": "engine/reference/sim/particles/substances/materials/wax/reactions.md",
      "source": "engine/sim/particles/substances/materials/wax/reactions.js",
      "import": "/engine/sim/particles/substances/materials/wax/reactions.js",
      "sourceHash": "c07a32932408c241d860d6aab5b3c980ef5920d30de30658daee27e1a4302dbc",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/spell",
      "path": "engine/reference/sim/particles/substances/materials/wax/spell.md",
      "source": "engine/sim/particles/substances/materials/wax/spell.js",
      "import": "/engine/sim/particles/substances/materials/wax/spell.js",
      "sourceHash": "a0a50c83fea6e8fe0a307966d9b195ffbd13c10a0dca94ac1aa368a1ba69bf11",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/sph",
      "path": "engine/reference/sim/particles/substances/materials/wax/sph.md",
      "source": "engine/sim/particles/substances/materials/wax/sph.js",
      "import": "/engine/sim/particles/substances/materials/wax/sph.js",
      "sourceHash": "cabf8105eeb23c7f6a9493a68485a43848eafabe6c6e8ee41d4e941f7c0b923c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/thermal",
      "path": "engine/reference/sim/particles/substances/materials/wax/thermal.md",
      "source": "engine/sim/particles/substances/materials/wax/thermal.js",
      "import": "/engine/sim/particles/substances/materials/wax/thermal.js",
      "sourceHash": "2b2ad3dc7f16ba9e0880f51f36fc7290375f4d5e1755e183c26804a860c8c39a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wax/visual",
      "path": "engine/reference/sim/particles/substances/materials/wax/visual.md",
      "source": "engine/sim/particles/substances/materials/wax/visual.js",
      "import": "/engine/sim/particles/substances/materials/wax/visual.js",
      "sourceHash": "5e70a160f17530606a405f90ada19075ba8e8f15cc607d9b53017d88b453e412",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/audio",
      "path": "engine/reference/sim/particles/substances/materials/wood/audio.md",
      "source": "engine/sim/particles/substances/materials/wood/audio.js",
      "import": "/engine/sim/particles/substances/materials/wood/audio.js",
      "sourceHash": "9dbd99b9d422d30df4d70af7760882cb475baf3138dbf8fac1bea6678258f16a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/chemistry",
      "path": "engine/reference/sim/particles/substances/materials/wood/chemistry.md",
      "source": "engine/sim/particles/substances/materials/wood/chemistry.js",
      "import": "/engine/sim/particles/substances/materials/wood/chemistry.js",
      "sourceHash": "413ba9c326c5b632af5c70408bac1bd5ac91071d9469f6121b77caebdbd282b4",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/decals",
      "path": "engine/reference/sim/particles/substances/materials/wood/decals.md",
      "source": "engine/sim/particles/substances/materials/wood/decals.js",
      "import": "/engine/sim/particles/substances/materials/wood/decals.js",
      "sourceHash": "d9aeae455817d3655ae1873e5f68fe656d670d215b7eda84842e758e8269a2a9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/emitter",
      "path": "engine/reference/sim/particles/substances/materials/wood/emitter.md",
      "source": "engine/sim/particles/substances/materials/wood/emitter.js",
      "import": "/engine/sim/particles/substances/materials/wood/emitter.js",
      "sourceHash": "da295741b45276a4b8f584831fd4b1eec9a17f9b49690b68423cacab60b67791",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/identity",
      "path": "engine/reference/sim/particles/substances/materials/wood/identity.md",
      "source": "engine/sim/particles/substances/materials/wood/identity.js",
      "import": "/engine/sim/particles/substances/materials/wood/identity.js",
      "sourceHash": "f03767f97810dd1aae4487477d0253027c0e959d723339dd8da85c3b6353fedf",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/index",
      "path": "engine/reference/sim/particles/substances/materials/wood/index.md",
      "source": "engine/sim/particles/substances/materials/wood/index.js",
      "import": "/engine/sim/particles/substances/materials/wood/index.js",
      "sourceHash": "11f7e1b13b541a1b143f598b4f5b2022bce4624c4128dd292354a7ae5ab9735e",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/physics",
      "path": "engine/reference/sim/particles/substances/materials/wood/physics.md",
      "source": "engine/sim/particles/substances/materials/wood/physics.js",
      "import": "/engine/sim/particles/substances/materials/wood/physics.js",
      "sourceHash": "b42652b7ea4731ebeb321ca2c0ce8605e9d82401b466557d037bf9cc0028bcd7",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/reactions",
      "path": "engine/reference/sim/particles/substances/materials/wood/reactions.md",
      "source": "engine/sim/particles/substances/materials/wood/reactions.js",
      "import": "/engine/sim/particles/substances/materials/wood/reactions.js",
      "sourceHash": "2a0d646fdf00ea353a9ee34fc98850d76e5cae29354c505da145b22e64493fe0",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/spell",
      "path": "engine/reference/sim/particles/substances/materials/wood/spell.md",
      "source": "engine/sim/particles/substances/materials/wood/spell.js",
      "import": "/engine/sim/particles/substances/materials/wood/spell.js",
      "sourceHash": "5a3da0bf2092de6b056b05d99e067cedbf4b413c78a7363fcc1a321ffefeba55",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/sph",
      "path": "engine/reference/sim/particles/substances/materials/wood/sph.md",
      "source": "engine/sim/particles/substances/materials/wood/sph.js",
      "import": "/engine/sim/particles/substances/materials/wood/sph.js",
      "sourceHash": "d01e0b897d6eea9d7191bd12b836303394fee3ec5b2bdd1c8fed01613e2cc56d",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/thermal",
      "path": "engine/reference/sim/particles/substances/materials/wood/thermal.md",
      "source": "engine/sim/particles/substances/materials/wood/thermal.js",
      "import": "/engine/sim/particles/substances/materials/wood/thermal.js",
      "sourceHash": "1bde9448d52207715b57d46caf5670c690e8dd0829e8962f661437019b7073a9",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/substances/materials/wood/visual",
      "path": "engine/reference/sim/particles/substances/materials/wood/visual.md",
      "source": "engine/sim/particles/substances/materials/wood/visual.js",
      "import": "/engine/sim/particles/substances/materials/wood/visual.js",
      "sourceHash": "96f27fff1aa28b668e7526e26195df97818be209cc04671b1fd5e0957ea684c0",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/particles/thermal/index",
      "path": "engine/reference/sim/particles/thermal/index.md",
      "source": "engine/sim/particles/thermal/index.js",
      "import": "/engine/sim/particles/thermal/index.js",
      "sourceHash": "e5a61b0e7abcb90e1c8d58513a729d6561b590640b0b820ddd416f588e7c394e",
      "summary": "thermal/index.js — Re-exports for heat, phase transitions, and chemistry.",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/ConnectivityCompute",
      "path": "engine/reference/sim/physics/ConnectivityCompute.md",
      "source": "engine/sim/physics/ConnectivityCompute.js",
      "import": "/engine/sim/physics/ConnectivityCompute.js",
      "sourceHash": "014bfd2481478190885f6809df41d1d31f1b9cd85d0b56d146d2e4c4715b0a4a",
      "summary": "ConnectivityCompute.js - GPU-Accelerated Voxel Connectivity Analysis Problem: When voxels are destroyed, we need to detect which parts are still connected to anchors (ground) vs floating (should fall). CPU flood-fill is O(n) and too slow for real-time destruction. Solution: GPU wave propagation using ping-pong buffers. Each iteration, voxels adopt the minimum component ID of their neighbors. After log(n) iterations, all connected voxels share the same ID. Algorithm: 1. Initialize: Each solid voxel gets unique ID, anchors get ID=1 2. Propagate: Each voxel takes min(self, neighbors) if solid 3. Repeat until no changes (typically 10-20 iterations for 32³) 4. Result: All voxels connected to anchors have ID=1, others form islands Performance Target: <1ms for 32³ chunk (10-20 iterations)",
      "exports": [
        {
          "name": "ConnectivityCompute",
          "kind": "class",
          "signature": "class ConnectivityCompute",
          "summary": ""
        },
        {
          "name": "indexTo3D",
          "kind": "function",
          "signature": "indexTo3D(idx, size)",
          "summary": "Convert 1D index to 3D position"
        },
        {
          "name": "positionToIndex",
          "kind": "function",
          "signature": "positionToIndex(x, y, z, size)",
          "summary": "Convert 3D position to 1D index"
        },
        {
          "name": "MAX_ITERATIONS",
          "kind": "constant",
          "signature": "MAX_ITERATIONS",
          "summary": "Maximum iterations before forcing stop (prevents infinite loops)"
        },
        {
          "name": "WORKGROUP_SIZE",
          "kind": "constant",
          "signature": "WORKGROUP_SIZE",
          "summary": "Workgroup size for compute shaders"
        },
        {
          "name": "ANCHOR_COMPONENT_ID",
          "kind": "constant",
          "signature": "ANCHOR_COMPONENT_ID",
          "summary": "Component ID for anchored voxels (ground, supports)"
        },
        {
          "name": "EMPTY_COMPONENT_ID",
          "kind": "constant",
          "signature": "EMPTY_COMPONENT_ID",
          "summary": "Component ID for empty/air voxels"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/ConvexDecomposition",
      "path": "engine/reference/sim/physics/ConvexDecomposition.md",
      "source": "engine/sim/physics/ConvexDecomposition.js",
      "import": "/engine/sim/physics/ConvexDecomposition.js",
      "sourceHash": "ff54f4f794001bc44949754b575d5b6c82e4a9f09840f11243f0fa34476e3995",
      "summary": "ConvexDecomposition.js - V-HACD Style Convex Decomposition Implements Volumetric Hierarchical Approximate Convex Decomposition (V-HACD) for breaking concave meshes into convex pieces suitable for physics collision. This is essential for: - Complex mesh colliders (characters, vehicles, props) - Hollow objects (cups, bowls, tubes) - Concave terrain features The algorithm: 1. Voxelize the mesh at a given resolution 2. Recursively split voxel regions using optimal cutting planes 3. Compute convex hulls for each region 4. Simplify hulls to reduce vertex count",
      "exports": [
        {
          "name": "voxelizeMesh",
          "kind": "function",
          "signature": "voxelizeMesh(vertices, indices, resolution = 64)",
          "summary": "Voxelize a mesh into a 3D grid"
        },
        {
          "name": "decomposeMesh",
          "kind": "function",
          "signature": "decomposeMesh(vertices, indices, options = {})",
          "summary": "Decompose a mesh into convex hulls"
        },
        {
          "name": "hullsToCompoundCollider",
          "kind": "function",
          "signature": "hullsToCompoundCollider(hulls)",
          "summary": "Convert decomposition result to PhysX compound collider format"
        },
        {
          "name": "createDecomposedCollider",
          "kind": "function",
          "signature": "createDecomposedCollider(vertices, indices, options = {})",
          "summary": "High-level function: Decompose mesh and create PhysX collider"
        },
        {
          "name": "DECOMPOSITION_DEFAULTS",
          "kind": "constant",
          "signature": "DECOMPOSITION_DEFAULTS",
          "summary": "Default decomposition parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/DynamicMeshCollider",
      "path": "engine/reference/sim/physics/DynamicMeshCollider.md",
      "source": "engine/sim/physics/DynamicMeshCollider.js",
      "import": "/engine/sim/physics/DynamicMeshCollider.js",
      "sourceHash": "0e373c43c972d51ffbd7057d2b90a7345ab105af13c617a6764e9fcaa2a5151f",
      "summary": "",
      "exports": [
        {
          "name": "cookMeshColliderFromVertices",
          "kind": "function",
          "signature": "cookMeshColliderFromVertices(world, meshId, positions)",
          "summary": ""
        },
        {
          "name": "cookMeshColliderFromRenderMesh",
          "kind": "function",
          "signature": "cookMeshColliderFromRenderMesh(world, renderMesh)",
          "summary": ""
        },
        {
          "name": "getColliderConfigForMesh",
          "kind": "function",
          "signature": "getColliderConfigForMesh(meshId, halfExtents = [0.5, 0.5, 0.5])",
          "summary": ""
        },
        {
          "name": "createUniversalCollider",
          "kind": "function",
          "signature": "createUniversalCollider(world, meshType, geometryFn, halfExtents = [0.5, 0.5, 0.5], material = null, density = 1.0)",
          "summary": ""
        },
        {
          "name": "clearMeshColliderCache",
          "kind": "function",
          "signature": "clearMeshColliderCache()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/FragmentPhysics",
      "path": "engine/reference/sim/physics/FragmentPhysics.md",
      "source": "engine/sim/physics/FragmentPhysics.js",
      "import": "/engine/sim/physics/FragmentPhysics.js",
      "sourceHash": "4a20e15be985dbacf32972f3b0537a167bb5c51486430d2a47f98108f30bbc0d",
      "summary": "FragmentPhysics.js - Physics Integration for Mesh Fragments Handles physics simulation for fracture fragments using PhysX. Features: - Convex hull generation for rigid body collision - Mass distribution based on volume/material - Structural connection graph for progressive collapse - Fragment → particle conversion for small pieces",
      "exports": [
        {
          "name": "StructuralConnection",
          "kind": "class",
          "signature": "class StructuralConnection",
          "summary": "Represents a connection between two fragments"
        },
        {
          "name": "PhysicsFragment",
          "kind": "class",
          "signature": "class PhysicsFragment",
          "summary": "A mesh fragment with physics properties"
        },
        {
          "name": "FragmentManager",
          "kind": "class",
          "signature": "class FragmentManager",
          "summary": "Manages all physics fragments in the world"
        },
        {
          "name": "meshFragmentToIndexedMesh",
          "kind": "function",
          "signature": "meshFragmentToIndexedMesh(meshFragment, options = null)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/GPUArticulationSolver",
      "path": "engine/reference/sim/physics/GPUArticulationSolver.md",
      "source": "engine/sim/physics/GPUArticulationSolver.js",
      "import": "/engine/sim/physics/GPUArticulationSolver.js",
      "sourceHash": "72824a10a19a7714a9ddb7b374a86f492e716a4d3a390f9b3a20c8902318adfd",
      "summary": "GPUArticulationSolver.js - WebGPU Articulation Physics GPU-based articulation solver using vGPU compute shaders. Replaces PhysX WASM articulation with pure WebGPU implementation. Based on: - Stable Cosserat Rods (SIGGRAPH 2025) - Split position/rotation optimization - Direct PBD Solver for Stiff Rods (Bender et al. 2018) - XPBD compliance for stable stiffness Key Features: - Parallel Jacobi solver for position constraints - Quaternion orientation updates for twist - Graph coloring for dependency-free parallel solving - Warm starting for faster convergence",
      "exports": [
        {
          "name": "GPUArticulationSolver",
          "kind": "class",
          "signature": "class GPUArticulationSolver",
          "summary": ""
        },
        {
          "name": "getGPUArticulationSolver",
          "kind": "function",
          "signature": "async getGPUArticulationSolver(device)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/GPUClothSolver",
      "path": "engine/reference/sim/physics/GPUClothSolver.md",
      "source": "engine/sim/physics/GPUClothSolver.js",
      "import": "/engine/sim/physics/GPUClothSolver.js",
      "sourceHash": "40826ed9f13832484d4baa1d4e5a40d40f915c1ceceb2f36086902f526a0c63b",
      "summary": "GPU Cloth Physics Solver Position-based dynamics (PBD) solver running entirely on GPU Handles cloth, ropes, soft bodies with collision detection **Small Substeps Approach (Miles Macklin, NVIDIA 2019):** Uses 8 substeps with 1 iteration each for better stability than 1 substep with 8 iterations. This is especially important for stiff constraints like ropes and tightly-woven cloth. **OGC Contact Model (Chen et al., SIGGRAPH 2025):** Uses Offset Geometric Contact for penetration-free simulation. Barrier energy prevents penetration before it occurs, with orthogonal contact forces along face normals.",
      "exports": [
        {
          "name": "GPUClothSolver",
          "kind": "class",
          "signature": "class GPUClothSolver",
          "summary": ""
        },
        {
          "name": "GPU_CLOTH_DEFAULT_SUBSTEPS",
          "kind": "constant",
          "signature": "GPU_CLOTH_DEFAULT_SUBSTEPS",
          "summary": "Default substeps (small substeps approach)"
        },
        {
          "name": "GPU_CLOTH_DEFAULT_ITERATIONS",
          "kind": "constant",
          "signature": "GPU_CLOTH_DEFAULT_ITERATIONS",
          "summary": "Default iterations per substep"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/GPUSpatialHash",
      "path": "engine/reference/sim/physics/GPUSpatialHash.md",
      "source": "engine/sim/physics/GPUSpatialHash.js",
      "import": "/engine/sim/physics/GPUSpatialHash.js",
      "sourceHash": "4f52be6837ec6fc9c04d0a3d29d4ac58de278558721f8404bcfecb70c61e3c04",
      "summary": "CPU-based spatial hash grid for physics broad-phase",
      "exports": [
        {
          "name": "SpatialHashGrid",
          "kind": "class",
          "signature": "class SpatialHashGrid",
          "summary": "CPU-based spatial hash grid for physics broad-phase"
        },
        {
          "name": "GPUSpatialHashGrid",
          "kind": "class",
          "signature": "class GPUSpatialHashGrid",
          "summary": "GPU-accelerated spatial hash grid using WebGPU compute shaders"
        },
        {
          "name": "morton3D",
          "kind": "function",
          "signature": "morton3D(x, y, z)",
          "summary": "Calculate Morton code for 3D position"
        },
        {
          "name": "hashCell",
          "kind": "function",
          "signature": "hashCell(x, y, z, tableSize)",
          "summary": "Simple hash function for cell coordinates"
        },
        {
          "name": "createSpatialHashFromVGPU",
          "kind": "function",
          "signature": "async createSpatialHashFromVGPU(vgpu, options = {})",
          "summary": "Factory function to create GPUSpatialHashGrid from VirtualGPU"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/MLSMPMSolver",
      "path": "engine/reference/sim/physics/MLSMPMSolver.md",
      "source": "engine/sim/physics/MLSMPMSolver.js",
      "import": "/engine/sim/physics/MLSMPMSolver.js",
      "sourceHash": "bc98122123ecde5c1dec5e2d47501649a6b6eaf43091e4e6251af117b2ab051b",
      "summary": "MLSMPMSolver.js - Moving Least Squares Material Point Method Hybrid Lagrangian-Eulerian simulation for: - Soft body deformation (jelly, flesh) - Fracturing materials (snow, sand) - Fluid-solid interaction - Large deformation scenarios Algorithm Overview: 1. P2G (Particle to Grid): Transfer mass/momentum using quadratic B-splines 2. Grid Update: Apply forces, boundaries, compute velocities 3. G2P (Grid to Particle): Gather velocity, update deformation gradient 4. Advection: Move particles Key Features: - Fixed-point atomics for P2G scatter (WebGPU has no f32 atomics) - SoA (Structure of Arrays) for GPU coalescing - Multiple constitutive models (Neo-Hookean, Fixed Corotated, Snow) Performance Target: 100k particles < 10ms",
      "exports": [
        {
          "name": "MPMParticle",
          "kind": "class",
          "signature": "class MPMParticle",
          "summary": ""
        },
        {
          "name": "GridCell",
          "kind": "class",
          "signature": "class GridCell",
          "summary": ""
        },
        {
          "name": "MLSMPMSolver",
          "kind": "class",
          "signature": "class MLSMPMSolver",
          "summary": ""
        },
        {
          "name": "quadraticBSpline",
          "kind": "function",
          "signature": "quadraticBSpline(x)",
          "summary": "Quadratic B-spline weight"
        },
        {
          "name": "quadraticBSplineGrad",
          "kind": "function",
          "signature": "quadraticBSplineGrad(x)",
          "summary": "Quadratic B-spline derivative"
        },
        {
          "name": "computeWeight",
          "kind": "function",
          "signature": "computeWeight(px, py, pz, gx, gy, gz, cellSize = 1.0)",
          "summary": "Compute 3D weight and gradient for a particle-grid pair"
        },
        {
          "name": "CELL_SIZE",
          "kind": "constant",
          "signature": "CELL_SIZE",
          "summary": "Grid cell size (1 unit typical)"
        },
        {
          "name": "DEFAULT_GRID_SIZE",
          "kind": "constant",
          "signature": "DEFAULT_GRID_SIZE",
          "summary": "Default grid dimensions"
        },
        {
          "name": "SPLINE_RADIUS",
          "kind": "constant",
          "signature": "SPLINE_RADIUS",
          "summary": "Quadratic B-spline support radius (3 cells)"
        },
        {
          "name": "ConstitutiveModel",
          "kind": "constant",
          "signature": "ConstitutiveModel",
          "summary": "Constitutive model types"
        },
        {
          "name": "MaterialPresets",
          "kind": "constant",
          "signature": "MaterialPresets",
          "summary": "Material presets"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/MeshCutter",
      "path": "engine/reference/sim/physics/MeshCutter.md",
      "source": "engine/sim/physics/MeshCutter.js",
      "import": "/engine/sim/physics/MeshCutter.js",
      "sourceHash": "4e675a28f966c228005ecc56e127d4aa959806dc840fac8bce7792234f861064",
      "summary": "MeshCutter.js - Mesh Cutting and Fragment Generation System Cuts meshes along Voronoi cell boundaries to create realistic fragments. Uses plane-triangle intersection to split geometry. Features: - Triangle classification (front/back/spanning) - Edge-plane intersection computation - Cap geometry generation for cut faces - UV coordinate preservation - Convex hull generation for PhysX",
      "exports": [
        {
          "name": "Plane",
          "kind": "class",
          "signature": "class Plane",
          "summary": ""
        },
        {
          "name": "Vertex",
          "kind": "class",
          "signature": "class Vertex",
          "summary": ""
        },
        {
          "name": "Triangle",
          "kind": "class",
          "signature": "class Triangle",
          "summary": ""
        },
        {
          "name": "MeshFragment",
          "kind": "class",
          "signature": "class MeshFragment",
          "summary": ""
        },
        {
          "name": "MeshCutter",
          "kind": "class",
          "signature": "class MeshCutter",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/MeshDecimation",
      "path": "engine/reference/sim/physics/MeshDecimation.md",
      "source": "engine/sim/physics/MeshDecimation.js",
      "import": "/engine/sim/physics/MeshDecimation.js",
      "sourceHash": "e5e606d35b579c254a29b39f96bffe783f28e9bff6a191ebb1eaa88451c6681a",
      "summary": "MeshDecimation.js - Mesh Simplification for Debris Reduces triangle count for debris meshes to maintain performance. Two algorithms available: 1. Grid-Based (Fast): O(n) - Good for realtime debris - Snap vertices to grid - Merge coincident vertices - Remove degenerate triangles 2. QEM (Quality): O(n log n) - Better for LOD generation - Quadric Error Metrics - Edge collapse with priority queue - Preserves shape better Performance Targets: - Grid: 10k verts → 500 verts in <1ms - QEM: 10k verts → 500 verts in <50ms",
      "exports": [
        {
          "name": "Vertex",
          "kind": "class",
          "signature": "class Vertex",
          "summary": ""
        },
        {
          "name": "Triangle",
          "kind": "class",
          "signature": "class Triangle",
          "summary": ""
        },
        {
          "name": "Quadric",
          "kind": "class",
          "signature": "class Quadric",
          "summary": ""
        },
        {
          "name": "Edge",
          "kind": "class",
          "signature": "class Edge",
          "summary": ""
        },
        {
          "name": "MeshDecimator",
          "kind": "class",
          "signature": "class MeshDecimator",
          "summary": ""
        },
        {
          "name": "decimateGrid",
          "kind": "function",
          "signature": "decimateGrid(vertices, indices, gridSize = DEFAULT_GRID_SIZE)",
          "summary": "Fast grid-based mesh decimation"
        },
        {
          "name": "decimateQEM",
          "kind": "function",
          "signature": "decimateQEM(vertices, indices, targetRatio = DEFAULT_TARGET_RATIO, maxIterations = Infinity, options = null)",
          "summary": "QEM-based mesh decimation"
        },
        {
          "name": "DEFAULT_GRID_SIZE",
          "kind": "constant",
          "signature": "DEFAULT_GRID_SIZE",
          "summary": "Default grid cell size for grid-based decimation"
        },
        {
          "name": "DEFAULT_TARGET_RATIO",
          "kind": "constant",
          "signature": "DEFAULT_TARGET_RATIO",
          "summary": "Default target reduction ratio"
        },
        {
          "name": "MAX_QEM_ITERATIONS",
          "kind": "constant",
          "signature": "MAX_QEM_ITERATIONS",
          "summary": "Maximum QEM iterations per frame (for realtime)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/MeshParticles",
      "path": "engine/reference/sim/physics/MeshParticles.md",
      "source": "engine/sim/physics/MeshParticles.js",
      "import": "/engine/sim/physics/MeshParticles.js",
      "sourceHash": "bd29ab33642fda207238bb165b4bfa168468c2b280e2cc2d451cafbe42ba88b8",
      "summary": "Single debris chunk with mesh, physics, and rendering state",
      "exports": [
        {
          "name": "DebrisParticle",
          "kind": "class",
          "signature": "class DebrisParticle",
          "summary": "Single debris chunk with mesh, physics, and rendering state"
        },
        {
          "name": "MeshParticleSystem",
          "kind": "class",
          "signature": "class MeshParticleSystem",
          "summary": ""
        },
        {
          "name": "MAX_DEBRIS_PARTICLES",
          "kind": "constant",
          "signature": "MAX_DEBRIS_PARTICLES",
          "summary": "Maximum active debris particles"
        },
        {
          "name": "LOD_DISTANCES",
          "kind": "constant",
          "signature": "LOD_DISTANCES",
          "summary": "LOD distance thresholds"
        },
        {
          "name": "LOD_RATIOS",
          "kind": "constant",
          "signature": "LOD_RATIOS",
          "summary": "LOD decimation ratios"
        },
        {
          "name": "MIN_CLUSTER_SIZE",
          "kind": "constant",
          "signature": "MIN_CLUSTER_SIZE",
          "summary": "Minimum voxels to create debris (smaller clusters become particles)"
        },
        {
          "name": "MAX_CLUSTER_SIZE",
          "kind": "constant",
          "signature": "MAX_CLUSTER_SIZE",
          "summary": "Maximum voxels per debris chunk"
        },
        {
          "name": "DEFAULT_LIFETIME",
          "kind": "constant",
          "signature": "DEFAULT_LIFETIME",
          "summary": "Debris lifetime in seconds"
        },
        {
          "name": "DebrisState",
          "kind": "constant",
          "signature": "DebrisState",
          "summary": "Debris states"
        },
        {
          "name": "MeshParticles",
          "kind": "re-export",
          "signature": "MeshParticles",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/OGCContact",
      "path": "engine/reference/sim/physics/OGCContact.md",
      "source": "engine/sim/physics/OGCContact.js",
      "import": "/engine/sim/physics/OGCContact.js",
      "sourceHash": "199843b33037aa766ffb4d8750ad2a433b53ef85c75b079f15c97a3b9255fcc8",
      "summary": "OGCContact.js - Offset Geometric Contact Model Implementation of the SIGGRAPH 2025 paper: \"Offset Geometric Contact for Real-Time Simulation\" Chen et al., 2025 Key features: - Guaranteed penetration-free simulation - Orthogonal contact forces (along face normals, not radial) - Large contact radius support (2-5mm without artifacts) - No CCD required - uses conservative displacement bounds - GPU-efficient parallel local operations The offset geometry approach inflates primitives by a contact radius, computes distance to the offset surface, and applies smooth barrier energy that activates before penetration occurs.",
      "exports": [
        {
          "name": "OGCContactManager",
          "kind": "class",
          "signature": "class OGCContactManager",
          "summary": "Manages OGC contacts for a simulation"
        },
        {
          "name": "barrierEnergy",
          "kind": "function",
          "signature": "barrierEnergy(d, r)",
          "summary": "OGC Barrier energy function g(d) = d²(2r - d)² Smooth C1 continuous, zero at d=0 and d=2r Maximum at d=r"
        },
        {
          "name": "barrierForce",
          "kind": "function",
          "signature": "barrierForce(d, r)",
          "summary": "Derivative of barrier energy: g'(d) = 2d(2r-d)(2r-2d) Used for force computation"
        },
        {
          "name": "normalizedBarrierEnergy",
          "kind": "function",
          "signature": "normalizedBarrierEnergy(d, r)",
          "summary": "Normalized barrier energy for stability Scales to [0, 1] range with maximum at d=r"
        },
        {
          "name": "conservativeDisplacementBound",
          "kind": "function",
          "signature": "conservativeDisplacementBound(currentDistance, contactRadius)",
          "summary": "Compute conservative displacement bound for a vertex This is the maximum safe movement before barrier check is needed"
        },
        {
          "name": "distanceToOffsetSphere",
          "kind": "function",
          "signature": "distanceToOffsetSphere(p, center, radius, r)",
          "summary": "Distance from point to offset sphere (sphere with radius inflated by r)"
        },
        {
          "name": "distanceToOffsetPlane",
          "kind": "function",
          "signature": "distanceToOffsetPlane(p, planePoint, planeNormal, r)",
          "summary": "Distance from point to offset plane (plane pushed by r along normal)"
        },
        {
          "name": "distanceToOffsetCapsule",
          "kind": "function",
          "signature": "distanceToOffsetCapsule(p, a, b, radius, r)",
          "summary": "Distance from point to offset capsule"
        },
        {
          "name": "distanceToOffsetBox",
          "kind": "function",
          "signature": "distanceToOffsetBox(p, center, halfExtents, rotation, r)",
          "summary": "Distance from point to offset box (OBB with offset shell) Handles rotated boxes by transforming into local space."
        },
        {
          "name": "evaluateAnalyticSDF",
          "kind": "function",
          "signature": "evaluateAnalyticSDF(shape, params, lx, ly, lz)",
          "summary": "Evaluate an analytic SDF in local space (no transform — caller handles that)."
        },
        {
          "name": "distanceToOffsetEdge",
          "kind": "function",
          "signature": "distanceToOffsetEdge(p, a, b, r)",
          "summary": "Distance from point to offset edge (line segment with offset radius)"
        },
        {
          "name": "distanceToOffsetTriangle",
          "kind": "function",
          "signature": "distanceToOffsetTriangle(p, v0, v1, v2, r)",
          "summary": "Distance from point to offset triangle (triangle with offset shell) Uses the face normal for orthogonal contact"
        },
        {
          "name": "applyOGCForce",
          "kind": "function",
          "signature": "applyOGCForce(particle, distance, normal, contactRadius, stiffness, dt)",
          "summary": "Apply OGC barrier force to a particle"
        },
        {
          "name": "applyOGCPositionCorrection",
          "kind": "function",
          "signature": "applyOGCPositionCorrection(particle, distance, normal, contactRadius, compliance, dt)",
          "summary": "Apply OGC position correction (for PBD-style solvers)"
        },
        {
          "name": "DEFAULT_CONTACT_RADIUS",
          "kind": "constant",
          "signature": "DEFAULT_CONTACT_RADIUS",
          "summary": "Default contact radius (meters) - paper recommends 2-5mm for cloth"
        },
        {
          "name": "BARRIER_ACTIVATION_RATIO",
          "kind": "constant",
          "signature": "BARRIER_ACTIVATION_RATIO",
          "summary": "Barrier energy activation distance (multiple of contact radius)"
        },
        {
          "name": "MIN_DISTANCE",
          "kind": "constant",
          "signature": "MIN_DISTANCE",
          "summary": "Minimum distance to prevent numerical issues"
        },
        {
          "name": "FIXED_SCALE",
          "kind": "constant",
          "signature": "FIXED_SCALE",
          "summary": "Fixed-point scale for GPU atomics"
        },
        {
          "name": "OGC_BARRIER_WGSL",
          "kind": "constant",
          "signature": "OGC_BARRIER_WGSL",
          "summary": "WGSL snippet for OGC barrier functions"
        },
        {
          "name": "OGC_DISTANCE_WGSL",
          "kind": "constant",
          "signature": "OGC_DISTANCE_WGSL",
          "summary": "WGSL snippet for offset geometry distance functions"
        },
        {
          "name": "OGC_SOLVE_WGSL",
          "kind": "constant",
          "signature": "OGC_SOLVE_WGSL",
          "summary": "WGSL snippet for OGC contact solving"
        },
        {
          "name": "OGC_WGSL_MODULE",
          "kind": "constant",
          "signature": "OGC_WGSL_MODULE",
          "summary": "Complete WGSL module for OGC"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PBDRagdoll",
      "path": "engine/reference/sim/physics/PBDRagdoll.md",
      "source": "engine/sim/physics/PBDRagdoll.js",
      "import": "/engine/sim/physics/PBDRagdoll.js",
      "sourceHash": "a783c6854f3567842a6da30a2e2f64ad31c43b6676b6aca6043a311cb6681c2a",
      "summary": "Bone identifiers",
      "exports": [
        {
          "name": "CapsuleCollider",
          "kind": "class",
          "signature": "class CapsuleCollider",
          "summary": ""
        },
        {
          "name": "RagdollBoneData",
          "kind": "class",
          "signature": "class RagdollBoneData",
          "summary": ""
        },
        {
          "name": "PBDRagdoll",
          "kind": "class",
          "signature": "class PBDRagdoll",
          "summary": ""
        },
        {
          "name": "RagdollBone",
          "kind": "constant",
          "signature": "RagdollBone",
          "summary": "Bone identifiers"
        },
        {
          "name": "JointType",
          "kind": "constant",
          "signature": "JointType",
          "summary": "Joint types"
        },
        {
          "name": "RagdollState",
          "kind": "constant",
          "signature": "RagdollState",
          "summary": "Ragdoll states"
        },
        {
          "name": "DEFAULT_MEASUREMENTS",
          "kind": "constant",
          "signature": "DEFAULT_MEASUREMENTS",
          "summary": "Default humanoid measurements (meters)"
        },
        {
          "name": "JOINT_LIMITS",
          "kind": "constant",
          "signature": "JOINT_LIMITS",
          "summary": "Joint angle limits (radians)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PBDSolver",
      "path": "engine/reference/sim/physics/PBDSolver.md",
      "source": "engine/sim/physics/PBDSolver.js",
      "import": "/engine/sim/physics/PBDSolver.js",
      "sourceHash": "8bb2326d5ce269ffaf826e1fc6df41cc52d23d0ccf6af07d004ee677a9717d0c",
      "summary": "PBDSolver.js - Position-Based Dynamics Solver Implements XPBD (Extended Position-Based Dynamics) for: - Rope/cable physics (line segments) - Soft body deformation - Ragdoll skeletons - Cloth simulation Key Algorithms: - Verlet integration (position-based) - Gauss-Seidel constraint projection - Graph coloring for GPU parallelization - XPBD compliance for stable stiffness **Small Substeps Approach (Miles Macklin, NVIDIA 2019):** \"n small timesteps with 1 iteration each > 1 large timestep with n iterations\" This provides better stability for stiff systems (ropes, cloth). We use 8 substeps with 1 iteration each by default (equivalent to but more stable than 1 substep with 8 iterations). **OGC Contact Model (Chen et al., SIGGRAPH 2025):** Uses Offset Geometric Contact for penetration-free collision. Barrier energy prevents penetration before it occurs. Performance Targets: - 1000 particles + 3000 constraints: <5ms - 8 substeps, 1 iteration per substep (small substeps approach)",
      "exports": [
        {
          "name": "PBDParticle",
          "kind": "class",
          "signature": "class PBDParticle",
          "summary": "PBD Particle with position, velocity, and inverse mass"
        },
        {
          "name": "PBDConstraint",
          "kind": "class",
          "signature": "class PBDConstraint",
          "summary": "Base constraint class"
        },
        {
          "name": "DistanceConstraint",
          "kind": "class",
          "signature": "class DistanceConstraint extends PBDConstraint",
          "summary": "Distance constraint - maintains rest length between two particles"
        },
        {
          "name": "AngleConstraint",
          "kind": "class",
          "signature": "class AngleConstraint extends PBDConstraint",
          "summary": "Angle constraint - limits angle between three particles"
        },
        {
          "name": "AttachmentConstraint",
          "kind": "class",
          "signature": "class AttachmentConstraint extends PBDConstraint",
          "summary": "Attachment constraint - pins particle to world position Simple and stable: directly moves particle toward target"
        },
        {
          "name": "BendingConstraint",
          "kind": "class",
          "signature": "class BendingConstraint extends PBDConstraint",
          "summary": "Bending constraint - maintains angle between 3 particles - UNTESTED Used for hair, grass, stiff ropes"
        },
        {
          "name": "SpringConstraint",
          "kind": "class",
          "signature": "class SpringConstraint extends PBDConstraint",
          "summary": "Spring constraint - UNTESTED Unlike distance constraint, springs can compress AND extend (Hooke's law)"
        },
        {
          "name": "CohesionConstraint",
          "kind": "class",
          "signature": "class CohesionConstraint extends PBDConstraint",
          "summary": "Cohesion constraint - UNTESTED Particles attract each other within a radius (like water droplets)"
        },
        {
          "name": "LongRangeAttachmentConstraint",
          "kind": "class",
          "signature": "class LongRangeAttachmentConstraint extends PBDConstraint",
          "summary": "Long Range Attachment (LRA) Constraint Creates distance constraints from fixed/anchor particles to all particles in a rope. This dramatically improves convergence for long ropes (100+ segments). Reference: Kim et al. 2012 \"Long Range Attachments - A Method to Simulate Inextensible Clothing in Computer Games\" Reference: Müller 2017 \"Long Range Constraints for Rigid Body Simulations\" Key idea: Instead of only having adjacent distance constraints, we create constraints from the anchor to every Nth particle along the rope. This allows the solver to propagate length corrections globally in fewer iterations."
        },
        {
          "name": "VolumeConstraint",
          "kind": "class",
          "signature": "class VolumeConstraint extends PBDConstraint",
          "summary": "Volume constraint - preserves volume of a tetrahedron (4 particles) C = V - V0 = 0, where V = (1/6) * (p1-p0) · ((p2-p0) × (p3-p0))"
        },
        {
          "name": "ShapeMatchingConstraint",
          "kind": "class",
          "signature": "class ShapeMatchingConstraint extends PBDConstraint",
          "summary": "Shape Matching constraint - restores N particles to their original shape Based on \"Meshless Deformations Based on Shape Matching\" (Müller 2005)"
        },
        {
          "name": "PressureConstraint",
          "kind": "class",
          "signature": "class PressureConstraint extends PBDConstraint",
          "summary": "Pressure constraint - internal pressure for closed meshes (balloons) Works with N particles forming a closed surface"
        },
        {
          "name": "DensityConstraint",
          "kind": "class",
          "signature": "class DensityConstraint extends PBDConstraint",
          "summary": "SPH Density constraint - maintains constant density (fluids) Based on \"Position Based Fluids\" (Macklin & Müller 2013)"
        },
        {
          "name": "PBDSolver",
          "kind": "class",
          "signature": "class PBDSolver",
          "summary": ""
        },
        {
          "name": "colorConstraints",
          "kind": "function",
          "signature": "colorConstraints(constraints, particles)",
          "summary": "Greedy graph coloring for constraint parallelization Constraints with same color can be solved in parallel"
        },
        {
          "name": "groupByColor",
          "kind": "function",
          "signature": "groupByColor(constraints, numColors)",
          "summary": "Group constraints by color for batched dispatch"
        },
        {
          "name": "DEFAULT_ITERATIONS",
          "kind": "constant",
          "signature": "DEFAULT_ITERATIONS",
          "summary": "Default solver iterations per substep (small substeps: use 1-2)"
        },
        {
          "name": "DEFAULT_SUBSTEPS",
          "kind": "constant",
          "signature": "DEFAULT_SUBSTEPS",
          "summary": "Default substeps per frame (small substeps: use 8-16 for stability)"
        },
        {
          "name": "ConstraintType",
          "kind": "constant",
          "signature": "ConstraintType",
          "summary": "Constraint types"
        },
        {
          "name": "ParticleFlags",
          "kind": "constant",
          "signature": "ParticleFlags",
          "summary": "Particle flags"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysXArticulations",
      "path": "engine/reference/sim/physics/PhysXArticulations.md",
      "source": "engine/sim/physics/PhysXArticulations.js",
      "import": "/engine/sim/physics/PhysXArticulations.js",
      "sourceHash": "c1d1eebe252d20de4ab5c1a7eabe79500968c31deb639cf1c5364306a0ca66d7",
      "summary": "PhysXArticulations.js - PhysX Articulation Support Articulations are optimized for chains of connected bodies like: - Ropes and cables - Ragdolls - Robotic arms - Vehicles (suspensions) Per NVIDIA PhysX Best Practices: \"Articulations are much better at simulating articulated objects. They can be used to model better ropes, bridges, vehicles, or ragdolls out-of-the-box, without the need for workarounds.\" Articulations provide: - Better stability than joint chains - Reduced jitter - More accurate constraint solving - Built-in tendon support for muscle simulation",
      "exports": [
        {
          "name": "createArticulation",
          "kind": "function",
          "signature": "createArticulation(world, options = {})",
          "summary": "Create a reduced coordinate articulation (PhysX 5.x)"
        },
        {
          "name": "createRootLink",
          "kind": "function",
          "signature": "createRootLink(articulation, options = {})",
          "summary": "Create the root link of an articulation"
        },
        {
          "name": "createChildLink",
          "kind": "function",
          "signature": "createChildLink(articulation, parentLink, options = {})",
          "summary": "Create a child link attached to a parent link"
        },
        {
          "name": "addArticulationToScene",
          "kind": "function",
          "signature": "addArticulationToScene(articulation)",
          "summary": "Add articulation to scene (must be called after all links are created)"
        },
        {
          "name": "createRope",
          "kind": "function",
          "signature": "createRope(world, startPos, endPos, segments = 10, options = {})",
          "summary": "Create a rope using articulations Per NVIDIA: \"Use spheres instead of capsules. A rope made of spheres will be more stable.\""
        },
        {
          "name": "getArticulationLinkTransforms",
          "kind": "function",
          "signature": "getArticulationLinkTransforms(articulation)",
          "summary": "Update articulation link positions from simulation"
        },
        {
          "name": "destroyArticulation",
          "kind": "function",
          "signature": "destroyArticulation(articulation)",
          "summary": "Destroy an articulation and clean up resources"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysXJoints",
      "path": "engine/reference/sim/physics/PhysXJoints.md",
      "source": "engine/sim/physics/PhysXJoints.js",
      "import": "/engine/sim/physics/PhysXJoints.js",
      "sourceHash": "fd2f78a431a29ae21a9d44a6d8b5125fd2f19ec8710bab0e897fa0a96eacdca2",
      "summary": "PhysX Joint Creation API Exposes D6, revolute, distance, and spherical joints for articulated bodies",
      "exports": [
        {
          "name": "getPhysXJointCapabilities",
          "kind": "function",
          "signature": "getPhysXJointCapabilities(world)",
          "summary": "PhysX Joint Creation API Exposes D6, revolute, distance, and spherical joints for articulated bodies"
        },
        {
          "name": "createD6Joint",
          "kind": "function",
          "signature": "createD6Joint(world, bodyA, bodyB, options = {})",
          "summary": "Create a D6 joint (6 degrees of freedom - most flexible joint type)"
        },
        {
          "name": "createRevoluteJoint",
          "kind": "function",
          "signature": "createRevoluteJoint(world, bodyA, bodyB, options = {})",
          "summary": "Create a revolute joint (hinge joint - 1 rotational DOF)"
        },
        {
          "name": "createSphericalJoint",
          "kind": "function",
          "signature": "createSphericalJoint(world, bodyA, bodyB, options = {})",
          "summary": "Create a spherical joint (ball-and-socket - 3 rotational DOF)"
        },
        {
          "name": "createDistanceJoint",
          "kind": "function",
          "signature": "createDistanceJoint(world, bodyA, bodyB, options = {})",
          "summary": "Create a distance joint (maintains distance between two points)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysXMeshCooking",
      "path": "engine/reference/sim/physics/PhysXMeshCooking.md",
      "source": "engine/sim/physics/PhysXMeshCooking.js",
      "import": "/engine/sim/physics/PhysXMeshCooking.js",
      "sourceHash": "9b1c76625fc827d59569aca717623031feca49a4f8575885956f6b0f26cc05bb",
      "summary": "Local register helpers (avoid circular import with PhysXPhysicsWorld)",
      "exports": [
        {
          "name": "cookAndRegisterConvexMeshForWorld",
          "kind": "function",
          "signature": "cookAndRegisterConvexMeshForWorld(world, meshId, positions)",
          "summary": ""
        },
        {
          "name": "cookAndRegisterTriangleMeshForWorld",
          "kind": "function",
          "signature": "cookAndRegisterTriangleMeshForWorld(world, meshId, positions, indices)",
          "summary": ""
        },
        {
          "name": "PhysXMeshCooking",
          "kind": "re-export",
          "signature": "PhysXMeshCooking",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysXModule",
      "path": "engine/reference/sim/physics/PhysXModule.md",
      "source": "engine/sim/physics/PhysXModule.js",
      "import": "/engine/sim/physics/PhysXModule.js",
      "sourceHash": "743c7782aefa327a5c64a7ca35fbf3d1b4d22bbdb7ecf71ddb1e0e8bb6fc779d",
      "summary": "",
      "exports": [
        {
          "name": "ensurePhysXModule",
          "kind": "function",
          "signature": "ensurePhysXModule()",
          "summary": ""
        },
        {
          "name": "PhysXModule",
          "kind": "re-export",
          "signature": "PhysXModule",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysXPhysicsWorld",
      "path": "engine/reference/sim/physics/PhysXPhysicsWorld.md",
      "source": "engine/sim/physics/PhysXPhysicsWorld.js",
      "import": "/engine/sim/physics/PhysXPhysicsWorld.js",
      "sourceHash": "9b48f0c14b4d5fa2b3e4941475c68c2e62a39a00cb2d433ed2dbdcfc8e457703",
      "summary": "Move a kinematic body to a new pose (PhysX setKinematicTarget — the solver sweeps it there over the next step, pushing dynamic bodies out of the way instead of teleporting through them). Used for script-driven obstacles (e.g. AI traffic cars that dynamic bodies must collide with).",
      "exports": [
        {
          "name": "createPhysicsWorld",
          "kind": "function",
          "signature": "createPhysicsWorld(options = {})",
          "summary": ""
        },
        {
          "name": "registerConvexMesh",
          "kind": "function",
          "signature": "registerConvexMesh(world, meshId, pxConvexMesh)",
          "summary": ""
        },
        {
          "name": "registerTriangleMesh",
          "kind": "function",
          "signature": "registerTriangleMesh(world, meshId, pxTriangleMesh)",
          "summary": ""
        },
        {
          "name": "destroyPhysicsWorld",
          "kind": "function",
          "signature": "destroyPhysicsWorld(world)",
          "summary": ""
        },
        {
          "name": "createBody",
          "kind": "function",
          "signature": "createBody(world, desc)",
          "summary": ""
        },
        {
          "name": "getBody",
          "kind": "function",
          "signature": "getBody(world, handle)",
          "summary": ""
        },
        {
          "name": "setBodyKinematic",
          "kind": "function",
          "signature": "setBodyKinematic(world, handle, enabled)",
          "summary": ""
        },
        {
          "name": "setKinematicPose",
          "kind": "function",
          "signature": "setKinematicPose(world, handle, position, rotation = [0, 0, 0, 1])",
          "summary": "Move a kinematic body to a new pose (PhysX setKinematicTarget — the solver sweeps it there over the next step, pushing dynamic bodies out of the way instead of teleporting through them). Used for script-driven obstacles (e.g. AI traffic cars that dynamic bodies must collide with)."
        },
        {
          "name": "removeBody",
          "kind": "function",
          "signature": "removeBody(world, handle)",
          "summary": ""
        },
        {
          "name": "updateBodyFilterData",
          "kind": "function",
          "signature": "updateBodyFilterData(world, handle, entityFlags)",
          "summary": "Update a body's collision filter data based on EntityFlags Call this when EntityFlags.collisionLayer, collisionMask, or collisionMode changes"
        },
        {
          "name": "updateWorldMaterial",
          "kind": "function",
          "signature": "updateWorldMaterial(world, materialOptions)",
          "summary": ""
        },
        {
          "name": "raycastWorld",
          "kind": "function",
          "signature": "raycastWorld(world, origin, direction, maxDistance)",
          "summary": ""
        },
        {
          "name": "stepPhysicsWorld",
          "kind": "function",
          "signature": "stepPhysicsWorld(world, deltaTime)",
          "summary": ""
        },
        {
          "name": "PhysXPhysicsWorld",
          "kind": "re-export",
          "signature": "PhysXPhysicsWorld",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysXVehicle",
      "path": "engine/reference/sim/physics/PhysXVehicle.md",
      "source": "engine/sim/physics/PhysXVehicle.js",
      "import": "/engine/sim/physics/PhysXVehicle.js",
      "sourceHash": "db304e9273d382b73f92569c0447060a2f5b6e5509ac97f4b61f238d103c5ec5",
      "summary": "Compatibility entry point. Implementation is split by vehicle subsystem in ./vehicle so existing engine and playground import paths remain stable.",
      "exports": [
        {
          "name": "createPhysXVehicle",
          "kind": "re-export",
          "signature": "createPhysXVehicle",
          "summary": ""
        },
        {
          "name": "isPhysXVehicleSupported",
          "kind": "re-export",
          "signature": "isPhysXVehicleSupported",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysicalMaterialPresets",
      "path": "engine/reference/sim/physics/PhysicalMaterialPresets.md",
      "source": "engine/sim/physics/PhysicalMaterialPresets.js",
      "import": "/engine/sim/physics/PhysicalMaterialPresets.js",
      "sourceHash": "0b43b134179af6b9c25e7f5e17a2f71c3842944aeef9c16753e81471c0f5a7ec",
      "summary": "PhysicalMaterialPresets.js — Real-world material property presets Each preset defines how a shape behaves physically: density for mass, elasticity for springback, hardness for deformation resistance, brittleness for shatter vs bend, and fracture configuration. Used by the PhysicalMaterial ECS component and EditorPhysicalMaterial bridge.",
      "exports": [
        {
          "name": "getMaterialPreset",
          "kind": "function",
          "signature": "getMaterialPreset(key)",
          "summary": "Get a full material preset by key (returns a shallow copy)."
        },
        {
          "name": "createPhysicalMaterial",
          "kind": "function",
          "signature": "createPhysicalMaterial(presetKey, overrides = {})",
          "summary": "Create a PhysicalMaterial component value from a preset key, with optional property overrides."
        },
        {
          "name": "computeMassFromMaterial",
          "kind": "function",
          "signature": "computeMassFromMaterial(material, halfExtents, colliderShape)",
          "summary": "Compute mass from material density and collider volume."
        },
        {
          "name": "MATERIAL_PRESETS",
          "kind": "constant",
          "signature": "MATERIAL_PRESETS",
          "summary": ""
        },
        {
          "name": "MATERIAL_KEYS",
          "kind": "constant",
          "signature": "MATERIAL_KEYS",
          "summary": "All preset keys."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysicsSchema",
      "path": "engine/reference/sim/physics/PhysicsSchema.md",
      "source": "engine/sim/physics/PhysicsSchema.js",
      "import": "/engine/sim/physics/PhysicsSchema.js",
      "sourceHash": "7b2c061487e7c773c23bf55bb49605489b3c2576a2bacda2c5b66f03e08fc348",
      "summary": "PhysicsSchema.js - Unified JSON Schema for Physics System Defines consistent data structures for: - Body types (dynamic, kinematic, static) - Collider shapes (box, sphere, capsule, mesh) - Joint types (D6, revolute, spherical, distance) - Collision layers and masks - Material properties (friction, restitution) All physics code should use these schemas for consistency.",
      "exports": [
        {
          "name": "getSimModeId",
          "kind": "function",
          "signature": "getSimModeId(modeName)",
          "summary": "Get simulation mode ID from name"
        },
        {
          "name": "getSimModeName",
          "kind": "function",
          "signature": "getSimModeName(modeId)",
          "summary": "Get simulation mode name from ID"
        },
        {
          "name": "getColliderShapeId",
          "kind": "function",
          "signature": "getColliderShapeId(shapeName)",
          "summary": "Get collider shape ID from name"
        },
        {
          "name": "getColliderShapeName",
          "kind": "function",
          "signature": "getColliderShapeName(shapeId)",
          "summary": "Get collider shape name from ID"
        },
        {
          "name": "getCollisionMask",
          "kind": "function",
          "signature": "getCollisionMask(...layerNames)",
          "summary": "Get collision layer mask from layer names"
        },
        {
          "name": "layersCollide",
          "kind": "function",
          "signature": "layersCollide(maskA, maskB)",
          "summary": "Check if two layer masks collide"
        },
        {
          "name": "validatePhysicsBody",
          "kind": "function",
          "signature": "validatePhysicsBody(config)",
          "summary": "Validate physics body configuration"
        },
        {
          "name": "validateCollider",
          "kind": "function",
          "signature": "validateCollider(config)",
          "summary": "Validate collider configuration"
        },
        {
          "name": "validatePhysicsMaterial",
          "kind": "function",
          "signature": "validatePhysicsMaterial(config)",
          "summary": "Validate physics material"
        },
        {
          "name": "createDefaultPhysicsBody",
          "kind": "function",
          "signature": "createDefaultPhysicsBody()",
          "summary": "Create default physics body config"
        },
        {
          "name": "createDefaultCollider",
          "kind": "function",
          "signature": "createDefaultCollider(shape = \"box\")",
          "summary": "Create default collider config"
        },
        {
          "name": "createDefaultJoint",
          "kind": "function",
          "signature": "createDefaultJoint(type = \"fixed\")",
          "summary": "Create default joint config"
        },
        {
          "name": "createDefaultPhysicsWorld",
          "kind": "function",
          "signature": "createDefaultPhysicsWorld()",
          "summary": "Create default physics world config"
        },
        {
          "name": "getPhysicsMaterial",
          "kind": "function",
          "signature": "getPhysicsMaterial(name)",
          "summary": "Get physics material by name"
        },
        {
          "name": "SIM_MODES",
          "kind": "constant",
          "signature": "SIM_MODES",
          "summary": "Physics simulation modes"
        },
        {
          "name": "COLLIDER_SHAPES",
          "kind": "constant",
          "signature": "COLLIDER_SHAPES",
          "summary": "Collider shape types"
        },
        {
          "name": "JOINT_TYPES",
          "kind": "constant",
          "signature": "JOINT_TYPES",
          "summary": "Joint types for articulated bodies"
        },
        {
          "name": "D6_MOTION",
          "kind": "constant",
          "signature": "D6_MOTION",
          "summary": "D6 joint axis motion types"
        },
        {
          "name": "D6_AXES",
          "kind": "constant",
          "signature": "D6_AXES",
          "summary": "D6 joint axes"
        },
        {
          "name": "D6_DRIVES",
          "kind": "constant",
          "signature": "D6_DRIVES",
          "summary": ""
        },
        {
          "name": "COLLISION_LAYERS",
          "kind": "constant",
          "signature": "COLLISION_LAYERS",
          "summary": "Collision layer definitions (bitmask)"
        },
        {
          "name": "PHYSICS_MATERIAL_SCHEMA",
          "kind": "constant",
          "signature": "PHYSICS_MATERIAL_SCHEMA",
          "summary": "Physics material schema **Compliant Contacts (PhysX 5.1+):** Set restitution to a NEGATIVE value to enable spring-damper contact model. This provides more stable collision behavior for complex contact configurations. - restitution = -springStiffness (negative enables compliant mode) - damping = damping ratio for the spring - compliantAcceleration = true to use acceleration spring (mass-independent)"
        },
        {
          "name": "PHYSICS_MATERIALS",
          "kind": "constant",
          "signature": "PHYSICS_MATERIALS",
          "summary": "Preset physics materials Note: Negative restitution enables compliant (spring-damper) contacts"
        },
        {
          "name": "PHYSICS_BODY_SCHEMA",
          "kind": "constant",
          "signature": "PHYSICS_BODY_SCHEMA",
          "summary": "Physics body schema"
        },
        {
          "name": "COLLIDER_SCHEMA",
          "kind": "constant",
          "signature": "COLLIDER_SCHEMA",
          "summary": "Collider schema"
        },
        {
          "name": "JOINT_SCHEMA",
          "kind": "constant",
          "signature": "JOINT_SCHEMA",
          "summary": "Joint schema"
        },
        {
          "name": "PHYSICS_WORLD_SCHEMA",
          "kind": "constant",
          "signature": "PHYSICS_WORLD_SCHEMA",
          "summary": "Physics world configuration"
        },
        {
          "name": "STANDARD_COLLIDER_MESHES",
          "kind": "constant",
          "signature": "STANDARD_COLLIDER_MESHES",
          "summary": "Standard convex collider mesh IDs"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/PhysicsWorld",
      "path": "engine/reference/sim/physics/PhysicsWorld.md",
      "source": "engine/sim/physics/PhysicsWorld.js",
      "import": "/engine/sim/physics/PhysicsWorld.js",
      "sourceHash": "baca91fd7841cc4105753bb1a43212d8df35cf1ca9e97f93c3f062c939fd28f8",
      "summary": "",
      "exports": [
        {
          "name": "createPhysicsWorld",
          "kind": "function",
          "signature": "createPhysicsWorld(options = {})",
          "summary": ""
        },
        {
          "name": "destroyPhysicsWorld",
          "kind": "function",
          "signature": "destroyPhysicsWorld(physicsWorld)",
          "summary": ""
        },
        {
          "name": "createBody",
          "kind": "function",
          "signature": "createBody(physicsWorld, desc)",
          "summary": ""
        },
        {
          "name": "getBody",
          "kind": "function",
          "signature": "getBody(physicsWorld, handle)",
          "summary": ""
        },
        {
          "name": "removeBody",
          "kind": "function",
          "signature": "removeBody(physicsWorld, handle)",
          "summary": ""
        },
        {
          "name": "stepPhysicsWorld",
          "kind": "function",
          "signature": "stepPhysicsWorld(physicsWorld, deltaSeconds)",
          "summary": ""
        },
        {
          "name": "PhysicsWorld",
          "kind": "re-export",
          "signature": "PhysicsWorld",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/SDFCollision",
      "path": "engine/reference/sim/physics/SDFCollision.md",
      "source": "engine/sim/physics/SDFCollision.js",
      "import": "/engine/sim/physics/SDFCollision.js",
      "sourceHash": "88762feef26f204c25c91b6a79b76c446ca4bfd2c47ad2a2dfb385d2a99d03aa",
      "summary": "SDFCollision.js - Signed Distance Field Collision Detection Based on GPU Gems 3, Chapter 34: \"Signed Distance Fields Using Single-Pass GPU Scan\" and PhysX 5.x SDF collision geometry. SDFs provide: - Accurate collision for concave shapes without decomposition - Efficient distance queries for soft body interactions - Smooth contact normals for stable simulation - Fast ray/sphere casting The SDF stores the signed distance to the nearest surface at each point: - Negative inside the object - Positive outside the object - Zero on the surface",
      "exports": [
        {
          "name": "SDFGrid",
          "kind": "class",
          "signature": "class SDFGrid",
          "summary": "3D SDF Grid for collision detection"
        },
        {
          "name": "createSDFFromMesh",
          "kind": "function",
          "signature": "createSDFFromMesh(vertices, indices, options = {})",
          "summary": "Create SDF collider from mesh using jump flooding algorithm This is a simplified CPU version - GPU version would be faster"
        },
        {
          "name": "SDFPrimitives",
          "kind": "constant",
          "signature": "SDFPrimitives",
          "summary": "SDF primitive functions"
        },
        {
          "name": "SDFOperations",
          "kind": "constant",
          "signature": "SDFOperations",
          "summary": "SDF combination operations"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/SeismicSystem",
      "path": "engine/reference/sim/physics/SeismicSystem.md",
      "source": "engine/sim/physics/SeismicSystem.js",
      "import": "/engine/sim/physics/SeismicSystem.js",
      "sourceHash": "95904af0338d65b31980ad24108a2bcf5afa12bd5d5260c5d9604219cb03747a",
      "summary": "SeismicSystem.js - Tectonic Simulation and Earthquake Events Simulates geological activity on the planet: - Tectonic fault lines with stress accumulation - Earthquake event triggering when stress exceeds threshold - Seismic wave propagation (P-waves, S-waves, surface waves) - Distance-based attenuation - Character/entity response integration Wave Types: - P-waves (Primary): Compressional, fastest, travels through solids/liquids - S-waves (Secondary): Shear, slower, solids only - Surface waves: Slowest, most destructive, along surface",
      "exports": [
        {
          "name": "FaultLine",
          "kind": "class",
          "signature": "class FaultLine",
          "summary": "Represents a tectonic fault line"
        },
        {
          "name": "SeismicWave",
          "kind": "class",
          "signature": "class SeismicWave",
          "summary": "Propagating seismic wave"
        },
        {
          "name": "Earthquake",
          "kind": "class",
          "signature": "class Earthquake",
          "summary": "Complete earthquake event with multiple wave types"
        },
        {
          "name": "SeismicSystem",
          "kind": "class",
          "signature": "class SeismicSystem",
          "summary": ""
        },
        {
          "name": "WaveType",
          "kind": "constant",
          "signature": "WaveType",
          "summary": "Wave types"
        },
        {
          "name": "WAVE_SPEEDS",
          "kind": "constant",
          "signature": "WAVE_SPEEDS",
          "summary": "Wave speeds (m/s, scaled for game)"
        },
        {
          "name": "MagnitudeScale",
          "kind": "constant",
          "signature": "MagnitudeScale",
          "summary": "Earthquake magnitude scales"
        },
        {
          "name": "DEFAULT_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_PARAMS",
          "summary": "Default seismic parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/ShockPropagation",
      "path": "engine/reference/sim/physics/ShockPropagation.md",
      "source": "engine/sim/physics/ShockPropagation.js",
      "import": "/engine/sim/physics/ShockPropagation.js",
      "sourceHash": "b23374c6b05dd0c3e0bff9bbaaa90b438c2e3264bfa62f08863a2e8e7f4cb110",
      "summary": "ShockPropagation.js - Shock Propagation for Stable Stacking Based on \"Nonconvex Rigid Bodies with Stacking\" (Guendelman et al., SIGGRAPH 2003) and NVIDIA PhysX best practices. Problem: Standard iterative solvers struggle with deep stacks of objects. Objects at the bottom don't \"know\" about the weight above them, causing jitter and instability. Solution: Process contacts in a specific order, propagating forces from the ground upward through the contact graph. This ensures each layer is stable before processing the next. Key Techniques: - Contact graph construction - Topological sorting by \"height\" from ground - Bottom-up constraint solving - Velocity-level shock propagation",
      "exports": [
        {
          "name": "ShockPropagationSolver",
          "kind": "class",
          "signature": "class ShockPropagationSolver",
          "summary": "Shock propagation solver for stable stacking"
        },
        {
          "name": "applyShockPropagation",
          "kind": "function",
          "signature": "applyShockPropagation(world, contacts, dt)",
          "summary": "Integrate shock propagation with existing physics world Call this after broad/narrow phase but before velocity integration"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/SpatialIntegritySystem",
      "path": "engine/reference/sim/physics/SpatialIntegritySystem.md",
      "source": "engine/sim/physics/SpatialIntegritySystem.js",
      "import": "/engine/sim/physics/SpatialIntegritySystem.js",
      "sourceHash": "ac8d386da0352a0225e0d3221077e08d40eac1b36f937a76310ba3327ff10e1d",
      "summary": "SpatialIntegritySystem.js - Coordinate Validation & Correction Ensures spatial integrity for planetary-scale worlds: - O(1) position lookup via composite keys - Fast checksum validation for corruption detection - World-tick based temporal tracking - Authority snapshots for rollback/sync - Drift correction for network sync Designed for minimal overhead while providing strong guarantees.",
      "exports": [
        {
          "name": "SpatialIntegritySystem",
          "kind": "class",
          "signature": "class SpatialIntegritySystem",
          "summary": ""
        },
        {
          "name": "ChunkIntegrityTracker",
          "kind": "class",
          "signature": "class ChunkIntegrityTracker",
          "summary": "Specialized integrity tracking for chunk positions Uses integer coordinates for exact matching"
        },
        {
          "name": "EntityCategory",
          "kind": "constant",
          "signature": "EntityCategory",
          "summary": ""
        },
        {
          "name": "ValidationResult",
          "kind": "constant",
          "signature": "ValidationResult",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/SpeculativeContacts",
      "path": "engine/reference/sim/physics/SpeculativeContacts.md",
      "source": "engine/sim/physics/SpeculativeContacts.js",
      "import": "/engine/sim/physics/SpeculativeContacts.js",
      "sourceHash": "2c271c46a9a88edac3d9b4288c52be9f95e2cb0ec69d4c7f3b3e506a2ba6a5f3",
      "summary": "SpeculativeContacts.js - Speculative Continuous Collision Detection Based on \"Speculative Contacts\" (Bullet Physics) and PhysX eSPECULATIVE_CCD. Traditional CCD is expensive as it requires time-of-impact (TOI) calculations. Speculative contacts provide a cheaper alternative: 1. Expand AABBs by velocity * dt to predict where objects will be 2. Generate contacts for all potentially overlapping pairs 3. Add velocity constraints to prevent future penetration Benefits: - Cheaper than sweep-based CCD - Prevents tunneling for most cases - Works well with iterative solvers Limitations: - Can cause \"ghost collisions\" with thin objects - Not as accurate as full CCD for very fast objects",
      "exports": [
        {
          "name": "SpeculativeContactsSolver",
          "kind": "class",
          "signature": "class SpeculativeContactsSolver",
          "summary": "Speculative contacts solver"
        },
        {
          "name": "expandAABBByVelocity",
          "kind": "function",
          "signature": "expandAABBByVelocity(aabb, velocity, dt, margin = 0.01)",
          "summary": "Expand AABB by velocity to get speculative bounds"
        },
        {
          "name": "timeOfClosestApproach",
          "kind": "function",
          "signature": "timeOfClosestApproach(posA, velA, radiusA, posB, velB, radiusB)",
          "summary": "Calculate time of closest approach between two moving spheres Used for speculative contact timing"
        },
        {
          "name": "enablePhysXSpeculativeCCD",
          "kind": "function",
          "signature": "enablePhysXSpeculativeCCD(actor, PhysX)",
          "summary": "Enable speculative CCD on a PhysX rigid body This configures the PhysX-specific flags for speculative contacts"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/StandardColliderMeshes",
      "path": "engine/reference/sim/physics/StandardColliderMeshes.md",
      "source": "engine/sim/physics/StandardColliderMeshes.js",
      "import": "/engine/sim/physics/StandardColliderMeshes.js",
      "sourceHash": "47a89cedbba0459370064b7ab80398f02cc30470de15a20aa2c077ad03b52309",
      "summary": "",
      "exports": [
        {
          "name": "getStandardColliderBaseHalfExtents",
          "kind": "function",
          "signature": "getStandardColliderBaseHalfExtents(meshId)",
          "summary": ""
        },
        {
          "name": "ensureStandardColliderMeshes",
          "kind": "function",
          "signature": "ensureStandardColliderMeshes(world)",
          "summary": ""
        },
        {
          "name": "StandardColliderMeshIds",
          "kind": "constant",
          "signature": "StandardColliderMeshIds",
          "summary": ""
        },
        {
          "name": "StandardColliderMeshes",
          "kind": "re-export",
          "signature": "StandardColliderMeshes",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/StructuralIntegrity",
      "path": "engine/reference/sim/physics/StructuralIntegrity.md",
      "source": "engine/sim/physics/StructuralIntegrity.js",
      "import": "/engine/sim/physics/StructuralIntegrity.js",
      "sourceHash": "b329056485069d2e4984e5e7904c42dd08f84c9f305f875093fd506da42735af",
      "summary": "StructuralIntegrity.js - Structural Integrity and Collapse System Implements realistic structural mechanics for destructible buildings: - Iterative relaxation solver for force propagation - Stress accumulation and breaking thresholds - Connectivity analysis with flood-fill from anchors - Chain reaction cascading collapse Based on constraint relaxation similar to Verlet physics but for structural connections rather than particle positions.",
      "exports": [
        {
          "name": "StructuralNode",
          "kind": "class",
          "signature": "class StructuralNode",
          "summary": "A node in the structural graph (corresponds to a fragment or chunk)"
        },
        {
          "name": "StructuralEdge",
          "kind": "class",
          "signature": "class StructuralEdge",
          "summary": "An edge connecting two structural nodes"
        },
        {
          "name": "StructuralIntegritySolver",
          "kind": "class",
          "signature": "class StructuralIntegritySolver",
          "summary": "Main structural integrity system"
        },
        {
          "name": "ANCHOR_TYPE",
          "kind": "constant",
          "signature": "ANCHOR_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/TreePhysics",
      "path": "engine/reference/sim/physics/TreePhysics.md",
      "source": "engine/sim/physics/TreePhysics.js",
      "import": "/engine/sim/physics/TreePhysics.js",
      "sourceHash": "dee13420258954f0d3f97c9089ed9988bf981ff820e02933c62da73f1c1b5b9d",
      "summary": "TreePhysics.js - Teardown-style Tree Physics System Features: - Trees must spawn on solid ground (validated placement) - Root connection tracking (trees anchored at base) - Structural integrity - cut trees fall realistically - Physics body conversion when disconnected Based on Teardown's structural integrity system where objects fall when disconnected from anchors (ground).",
      "exports": [
        {
          "name": "TreeVoxelBody",
          "kind": "class",
          "signature": "class TreeVoxelBody",
          "summary": "Represents a tree's voxel structure for physics"
        },
        {
          "name": "TreePhysicsSystem",
          "kind": "class",
          "signature": "class TreePhysicsSystem",
          "summary": "Manages all tree physics in the world"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/UnifiedDamageSystem",
      "path": "engine/reference/sim/physics/UnifiedDamageSystem.md",
      "source": "engine/sim/physics/UnifiedDamageSystem.js",
      "import": "/engine/sim/physics/UnifiedDamageSystem.js",
      "sourceHash": "a50848e7d1c7a8fd23bad3d8c97dd9e32a9a5f75be356143af697e360c404abd",
      "summary": "UnifiedDamageSystem.js - Cross-System Damage Integration Connects all destruction systems so everything affects everything: - Particles damage voxels (erosion, accumulation) - Particles damage meshes (impact fracture) - Mesh debris creates voxel craters - Voxel explosions affect mesh structures Acts as the central hub for damage propagation between systems.",
      "exports": [
        {
          "name": "DamageEvent",
          "kind": "class",
          "signature": "class DamageEvent",
          "summary": "Represents a damage event that propagates through systems"
        },
        {
          "name": "UnifiedDamageSystem",
          "kind": "class",
          "signature": "class UnifiedDamageSystem",
          "summary": "Central damage system that coordinates between all subsystems"
        },
        {
          "name": "DAMAGE_TYPE",
          "kind": "constant",
          "signature": "DAMAGE_TYPE",
          "summary": "Damage types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/VoronoiFracture",
      "path": "engine/reference/sim/physics/VoronoiFracture.md",
      "source": "engine/sim/physics/VoronoiFracture.js",
      "import": "/engine/sim/physics/VoronoiFracture.js",
      "sourceHash": "243cfebc3872355731198e238e26c9e69f2ed547f502e8f01ab28a39f213d822",
      "summary": "VoronoiFracture.js - GPU-accelerated Voronoi Fracture System Uses Jump Flooding Algorithm (JFA) to compute 3D Voronoi diagrams for realistic mesh fracturing. Seeds are placed based on impact location and fracture patterns. Algorithm: 1. Place seed points (impact-based or pattern-based) 2. Run JFA to compute nearest seed for each voxel 3. Extract cell boundaries as fracture planes 4. Cut mesh along planes to create fragments",
      "exports": [
        {
          "name": "VoronoiFracture",
          "kind": "class",
          "signature": "class VoronoiFracture",
          "summary": ""
        },
        {
          "name": "FRACTURE_PATTERNS",
          "kind": "constant",
          "signature": "FRACTURE_PATTERNS",
          "summary": "Predefined fracture patterns for different impact types"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/VoxelMeshCollision",
      "path": "engine/reference/sim/physics/VoxelMeshCollision.md",
      "source": "engine/sim/physics/VoxelMeshCollision.js",
      "import": "/engine/sim/physics/VoxelMeshCollision.js",
      "sourceHash": "93d022c0d4d7ee64e7350a8090692caac437db0799f99fef5948055eb28c1421",
      "summary": "VoxelMeshCollision.js - Voxel-based Mesh Collision for Particles and Ropes Voxelizes meshes into an occupancy grid with compressed normals for efficient GPU collision detection. This allows particles and ropes to collide with arbitrary mesh geometry beyond simple AABBs. Representation (per voxel, 32 bits total): - Bit 31: Occupancy flag (1 = solid) - Bits 30-21: Normal X (10 bits, signed normalized) - Bits 20-11: Normal Y (10 bits, signed normalized) - Bits 10-1: Normal Z (10 bits, signed normalized) - Bit 0: Reserved Features: - GPU mesh voxelization via compute shader - Compressed normal storage (10-10-10-2 format) - Cascaded/multi-resolution support - GPU collision queries for particles - Cache and reuse voxelized meshes",
      "exports": [
        {
          "name": "VoxelMeshCollider",
          "kind": "class",
          "signature": "class VoxelMeshCollider",
          "summary": ""
        },
        {
          "name": "CascadedVoxelCollider",
          "kind": "class",
          "signature": "class CascadedVoxelCollider",
          "summary": "CascadedVoxelCollider - Multi-resolution voxel collision with LOD levels Uses multiple grid resolutions for efficient collision: - LOD 0: Fine (128³) - Near particles, high accuracy - LOD 1: Medium (64³) - Mid-range particles - LOD 2: Coarse (32³) - Far particles, fast queries"
        },
        {
          "name": "VoxelCacheManager",
          "kind": "class",
          "signature": "class VoxelCacheManager",
          "summary": "VoxelCacheManager - Persistent cache for voxelized meshes Saves/loads voxelized mesh data to avoid re-voxelization. Uses IndexedDB for persistence."
        },
        {
          "name": "meshToTriangleBuffer",
          "kind": "function",
          "signature": "meshToTriangleBuffer(vertices, indices)",
          "summary": "Helper: Convert mesh vertices/indices to triangle buffer format"
        },
        {
          "name": "computeMeshBounds",
          "kind": "function",
          "signature": "computeMeshBounds(vertices)",
          "summary": "Helper: Compute mesh AABB"
        },
        {
          "name": "createVoxelMeshCollider",
          "kind": "function",
          "signature": "createVoxelMeshCollider(device, options = {})",
          "summary": ""
        },
        {
          "name": "createCascadedVoxelCollider",
          "kind": "function",
          "signature": "createCascadedVoxelCollider(device, options = {})",
          "summary": ""
        },
        {
          "name": "createVoxelCacheManager",
          "kind": "function",
          "signature": "createVoxelCacheManager(dbName = 'VoxelMeshCache')",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUBroadphase",
      "path": "engine/reference/sim/physics/gpu/GPUBroadphase.md",
      "source": "engine/sim/physics/gpu/GPUBroadphase.js",
      "import": "/engine/sim/physics/gpu/GPUBroadphase.js",
      "sourceHash": "5df30582ecda7ec677bf64bcd1e656e53da6ba9cd40e47ff9edcedca09312f64",
      "summary": "GPUBroadphase.js — GPU Compute Spatial Hash Broadphase Spatial hash broad-phase collision detection on GPU. Computes AABBs from collider shapes + world transforms, inserts into spatial hash grid, finds candidate collision pairs. Based on: - GPU Gems 3 Ch.32: Broad-Phase Collision Detection with CUDA - GPU Gems 3 Ch.29: Uniform grid with 27-neighbor cell queries - Existing GPUSpatialHash.js patterns (morton codes, hash primes) Uses atomicAdd for pair output (modern WebGPU, no multi-pass needed). Collision layer/mask filtering happens during pair generation.",
      "exports": [
        {
          "name": "GPUBroadphase",
          "kind": "class",
          "signature": "class GPUBroadphase",
          "summary": ""
        },
        {
          "name": "createBroadphase",
          "kind": "function",
          "signature": "async createBroadphase(device, worldBuffers, options = {})",
          "summary": "Create and initialize a GPU broadphase."
        },
        {
          "name": "destroyBroadphase",
          "kind": "function",
          "signature": "destroyBroadphase(bp)",
          "summary": ""
        },
        {
          "name": "DEFAULT_CELL_SIZE",
          "kind": "constant",
          "signature": "DEFAULT_CELL_SIZE",
          "summary": ""
        },
        {
          "name": "HASH_TABLE_SIZE",
          "kind": "constant",
          "signature": "HASH_TABLE_SIZE",
          "summary": ""
        },
        {
          "name": "MAX_BODIES_PER_CELL",
          "kind": "constant",
          "signature": "MAX_BODIES_PER_CELL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUCharacterController",
      "path": "engine/reference/sim/physics/gpu/GPUCharacterController.md",
      "source": "engine/sim/physics/gpu/GPUCharacterController.js",
      "import": "/engine/sim/physics/gpu/GPUCharacterController.js",
      "sourceHash": "ebf7cee4cb160410cdaf0ba7521dd698de9c5d6b538bba27450ea77401e4bb9e",
      "summary": "GPUCharacterController.js — Kinematic Character Controller PhysX-style character controller (CCT) for player/NPC movement. Kinematic body that sweeps through the scene, resolves collisions, handles ground detection, slope limits, step climbing, and skin width. Based on: - PhysX PxController: kinematic move with depenetration, auto-step, slope limit - Quake/Source: slide-move along wall normals, stair stepping - Jolt CharacterVirtual: predictive contacts, inner body shape Architecture: - CPU-driven (character movement is inherently sequential per-character) - Uses GPURaycast (CPU fallback) for ground probes and sweep tests - Applies final position to a kinematic body in GPURigidBodyWorld - Supports capsule and box shapes The controller does NOT use GPU compute shaders directly because character movement is latency-sensitive (needs immediate response to input) and typically only a handful of characters exist. CPU is the right choice here.",
      "exports": [
        {
          "name": "GPUCharacterController",
          "kind": "class",
          "signature": "class GPUCharacterController",
          "summary": ""
        },
        {
          "name": "GPUCharacterControllerManager",
          "kind": "class",
          "signature": "class GPUCharacterControllerManager",
          "summary": ""
        },
        {
          "name": "createCharacterControllerManager",
          "kind": "function",
          "signature": "createCharacterControllerManager()",
          "summary": ""
        },
        {
          "name": "destroyCharacterControllerManager",
          "kind": "function",
          "signature": "destroyCharacterControllerManager(mgr)",
          "summary": ""
        },
        {
          "name": "CCT_SHAPE_CAPSULE",
          "kind": "constant",
          "signature": "CCT_SHAPE_CAPSULE",
          "summary": ""
        },
        {
          "name": "CCT_SHAPE_BOX",
          "kind": "constant",
          "signature": "CCT_SHAPE_BOX",
          "summary": ""
        },
        {
          "name": "CCT_GROUNDED",
          "kind": "constant",
          "signature": "CCT_GROUNDED",
          "summary": ""
        },
        {
          "name": "CCT_SLIDING",
          "kind": "constant",
          "signature": "CCT_SLIDING",
          "summary": ""
        },
        {
          "name": "CCT_FALLING",
          "kind": "constant",
          "signature": "CCT_FALLING",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUConstraintSolver",
      "path": "engine/reference/sim/physics/gpu/GPUConstraintSolver.md",
      "source": "engine/sim/physics/gpu/GPUConstraintSolver.js",
      "import": "/engine/sim/physics/gpu/GPUConstraintSolver.js",
      "sourceHash": "d3e020ad9913e2acf5b5ead38604cce78107b5a6a72ded8ffd26cfe81c58da27",
      "summary": "GPUConstraintSolver.js — GPU Compute XPBD/TGS Constraint Solver Solves contact constraints and joint constraints on GPU. Uses TGS_Soft approach (Erin Catto, Box2D v3): - Sub-step contact separation update via local-frame anchors - Accumulated impulse clamping (Sequential Impulses) - Warm starting from previous frame's Lagrange multipliers - Relaxation pass to drain bias energy - Coulomb friction with tangent clamping - Restitution via velocity-level bounce Joint constraints use D6 as sole native type (PhysX 5 GPU best practice). Ball, hinge, fixed, distance, prismatic are D6 presets. Parallel solving via graph-colored Gauss-Seidel (Fratarcangeli et al.): - CPU-side graph coloring groups non-conflicting constraints - One GPU dispatch per color group Based on: - XPBD (Macklin 2016): Δλ = -(C + α̃·λ) / (w_a + w_b + α̃) - Small Steps (Macklin 2019): sub-stepping > iteration - Box2D v3 Solver2D: TGS_Soft, relaxation, accumulated impulse clamping - PhysX 5 GPU: D6 joints native, soft constraint compliance",
      "exports": [
        {
          "name": "GPUConstraintSolver",
          "kind": "class",
          "signature": "class GPUConstraintSolver",
          "summary": ""
        },
        {
          "name": "createConstraintSolver",
          "kind": "function",
          "signature": "async createConstraintSolver(device, worldBuffers, narrowphaseBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyConstraintSolver",
          "kind": "function",
          "signature": "destroyConstraintSolver(solver)",
          "summary": ""
        },
        {
          "name": "gpuAddJoint",
          "kind": "function",
          "signature": "gpuAddJoint(solver, desc)",
          "summary": ""
        },
        {
          "name": "gpuRemoveJoint",
          "kind": "function",
          "signature": "gpuRemoveJoint(solver, handle)",
          "summary": ""
        },
        {
          "name": "JOINT_BALL",
          "kind": "constant",
          "signature": "JOINT_BALL",
          "summary": ""
        },
        {
          "name": "JOINT_HINGE",
          "kind": "constant",
          "signature": "JOINT_HINGE",
          "summary": ""
        },
        {
          "name": "JOINT_FIXED",
          "kind": "constant",
          "signature": "JOINT_FIXED",
          "summary": ""
        },
        {
          "name": "JOINT_DISTANCE",
          "kind": "constant",
          "signature": "JOINT_DISTANCE",
          "summary": ""
        },
        {
          "name": "JOINT_D6",
          "kind": "constant",
          "signature": "JOINT_D6",
          "summary": ""
        },
        {
          "name": "JOINT_PRISMATIC",
          "kind": "constant",
          "signature": "JOINT_PRISMATIC",
          "summary": ""
        },
        {
          "name": "D6_LOCKED",
          "kind": "constant",
          "signature": "D6_LOCKED",
          "summary": ""
        },
        {
          "name": "D6_LIMITED",
          "kind": "constant",
          "signature": "D6_LIMITED",
          "summary": ""
        },
        {
          "name": "D6_FREE",
          "kind": "constant",
          "signature": "D6_FREE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUContinuousCollision",
      "path": "engine/reference/sim/physics/gpu/GPUContinuousCollision.md",
      "source": "engine/sim/physics/gpu/GPUContinuousCollision.js",
      "import": "/engine/sim/physics/gpu/GPUContinuousCollision.js",
      "sourceHash": "799f36d3926fadf7cae5e36435ffcd8310300169d3afa7bae32a80f013fa8fa5",
      "summary": "GPUContinuousCollision.js — GPU Speculative CCD (Continuous Collision Detection) Prevents fast-moving objects from tunneling through thin geometry. Uses speculative contacts: expand AABBs by velocity, generate conservative contacts at predicted future positions. Based on: - PhysX CCD: PxPairFlag::eDETECT_CCD_CONTACT, PxRigidBodyFlag::eENABLE_CCD - Bullet Physics: speculative contacts (Erwin Coumans GDC 2013) - Existing engine SpeculativeContacts.js (CPU) — this is the GPU version Architecture: - GPU shader expands AABBs by linear velocity * dt - Broadphase runs on expanded AABBs (catches potential tunneling pairs) - For CCD-flagged bodies, compute time of impact (TOI) via conservative advancement - Clamp body position to TOI * displacement if tunneling detected - Generates speculative contacts at predicted impact point When to enable CCD: - Bullets, projectiles, fast vehicles - Small objects near thin walls - Any body with speed > size/dt (tunneling risk)",
      "exports": [
        {
          "name": "GPUContinuousCollision",
          "kind": "class",
          "signature": "class GPUContinuousCollision",
          "summary": ""
        },
        {
          "name": "createContinuousCollision",
          "kind": "function",
          "signature": "async createContinuousCollision(device, worldBuffers, narrowphaseBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyContinuousCollision",
          "kind": "function",
          "signature": "destroyContinuousCollision(ccd)",
          "summary": ""
        },
        {
          "name": "CCD_FLAG_BIT",
          "kind": "constant",
          "signature": "CCD_FLAG_BIT",
          "summary": ""
        },
        {
          "name": "MAX_CCD_PAIRS",
          "kind": "constant",
          "signature": "MAX_CCD_PAIRS",
          "summary": ""
        },
        {
          "name": "CCD_SLOP",
          "kind": "constant",
          "signature": "CCD_SLOP",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUConvexHull",
      "path": "engine/reference/sim/physics/gpu/GPUConvexHull.md",
      "source": "engine/sim/physics/gpu/GPUConvexHull.js",
      "import": "/engine/sim/physics/gpu/GPUConvexHull.js",
      "sourceHash": "390c5d2c611fcf93ca1db4240f8c222664363e2c3fb1f3322cc7916fc6e0cfc3",
      "summary": "GPUConvexHull.js — CPU-side Quickhull 3D + GPU Buffer Helpers Computes convex hulls from vertex data (runs once at cook time, not per-frame). Produces GPU-compatible hull data for narrowphase collision detection. PhysX 5 GPU limits enforced: - Max 64 vertices per hull - Max 32 vertices per face - Hulls exceeding these limits are simplified Algorithm: Incremental Quickhull 3D - Find initial tetrahedron from extreme points - Iteratively add furthest point from each face - Expand horizon edges, rebuild faces Also builds precomputed support maps for GJK: - For 128 sampled directions, store the support vertex index - Enables O(1) support queries on GPU",
      "exports": [
        {
          "name": "computeConvexHull",
          "kind": "function",
          "signature": "computeConvexHull(vertices, options = {})",
          "summary": "Compute a 3D convex hull from a set of vertices."
        },
        {
          "name": "buildSupportMap",
          "kind": "function",
          "signature": "buildSupportMap(hull, numDirections = SUPPORT_MAP_DIRECTIONS)",
          "summary": "Build precomputed support map for fast GPU GJK. For each of N uniformly sampled directions, stores the index of the furthest vertex in that direction."
        },
        {
          "name": "hullToGPUBuffer",
          "kind": "function",
          "signature": "hullToGPUBuffer(device, hull, supportMap = null)",
          "summary": "Upload hull data to a GPU buffer for narrowphase use. Layout: [vertexCount(u32), faceCount(u32), pad, pad] + [vertices (vec4)] + [normals (vec4)] + [supportMap (u32)]"
        },
        {
          "name": "hullHalfExtents",
          "kind": "function",
          "signature": "hullHalfExtents(hull)",
          "summary": "Compute AABB half-extents from hull vertices (for broadphase)."
        },
        {
          "name": "MAX_HULL_VERTICES",
          "kind": "constant",
          "signature": "MAX_HULL_VERTICES",
          "summary": ""
        },
        {
          "name": "MAX_HULL_FACES",
          "kind": "constant",
          "signature": "MAX_HULL_FACES",
          "summary": ""
        },
        {
          "name": "MAX_VERTS_PER_FACE",
          "kind": "constant",
          "signature": "MAX_VERTS_PER_FACE",
          "summary": ""
        },
        {
          "name": "SUPPORT_MAP_DIRECTIONS",
          "kind": "constant",
          "signature": "SUPPORT_MAP_DIRECTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUHeightfield",
      "path": "engine/reference/sim/physics/gpu/GPUHeightfield.md",
      "source": "engine/sim/physics/gpu/GPUHeightfield.js",
      "import": "/engine/sim/physics/gpu/GPUHeightfield.js",
      "sourceHash": "4795645c9bbdbe8fb18921a2fd8327edef15a0aba2f86f40a4eb16093a0f3975",
      "summary": "GPUHeightfield.js — GPU Terrain Heightfield Collider Heightmap-based terrain collision for GPU physics. Stores a 2D grid of heights, generates contacts against rigid bodies via GPU compute shader. Based on: - PhysX PxHeightField: regular grid, per-sample materials, hole support - Bullet btHeightfieldTerrainShape: bilinear interpolation - Jolt HeightFieldShape: hierarchical BVH for large terrains Features: - Bilinear height interpolation for smooth normals - Per-cell material index (for surface types: grass, rock, mud, etc.) - Hole support (cells with height = NaN are passthrough) - GPU shader: one thread per body, probes heightfield under body AABB - CPU upload of heightmap data (set once or update regions) - Supports terrains up to 1024×1024 (configurable)",
      "exports": [
        {
          "name": "GPUHeightfield",
          "kind": "class",
          "signature": "class GPUHeightfield",
          "summary": ""
        },
        {
          "name": "createHeightfield",
          "kind": "function",
          "signature": "async createHeightfield(device, worldBuffers, narrowphaseBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyHeightfield",
          "kind": "function",
          "signature": "destroyHeightfield(hf)",
          "summary": ""
        },
        {
          "name": "DEFAULT_HEIGHTFIELD_SIZE",
          "kind": "constant",
          "signature": "DEFAULT_HEIGHTFIELD_SIZE",
          "summary": ""
        },
        {
          "name": "MAX_HEIGHTFIELD_SIZE",
          "kind": "constant",
          "signature": "MAX_HEIGHTFIELD_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUMeshDeform",
      "path": "engine/reference/sim/physics/gpu/GPUMeshDeform.md",
      "source": "engine/sim/physics/gpu/GPUMeshDeform.js",
      "import": "/engine/sim/physics/gpu/GPUMeshDeform.js",
      "sourceHash": "44e8f155bfe6a2753faf99d81ea708e3b4b6a6903f6ba3cd07150dcd39e85c24",
      "summary": "GPUMeshDeform.js — GPU-accelerated vertex displacement for impact dents Fast-path for small impacts: pushes vertices inward within a radius around the impact point, weighted by distance. Runs in <1ms on GPU vs 50-200ms for the full voxelize→SDF→marching cubes CPU pipeline. Also includes a normal recalculation pass (GAP 4). Usage: const deformer = new GPUMeshDeform(device); const result = await deformer.applyDent(positions, indices, { impactPoint: [x, y, z], impactNormal: [nx, ny, nz], radius: 0.3, depth: 0.1, }); // result.positions — Float32Array of deformed positions // result.normals   — Float32Array of recalculated normals",
      "exports": [
        {
          "name": "GPUMeshDeform",
          "kind": "class",
          "signature": "class GPUMeshDeform",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUNarrowphase",
      "path": "engine/reference/sim/physics/gpu/GPUNarrowphase.md",
      "source": "engine/sim/physics/gpu/GPUNarrowphase.js",
      "import": "/engine/sim/physics/gpu/GPUNarrowphase.js",
      "sourceHash": "95d8607fc7ba61b68d25076b39bd6cd16f81c1b591b2e2437f1b48f6faa1fd0a",
      "summary": "GPUNarrowphase.js — GPU Compute Contact Generation Analytic shape-shape collision tests on GPU compute shaders. Processes candidate pairs from GPUBroadphase, generates contact manifold. Supported shape pairs: - sphere–sphere, sphere–box, sphere–capsule - box–box (SAT, 15 separating axes) - capsule–capsule (closest points on two line segments) - capsule–box (segment vs box faces) - ground plane (infinite y=0, special-cased) Contact manifold uses Persistent Contact Manifold (PCM) approach: - Contacts stored with local-frame anchors for sub-step updating - Feature IDs for warm-start matching across frames - OGC barrier energy for penetration prevention Based on: - PhysX 5 GPU: PCM required for GPU contact gen - PhysX 5: convex hulls capped at 64 verts for GPU compat - Box2D v3 TGS: sub-step contact separation update via local anchors - OGCContact.js: barrier energy WGSL module",
      "exports": [
        {
          "name": "GPUNarrowphase",
          "kind": "class",
          "signature": "class GPUNarrowphase",
          "summary": ""
        },
        {
          "name": "createNarrowphase",
          "kind": "function",
          "signature": "async createNarrowphase(device, worldBuffers, broadphaseBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyNarrowphase",
          "kind": "function",
          "signature": "destroyNarrowphase(np)",
          "summary": ""
        },
        {
          "name": "CONTACT_STRIDE",
          "kind": "constant",
          "signature": "CONTACT_STRIDE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPURaycast",
      "path": "engine/reference/sim/physics/gpu/GPURaycast.md",
      "source": "engine/sim/physics/gpu/GPURaycast.js",
      "import": "/engine/sim/physics/gpu/GPURaycast.js",
      "sourceHash": "20a313e377b83ce174da4c34fded510b85ea707175fa77faef20693db6295adc",
      "summary": "GPURaycast.js — GPU Compute Parallel Raycast Casts rays against all rigid bodies on the GPU. Each thread tests one body, writes closest hit to output. Reduction pass finds global closest hit across all threads. Result returned via async readback (Promise). Also provides CPU fallback for synchronous raycasting against CPU shadow data (1-frame lag, but instant). Shape-ray tests: - ray-sphere (geometric closest approach) - ray-box (slab method) - ray-capsule (ray-segment closest point + sphere test)",
      "exports": [
        {
          "name": "GPURaycast",
          "kind": "class",
          "signature": "class GPURaycast",
          "summary": ""
        },
        {
          "name": "gpuRaycastCPU",
          "kind": "function",
          "signature": "gpuRaycastCPU(world, origin, direction, maxDistance = 1000)",
          "summary": "Synchronous CPU raycast against CPU shadow data (1-frame lag). Use when async GPU raycast is too slow or when GPU is busy."
        },
        {
          "name": "createGPURaycast",
          "kind": "function",
          "signature": "async createGPURaycast(device, worldBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyGPURaycast",
          "kind": "function",
          "signature": "destroyGPURaycast(rc)",
          "summary": ""
        },
        {
          "name": "gpuRaycast",
          "kind": "function",
          "signature": "async gpuRaycast(rc, world, origin, direction, maxDistance = 1000)",
          "summary": "GPU raycast (async)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPURigidBodyWorld",
      "path": "engine/reference/sim/physics/gpu/GPURigidBodyWorld.md",
      "source": "engine/sim/physics/gpu/GPURigidBodyWorld.js",
      "import": "/engine/sim/physics/gpu/GPURigidBodyWorld.js",
      "sourceHash": "179a5bc09d7daca5a25846e7075c5505364ad3e049710b3162be6c330e9c7fa7",
      "summary": "GPURigidBodyWorld.js — GPU Compute Rigid Body Physics World Custom WebGPU compute-based rigid body simulation engine. Runs broadphase, narrowphase, constraint solving, and integration entirely on the GPU via WGSL compute shaders. Architecture based on: - TGS_Soft solver (Erin Catto, Box2D v3 Solver2D, Feb 2024) Sub-stepping + warm starting + soft constraints + relaxation - XPBD compliance (Macklin 2016) for stiffness-independent constraints - Small Steps (Macklin 2019) for sub-step contact updating - PhysX 5 GPU rigid bodies: fixed pre-allocated buffers, D6-native joints - Jolt + Box2D v3: simulation islands via union-find, per-island sleep - Delta-position formulation (Catto) to avoid FP cancellation far from origin - Graph-colored parallel Gauss-Seidel (Fratarcangeli et al.) - GPU Gems 3 Ch.29: spatial hash broadphase, 27-neighbor cell queries SoA buffer layout for cache-coherent GPU access. All WGSL shaders embedded as template literals (matches codebase pattern).",
      "exports": [
        {
          "name": "GPURigidBodyWorld",
          "kind": "class",
          "signature": "class GPURigidBodyWorld",
          "summary": ""
        },
        {
          "name": "createGPUPhysicsWorld",
          "kind": "function",
          "signature": "async createGPUPhysicsWorld(device, options = {})",
          "summary": "Create a GPU physics world."
        },
        {
          "name": "destroyGPUPhysicsWorld",
          "kind": "function",
          "signature": "destroyGPUPhysicsWorld(world)",
          "summary": ""
        },
        {
          "name": "gpuCreateBody",
          "kind": "function",
          "signature": "gpuCreateBody(world, desc)",
          "summary": ""
        },
        {
          "name": "gpuRemoveBody",
          "kind": "function",
          "signature": "gpuRemoveBody(world, handle)",
          "summary": ""
        },
        {
          "name": "gpuGetBody",
          "kind": "function",
          "signature": "gpuGetBody(world, handle)",
          "summary": ""
        },
        {
          "name": "gpuSetBodyKinematic",
          "kind": "function",
          "signature": "gpuSetBodyKinematic(world, handle, enabled)",
          "summary": ""
        },
        {
          "name": "gpuApplyForce",
          "kind": "function",
          "signature": "gpuApplyForce(world, handle, fx, fy, fz)",
          "summary": ""
        },
        {
          "name": "gpuApplyTorque",
          "kind": "function",
          "signature": "gpuApplyTorque(world, handle, tx, ty, tz)",
          "summary": ""
        },
        {
          "name": "gpuStepWorld",
          "kind": "function",
          "signature": "gpuStepWorld(world, dt, broadphase, narrowphase, solver)",
          "summary": "Step the GPU physics world."
        },
        {
          "name": "gpuReadbackAsync",
          "kind": "function",
          "signature": "async gpuReadbackAsync(world)",
          "summary": ""
        },
        {
          "name": "MAX_BODIES",
          "kind": "constant",
          "signature": "MAX_BODIES",
          "summary": ""
        },
        {
          "name": "MAX_CONTACTS",
          "kind": "constant",
          "signature": "MAX_CONTACTS",
          "summary": ""
        },
        {
          "name": "MAX_PAIRS",
          "kind": "constant",
          "signature": "MAX_PAIRS",
          "summary": ""
        },
        {
          "name": "MAX_JOINTS",
          "kind": "constant",
          "signature": "MAX_JOINTS",
          "summary": ""
        },
        {
          "name": "SHAPE_SPHERE",
          "kind": "constant",
          "signature": "SHAPE_SPHERE",
          "summary": ""
        },
        {
          "name": "SHAPE_BOX",
          "kind": "constant",
          "signature": "SHAPE_BOX",
          "summary": ""
        },
        {
          "name": "SHAPE_CAPSULE",
          "kind": "constant",
          "signature": "SHAPE_CAPSULE",
          "summary": ""
        },
        {
          "name": "SHAPE_CONVEX",
          "kind": "constant",
          "signature": "SHAPE_CONVEX",
          "summary": ""
        },
        {
          "name": "SIM_DYNAMIC",
          "kind": "constant",
          "signature": "SIM_DYNAMIC",
          "summary": ""
        },
        {
          "name": "SIM_KINEMATIC",
          "kind": "constant",
          "signature": "SIM_KINEMATIC",
          "summary": ""
        },
        {
          "name": "SIM_STATIC",
          "kind": "constant",
          "signature": "SIM_STATIC",
          "summary": ""
        },
        {
          "name": "DEFAULT_SUBSTEPS",
          "kind": "constant",
          "signature": "DEFAULT_SUBSTEPS",
          "summary": ""
        },
        {
          "name": "DEFAULT_ITERATIONS",
          "kind": "constant",
          "signature": "DEFAULT_ITERATIONS",
          "summary": ""
        },
        {
          "name": "DEFAULT_MAX_SUBSTEPS",
          "kind": "constant",
          "signature": "DEFAULT_MAX_SUBSTEPS",
          "summary": ""
        },
        {
          "name": "DEFAULT_SLEEP_FRAMES",
          "kind": "constant",
          "signature": "DEFAULT_SLEEP_FRAMES",
          "summary": ""
        },
        {
          "name": "DEFAULT_SLEEP_THRESHOLD",
          "kind": "constant",
          "signature": "DEFAULT_SLEEP_THRESHOLD",
          "summary": ""
        },
        {
          "name": "DEFAULT_MAX_DEPENETRATION_VEL",
          "kind": "constant",
          "signature": "DEFAULT_MAX_DEPENETRATION_VEL",
          "summary": ""
        },
        {
          "name": "DEFAULT_CONTACT_OFFSET",
          "kind": "constant",
          "signature": "DEFAULT_CONTACT_OFFSET",
          "summary": ""
        },
        {
          "name": "DEFAULT_REST_OFFSET",
          "kind": "constant",
          "signature": "DEFAULT_REST_OFFSET",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUSceneQuery",
      "path": "engine/reference/sim/physics/gpu/GPUSceneQuery.md",
      "source": "engine/sim/physics/gpu/GPUSceneQuery.js",
      "import": "/engine/sim/physics/gpu/GPUSceneQuery.js",
      "sourceHash": "1d6352c4fe7cd4711f361164884b37033bafc50c6d8f3b7832ca0a308de7de0e",
      "summary": "GPUSceneQuery.js — GPU Scene Queries (Overlap, Sweep, Shape Cast) PhysX-style scene query system for spatial queries against the physics world. Supports overlap tests, sweep/shape casts, and multi-hit collection. Features: - Sphere/Box/Capsule overlap tests (find all bodies overlapping a shape) - Sphere/Box sweep (shape cast along a direction, find first/all hits) - Closest-hit and multi-hit modes - Layer/mask filtering - CPU-side for low-latency (synchronous results), uses CPU shadow data Based on: - PhysX PxScene::overlap(), sweep(), raycast() - PhysX PxOverlapBuffer, PxSweepBuffer - Jolt NarrowPhaseQuery: CastShape, CollideShape CPU-only implementation (not GPU compute) because: - Scene queries are typically 1-10 per frame (not thousands) - Need synchronous results (gameplay logic depends on them immediately) - GPU readback latency would negate the benefit",
      "exports": [
        {
          "name": "GPUSceneQuery",
          "kind": "class",
          "signature": "class GPUSceneQuery",
          "summary": ""
        },
        {
          "name": "createSceneQuery",
          "kind": "function",
          "signature": "createSceneQuery(world)",
          "summary": ""
        },
        {
          "name": "QUERY_CLOSEST",
          "kind": "constant",
          "signature": "QUERY_CLOSEST",
          "summary": ""
        },
        {
          "name": "QUERY_ALL",
          "kind": "constant",
          "signature": "QUERY_ALL",
          "summary": ""
        },
        {
          "name": "QUERY_ANY",
          "kind": "constant",
          "signature": "QUERY_ANY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUSoftBody",
      "path": "engine/reference/sim/physics/gpu/GPUSoftBody.md",
      "source": "engine/sim/physics/gpu/GPUSoftBody.js",
      "import": "/engine/sim/physics/gpu/GPUSoftBody.js",
      "sourceHash": "130b66425bc7aa1bc4f359d011bbb9476c5844491fa49386739dd269e2ace7d3",
      "summary": "GPUSoftBody.js — GPU FEM Soft Body Simulation Finite Element Method (FEM) soft body using tetrahedral meshes. PhysX 5's signature GPU feature — deformable materials like rubber, jelly, flesh, foam, etc. Based on: - PhysX 5 FEM Soft Bodies: tetrahedral simulation mesh + collision mesh - Müller et al. \"Real Time Physics\" (XPBD for FEM) - Smith et al. \"Stable Neo-Hookean Flesh Simulation\" (SIGGRAPH 2018) - Irving et al. \"Invertible Finite Elements\" (SIGGRAPH 2004) Architecture: - Tetrahedral mesh defines volume elements - Each tet has a rest-state inverse matrix (Dm_inv) - Per-frame: compute deformation gradient F, strain, stress → nodal forces - GPU shader: one thread per tetrahedron - Supports Neo-Hookean and co-rotational constitutive models - Nodes can be pinned (fixed) or coupled to rigid bodies Material properties: - Young's modulus E: stiffness (rubber ~1MPa, steel ~200GPa) - Poisson's ratio ν: incompressibility (rubber ~0.49, steel ~0.3) - Damping: velocity proportional damping",
      "exports": [
        {
          "name": "GPUSoftBody",
          "kind": "class",
          "signature": "class GPUSoftBody",
          "summary": ""
        },
        {
          "name": "lameParameters",
          "kind": "function",
          "signature": "lameParameters(youngsModulus, poissonRatio)",
          "summary": "Lamé parameters from Young's modulus and Poisson's ratio."
        },
        {
          "name": "createSoftBodySolver",
          "kind": "function",
          "signature": "async createSoftBodySolver(device, options = {})",
          "summary": ""
        },
        {
          "name": "destroySoftBodySolver",
          "kind": "function",
          "signature": "destroySoftBodySolver(sb)",
          "summary": ""
        },
        {
          "name": "MAX_SOFT_BODY_NODES",
          "kind": "constant",
          "signature": "MAX_SOFT_BODY_NODES",
          "summary": ""
        },
        {
          "name": "MAX_SOFT_BODY_TETS",
          "kind": "constant",
          "signature": "MAX_SOFT_BODY_TETS",
          "summary": ""
        },
        {
          "name": "CONSTITUTIVE_COROTATIONAL",
          "kind": "constant",
          "signature": "CONSTITUTIVE_COROTATIONAL",
          "summary": ""
        },
        {
          "name": "CONSTITUTIVE_NEOHOOKEAN",
          "kind": "constant",
          "signature": "CONSTITUTIVE_NEOHOOKEAN",
          "summary": ""
        },
        {
          "name": "SOFT_BODY_MATERIALS",
          "kind": "constant",
          "signature": "SOFT_BODY_MATERIALS",
          "summary": "Material presets (Young's modulus in Pa, Poisson's ratio)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUTriangleMesh",
      "path": "engine/reference/sim/physics/gpu/GPUTriangleMesh.md",
      "source": "engine/sim/physics/gpu/GPUTriangleMesh.js",
      "import": "/engine/sim/physics/gpu/GPUTriangleMesh.js",
      "sourceHash": "6901246bf342970d88c2cdea51fc6c9b8c2d8dfafc46f9ef4034940035c7ee16",
      "summary": "GPUTriangleMesh.js — GPU Triangle Mesh Static Collider Collision detection against static triangle meshes on GPU. Used for environment geometry (terrain, buildings, props) that doesn't move but needs accurate concave collision. Based on: - PhysX PxTriangleMeshGeometry: cooked triangle mesh with BVH - PhysX GPU: buildGPUData flag for GPU-accelerated triangle mesh contacts - Embree-style BVH: AABB tree for triangle culling Architecture: - CPU: Cook mesh → build BVH → upload to GPU buffers - GPU: Per-body shader traverses BVH, tests triangles in leaf nodes - Generates contacts into the shared narrowphase contact buffer Limitations (matching PhysX): - Triangle meshes are STATIC only (no deformation at runtime) - For deformable meshes, use GPUSoftBody.js instead - Max 65536 triangles per mesh (GPU buffer limit, configurable) - Max 16 meshes registered simultaneously",
      "exports": [
        {
          "name": "GPUTriangleMesh",
          "kind": "class",
          "signature": "class GPUTriangleMesh",
          "summary": ""
        },
        {
          "name": "buildTriangleMeshBVH",
          "kind": "function",
          "signature": "buildTriangleMeshBVH(vertices, indices)",
          "summary": "Build a BVH from triangle data for GPU traversal. Uses surface area heuristic (SAH) median split."
        },
        {
          "name": "createTriangleMesh",
          "kind": "function",
          "signature": "async createTriangleMesh(device, worldBuffers, narrowphaseBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyTriangleMesh",
          "kind": "function",
          "signature": "destroyTriangleMesh(tm)",
          "summary": ""
        },
        {
          "name": "MAX_TRIMESH_TRIANGLES",
          "kind": "constant",
          "signature": "MAX_TRIMESH_TRIANGLES",
          "summary": ""
        },
        {
          "name": "MAX_TRIMESH_VERTICES",
          "kind": "constant",
          "signature": "MAX_TRIMESH_VERTICES",
          "summary": ""
        },
        {
          "name": "MAX_TRIMESH_INSTANCES",
          "kind": "constant",
          "signature": "MAX_TRIMESH_INSTANCES",
          "summary": ""
        },
        {
          "name": "MAX_BVH_NODES",
          "kind": "constant",
          "signature": "MAX_BVH_NODES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUTriggerSystem",
      "path": "engine/reference/sim/physics/gpu/GPUTriggerSystem.md",
      "source": "engine/sim/physics/gpu/GPUTriggerSystem.js",
      "import": "/engine/sim/physics/gpu/GPUTriggerSystem.js",
      "sourceHash": "6663a4a35e282d2f31f6cb0a80375e7e997de7ec1bf15c0aba91ec64df4611e5",
      "summary": "GPUTriggerSystem.js — Trigger Volumes & Contact Event System GPU-accelerated trigger overlap detection and contact event generation. Mirrors PhysX's onContact/onTrigger callback system. Features: - Trigger volumes: AABB overlap tests on GPU, event dispatch on CPU - Contact events: begin/persist/end contact tracking with entity IDs - Event buffering: GPU writes events, CPU reads back and dispatches - Pair tracking: persistent pair state across frames for begin/end detection Based on: - PhysX PxSimulationEventCallback: onContact, onTrigger, onConstraintBreak - PhysX PxPairFlag: eNOTIFY_TOUCH_FOUND, eNOTIFY_TOUCH_PERSISTS, eNOTIFY_TOUCH_LOST - PhysX PxShapeFlagEnum: eTRIGGER_SHAPE (no contact response, only overlap events)",
      "exports": [
        {
          "name": "GPUTriggerSystem",
          "kind": "class",
          "signature": "class GPUTriggerSystem",
          "summary": ""
        },
        {
          "name": "createTriggerSystem",
          "kind": "function",
          "signature": "async createTriggerSystem(device, worldBuffers, broadphaseBuffers, narrowphaseBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyTriggerSystem",
          "kind": "function",
          "signature": "destroyTriggerSystem(sys)",
          "summary": ""
        },
        {
          "name": "MAX_TRIGGER_EVENTS",
          "kind": "constant",
          "signature": "MAX_TRIGGER_EVENTS",
          "summary": ""
        },
        {
          "name": "MAX_CONTACT_EVENTS",
          "kind": "constant",
          "signature": "MAX_CONTACT_EVENTS",
          "summary": ""
        },
        {
          "name": "TRIGGER_ENTER",
          "kind": "constant",
          "signature": "TRIGGER_ENTER",
          "summary": ""
        },
        {
          "name": "TRIGGER_STAY",
          "kind": "constant",
          "signature": "TRIGGER_STAY",
          "summary": ""
        },
        {
          "name": "TRIGGER_EXIT",
          "kind": "constant",
          "signature": "TRIGGER_EXIT",
          "summary": ""
        },
        {
          "name": "CONTACT_BEGIN",
          "kind": "constant",
          "signature": "CONTACT_BEGIN",
          "summary": ""
        },
        {
          "name": "CONTACT_PERSIST",
          "kind": "constant",
          "signature": "CONTACT_PERSIST",
          "summary": ""
        },
        {
          "name": "CONTACT_END",
          "kind": "constant",
          "signature": "CONTACT_END",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/GPUVehicle",
      "path": "engine/reference/sim/physics/gpu/GPUVehicle.md",
      "source": "engine/sim/physics/gpu/GPUVehicle.js",
      "import": "/engine/sim/physics/gpu/GPUVehicle.js",
      "sourceHash": "2b44911b9bf1a4f14a69712d5180bc5033cae54649ad77a70a487de1285b5160",
      "summary": "GPUVehicle.js — GPU-Accelerated Vehicle Physics Arcade-to-simulation vehicle system running on GPU compute. Models wheels, suspension, engine, transmission, steering, and drivetrain. Based on: - PhysX 5 Vehicle SDK: suspension raycasts, tire model, drivetrain - Bullet Vehicle: raycast vehicle with Pacejka tire friction - Marco Monster's \"Car Physics for Games\" (classic reference) - Brian Beckman's \"Physics of Racing\" series Architecture: - Vehicle is a rigid body in GPURigidBodyWorld with attached wheel descriptors - Each frame: suspension raycasts → tire forces → engine torque → apply to chassis body - GPU shader handles all wheels in parallel (one thread per wheel across all vehicles) - CPU manages gear shifts, input mapping, and vehicle creation Tire model: simplified Pacejka \"Magic Formula\" F = D * sin(C * atan(B * slip - E * (B * slip - atan(B * slip)))) Simplified to: F = peakForce * sin(2 * atan(slip / peakSlip))",
      "exports": [
        {
          "name": "GPUVehicleManager",
          "kind": "class",
          "signature": "class GPUVehicleManager",
          "summary": ""
        },
        {
          "name": "createVehicleManager",
          "kind": "function",
          "signature": "async createVehicleManager(device, worldBuffers, options = {})",
          "summary": ""
        },
        {
          "name": "destroyVehicleManager",
          "kind": "function",
          "signature": "destroyVehicleManager(mgr)",
          "summary": ""
        },
        {
          "name": "MAX_VEHICLES",
          "kind": "constant",
          "signature": "MAX_VEHICLES",
          "summary": ""
        },
        {
          "name": "MAX_WHEELS_PER_VEHICLE",
          "kind": "constant",
          "signature": "MAX_WHEELS_PER_VEHICLE",
          "summary": ""
        },
        {
          "name": "MAX_TOTAL_WHEELS",
          "kind": "constant",
          "signature": "MAX_TOTAL_WHEELS",
          "summary": ""
        },
        {
          "name": "DRIVE_FRONT",
          "kind": "constant",
          "signature": "DRIVE_FRONT",
          "summary": ""
        },
        {
          "name": "DRIVE_REAR",
          "kind": "constant",
          "signature": "DRIVE_REAR",
          "summary": ""
        },
        {
          "name": "DRIVE_AWD",
          "kind": "constant",
          "signature": "DRIVE_AWD",
          "summary": ""
        },
        {
          "name": "GEAR_REVERSE",
          "kind": "constant",
          "signature": "GEAR_REVERSE",
          "summary": ""
        },
        {
          "name": "GEAR_NEUTRAL",
          "kind": "constant",
          "signature": "GEAR_NEUTRAL",
          "summary": ""
        },
        {
          "name": "GEAR_1",
          "kind": "constant",
          "signature": "GEAR_1",
          "summary": ""
        },
        {
          "name": "GEAR_2",
          "kind": "constant",
          "signature": "GEAR_2",
          "summary": ""
        },
        {
          "name": "GEAR_3",
          "kind": "constant",
          "signature": "GEAR_3",
          "summary": ""
        },
        {
          "name": "GEAR_4",
          "kind": "constant",
          "signature": "GEAR_4",
          "summary": ""
        },
        {
          "name": "GEAR_5",
          "kind": "constant",
          "signature": "GEAR_5",
          "summary": ""
        },
        {
          "name": "GEAR_6",
          "kind": "constant",
          "signature": "GEAR_6",
          "summary": ""
        },
        {
          "name": "WHEEL_PRESETS",
          "kind": "constant",
          "signature": "WHEEL_PRESETS",
          "summary": "Default wheel presets for common vehicle types."
        },
        {
          "name": "ENGINE_PRESETS",
          "kind": "constant",
          "signature": "ENGINE_PRESETS",
          "summary": "Default engine/transmission presets."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/gpu/index",
      "path": "engine/reference/sim/physics/gpu/index.md",
      "source": "engine/sim/physics/gpu/index.js",
      "import": "/engine/sim/physics/gpu/index.js",
      "sourceHash": "05fc583617fc16c19ec15b21a725e420ca64ab962ead7239bebdd15d38bf41be",
      "summary": "GPU Physics Engine — Barrel Export Standalone WebGPU compute-based rigid body physics engine. Full PhysX 5 feature parity via WebGPU compute shaders. Import from this file to access all GPU physics components. Usage: import { createGPUPhysicsWorld, createBroadphase, ... } from './gpu/index.js'; ═══════════════════════════════════════════════════════════════ Core Rigid Body Pipeline (7 files): GPURigidBodyWorld   — World, bodies, integration, islands, readback GPUBroadphase       — Spatial hash broadphase, AABB, pair finding GPUNarrowphase      — Shape-shape contact generation (PCM) GPUConstraintSolver  — TGS_Soft contacts + D6 joints + relaxation GPUConvexHull       — Quickhull 3D, support maps, GPU upload GPURaycast          — GPU parallel raycast + CPU fallback GPUContinuousCollision — Speculative CCD (AABB expansion + TOI) Extended Simulation (4 files): GPUVehicle              — Wheels, suspension, Pacejka tires, drivetrain GPUCharacterController  — Kinematic CCT (slide-move, step climb, slope limit) GPUSoftBody             — FEM soft body (tetrahedral, co-rotational elasticity) GPUTriggerSystem        — Trigger volumes + contact events (enter/stay/exit) Geometry & Queries (4 files): GPUSceneQuery       — Overlap tests, sweep/shape casts GPUHeightfield      — Terrain heightfield collider (bilinear, materials, holes) GPUTriangleMesh     — Static triangle mesh collider (BVH traversal) ═══════════════════════════════════════════════════════════════ Existing Engine Systems (already built, import from parent): ../GPUClothSolver.js       — PBD cloth (small substeps + OGC contact) ../GPUArticulationSolver.js — Articulated chains (Cosserat rods) ../GPUSpatialHash.js       — Morton-code spatial hash (GPU Gems 3) ../SDFCollision.js         — SDF mesh geometry (PhysX 5 style) ../PBDSolver.js            — Position-Based Dynamics (XPBD, graph coloring) ../MLSMPMSolver.js         — MLS-MPM soft body (snow, sand, jelly) ../OGCContact.js           — Offset Geometric Contact (SIGGRAPH 2025) ../SpeculativeContacts.js  — CPU speculative CCD ../ShockPropagation.js     — Shock propagation (Guendelman 2003) ../VoronoiFracture.js      — Voronoi destruction (Blast SDK equivalent) ../ConvexDecomposition.js  — V-HACD convex decomposition ../VoxelMeshCollision.js   — Voxelized mesh collider (LOD) ../DynamicMeshCollider.js  — Runtime mesh collider updates ═══════════════════════════════════════════════════════════════",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/index",
      "path": "engine/reference/sim/physics/index.md",
      "source": "engine/sim/physics/index.js",
      "import": "/engine/sim/physics/index.js",
      "sourceHash": "6862f9c63d155db3b4e8832b8074d2e54f19244f0cd6a8bef3353328d209f3c1",
      "summary": "engine/sim/physics/index.js - Physics Systems Barrel Export",
      "exports": [
        {
          "name": "ANCHOR_COMPONENT_ID",
          "kind": "re-export",
          "signature": "ANCHOR_COMPONENT_ID",
          "summary": ""
        },
        {
          "name": "ANCHOR_TYPE",
          "kind": "re-export",
          "signature": "ANCHOR_TYPE",
          "summary": ""
        },
        {
          "name": "AngleConstraint",
          "kind": "re-export",
          "signature": "AngleConstraint",
          "summary": ""
        },
        {
          "name": "AttachmentConstraint",
          "kind": "re-export",
          "signature": "AttachmentConstraint",
          "summary": ""
        },
        {
          "name": "BARRIER_ACTIVATION_RATIO",
          "kind": "re-export",
          "signature": "BARRIER_ACTIVATION_RATIO",
          "summary": ""
        },
        {
          "name": "COLLIDER_SCHEMA",
          "kind": "re-export",
          "signature": "COLLIDER_SCHEMA",
          "summary": ""
        },
        {
          "name": "COLLIDER_SHAPES",
          "kind": "re-export",
          "signature": "COLLIDER_SHAPES",
          "summary": ""
        },
        {
          "name": "COLLISION_LAYERS",
          "kind": "re-export",
          "signature": "COLLISION_LAYERS",
          "summary": ""
        },
        {
          "name": "CONNECTIVITY_MAX_ITERATIONS",
          "kind": "re-export",
          "signature": "CONNECTIVITY_MAX_ITERATIONS",
          "summary": ""
        },
        {
          "name": "CONNECTIVITY_WORKGROUP_SIZE",
          "kind": "re-export",
          "signature": "CONNECTIVITY_WORKGROUP_SIZE",
          "summary": ""
        },
        {
          "name": "CapsuleCollider",
          "kind": "re-export",
          "signature": "CapsuleCollider",
          "summary": ""
        },
        {
          "name": "ConnectivityCompute",
          "kind": "re-export",
          "signature": "ConnectivityCompute",
          "summary": ""
        },
        {
          "name": "ConstitutiveModel",
          "kind": "re-export",
          "signature": "ConstitutiveModel",
          "summary": ""
        },
        {
          "name": "ConstraintType",
          "kind": "re-export",
          "signature": "ConstraintType",
          "summary": ""
        },
        {
          "name": "D6_AXES",
          "kind": "re-export",
          "signature": "D6_AXES",
          "summary": ""
        },
        {
          "name": "D6_DRIVES",
          "kind": "re-export",
          "signature": "D6_DRIVES",
          "summary": ""
        },
        {
          "name": "D6_MOTION",
          "kind": "re-export",
          "signature": "D6_MOTION",
          "summary": ""
        },
        {
          "name": "DECIMATION_GRID_SIZE",
          "kind": "re-export",
          "signature": "DECIMATION_GRID_SIZE",
          "summary": ""
        },
        {
          "name": "DECOMPOSITION_DEFAULTS",
          "kind": "re-export",
          "signature": "DECOMPOSITION_DEFAULTS",
          "summary": ""
        },
        {
          "name": "DEFAULT_CONTACT_RADIUS",
          "kind": "re-export",
          "signature": "DEFAULT_CONTACT_RADIUS",
          "summary": ""
        },
        {
          "name": "DEFAULT_MEASUREMENTS",
          "kind": "re-export",
          "signature": "DEFAULT_MEASUREMENTS",
          "summary": ""
        },
        {
          "name": "DEFAULT_TARGET_RATIO",
          "kind": "re-export",
          "signature": "DEFAULT_TARGET_RATIO",
          "summary": ""
        },
        {
          "name": "DecimationEdge",
          "kind": "re-export",
          "signature": "DecimationEdge",
          "summary": ""
        },
        {
          "name": "DecimationTriangle",
          "kind": "re-export",
          "signature": "DecimationTriangle",
          "summary": ""
        },
        {
          "name": "DecimationVertex",
          "kind": "re-export",
          "signature": "DecimationVertex",
          "summary": ""
        },
        {
          "name": "DistanceConstraint",
          "kind": "re-export",
          "signature": "DistanceConstraint",
          "summary": ""
        },
        {
          "name": "EMPTY_COMPONENT_ID",
          "kind": "re-export",
          "signature": "EMPTY_COMPONENT_ID",
          "summary": ""
        },
        {
          "name": "Earthquake",
          "kind": "re-export",
          "signature": "Earthquake",
          "summary": ""
        },
        {
          "name": "FRACTURE_PATTERNS",
          "kind": "re-export",
          "signature": "FRACTURE_PATTERNS",
          "summary": ""
        },
        {
          "name": "FaultLine",
          "kind": "re-export",
          "signature": "FaultLine",
          "summary": ""
        },
        {
          "name": "FragmentManager",
          "kind": "re-export",
          "signature": "FragmentManager",
          "summary": ""
        },
        {
          "name": "FragmentPhysics",
          "kind": "re-export",
          "signature": "FragmentPhysics",
          "summary": ""
        },
        {
          "name": "GPUClothSolver",
          "kind": "re-export",
          "signature": "GPUClothSolver",
          "summary": ""
        },
        {
          "name": "GPUSpatialHashGrid",
          "kind": "re-export",
          "signature": "GPUSpatialHashGrid",
          "summary": ""
        },
        {
          "name": "GPU_CLOTH_DEFAULT_ITERATIONS",
          "kind": "re-export",
          "signature": "GPU_CLOTH_DEFAULT_ITERATIONS",
          "summary": ""
        },
        {
          "name": "GPU_CLOTH_DEFAULT_SUBSTEPS",
          "kind": "re-export",
          "signature": "GPU_CLOTH_DEFAULT_SUBSTEPS",
          "summary": ""
        },
        {
          "name": "GridCell",
          "kind": "re-export",
          "signature": "GridCell",
          "summary": ""
        },
        {
          "name": "JOINT_LIMITS",
          "kind": "re-export",
          "signature": "JOINT_LIMITS",
          "summary": ""
        },
        {
          "name": "JOINT_SCHEMA",
          "kind": "re-export",
          "signature": "JOINT_SCHEMA",
          "summary": ""
        },
        {
          "name": "JOINT_TYPES",
          "kind": "re-export",
          "signature": "JOINT_TYPES",
          "summary": ""
        },
        {
          "name": "JointType",
          "kind": "re-export",
          "signature": "JointType",
          "summary": ""
        },
        {
          "name": "MAX_QEM_ITERATIONS",
          "kind": "re-export",
          "signature": "MAX_QEM_ITERATIONS",
          "summary": ""
        },
        {
          "name": "MLSMPMSolver",
          "kind": "re-export",
          "signature": "MLSMPMSolver",
          "summary": ""
        },
        {
          "name": "MPMParticle",
          "kind": "re-export",
          "signature": "MPMParticle",
          "summary": ""
        },
        {
          "name": "MPM_CELL_SIZE",
          "kind": "re-export",
          "signature": "MPM_CELL_SIZE",
          "summary": ""
        },
        {
          "name": "MPM_DEFAULT_GRID_SIZE",
          "kind": "re-export",
          "signature": "MPM_DEFAULT_GRID_SIZE",
          "summary": ""
        },
        {
          "name": "MagnitudeScale",
          "kind": "re-export",
          "signature": "MagnitudeScale",
          "summary": ""
        },
        {
          "name": "MaterialPresets",
          "kind": "re-export",
          "signature": "MaterialPresets",
          "summary": ""
        },
        {
          "name": "MeshCutter",
          "kind": "re-export",
          "signature": "MeshCutter",
          "summary": ""
        },
        {
          "name": "MeshDecimator",
          "kind": "re-export",
          "signature": "MeshDecimator",
          "summary": ""
        },
        {
          "name": "MeshFragment",
          "kind": "re-export",
          "signature": "MeshFragment",
          "summary": ""
        },
        {
          "name": "MeshParticles",
          "kind": "re-export",
          "signature": "MeshParticles",
          "summary": ""
        },
        {
          "name": "OGCContactManager",
          "kind": "re-export",
          "signature": "OGCContactManager",
          "summary": ""
        },
        {
          "name": "OGC_BARRIER_WGSL",
          "kind": "re-export",
          "signature": "OGC_BARRIER_WGSL",
          "summary": ""
        },
        {
          "name": "OGC_DISTANCE_WGSL",
          "kind": "re-export",
          "signature": "OGC_DISTANCE_WGSL",
          "summary": ""
        },
        {
          "name": "OGC_FIXED_SCALE",
          "kind": "re-export",
          "signature": "OGC_FIXED_SCALE",
          "summary": ""
        },
        {
          "name": "OGC_MIN_DISTANCE",
          "kind": "re-export",
          "signature": "OGC_MIN_DISTANCE",
          "summary": ""
        },
        {
          "name": "OGC_SOLVE_WGSL",
          "kind": "re-export",
          "signature": "OGC_SOLVE_WGSL",
          "summary": ""
        },
        {
          "name": "OGC_WGSL_MODULE",
          "kind": "re-export",
          "signature": "OGC_WGSL_MODULE",
          "summary": ""
        },
        {
          "name": "PBDConstraint",
          "kind": "re-export",
          "signature": "PBDConstraint",
          "summary": ""
        },
        {
          "name": "PBDParticle",
          "kind": "re-export",
          "signature": "PBDParticle",
          "summary": ""
        },
        {
          "name": "PBDRagdoll",
          "kind": "re-export",
          "signature": "PBDRagdoll",
          "summary": ""
        },
        {
          "name": "PBDSolver",
          "kind": "re-export",
          "signature": "PBDSolver",
          "summary": ""
        },
        {
          "name": "PBD_DEFAULT_ITERATIONS",
          "kind": "re-export",
          "signature": "PBD_DEFAULT_ITERATIONS",
          "summary": ""
        },
        {
          "name": "PBD_DEFAULT_SUBSTEPS",
          "kind": "re-export",
          "signature": "PBD_DEFAULT_SUBSTEPS",
          "summary": ""
        },
        {
          "name": "PHYSICS_BODY_SCHEMA",
          "kind": "re-export",
          "signature": "PHYSICS_BODY_SCHEMA",
          "summary": ""
        },
        {
          "name": "PHYSICS_MATERIALS",
          "kind": "re-export",
          "signature": "PHYSICS_MATERIALS",
          "summary": ""
        },
        {
          "name": "PHYSICS_WORLD_SCHEMA",
          "kind": "re-export",
          "signature": "PHYSICS_WORLD_SCHEMA",
          "summary": ""
        },
        {
          "name": "ParticleFlags",
          "kind": "re-export",
          "signature": "ParticleFlags",
          "summary": ""
        },
        {
          "name": "PhysXMeshCooking",
          "kind": "re-export",
          "signature": "PhysXMeshCooking",
          "summary": ""
        },
        {
          "name": "PhysXPhysicsWorld",
          "kind": "re-export",
          "signature": "PhysXPhysicsWorld",
          "summary": ""
        },
        {
          "name": "PhysicsFragment",
          "kind": "re-export",
          "signature": "PhysicsFragment",
          "summary": ""
        },
        {
          "name": "Plane",
          "kind": "re-export",
          "signature": "Plane",
          "summary": ""
        },
        {
          "name": "Quadric",
          "kind": "re-export",
          "signature": "Quadric",
          "summary": ""
        },
        {
          "name": "RagdollBone",
          "kind": "re-export",
          "signature": "RagdollBone",
          "summary": ""
        },
        {
          "name": "RagdollBoneData",
          "kind": "re-export",
          "signature": "RagdollBoneData",
          "summary": ""
        },
        {
          "name": "RagdollState",
          "kind": "re-export",
          "signature": "RagdollState",
          "summary": ""
        },
        {
          "name": "SDFGrid",
          "kind": "re-export",
          "signature": "SDFGrid",
          "summary": ""
        },
        {
          "name": "SDFOperations",
          "kind": "re-export",
          "signature": "SDFOperations",
          "summary": ""
        },
        {
          "name": "SDFPrimitives",
          "kind": "re-export",
          "signature": "SDFPrimitives",
          "summary": ""
        },
        {
          "name": "SEISMIC_PARAMS",
          "kind": "re-export",
          "signature": "SEISMIC_PARAMS",
          "summary": ""
        },
        {
          "name": "SIM_MODES",
          "kind": "re-export",
          "signature": "SIM_MODES",
          "summary": ""
        },
        {
          "name": "SPLINE_RADIUS",
          "kind": "re-export",
          "signature": "SPLINE_RADIUS",
          "summary": ""
        },
        {
          "name": "STANDARD_COLLIDER_MESHES",
          "kind": "re-export",
          "signature": "STANDARD_COLLIDER_MESHES",
          "summary": ""
        },
        {
          "name": "SeismicSystem",
          "kind": "re-export",
          "signature": "SeismicSystem",
          "summary": ""
        },
        {
          "name": "SeismicWave",
          "kind": "re-export",
          "signature": "SeismicWave",
          "summary": ""
        },
        {
          "name": "ShockPropagationSolver",
          "kind": "re-export",
          "signature": "ShockPropagationSolver",
          "summary": ""
        },
        {
          "name": "SpatialHashGrid",
          "kind": "re-export",
          "signature": "SpatialHashGrid",
          "summary": ""
        },
        {
          "name": "SpatialIntegritySystem",
          "kind": "re-export",
          "signature": "SpatialIntegritySystem",
          "summary": ""
        },
        {
          "name": "SpeculativeContactsSolver",
          "kind": "re-export",
          "signature": "SpeculativeContactsSolver",
          "summary": ""
        },
        {
          "name": "StandardColliderMeshes",
          "kind": "re-export",
          "signature": "StandardColliderMeshes",
          "summary": ""
        },
        {
          "name": "StructuralConnection",
          "kind": "re-export",
          "signature": "StructuralConnection",
          "summary": ""
        },
        {
          "name": "StructuralIntegritySolver",
          "kind": "re-export",
          "signature": "StructuralIntegritySolver",
          "summary": ""
        },
        {
          "name": "TreePhysics",
          "kind": "re-export",
          "signature": "TreePhysics",
          "summary": ""
        },
        {
          "name": "TreePhysicsSystem",
          "kind": "re-export",
          "signature": "TreePhysicsSystem",
          "summary": ""
        },
        {
          "name": "TreeVoxelBody",
          "kind": "re-export",
          "signature": "TreeVoxelBody",
          "summary": ""
        },
        {
          "name": "Triangle",
          "kind": "re-export",
          "signature": "Triangle",
          "summary": ""
        },
        {
          "name": "UnifiedDamageSystem",
          "kind": "re-export",
          "signature": "UnifiedDamageSystem",
          "summary": ""
        },
        {
          "name": "Vertex",
          "kind": "re-export",
          "signature": "Vertex",
          "summary": ""
        },
        {
          "name": "VoronoiFracture",
          "kind": "re-export",
          "signature": "VoronoiFracture",
          "summary": ""
        },
        {
          "name": "WAVE_SPEEDS",
          "kind": "re-export",
          "signature": "WAVE_SPEEDS",
          "summary": ""
        },
        {
          "name": "WaveType",
          "kind": "re-export",
          "signature": "WaveType",
          "summary": ""
        },
        {
          "name": "addArticulationToScene",
          "kind": "re-export",
          "signature": "addArticulationToScene",
          "summary": ""
        },
        {
          "name": "applyOGCForce",
          "kind": "re-export",
          "signature": "applyOGCForce",
          "summary": ""
        },
        {
          "name": "applyOGCPositionCorrection",
          "kind": "re-export",
          "signature": "applyOGCPositionCorrection",
          "summary": ""
        },
        {
          "name": "applyShockPropagation",
          "kind": "re-export",
          "signature": "applyShockPropagation",
          "summary": ""
        },
        {
          "name": "barrierEnergy",
          "kind": "re-export",
          "signature": "barrierEnergy",
          "summary": ""
        },
        {
          "name": "barrierForce",
          "kind": "re-export",
          "signature": "barrierForce",
          "summary": ""
        },
        {
          "name": "colorConstraints",
          "kind": "re-export",
          "signature": "colorConstraints",
          "summary": ""
        },
        {
          "name": "computeWeight",
          "kind": "re-export",
          "signature": "computeWeight",
          "summary": ""
        },
        {
          "name": "conservativeDisplacementBound",
          "kind": "re-export",
          "signature": "conservativeDisplacementBound",
          "summary": ""
        },
        {
          "name": "createArticulation",
          "kind": "re-export",
          "signature": "createArticulation",
          "summary": ""
        },
        {
          "name": "createBody",
          "kind": "re-export",
          "signature": "createBody",
          "summary": ""
        },
        {
          "name": "createChildLink",
          "kind": "re-export",
          "signature": "createChildLink",
          "summary": ""
        },
        {
          "name": "createD6Joint",
          "kind": "re-export",
          "signature": "createD6Joint",
          "summary": ""
        },
        {
          "name": "createDecomposedCollider",
          "kind": "re-export",
          "signature": "createDecomposedCollider",
          "summary": ""
        },
        {
          "name": "createDefaultCollider",
          "kind": "re-export",
          "signature": "createDefaultCollider",
          "summary": ""
        },
        {
          "name": "createDefaultJoint",
          "kind": "re-export",
          "signature": "createDefaultJoint",
          "summary": ""
        },
        {
          "name": "createDefaultPhysicsBody",
          "kind": "re-export",
          "signature": "createDefaultPhysicsBody",
          "summary": ""
        },
        {
          "name": "createDefaultPhysicsWorld",
          "kind": "re-export",
          "signature": "createDefaultPhysicsWorld",
          "summary": ""
        },
        {
          "name": "createDistanceJoint",
          "kind": "re-export",
          "signature": "createDistanceJoint",
          "summary": ""
        },
        {
          "name": "createPhysicsWorld",
          "kind": "re-export",
          "signature": "createPhysicsWorld",
          "summary": ""
        },
        {
          "name": "createRevoluteJoint",
          "kind": "re-export",
          "signature": "createRevoluteJoint",
          "summary": ""
        },
        {
          "name": "createRootLink",
          "kind": "re-export",
          "signature": "createRootLink",
          "summary": ""
        },
        {
          "name": "createRope",
          "kind": "re-export",
          "signature": "createRope",
          "summary": ""
        },
        {
          "name": "createSDFFromMesh",
          "kind": "re-export",
          "signature": "createSDFFromMesh",
          "summary": ""
        },
        {
          "name": "createSpatialHashFromVGPU",
          "kind": "re-export",
          "signature": "createSpatialHashFromVGPU",
          "summary": ""
        },
        {
          "name": "createSphericalJoint",
          "kind": "re-export",
          "signature": "createSphericalJoint",
          "summary": ""
        },
        {
          "name": "decimateGrid",
          "kind": "re-export",
          "signature": "decimateGrid",
          "summary": ""
        },
        {
          "name": "decimateQEM",
          "kind": "re-export",
          "signature": "decimateQEM",
          "summary": ""
        },
        {
          "name": "decomposeMesh",
          "kind": "re-export",
          "signature": "decomposeMesh",
          "summary": ""
        },
        {
          "name": "destroyArticulation",
          "kind": "re-export",
          "signature": "destroyArticulation",
          "summary": ""
        },
        {
          "name": "destroyPhysicsWorld",
          "kind": "re-export",
          "signature": "destroyPhysicsWorld",
          "summary": ""
        },
        {
          "name": "distanceToOffsetCapsule",
          "kind": "re-export",
          "signature": "distanceToOffsetCapsule",
          "summary": ""
        },
        {
          "name": "distanceToOffsetEdge",
          "kind": "re-export",
          "signature": "distanceToOffsetEdge",
          "summary": ""
        },
        {
          "name": "distanceToOffsetPlane",
          "kind": "re-export",
          "signature": "distanceToOffsetPlane",
          "summary": ""
        },
        {
          "name": "distanceToOffsetSphere",
          "kind": "re-export",
          "signature": "distanceToOffsetSphere",
          "summary": ""
        },
        {
          "name": "distanceToOffsetTriangle",
          "kind": "re-export",
          "signature": "distanceToOffsetTriangle",
          "summary": ""
        },
        {
          "name": "enablePhysXSpeculativeCCD",
          "kind": "re-export",
          "signature": "enablePhysXSpeculativeCCD",
          "summary": ""
        },
        {
          "name": "expandAABBByVelocity",
          "kind": "re-export",
          "signature": "expandAABBByVelocity",
          "summary": ""
        },
        {
          "name": "getArticulationLinkTransforms",
          "kind": "re-export",
          "signature": "getArticulationLinkTransforms",
          "summary": ""
        },
        {
          "name": "getBody",
          "kind": "re-export",
          "signature": "getBody",
          "summary": ""
        },
        {
          "name": "getColliderShapeId",
          "kind": "re-export",
          "signature": "getColliderShapeId",
          "summary": ""
        },
        {
          "name": "getColliderShapeName",
          "kind": "re-export",
          "signature": "getColliderShapeName",
          "summary": ""
        },
        {
          "name": "getCollisionMask",
          "kind": "re-export",
          "signature": "getCollisionMask",
          "summary": ""
        },
        {
          "name": "getPhysXJointCapabilities",
          "kind": "re-export",
          "signature": "getPhysXJointCapabilities",
          "summary": ""
        },
        {
          "name": "getPhysicsMaterial",
          "kind": "re-export",
          "signature": "getPhysicsMaterial",
          "summary": ""
        },
        {
          "name": "getSimModeId",
          "kind": "re-export",
          "signature": "getSimModeId",
          "summary": ""
        },
        {
          "name": "getSimModeName",
          "kind": "re-export",
          "signature": "getSimModeName",
          "summary": ""
        },
        {
          "name": "groupByColor",
          "kind": "re-export",
          "signature": "groupByColor",
          "summary": ""
        },
        {
          "name": "hashCell",
          "kind": "re-export",
          "signature": "hashCell",
          "summary": ""
        },
        {
          "name": "hullsToCompoundCollider",
          "kind": "re-export",
          "signature": "hullsToCompoundCollider",
          "summary": ""
        },
        {
          "name": "indexTo3D",
          "kind": "re-export",
          "signature": "indexTo3D",
          "summary": ""
        },
        {
          "name": "layersCollide",
          "kind": "re-export",
          "signature": "layersCollide",
          "summary": ""
        },
        {
          "name": "morton3D",
          "kind": "re-export",
          "signature": "morton3D",
          "summary": ""
        },
        {
          "name": "normalizedBarrierEnergy",
          "kind": "re-export",
          "signature": "normalizedBarrierEnergy",
          "summary": ""
        },
        {
          "name": "positionToIndex",
          "kind": "re-export",
          "signature": "positionToIndex",
          "summary": ""
        },
        {
          "name": "quadraticBSpline",
          "kind": "re-export",
          "signature": "quadraticBSpline",
          "summary": ""
        },
        {
          "name": "quadraticBSplineGrad",
          "kind": "re-export",
          "signature": "quadraticBSplineGrad",
          "summary": ""
        },
        {
          "name": "raycastWorld",
          "kind": "re-export",
          "signature": "raycastWorld",
          "summary": ""
        },
        {
          "name": "registerConvexMesh",
          "kind": "re-export",
          "signature": "registerConvexMesh",
          "summary": ""
        },
        {
          "name": "registerTriangleMesh",
          "kind": "re-export",
          "signature": "registerTriangleMesh",
          "summary": ""
        },
        {
          "name": "removeBody",
          "kind": "re-export",
          "signature": "removeBody",
          "summary": ""
        },
        {
          "name": "setBodyKinematic",
          "kind": "re-export",
          "signature": "setBodyKinematic",
          "summary": ""
        },
        {
          "name": "stepPhysicsWorld",
          "kind": "re-export",
          "signature": "stepPhysicsWorld",
          "summary": ""
        },
        {
          "name": "timeOfClosestApproach",
          "kind": "re-export",
          "signature": "timeOfClosestApproach",
          "summary": ""
        },
        {
          "name": "updateWorldMaterial",
          "kind": "re-export",
          "signature": "updateWorldMaterial",
          "summary": ""
        },
        {
          "name": "validateCollider",
          "kind": "re-export",
          "signature": "validateCollider",
          "summary": ""
        },
        {
          "name": "validatePhysicsBody",
          "kind": "re-export",
          "signature": "validatePhysicsBody",
          "summary": ""
        },
        {
          "name": "validatePhysicsMaterial",
          "kind": "re-export",
          "signature": "validatePhysicsMaterial",
          "summary": ""
        },
        {
          "name": "voxelizeMesh",
          "kind": "re-export",
          "signature": "voxelizeMesh",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/ActiveRigController",
      "path": "engine/reference/sim/physics/rig/ActiveRigController.md",
      "source": "engine/sim/physics/rig/ActiveRigController.js",
      "import": "/engine/sim/physics/rig/ActiveRigController.js",
      "sourceHash": "2f398c787854f0b198c2ce142639e68f08bf61d46ba536e16160f065789d6903",
      "summary": "",
      "exports": [
        {
          "name": "ActiveRigController",
          "kind": "class",
          "signature": "class ActiveRigController",
          "summary": ""
        },
        {
          "name": "createActiveRigController",
          "kind": "function",
          "signature": "createActiveRigController(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/ActiveRigSchema",
      "path": "engine/reference/sim/physics/rig/ActiveRigSchema.md",
      "source": "engine/sim/physics/rig/ActiveRigSchema.js",
      "import": "/engine/sim/physics/rig/ActiveRigSchema.js",
      "sourceHash": "9fd59c80cea1ad3fee7294ddc9f1d93f4ab599f318e925cdde0aafbfda58fb24",
      "summary": "",
      "exports": [
        {
          "name": "createDriveAxis",
          "kind": "function",
          "signature": "createDriveAxis(options = {})",
          "summary": ""
        },
        {
          "name": "frequencyToDrive",
          "kind": "function",
          "signature": "frequencyToDrive({ frequencyHz = 4.5, dampingRatio = 1.0, effectiveMass = 1, mode = DRIVE_MODES.acceleration } = {})",
          "summary": ""
        },
        {
          "name": "getJointTorqueBudget",
          "kind": "function",
          "signature": "getJointTorqueBudget(jointType, massKg = 80, presetName = 'HumanAverage', tier = 'avg')",
          "summary": ""
        },
        {
          "name": "createDriveProfile",
          "kind": "function",
          "signature": "createDriveProfile({ joints = [], massKg = 80, preset = 'HumanAverage', frequencyHz = 4.5, dampingRatio = 1.0, driveMode = DRIVE_MODES.acceleration } = {})",
          "summary": ""
        },
        {
          "name": "createPoseBufferFromRig",
          "kind": "function",
          "signature": "createPoseBufferFromRig(rig = {})",
          "summary": ""
        },
        {
          "name": "createActiveRigConfig",
          "kind": "function",
          "signature": "createActiveRigConfig(options = {})",
          "summary": ""
        },
        {
          "name": "inferJointDriveType",
          "kind": "function",
          "signature": "inferJointDriveType(name = '')",
          "summary": ""
        },
        {
          "name": "ACTIVE_RIG_BACKENDS",
          "kind": "constant",
          "signature": "ACTIVE_RIG_BACKENDS",
          "summary": ""
        },
        {
          "name": "ACTIVE_RIG_STATES",
          "kind": "constant",
          "signature": "ACTIVE_RIG_STATES",
          "summary": ""
        },
        {
          "name": "DRIVE_MODES",
          "kind": "constant",
          "signature": "DRIVE_MODES",
          "summary": ""
        },
        {
          "name": "POSE_BLEND_MODES",
          "kind": "constant",
          "signature": "POSE_BLEND_MODES",
          "summary": ""
        },
        {
          "name": "ACTIVE_RIG_AXES",
          "kind": "constant",
          "signature": "ACTIVE_RIG_AXES",
          "summary": ""
        },
        {
          "name": "HUMAN_MASS_FRACTIONS",
          "kind": "constant",
          "signature": "HUMAN_MASS_FRACTIONS",
          "summary": ""
        },
        {
          "name": "HUMAN_JOINT_TORQUE_NM_PER_KG",
          "kind": "constant",
          "signature": "HUMAN_JOINT_TORQUE_NM_PER_KG",
          "summary": ""
        },
        {
          "name": "ACTIVE_RIG_PRESETS",
          "kind": "constant",
          "signature": "ACTIVE_RIG_PRESETS",
          "summary": ""
        },
        {
          "name": "DEFAULT_ACTIVE_RIG_CONFIG",
          "kind": "constant",
          "signature": "DEFAULT_ACTIVE_RIG_CONFIG",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/BalanceController",
      "path": "engine/reference/sim/physics/rig/BalanceController.md",
      "source": "engine/sim/physics/rig/BalanceController.js",
      "import": "/engine/sim/physics/rig/BalanceController.js",
      "sourceHash": "1bab629c5ceb06b8e1cf5cf5433d3fee95adbb5e57ef0bd25bbdf80f0ceeeb07",
      "summary": "",
      "exports": [
        {
          "name": "BalanceController",
          "kind": "class",
          "signature": "class BalanceController",
          "summary": ""
        },
        {
          "name": "estimateCenterOfMass",
          "kind": "function",
          "signature": "estimateCenterOfMass(joints = {}, fallback = [0, 0, 0])",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/CharacterPhysicsAssetAdapter",
      "path": "engine/reference/sim/physics/rig/CharacterPhysicsAssetAdapter.md",
      "source": "engine/sim/physics/rig/CharacterPhysicsAssetAdapter.js",
      "import": "/engine/sim/physics/rig/CharacterPhysicsAssetAdapter.js",
      "sourceHash": "128a84b4e8060093c0be88c95287046f62b3fc15c686fb4f71d235c3db2e2bff",
      "summary": "engine/sim/physics/rig/CharacterPhysicsAssetAdapter.js — converts a CharacterPhysicsAsset (engine/assets/rig/CharacterPhysicsAsset.js) into the { parts, joints, bodies } rig shape ActiveRigController expects.  This is the Phase 1 fix for the ragdoll stack's root-cause bug: StickmanActiveRigAdapter.js only ever read the hand-authored StickmanRagdoll ECS shape, completely disconnected from RagdollBuilder/JointLimits' output — meaning PhysX built joints from different axis/limit data than RagdollSim did, so systems disagreed about which way an elbow/knee should bend. This adapter reads the SAME asset.jointDefs (axis/swingDeg/twistDeg/motion/ frameA/frameB) that RagdollSim consumes, so PhysX and the Verlet fallback now agree by construction.",
      "exports": [
        {
          "name": "createActiveRigFromCharacterPhysicsAsset",
          "kind": "function",
          "signature": "createActiveRigFromCharacterPhysicsAsset(asset, options = {})",
          "summary": "Build an ActiveRigController-compatible rig descriptor from a CharacterPhysicsAsset."
        },
        {
          "name": "createActiveRigControllerOptionsFromCharacterPhysicsAsset",
          "kind": "function",
          "signature": "createActiveRigControllerOptionsFromCharacterPhysicsAsset(asset, options = {})",
          "summary": "Build the full option bag `new ActiveRigController(options)` expects, from a CharacterPhysicsAsset — the CharacterPhysicsAsset equivalent of `createActiveRigControllerOptionsFromStickman`."
        },
        {
          "name": "createRetargetGraphFromBodyDefs",
          "kind": "function",
          "signature": "createRetargetGraphFromBodyDefs(bodyDefs = [])",
          "summary": "Trivial identity retarget graph (physics joint id === render bone id/slot)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/MuscleLayer",
      "path": "engine/reference/sim/physics/rig/MuscleLayer.md",
      "source": "engine/sim/physics/rig/MuscleLayer.js",
      "import": "/engine/sim/physics/rig/MuscleLayer.js",
      "sourceHash": "1daa430d6683dfc3538f4c8e3a9e7e175a93dc4b29b87dd41cfc8f93d1eac686",
      "summary": "",
      "exports": [
        {
          "name": "MuscleLayer",
          "kind": "class",
          "signature": "class MuscleLayer",
          "summary": ""
        },
        {
          "name": "MUSCLE_GROUPS",
          "kind": "constant",
          "signature": "MUSCLE_GROUPS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/PoseStateGraph",
      "path": "engine/reference/sim/physics/rig/PoseStateGraph.md",
      "source": "engine/sim/physics/rig/PoseStateGraph.js",
      "import": "/engine/sim/physics/rig/PoseStateGraph.js",
      "sourceHash": "fba564e92a7cb7675d35875753a29d6a14485142020917a14e90a0b1d82f6b59",
      "summary": "",
      "exports": [
        {
          "name": "PoseStateGraph",
          "kind": "class",
          "signature": "class PoseStateGraph",
          "summary": ""
        },
        {
          "name": "createPoseStateGraph",
          "kind": "function",
          "signature": "createPoseStateGraph(options = {})",
          "summary": ""
        },
        {
          "name": "resolveRequestedPoseState",
          "kind": "function",
          "signature": "resolveRequestedPoseState(intent = {}, fallback = 'idle_stand')",
          "summary": ""
        },
        {
          "name": "DEFAULT_POSE_STATES",
          "kind": "constant",
          "signature": "DEFAULT_POSE_STATES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/RetargetGraph",
      "path": "engine/reference/sim/physics/rig/RetargetGraph.md",
      "source": "engine/sim/physics/rig/RetargetGraph.js",
      "import": "/engine/sim/physics/rig/RetargetGraph.js",
      "sourceHash": "3380b40e6d1b29fdd911fa1b93917626a73f0869098ca9dcec8534e823b4dfd2",
      "summary": "",
      "exports": [
        {
          "name": "RetargetGraph",
          "kind": "class",
          "signature": "class RetargetGraph",
          "summary": ""
        },
        {
          "name": "PoseBlendState",
          "kind": "class",
          "signature": "class PoseBlendState",
          "summary": ""
        },
        {
          "name": "createEmptyPoseBuffer",
          "kind": "function",
          "signature": "createEmptyPoseBuffer()",
          "summary": ""
        },
        {
          "name": "createPoseJoint",
          "kind": "function",
          "signature": "createPoseJoint(id, options = {})",
          "summary": ""
        },
        {
          "name": "clonePoseBuffer",
          "kind": "function",
          "signature": "clonePoseBuffer(pose)",
          "summary": ""
        },
        {
          "name": "blendPoseBuffers",
          "kind": "function",
          "signature": "blendPoseBuffers(a, b, t)",
          "summary": ""
        },
        {
          "name": "poseFromJointArray",
          "kind": "function",
          "signature": "poseFromJointArray(joints = [])",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/StickmanActiveRigAdapter",
      "path": "engine/reference/sim/physics/rig/StickmanActiveRigAdapter.md",
      "source": "engine/sim/physics/rig/StickmanActiveRigAdapter.js",
      "import": "/engine/sim/physics/rig/StickmanActiveRigAdapter.js",
      "sourceHash": "b70677366f931c1517debfe88923d50fd790a3ec840b6512d49891e656671629",
      "summary": "",
      "exports": [
        {
          "name": "createActiveRigFromStickman",
          "kind": "function",
          "signature": "createActiveRigFromStickman(stickman = {}, options = {})",
          "summary": ""
        },
        {
          "name": "createActiveRigControllerOptionsFromStickman",
          "kind": "function",
          "signature": "createActiveRigControllerOptionsFromStickman(stickman = {}, options = {})",
          "summary": ""
        },
        {
          "name": "createStickmanRetargetGraph",
          "kind": "function",
          "signature": "createStickmanRetargetGraph(bodies = [])",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/rig/index",
      "path": "engine/reference/sim/physics/rig/index.md",
      "source": "engine/sim/physics/rig/index.js",
      "import": "/engine/sim/physics/rig/index.js",
      "sourceHash": "7c5513cd75e53b4c19f2d1c63fad9c83a16e292b81f6d87d7a2fa64cba391fbf",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/VehicleBindings",
      "path": "engine/reference/sim/physics/vehicle/VehicleBindings.md",
      "source": "engine/sim/physics/vehicle/VehicleBindings.js",
      "import": "/engine/sim/physics/vehicle/VehicleBindings.js",
      "sourceHash": "97b09e236b670ca6ee5285cfb98b8512cc1f92f1686147d053132c7a03ce0ae1",
      "summary": "Vehicle2 WebIDL capability adapters. The generated declaration exposes several helpers as statics while the emitted JavaScript places them on the constructor prototype, so all vehicle code crosses that mismatch here.",
      "exports": [
        {
          "name": "vehicleTopLevelFunctions",
          "kind": "function",
          "signature": "vehicleTopLevelFunctions(PhysX)",
          "summary": ""
        },
        {
          "name": "tireForceExtension",
          "kind": "function",
          "signature": "tireForceExtension(PhysX)",
          "summary": ""
        },
        {
          "name": "ensureVehicleExtension",
          "kind": "function",
          "signature": "ensureVehicleExtension(PhysX, foundation)",
          "summary": ""
        },
        {
          "name": "isPhysXVehicleSupported",
          "kind": "function",
          "signature": "isPhysXVehicleSupported(world)",
          "summary": ""
        },
        {
          "name": "destroyTracked",
          "kind": "function",
          "signature": "destroyTracked(PhysX, tracked)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/VehicleChassis",
      "path": "engine/reference/sim/physics/vehicle/VehicleChassis.md",
      "source": "engine/sim/physics/vehicle/VehicleChassis.js",
      "import": "/engine/sim/physics/vehicle/VehicleChassis.js",
      "sourceHash": "21afd7427fa0a76b97a041f3d7d2fc0116369244a7f547050ffae724a108f640",
      "summary": "",
      "exports": [
        {
          "name": "configureVehicleChassis",
          "kind": "function",
          "signature": "configureVehicleChassis(PhysX, vehicle, config, alloc)",
          "summary": ""
        },
        {
          "name": "initializeVehicleActor",
          "kind": "function",
          "signature": "initializeVehicleActor(PhysX, topLevel, world, vehicle, config, alloc)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/VehicleConfig",
      "path": "engine/reference/sim/physics/vehicle/VehicleConfig.md",
      "source": "engine/sim/physics/vehicle/VehicleConfig.js",
      "import": "/engine/sim/physics/vehicle/VehicleConfig.js",
      "sourceHash": "2668e06d78fa5abae23fa844fd8682a85603d409951433eab8c3d15a01c316bb",
      "summary": "",
      "exports": [
        {
          "name": "resolveVehicleConfig",
          "kind": "function",
          "signature": "resolveVehicleConfig(options = {})",
          "summary": ""
        },
        {
          "name": "arrayAt",
          "kind": "function",
          "signature": "arrayAt(owner, field, index)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/VehicleController",
      "path": "engine/reference/sim/physics/vehicle/VehicleController.md",
      "source": "engine/sim/physics/vehicle/VehicleController.js",
      "import": "/engine/sim/physics/vehicle/VehicleController.js",
      "sourceHash": "fee817699995c08e921c4252aa967937a925278883e17753d1626b035d1d1941",
      "summary": "",
      "exports": [
        {
          "name": "createVehicleController",
          "kind": "function",
          "signature": "createVehicleController({ PhysX, world, topLevel, vehicle, actor, context, sweepMesh, tracked, config, gears, })",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/VehicleDrivetrain",
      "path": "engine/reference/sim/physics/vehicle/VehicleDrivetrain.md",
      "source": "engine/sim/physics/vehicle/VehicleDrivetrain.js",
      "import": "/engine/sim/physics/vehicle/VehicleDrivetrain.js",
      "sourceHash": "09845e26802d23f75bbe4a7b133ba4215c2038554ae7ed64e889a940f71ecbdc",
      "summary": "",
      "exports": [
        {
          "name": "configureVehicleDrivetrain",
          "kind": "function",
          "signature": "configureVehicleDrivetrain(PhysX, vehicle)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/VehicleEngine",
      "path": "engine/reference/sim/physics/vehicle/VehicleEngine.md",
      "source": "engine/sim/physics/vehicle/VehicleEngine.js",
      "import": "/engine/sim/physics/vehicle/VehicleEngine.js",
      "sourceHash": "539ec7587a3b5bf938ffdc02c26093c7314060c242989e99c842bf035c68b413",
      "summary": "",
      "exports": [
        {
          "name": "configureVehicleEngine",
          "kind": "function",
          "signature": "configureVehicleEngine(vehicle, config)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/VehicleWheels",
      "path": "engine/reference/sim/physics/vehicle/VehicleWheels.md",
      "source": "engine/sim/physics/vehicle/VehicleWheels.js",
      "import": "/engine/sim/physics/vehicle/VehicleWheels.js",
      "sourceHash": "b932b4eaffd16b35263b15cb30bf0e39431c6a6d004edaa23937e8db7f74a818",
      "summary": "",
      "exports": [
        {
          "name": "configureVehicleWheels",
          "kind": "function",
          "signature": "configureVehicleWheels(PhysX, topLevel, vehicle, config, alloc)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/physics/vehicle/index",
      "path": "engine/reference/sim/physics/vehicle/index.md",
      "source": "engine/sim/physics/vehicle/index.js",
      "import": "/engine/sim/physics/vehicle/index.js",
      "sourceHash": "0c8d20ac95b04ef47c0c3324f7b3ab839d65211ec2ac35c21cdcd6d206fa3988",
      "summary": "Build a complete PhysX Vehicle2 car from independently owned subsystems.",
      "exports": [
        {
          "name": "createPhysXVehicle",
          "kind": "function",
          "signature": "createPhysXVehicle(world, options = {})",
          "summary": "Build a complete PhysX Vehicle2 car from independently owned subsystems."
        },
        {
          "name": "isPhysXVehicleSupported",
          "kind": "re-export",
          "signature": "isPhysXVehicleSupported",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/world/WindSimulation",
      "path": "engine/reference/sim/world/WindSimulation.md",
      "source": "engine/sim/world/WindSimulation.js",
      "import": "/engine/sim/world/WindSimulation.js",
      "sourceHash": "b69d30783a2f75705041704fd336413a0dca5a330d8e08b23b3ed914eb5a5475",
      "summary": "Procedural Weather System - Grid-based weather simulation Simulates coupled ODE system for: - Temperature (fed by sunshine, decreased by rain/altitude) - Humidity (fed by water evaporation, lost to rain) - Clouds (appear above temp/humidity thresholds) - Precipitation (impulsive rain from cooling humid air) - Wind (convects temperature and humidity)",
      "exports": [
        {
          "name": "WindSimulation",
          "kind": "class",
          "signature": "class WindSimulation",
          "summary": ""
        },
        {
          "name": "ProceduralWeather",
          "kind": "class",
          "signature": "class ProceduralWeather",
          "summary": "Procedural Weather System - Grid-based weather simulation Simulates coupled ODE system for: - Temperature (fed by sunshine, decreased by rain/altitude) - Humidity (fed by water evaporation, lost to rain) - Clouds (appear above temp/humidity thresholds) - Precipitation (impulsive rain from cooling humid air) - Wind (convects temperature and humidity)"
        },
        {
          "name": "VolumetricClouds",
          "kind": "class",
          "signature": "class VolumetricClouds",
          "summary": "Volumetric Cloud Generator - Raymarched 3D density clouds INTEGRATION: - Uses GPU particles for cloud puffs/wisps - Uses WindSimulation for cloud advection - Uses SpatialHashCompute for LOD particle culling Uses multi-octave noise for cloud density with: - Wind advection from LBM simulation - Rayleigh/Mie scattering for realistic lighting - LOD based on ray distance"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/world/WindSystem",
      "path": "engine/reference/sim/world/WindSystem.md",
      "source": "engine/sim/world/WindSystem.js",
      "import": "/engine/sim/world/WindSystem.js",
      "sourceHash": "be6e0f04d8c530906e8bf6fe05ff3fdc0fd69062e9456eb53422868ae9e55d7c",
      "summary": "WindSystem.js - Global Wind Simulation Provides wind data for vegetation, particles, cloth, etc. Features gusts, turbulence, and directional wind",
      "exports": [
        {
          "name": "WindSystem",
          "kind": "class",
          "signature": "class WindSystem",
          "summary": "WindSystem.js - Global Wind Simulation Provides wind data for vegetation, particles, cloth, etc. Features gusts, turbulence, and directional wind"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "sim/world/WorldSim",
      "path": "engine/reference/sim/world/WorldSim.md",
      "source": "engine/sim/world/WorldSim.js",
      "import": "/engine/sim/world/WorldSim.js",
      "sourceHash": "70f0220e76173e4f4689a1f6a8c161e8b31b835b95dde9862af9e172577ddf58",
      "summary": "",
      "exports": [
        {
          "name": "createWorldSim",
          "kind": "function",
          "signature": "createWorldSim(options = {})",
          "summary": ""
        },
        {
          "name": "destroyWorldSim",
          "kind": "function",
          "signature": "destroyWorldSim(worldSim)",
          "summary": ""
        },
        {
          "name": "stepWorldSim",
          "kind": "function",
          "signature": "stepWorldSim(worldSim, deltaSeconds, options = {})",
          "summary": ""
        },
        {
          "name": "sampleTerrainHeight",
          "kind": "function",
          "signature": "sampleTerrainHeight(worldSim, worldX, worldZ)",
          "summary": ""
        },
        {
          "name": "getWorldSimSnapshot",
          "kind": "function",
          "signature": "getWorldSimSnapshot(worldSim)",
          "summary": ""
        },
        {
          "name": "exportWorldSimState",
          "kind": "function",
          "signature": "exportWorldSimState(worldSim, options = {})",
          "summary": ""
        },
        {
          "name": "createWorldSimFromState",
          "kind": "function",
          "signature": "createWorldSimFromState(state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/authority/Capability",
      "path": "engine/reference/state/authority/Capability.md",
      "source": "engine/state/authority/Capability.js",
      "import": "/engine/state/authority/Capability.js",
      "sourceHash": "6ae58a8f8791eb90d7657efa3af1c642c62d9bd095dccdfaa196dc2a9bd794b5",
      "summary": "state/authority/Capability.js — scoped, attenuable, revocable authority (spec §12).  Observation does NOT imply permission (spec rule 29). A capability names a principal, an object, an allowed action, scope/constraints, expiry, and whether it is single-use. Following Macaroons, a capability can be ATTENUATED by adding caveats (narrowing who/where/when/what) — never widened. Critical single-use capabilities are themselves USOs (consumed on use). Authority is re-checked at commit, closing the time-of-check/time-of-use gap.",
      "exports": [
        {
          "name": "makeCapability",
          "kind": "function",
          "signature": "makeCapability(c = {})",
          "summary": "Mint a capability."
        },
        {
          "name": "attenuate",
          "kind": "function",
          "signature": "attenuate(cap, caveat)",
          "summary": "Attenuate a capability by adding a caveat. The result is a NEW capability that is strictly narrower; it can never grant more than its parent (spec rule 30, CSE rule \"a capability cannot grant rights beyond its issuer's rights\")."
        },
        {
          "name": "authorizes",
          "kind": "function",
          "signature": "authorizes(cap, { principal, object, action, epoch, context = {} } = {})",
          "summary": "Test whether a capability authorizes an action in a context. Checks object/action match, expiry, and every caveat predicate. Does NOT check revocation — that lives in the registry (online status, spec rule 31)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/authority/CapabilityRegistry",
      "path": "engine/reference/state/authority/CapabilityRegistry.md",
      "source": "engine/state/authority/CapabilityRegistry.js",
      "import": "/engine/state/authority/CapabilityRegistry.js",
      "sourceHash": "16bbd9f2d16b24beaf91a1ebea1ce0ed0d15c1210e1a4d953e288cc88c556985",
      "summary": "state/authority/CapabilityRegistry.js — registry + revocation (spec §6,§12).  Holds issued capabilities and a revocation set. A revoked critical capability can never commit (safety invariant, spec §19). Revocation-sensitive capabilities require an online status check at commit, so the coordinator asks the registry — not a cached plan — whether a capability is still valid.",
      "exports": [
        {
          "name": "CapabilityRegistry",
          "kind": "class",
          "signature": "class CapabilityRegistry",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/authority/Identity",
      "path": "engine/reference/state/authority/Identity.md",
      "source": "engine/state/authority/Identity.js",
      "import": "/engine/state/authority/Identity.js",
      "sourceHash": "7d22bc018dc405e5fbde98d3326a15323a901dd5a181d9a6b4359fd5a73ddf48",
      "summary": "state/authority/Identity.js — pluggable signer for the Authority plane (spec §12).  Authority is explicit and bound to a signing key, not an ambient bearer token (spec rule 30, CSE rule 1). This wraps the engine's existing ECDSA P-256 identity (engine/collab/CollabIdentity.js) behind a minimal signer interface so the commit coordinator can verify signatures at commit time. When SubtleCrypto is unavailable it degrades to a deterministic FNV stamp — usable for local dev, but `secure:false` flags that it carries no cryptographic guarantee.",
      "exports": [
        {
          "name": "createSigner",
          "kind": "function",
          "signature": "async createSigner(principal, opts = {})",
          "summary": "Create an authority signer bound to a principal id. Each distinct principal gets its OWN persisted ECDSA P-256 keypair (via CollabIdentity's named-key support) rather than sharing the single default device key. This lets the same device host multiple unlinkable signers — e.g. a stable `profile:<id>` identity and per-group pseudonymous `membership:<groupId>:<profileId>` identities (engine/network/identity) — without one leaking the other's fingerprint."
        },
        {
          "name": "verifyWithKey",
          "kind": "function",
          "signature": "async verifyWithKey(publicKeyHex, data, signatureHex)",
          "summary": "Verify a signature against an explicit public key (cross-actor verification)."
        },
        {
          "name": "computeFingerprint",
          "kind": "re-export",
          "signature": "computeFingerprint",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/authority/PolicyEngine",
      "path": "engine/reference/state/authority/PolicyEngine.md",
      "source": "engine/state/authority/PolicyEngine.js",
      "import": "/engine/state/authority/PolicyEngine.js",
      "sourceHash": "0549c73affee4f07052c64c052e10563d12c4f4350337a1aa8e30ce4d615bd6e",
      "summary": "state/authority/PolicyEngine.js — Authority-plane policy engine + approval/risk gates (spec §3 plane 6, rules 30, 34).  Capabilities say WHAT a principal may do; policy says under WHICH conditions it is currently allowed, and which actions need human/authority approval before they may commit. The engine evaluates ordered rules (deny overrides allow) and classifies an action's risk; irreversible / high-risk actions are gated behind an explicit approval that must be present at commit time — closing the time-of-check/time-of-use gap together with the capability re-check (rule 31). Policy is versioned (rule 5) so receipts can record which policy decided.",
      "exports": [
        {
          "name": "PolicyEngine",
          "kind": "class",
          "signature": "class PolicyEngine",
          "summary": ""
        },
        {
          "name": "policyRule",
          "kind": "function",
          "signature": "policyRule(r)",
          "summary": ""
        },
        {
          "name": "RISK_LEVEL",
          "kind": "constant",
          "signature": "RISK_LEVEL",
          "summary": ""
        },
        {
          "name": "DECISION",
          "kind": "constant",
          "signature": "DECISION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/causal/CausalParents",
      "path": "engine/reference/state/causal/CausalParents.md",
      "source": "engine/state/causal/CausalParents.js",
      "import": "/engine/state/causal/CausalParents.js",
      "sourceHash": "5aac5c5b88a71890be52cf400384dec19350ba0d1d6c797c24826a32d3ba4f35",
      "summary": "state/causal/CausalParents.js — partial order over committed events (spec §2,§9).  Lamport's happened-before: causal relationships establish a partial order; concurrent events need not have a global order. This Causal Plane tracks the DAG of committed ids (commits, observations) so a new transaction can declare `causalParents` and the coordinator can verify those parents are known before committing. It reuses the partial-order toposort from facts/Causality.js for deterministic projection of the known causal graph.",
      "exports": [
        {
          "name": "CausalGraph",
          "kind": "class",
          "signature": "class CausalGraph",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/causal/DottedVersionVector",
      "path": "engine/reference/state/causal/DottedVersionVector.md",
      "source": "engine/state/causal/DottedVersionVector.js",
      "import": "/engine/state/causal/DottedVersionVector.js",
      "sourceHash": "30732395b15dbd7de7e0a565f6e9026e32d0f69d046f7215a4d619ecbd971846",
      "summary": "state/causal/DottedVersionVector.js — precise concurrent-version causality (spec §9 \"Causal time\", rule 8/9).  A VersionVector summarizes \"what I have seen\" per node and gives a partial order: equal / before / after / concurrent. Dotted version vectors (Preguiça et al.) add the ability to track each write as an isolated event (a \"dot\") so concurrent writes are kept as explicit SIBLINGS instead of being silently lost or forcing per-client metadata to grow without bound. This is the causality backbone the Causal Plane uses to decide when order is genuinely required.",
      "exports": [
        {
          "name": "VersionVector",
          "kind": "class",
          "signature": "class VersionVector",
          "summary": ""
        },
        {
          "name": "DVVSet",
          "kind": "class",
          "signature": "class DVVSet",
          "summary": "A dotted-version-vector set for ONE logical key: stores the current value(s) plus the causal history at which each was written. Concurrent writes survive as siblings; a write that causally dominates a value replaces it."
        },
        {
          "name": "ORDER",
          "kind": "constant",
          "signature": "ORDER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/causal/HLC",
      "path": "engine/reference/state/causal/HLC.md",
      "source": "engine/state/causal/HLC.js",
      "import": "/engine/state/causal/HLC.js",
      "sourceHash": "48a3e2efa12df1e8ba7369b3ba7b6b560bae3b589f90f6b5a28f271b45e30c23",
      "summary": "state/causal/HLC.js — Hybrid Logical Clock (spec §9 \"Operational time\", rule 11).  An HLC (Kulkarni et al.) combines a logical clock's causal guarantees with a timestamp that stays close to physical time. Each timestamp is (l, c): `l` tracks the max physical time observed, `c` is a bounded counter that breaks ties when events share the same `l`. HLC gives a total order consistent with causality (if A → B then ts(A) < ts(B)) while remaining readable as wall time.  IMPORTANT (rule 11): a timestamp NEVER establishes authority, ownership, or uniqueness on its own — HLC orders events; the commit protocol decides truth.",
      "exports": [
        {
          "name": "HLC",
          "kind": "class",
          "signature": "class HLC",
          "summary": ""
        },
        {
          "name": "compareHLC",
          "kind": "function",
          "signature": "compareHLC(a, b)",
          "summary": "Compare two HLC timestamps {l,c}. Returns -1, 0, or 1."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/codebook/CodeEntry",
      "path": "engine/reference/state/codebook/CodeEntry.md",
      "source": "engine/state/codebook/CodeEntry.js",
      "import": "/engine/state/codebook/CodeEntry.js",
      "sourceHash": "c87bef0fb15484cd2c1e810e609f24e79b7a5e834d978e9ddf36af51ab888915",
      "summary": "state/codebook/CodeEntry.js — the layered code packet. NOT one magic number: each field has exactly one job and never pretends to be another.  denseID        fast runtime handle exactID        literal pattern identity (9-bit packed / canonical) spatialID      where it belongs in space   (filled by the spatial layer, M2) resonanceVector what it resembles          (filled by the resonance layer, M3) correctionCode how to repair corruption    (filled by the correction layer, M5) hashID         have we seen this exact thing symbolicSig    what it MEANS (optional)",
      "exports": [
        {
          "name": "makeCodeEntry",
          "kind": "function",
          "signature": "makeCodeEntry(rawId, opts = {})",
          "summary": "Build a CodeEntry for a raw 3x3 pattern. Later layers enrich the null fields: spatialID (M2 SpatialCode), resonanceVector (M3 Transforms), correctionCode (M5 CorrectionGate). Keeping them explicitly null preserves the layer law — a missing layer is visibly missing, never faked."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/codebook/PatternCodebook",
      "path": "engine/reference/state/codebook/PatternCodebook.md",
      "source": "engine/state/codebook/PatternCodebook.js",
      "import": "/engine/state/codebook/PatternCodebook.js",
      "sourceHash": "1f081287566473f20ea6ce1f02cd98190384f983fd582515194d554dd99e5513",
      "summary": "state/codebook/PatternCodebook.js — Phase 1 of the URC pipeline: raw 3x3 block -> 9-bit exact id -> canonical (rotations/flips) -> dense id + hash id + nearest legal attractor (Hamming distance).  This is the smallest stable codebook. Bigger blocks (8x8 DCT, 32x32 wavelets) plug into the resonance layer later; the contract here is: a raw pattern maps deterministically to a stable codebook entry.",
      "exports": [
        {
          "name": "PatternCodebook",
          "kind": "class",
          "signature": "class PatternCodebook",
          "summary": ""
        },
        {
          "name": "packPattern",
          "kind": "function",
          "signature": "packPattern(cells)",
          "summary": "Pack a length-9 array of truthy/0 cells (row-major) into a 9-bit id (0..511)."
        },
        {
          "name": "unpackPattern",
          "kind": "function",
          "signature": "unpackPattern(id)",
          "summary": "Unpack a 9-bit id back into a length-9 Uint8Array (row-major)."
        },
        {
          "name": "hammingDistance",
          "kind": "function",
          "signature": "hammingDistance(a, b)",
          "summary": "Number of differing cells between two packed 3x3 patterns."
        },
        {
          "name": "symmetries",
          "kind": "function",
          "signature": "symmetries(id)",
          "summary": "All 8 dihedral symmetries of a packed pattern."
        },
        {
          "name": "canonicalId",
          "kind": "function",
          "signature": "canonicalId(id)",
          "summary": "Canonical id = smallest packed id over all dihedral symmetries (rotation/flip invariant)."
        },
        {
          "name": "patternHashId",
          "kind": "function",
          "signature": "patternHashId(rawId)",
          "summary": "Stable content fingerprint for a pattern (hash = identity)."
        },
        {
          "name": "PATTERN_W",
          "kind": "constant",
          "signature": "PATTERN_W",
          "summary": ""
        },
        {
          "name": "PATTERN_H",
          "kind": "constant",
          "signature": "PATTERN_H",
          "summary": ""
        },
        {
          "name": "PATTERN_BITS",
          "kind": "constant",
          "signature": "PATTERN_BITS",
          "summary": ""
        },
        {
          "name": "PATTERN_COUNT",
          "kind": "constant",
          "signature": "PATTERN_COUNT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/codebook/SymbolicSig",
      "path": "engine/reference/state/codebook/SymbolicSig.md",
      "source": "engine/state/codebook/SymbolicSig.js",
      "import": "/engine/state/codebook/SymbolicSig.js",
      "sourceHash": "2e675002b93c14c5fd2354236f682c663faf13fd5cf6f92b1b23ffe31bfa19fa",
      "summary": "state/codebook/SymbolicSig.js — symbolic *meaning* via prime INDICES.  Layer law: \"Primes = symbolic meaning\". We never multiply giant prime products at runtime (that would be slow and pretend to be storage). A symbolic signature is just a sorted set of prime indices; identity stays in hashes, speed stays in dense ids. Two things that look alike (resonance) can still mean opposite things — meaning is checked HERE, not by similarity.",
      "exports": [
        {
          "name": "primeAt",
          "kind": "function",
          "signature": "primeAt(index)",
          "summary": "Prime value for a given index (bounds-checked)."
        },
        {
          "name": "symbolicSig",
          "kind": "function",
          "signature": "symbolicSig(primeIndices)",
          "summary": "Build a symbolic signature: a sorted, de-duplicated vector of prime indices."
        },
        {
          "name": "sigEquals",
          "kind": "function",
          "signature": "sigEquals(a, b)",
          "summary": "Meaning equality — compares index sets, NEVER products."
        },
        {
          "name": "sigContains",
          "kind": "function",
          "signature": "sigContains(sig, sub)",
          "summary": "True if `sub`'s meanings are all present in `sig` (symbolic containment)."
        },
        {
          "name": "PRIME_TABLE",
          "kind": "constant",
          "signature": "PRIME_TABLE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/commit/CommitGate",
      "path": "engine/reference/state/commit/CommitGate.md",
      "source": "engine/state/commit/CommitGate.js",
      "import": "/engine/state/commit/CommitGate.js",
      "sourceHash": "3694364bd5ae2a2739926dd32b5f6a9a3122adf34c3a6f78b4480386791feaa4",
      "summary": "state/commit/CommitGate.js — only commit gates decide FINAL truth.  Core law: \"Similarity may suggest. Facts may branch. Constraints may reject. But only commit gates decide final truth.\" Used for the orderless-unsafe things: inventory, permissions, ownership, money, save overwrite, security, multiplayer hit-confirm, choosing a canonical branch.  A commit applies a delta (adds + tombstones) to a CLONE of the base store, runs COMMIT-strength constraints, then an optional authority check. It never mutates the base — truth is the returned store, with a witness either way.",
      "exports": [
        {
          "name": "createCommitGate",
          "kind": "function",
          "signature": "createCommitGate({ constraints = [], authority = null } = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/commit/CorrectionGate",
      "path": "engine/reference/state/commit/CorrectionGate.md",
      "source": "engine/state/commit/CorrectionGate.js",
      "import": "/engine/state/commit/CorrectionGate.js",
      "sourceHash": "443e38be7020c10ff79257d9abffad3b577e9dfa0076b4a71ce4efafbbbfb86a",
      "summary": "state/commit/CorrectionGate.js — correction is NOT authority.  Tiered policy (the layer law for repair): VISUAL    state may auto-correct (particles, cache, chunk, network-with-confidence) SEMANTIC  state must verify before applying (inventory, save, ...) SECURITY  state must NEVER silently repair (permission, ownership, security)  When unsure: branch / quarantine / request authority — never silently fix. Resonance (nearestAttractor) may SUGGEST the repaired value, but acceptance is decided here, and a security tier can only escalate, never apply.",
      "exports": [
        {
          "name": "correct",
          "kind": "function",
          "signature": "correct({ tier, repaired, verify, unsure = false })",
          "summary": "Decide what to do with a (resonance-)repaired candidate."
        },
        {
          "name": "CORRECTION_TIERS",
          "kind": "constant",
          "signature": "CORRECTION_TIERS",
          "summary": ""
        },
        {
          "name": "CORRECTION_ACTIONS",
          "kind": "constant",
          "signature": "CORRECTION_ACTIONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/consistency/CRDT",
      "path": "engine/reference/state/consistency/CRDT.md",
      "source": "engine/state/consistency/CRDT.js",
      "import": "/engine/state/consistency/CRDT.js",
      "sourceHash": "739bcace58a6dbef5b1c2d98f1284a099eaae80f1ec4f8d159a33ab9d0d41507",
      "summary": "state/consistency/CRDT.js — approved mergeable types (spec §4 \"Mergeable state\", rule 14/36).  State-based CRDTs (CvRDTs): every type exposes a `merge(other)` that is a least-upper-bound join — associative, commutative, and idempotent — so replicas that exchange state in any order/any number of times converge to the same value WITHOUT coordination (CALM / coordination-avoidance). Each merge is non-mutating and returns a NEW instance so the join algebra is easy to test.  IMPORTANT (rule 36): CRDT convergence is NOT proof of application validity. A CRDT may only be used for a value after `InvariantConfluence` confirms its operations preserve the relevant invariants. These types are the approved building blocks, not a license to make any value mergeable.",
      "exports": [
        {
          "name": "GCounter",
          "kind": "class",
          "signature": "class GCounter",
          "summary": ""
        },
        {
          "name": "PNCounter",
          "kind": "class",
          "signature": "class PNCounter",
          "summary": ""
        },
        {
          "name": "GSet",
          "kind": "class",
          "signature": "class GSet",
          "summary": ""
        },
        {
          "name": "ORSet",
          "kind": "class",
          "signature": "class ORSet",
          "summary": ""
        },
        {
          "name": "LWWRegister",
          "kind": "class",
          "signature": "class LWWRegister",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/consistency/InvariantConfluence",
      "path": "engine/reference/state/consistency/InvariantConfluence.md",
      "source": "engine/state/consistency/InvariantConfluence.js",
      "import": "/engine/state/consistency/InvariantConfluence.js",
      "sourceHash": "56caa87917ec33bb39a1e6414528615e7380ba337431d16acb2e2cae5e68ef2d",
      "summary": "state/consistency/InvariantConfluence.js — coordination-avoidance classifier (spec §4, §8 \"Consistency Plane\", rule 35/36).  Invariant confluence (Bailis et al.) is the precise test for whether a set of operations can run WITHOUT coordination: a set of operations is I-confluent with respect to an invariant I if, for any I-valid states reachable from a common ancestor, their merge is also I-valid. If so, replicas may diverge and merge freely (CALM); if not, those operations need a coordinating commit (Exclusive/serializable profile).  This is a BOUNDED, honest classifier (a finite-model property check, in the spirit of §19) — it explores states reachable within `depth` operations and reports a concrete counterexample when it finds one. A \"confluent\" result is evidence within the explored bound, not a closed-form proof.",
      "exports": [
        {
          "name": "classifyConfluence",
          "kind": "function",
          "signature": "classifyConfluence({ initial, merge, invariant, operations, depth = 2 })",
          "summary": "Classify a set of operations for invariant confluence."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/consistency/OptimisticValidator",
      "path": "engine/reference/state/consistency/OptimisticValidator.md",
      "source": "engine/state/consistency/OptimisticValidator.js",
      "import": "/engine/state/consistency/OptimisticValidator.js",
      "sourceHash": "0b8b7c13f58f08d1421721136354258f8e24a75b7b6e26b5b93a8dc4f90ecfea",
      "summary": "state/consistency/OptimisticValidator.js — optimistic read-set / predicate validation and write-skew detection (spec §6, §8, rule 22/24).  The \"Optimistic\" consistency profile reads versions, proposes a replacement, and commits only if every read remained current (MVCC validation). Checking only WRITTEN objects is insufficient: snapshot execution can admit write-skew anomalies involving predicates or separately-read objects. So validation must cover the full declared read-set AND predicates, and a serializability check must detect dangerous rw-antidependency structures between concurrent transactions.",
      "exports": [
        {
          "name": "OptimisticValidator",
          "kind": "class",
          "signature": "class OptimisticValidator",
          "summary": "Validate a transaction's declared read-set and predicates against the current state. Used standalone or alongside the CommitCoordinator's version check."
        },
        {
          "name": "detectWriteSkew",
          "kind": "function",
          "signature": "detectWriteSkew(a, b)",
          "summary": "Detect a write-skew (non-serializable) hazard between two CONCURRENT transactions. Write-skew occurs when each transaction reads data the other writes — two rw-antidependency edges — so both can pass snapshot validation yet jointly violate an invariant coupling the items."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/consistency/Reservation",
      "path": "engine/reference/state/consistency/Reservation.md",
      "source": "engine/state/consistency/Reservation.js",
      "import": "/engine/state/consistency/Reservation.js",
      "sourceHash": "9b66a4f50ddb2b6f074adce0f0aca882dbe8cbd8987743133f5ce24c223f7e42",
      "summary": "state/consistency/Reservation.js — reservations + bounded-counter escrow (spec §5 fragmentation fix, §10, rule 16).  Two coordination-avoidance tools that sit in front of the commit path:  • ReservationManager — a reservation is itself a USO (single-use, exclusive). Reserving a scarce resource creates a reservation output; it is later CONSUMED on commit or RELEASED/expired. A reservation can never be consumed twice (inherits the USO double-commit guarantee), and an expired reservation cannot mutate protected state (liveness: aborted reservation is eventually released).  • BoundedCounterEscrow — divides decrement rights for a scarce quantity among holders so each can withdraw from its local grant WITHOUT coordination, while preserving the lower-bound invariant (quantity never drops below the floor). Coordination is only needed when a holder exhausts its grant and must be rebalanced. This is the escrow / bounded-counter CRDT pattern.",
      "exports": [
        {
          "name": "ReservationManager",
          "kind": "class",
          "signature": "class ReservationManager",
          "summary": ""
        },
        {
          "name": "BoundedCounterEscrow",
          "kind": "class",
          "signature": "class BoundedCounterEscrow",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/consistency/SerializableQueue",
      "path": "engine/reference/state/consistency/SerializableQueue.md",
      "source": "engine/state/consistency/SerializableQueue.js",
      "import": "/engine/state/consistency/SerializableQueue.js",
      "sourceHash": "06db562db27c08e15648e872616b750d1cc93ad99e6a9c7a1b9f3195e962e9d9",
      "summary": "state/consistency/SerializableQueue.js — Consistency-plane serializable commit queue (spec §3 plane 3, §6, §8 \"Serializable\", rule 24).  The \"Exclusive\"/serializable consistency profile needs commits to be applied in an order equivalent to some serial schedule. This queue admits transactions (each declaring a read-set and write-set), assigns a monotonic commit sequence, and detects when admitting a transaction would create a non-serializable schedule against already-queued/committed transactions (a read-write or write-write conflict on overlapping items). Conflicting transactions are not silently interleaved — the queue rejects them for retry, preserving serializability for the invariants that require it.",
      "exports": [
        {
          "name": "SerializableQueue",
          "kind": "class",
          "signature": "class SerializableQueue",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/entity/EntityRegistry",
      "path": "engine/reference/state/entity/EntityRegistry.md",
      "source": "engine/state/entity/EntityRegistry.js",
      "import": "/engine/state/entity/EntityRegistry.js",
      "sourceHash": "a85f6576e260c1de3d6459c74f3c38467c31c37060f40da2a9b6b1c6a8f59447",
      "summary": "state/entity/EntityRegistry.js — versioned entity state (spec §4, rule 2).  A mutable logical object is represented as a chain of immutable versions. The logical entity id stays stable; each version's id is the content hash of its canonical bytes. \"Editing\" creates a new version pointing at its parent — the old version is never mutated. This is what optimistic concurrency reads against: a transaction's readSet declares the version it expected, and the commit fails if the entity has since advanced (write-skew protection).",
      "exports": [
        {
          "name": "EntityRegistry",
          "kind": "class",
          "signature": "class EntityRegistry",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/entity/ProvenanceStore",
      "path": "engine/reference/state/entity/ProvenanceStore.md",
      "source": "engine/state/entity/ProvenanceStore.js",
      "import": "/engine/state/entity/ProvenanceStore.js",
      "sourceHash": "2c0be6746eb31d96d5680d60c6ca9b597983dd6b67bcd11554af9867f497c748",
      "summary": "state/entity/ProvenanceStore.js — every observation, inference, prediction, and commit carries provenance (spec §14, rule 4). Vocabulary follows W3C PROV (entities, activities, agents, generation, derivation). Provenance lets the engine distinguish directly-observed vs inferred vs model-predicted vs stale vs untrusted data — crucial for the prompt-injection boundary (spec §15): retrieved/tool/model content is recorded as untrusted observation, never as authority.",
      "exports": [
        {
          "name": "ProvenanceStore",
          "kind": "class",
          "signature": "class ProvenanceStore",
          "summary": ""
        },
        {
          "name": "makeProvenance",
          "kind": "function",
          "signature": "makeProvenance(p = {})",
          "summary": "Build a provenance record for a subject (a fact, version, or transaction)."
        },
        {
          "name": "isUntrusted",
          "kind": "function",
          "signature": "isUntrusted(prov)",
          "summary": "True if a provenance record came from an untrusted external source."
        },
        {
          "name": "CERTAINTY",
          "kind": "constant",
          "signature": "CERTAINTY",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/entity/SchemaRegistry",
      "path": "engine/reference/state/entity/SchemaRegistry.md",
      "source": "engine/state/entity/SchemaRegistry.js",
      "import": "/engine/state/entity/SchemaRegistry.js",
      "sourceHash": "9349745dde454a08f6e28ad30e088ff0727e7c7d3e1aa08dc66f42504bc463f4",
      "summary": "state/entity/SchemaRegistry.js — meaning from schemas, not numeric tricks (spec rule 3). Every schema/validator/policy is versioned (spec rule 5) so migrations can reference exact stamps. A schema declares a name, a version, and a validate(value) predicate; validation is structural (legality), never a claim of semantic truth — that comes from commit logic.",
      "exports": [
        {
          "name": "SchemaRegistry",
          "kind": "class",
          "signature": "class SchemaRegistry",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/facts/Branch",
      "path": "engine/reference/state/facts/Branch.md",
      "source": "engine/state/facts/Branch.js",
      "import": "/engine/state/facts/Branch.js",
      "sourceHash": "e630ae3d8cb1b8893bf6cc1b0281e24bacdacbbbe6bc1db3fc550a9a98cffd50",
      "summary": "state/facts/Branch.js — split non-commuting possibilities; merge equivalent; prune invalid.  Core law: \"If A + B = B + A, merge them. If A + B != B + A, branch them.\" An operation is a pure function (store) => void that adds facts / tombstones.",
      "exports": [
        {
          "name": "applySequence",
          "kind": "function",
          "signature": "applySequence(store, ops)",
          "summary": "Apply a sequence of operations to a (cloned) store. Returns the store."
        },
        {
          "name": "commutes",
          "kind": "function",
          "signature": "commutes(base, opA, opB)",
          "summary": "Does applying opA then opB yield the same projection as opB then opA?"
        },
        {
          "name": "branchOrders",
          "kind": "function",
          "signature": "branchOrders(base, opA, opB)",
          "summary": "Produce both order-branches [A→B, B→A] from a base store."
        },
        {
          "name": "mergeEquivalent",
          "kind": "function",
          "signature": "mergeEquivalent(stores)",
          "summary": "Collapse branches with identical projections (merge equivalent)."
        },
        {
          "name": "prune",
          "kind": "function",
          "signature": "prune(stores, constraints)",
          "summary": "Drop branches that fail commit-strength constraints (prune invalid)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/facts/Causality",
      "path": "engine/reference/state/facts/Causality.md",
      "source": "engine/state/facts/Causality.js",
      "import": "/engine/state/facts/Causality.js",
      "sourceHash": "d361f493c2972f8cf58d8484f7904113041f327d6682f40805214f42e15ad5d6",
      "summary": "state/facts/Causality.js — partial order ONLY when a dependency forces it.  Layer law: \"Only causality creates before/after\". Facts with no dependency link stay unordered; we never invent sequence. Independent nodes get a deterministic tie-break (canonical sort) purely for reproducibility, not as claimed truth.",
      "exports": [
        {
          "name": "link",
          "kind": "function",
          "signature": "link(cause, effect)",
          "summary": "A causal link: effect depends on cause (cause must precede effect)."
        },
        {
          "name": "toposort",
          "kind": "function",
          "signature": "toposort(nodes, links = [])",
          "summary": "Partial-order sort. Nodes only ordered where links force it; otherwise deterministic by string. Throws on a causal cycle (an impossible order)."
        },
        {
          "name": "dependsOn",
          "kind": "function",
          "signature": "dependsOn(effect, cause, links = [])",
          "summary": "Transitive dependency test: does `effect` (transitively) depend on `cause`?"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/facts/Constraints",
      "path": "engine/reference/state/facts/Constraints.md",
      "source": "engine/state/facts/Constraints.js",
      "import": "/engine/state/facts/Constraints.js",
      "sourceHash": "ac5330d776308ed80833cad4b03f1e21e7bfd3cf3d58bd00c88ea53478169646",
      "summary": "state/facts/Constraints.js — the laws of the system.  Layer law: runtime uses simple validators; commit uses stronger validators (a superset). A constraint never repairs — it accepts or rejects. When a commit constraint fails, the caller branches / quarantines / requests authority (see CommitGate, M5) rather than silently fixing.",
      "exports": [
        {
          "name": "constraint",
          "kind": "function",
          "signature": "constraint(id, test, opts = {})",
          "summary": "Define a constraint."
        },
        {
          "name": "validateFacts",
          "kind": "function",
          "signature": "validateFacts(liveFacts, constraints, { phase = SCOPE_RUNTIME } = {})",
          "summary": "Validate live facts. phase 'runtime' runs only runtime constraints; phase 'commit' runs ALL (runtime + commit) — commit is strictly stronger."
        },
        {
          "name": "atMostOne",
          "kind": "function",
          "signature": "atMostOne(id, pattern, opts = {})",
          "summary": "No more than one live fact matching a regex (single source of truth)."
        },
        {
          "name": "mutuallyExclusive",
          "kind": "function",
          "signature": "mutuallyExclusive(id, a, b, opts = {})",
          "summary": "Two facts must never be live at once (mutual exclusion)."
        },
        {
          "name": "SCOPE_RUNTIME",
          "kind": "constant",
          "signature": "SCOPE_RUNTIME",
          "summary": ""
        },
        {
          "name": "SCOPE_COMMIT",
          "kind": "constant",
          "signature": "SCOPE_COMMIT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/facts/Fact",
      "path": "engine/reference/state/facts/Fact.md",
      "source": "engine/state/facts/Fact.js",
      "import": "/engine/state/facts/Fact.js",
      "sourceHash": "2938ba8a8e3ca0d1d333a2c9672cc857afe0e0cbe6d17ab26618a43313fb1ac4",
      "summary": "state/facts/Fact.js — canonical facts + tombstones.  Layer law: facts are MONOTONIC. We prefer adding facts, never deleting them. \"Deletion\" is a tombstone fact `revoked(<fact>)`; projection later decides what is currently valid. A fact is just a canonical string predicate so that {A,B} and {B,A} hash identically (see util/hashing.canonicalSetHash).",
      "exports": [
        {
          "name": "fact",
          "kind": "function",
          "signature": "fact(predicate, ...args)",
          "summary": "Build a canonical fact string: fact('hasKey','player','red') → \"hasKey(player,red)\"."
        },
        {
          "name": "revoke",
          "kind": "function",
          "signature": "revoke(f)",
          "summary": "Wrap a fact as a tombstone (the monotonic stand-in for deletion)."
        },
        {
          "name": "isTombstone",
          "kind": "function",
          "signature": "isTombstone(f)",
          "summary": "Is this fact a tombstone?"
        },
        {
          "name": "tombstoneTarget",
          "kind": "function",
          "signature": "tombstoneTarget(f)",
          "summary": "The fact a tombstone revokes, or null."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/facts/FactStore",
      "path": "engine/reference/state/facts/FactStore.md",
      "source": "engine/state/facts/FactStore.js",
      "import": "/engine/state/facts/FactStore.js",
      "sourceHash": "500e73d5772dbcb00e74d615fd9f9a376ca2d0cdc85bcdebeaf372db00422f99",
      "summary": "state/facts/FactStore.js — the unordered, monotonic fact set.  No sequence is stored. `id()` is the order-independent hash of ALL facts (history identity); `liveId()` is the hash of the currently-valid projection (tombstones applied). Merge is a set union — naturally commutative and idempotent (a CRDT-style anti-entropy merge), so two peers that saw events in different orders converge to the same id.",
      "exports": [
        {
          "name": "FactStore",
          "kind": "class",
          "signature": "class FactStore",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/index",
      "path": "engine/reference/state/index.md",
      "source": "engine/state/index.js",
      "import": "/engine/state/index.js",
      "sourceHash": "1bd5b1473a1bc18cd7bd10721b2cf5bf307435651d6f2242bf8cd4a326ea4ca9",
      "summary": "state/index.js — public barrel for the Causal State Engine (CSE), formerly the Universal Resonance State Engine (URC).  Order-on-demand: unordered facts encoded through a resonance codebook, organized spatially, compared by wave-like similarity, repaired through correction codes, branched when order matters, committed only when reality must choose one truth, and projected by observers into experienced sequence.  The CSE upgrade (see plans/causal-state-engine-upgrade-59657d.md) layers a partially-ordered, capability-secured, transactionally-committed world-state system on top of the URC core. The codebook/resonance/spatial layers are kept as the optional indexing/perception extension (spec §16) — never in the trusted authority/correctness path.  Build status: URC core: [x] M0 [x] M1 codebook [x] M2 spatial [x] M3 resonance [x] M4 facts [x] M5 commit [x] M6 observer CSE:      [x] P1 formal core (USO, tx envelope, idempotency, causal, 14-step commit, receipts) [x] P2 single-authority (entity/version, schema, provenance, capabilities, identity, event log, state roots, checkpoints) [x] P3 reliability (outbox, idempotent inbox, sagas+compensation, reconciler, reservations + bounded-counter escrow) [x] P4 concurrency (CRDTs, invariant-confluence classifier, optimistic/write-skew validator, dotted version vectors, HLC) [x] P5 world model (belief vs canonical, object graph, affordances, tool-effect/discrepancy, prediction sandbox, untrusted boundary) [x] P6 distributed (shard router, replicated log, Raft adapter, cross-shard 2PC + recovery, quorum checkpoints) [x] P7 sim/resonance (independent sim clocks, deterministic world dynamics, approximate-retrieve→exact-verify perception index) [x] P8 completeness (proposal pool, serializable queue, policy engine+risk gates, encryption/retention crypto-erase, GC, causal dynamics, TLA+ core stub) [x] P9 hardening (WebCrypto AES-GCM retention, Byzantine adapter, executable bounded model checker + TLC config) CSE COMPLETE: all 12 planes implemented + verified in verify.html.",
      "exports": [
        {
          "name": "AffordanceRegistry",
          "kind": "re-export",
          "signature": "AffordanceRegistry",
          "summary": ""
        },
        {
          "name": "BeliefStore",
          "kind": "re-export",
          "signature": "BeliefStore",
          "summary": ""
        },
        {
          "name": "BoundedCounterEscrow",
          "kind": "re-export",
          "signature": "BoundedCounterEscrow",
          "summary": ""
        },
        {
          "name": "ByzantineAdapter",
          "kind": "re-export",
          "signature": "ByzantineAdapter",
          "summary": ""
        },
        {
          "name": "CERTAINTY",
          "kind": "re-export",
          "signature": "CERTAINTY",
          "summary": ""
        },
        {
          "name": "CORRECTION_ACTIONS",
          "kind": "re-export",
          "signature": "CORRECTION_ACTIONS",
          "summary": ""
        },
        {
          "name": "CORRECTION_TIERS",
          "kind": "re-export",
          "signature": "CORRECTION_TIERS",
          "summary": ""
        },
        {
          "name": "CapabilityRegistry",
          "kind": "re-export",
          "signature": "CapabilityRegistry",
          "summary": ""
        },
        {
          "name": "CausalDynamics",
          "kind": "re-export",
          "signature": "CausalDynamics",
          "summary": ""
        },
        {
          "name": "CausalGraph",
          "kind": "re-export",
          "signature": "CausalGraph",
          "summary": ""
        },
        {
          "name": "CheckpointQuorum",
          "kind": "re-export",
          "signature": "CheckpointQuorum",
          "summary": ""
        },
        {
          "name": "CrossShardCoordinator",
          "kind": "re-export",
          "signature": "CrossShardCoordinator",
          "summary": ""
        },
        {
          "name": "DECISION",
          "kind": "re-export",
          "signature": "DECISION",
          "summary": ""
        },
        {
          "name": "DOMAIN_SEPARATOR",
          "kind": "re-export",
          "signature": "DOMAIN_SEPARATOR",
          "summary": ""
        },
        {
          "name": "DVVSet",
          "kind": "re-export",
          "signature": "DVVSet",
          "summary": ""
        },
        {
          "name": "EFFECT_STATUS",
          "kind": "re-export",
          "signature": "EFFECT_STATUS",
          "summary": ""
        },
        {
          "name": "EVENTLOG_GENESIS",
          "kind": "re-export",
          "signature": "EVENTLOG_GENESIS",
          "summary": ""
        },
        {
          "name": "EntityRegistry",
          "kind": "re-export",
          "signature": "EntityRegistry",
          "summary": ""
        },
        {
          "name": "EventLog",
          "kind": "re-export",
          "signature": "EventLog",
          "summary": ""
        },
        {
          "name": "FactStore",
          "kind": "re-export",
          "signature": "FactStore",
          "summary": ""
        },
        {
          "name": "FencingDomain",
          "kind": "re-export",
          "signature": "FencingDomain",
          "summary": ""
        },
        {
          "name": "GCounter",
          "kind": "re-export",
          "signature": "GCounter",
          "summary": ""
        },
        {
          "name": "GSet",
          "kind": "re-export",
          "signature": "GSet",
          "summary": ""
        },
        {
          "name": "GarbageCollector",
          "kind": "re-export",
          "signature": "GarbageCollector",
          "summary": ""
        },
        {
          "name": "HLC",
          "kind": "re-export",
          "signature": "HLC",
          "summary": ""
        },
        {
          "name": "IdempotencyRegistry",
          "kind": "re-export",
          "signature": "IdempotencyRegistry",
          "summary": ""
        },
        {
          "name": "Inbox",
          "kind": "re-export",
          "signature": "Inbox",
          "summary": ""
        },
        {
          "name": "LWWRegister",
          "kind": "re-export",
          "signature": "LWWRegister",
          "summary": ""
        },
        {
          "name": "ORDER",
          "kind": "re-export",
          "signature": "ORDER",
          "summary": ""
        },
        {
          "name": "ORSet",
          "kind": "re-export",
          "signature": "ORSet",
          "summary": ""
        },
        {
          "name": "ObjectGraph",
          "kind": "re-export",
          "signature": "ObjectGraph",
          "summary": ""
        },
        {
          "name": "OptimisticValidator",
          "kind": "re-export",
          "signature": "OptimisticValidator",
          "summary": ""
        },
        {
          "name": "Outbox",
          "kind": "re-export",
          "signature": "Outbox",
          "summary": ""
        },
        {
          "name": "PATTERN_BITS",
          "kind": "re-export",
          "signature": "PATTERN_BITS",
          "summary": ""
        },
        {
          "name": "PATTERN_COUNT",
          "kind": "re-export",
          "signature": "PATTERN_COUNT",
          "summary": ""
        },
        {
          "name": "PATTERN_H",
          "kind": "re-export",
          "signature": "PATTERN_H",
          "summary": ""
        },
        {
          "name": "PATTERN_W",
          "kind": "re-export",
          "signature": "PATTERN_W",
          "summary": ""
        },
        {
          "name": "PNCounter",
          "kind": "re-export",
          "signature": "PNCounter",
          "summary": ""
        },
        {
          "name": "PRIME_TABLE",
          "kind": "re-export",
          "signature": "PRIME_TABLE",
          "summary": ""
        },
        {
          "name": "PROPOSAL_STATUS",
          "kind": "re-export",
          "signature": "PROPOSAL_STATUS",
          "summary": ""
        },
        {
          "name": "PatternCodebook",
          "kind": "re-export",
          "signature": "PatternCodebook",
          "summary": ""
        },
        {
          "name": "PolicyEngine",
          "kind": "re-export",
          "signature": "PolicyEngine",
          "summary": ""
        },
        {
          "name": "PredictionSandbox",
          "kind": "re-export",
          "signature": "PredictionSandbox",
          "summary": ""
        },
        {
          "name": "ProposalPool",
          "kind": "re-export",
          "signature": "ProposalPool",
          "summary": ""
        },
        {
          "name": "ProvenanceStore",
          "kind": "re-export",
          "signature": "ProvenanceStore",
          "summary": ""
        },
        {
          "name": "RECONCILE_RESULT",
          "kind": "re-export",
          "signature": "RECONCILE_RESULT",
          "summary": ""
        },
        {
          "name": "RELATION",
          "kind": "re-export",
          "signature": "RELATION",
          "summary": ""
        },
        {
          "name": "RISK",
          "kind": "re-export",
          "signature": "RISK",
          "summary": ""
        },
        {
          "name": "RISK_LEVEL",
          "kind": "re-export",
          "signature": "RISK_LEVEL",
          "summary": ""
        },
        {
          "name": "RaftAdapter",
          "kind": "re-export",
          "signature": "RaftAdapter",
          "summary": ""
        },
        {
          "name": "Reconciler",
          "kind": "re-export",
          "signature": "Reconciler",
          "summary": ""
        },
        {
          "name": "ReplicatedLog",
          "kind": "re-export",
          "signature": "ReplicatedLog",
          "summary": ""
        },
        {
          "name": "ReservationManager",
          "kind": "re-export",
          "signature": "ReservationManager",
          "summary": ""
        },
        {
          "name": "ResonanceIndex",
          "kind": "re-export",
          "signature": "ResonanceIndex",
          "summary": ""
        },
        {
          "name": "RetentionManager",
          "kind": "re-export",
          "signature": "RetentionManager",
          "summary": ""
        },
        {
          "name": "SAGA_STATUS",
          "kind": "re-export",
          "signature": "SAGA_STATUS",
          "summary": ""
        },
        {
          "name": "SCOPE_COMMIT",
          "kind": "re-export",
          "signature": "SCOPE_COMMIT",
          "summary": ""
        },
        {
          "name": "SCOPE_RUNTIME",
          "kind": "re-export",
          "signature": "SCOPE_RUNTIME",
          "summary": ""
        },
        {
          "name": "Saga",
          "kind": "re-export",
          "signature": "Saga",
          "summary": ""
        },
        {
          "name": "SchemaRegistry",
          "kind": "re-export",
          "signature": "SchemaRegistry",
          "summary": ""
        },
        {
          "name": "SecureRetentionManager",
          "kind": "re-export",
          "signature": "SecureRetentionManager",
          "summary": ""
        },
        {
          "name": "SerializableQueue",
          "kind": "re-export",
          "signature": "SerializableQueue",
          "summary": ""
        },
        {
          "name": "ShardRouter",
          "kind": "re-export",
          "signature": "ShardRouter",
          "summary": ""
        },
        {
          "name": "SimulationClock",
          "kind": "re-export",
          "signature": "SimulationClock",
          "summary": ""
        },
        {
          "name": "SimulationClockSet",
          "kind": "re-export",
          "signature": "SimulationClockSet",
          "summary": ""
        },
        {
          "name": "TIME_MODES",
          "kind": "re-export",
          "signature": "TIME_MODES",
          "summary": ""
        },
        {
          "name": "TX_SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "TX_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "ToolEffectModel",
          "kind": "re-export",
          "signature": "ToolEffectModel",
          "summary": ""
        },
        {
          "name": "USORegistry",
          "kind": "re-export",
          "signature": "USORegistry",
          "summary": ""
        },
        {
          "name": "USO_KIND",
          "kind": "re-export",
          "signature": "USO_KIND",
          "summary": ""
        },
        {
          "name": "UntrustedBoundary",
          "kind": "re-export",
          "signature": "UntrustedBoundary",
          "summary": ""
        },
        {
          "name": "VersionVector",
          "kind": "re-export",
          "signature": "VersionVector",
          "summary": ""
        },
        {
          "name": "WORLD",
          "kind": "re-export",
          "signature": "WORLD",
          "summary": ""
        },
        {
          "name": "WorldDynamics",
          "kind": "re-export",
          "signature": "WorldDynamics",
          "summary": ""
        },
        {
          "name": "aeadOpen",
          "kind": "re-export",
          "signature": "aeadOpen",
          "summary": ""
        },
        {
          "name": "aeadSeal",
          "kind": "re-export",
          "signature": "aeadSeal",
          "summary": ""
        },
        {
          "name": "applySequence",
          "kind": "re-export",
          "signature": "applySequence",
          "summary": ""
        },
        {
          "name": "atMostOne",
          "kind": "re-export",
          "signature": "atMostOne",
          "summary": ""
        },
        {
          "name": "attenuate",
          "kind": "re-export",
          "signature": "attenuate",
          "summary": ""
        },
        {
          "name": "authorizes",
          "kind": "re-export",
          "signature": "authorizes",
          "summary": ""
        },
        {
          "name": "branchOrders",
          "kind": "re-export",
          "signature": "branchOrders",
          "summary": ""
        },
        {
          "name": "canAuthorize",
          "kind": "re-export",
          "signature": "canAuthorize",
          "summary": ""
        },
        {
          "name": "canonicalBytes",
          "kind": "re-export",
          "signature": "canonicalBytes",
          "summary": ""
        },
        {
          "name": "canonicalId",
          "kind": "re-export",
          "signature": "canonicalId",
          "summary": ""
        },
        {
          "name": "canonicalSetHash",
          "kind": "re-export",
          "signature": "canonicalSetHash",
          "summary": ""
        },
        {
          "name": "canonicalize",
          "kind": "re-export",
          "signature": "canonicalize",
          "summary": ""
        },
        {
          "name": "chooseBranch",
          "kind": "re-export",
          "signature": "chooseBranch",
          "summary": ""
        },
        {
          "name": "chunkCoords2D",
          "kind": "re-export",
          "signature": "chunkCoords2D",
          "summary": ""
        },
        {
          "name": "chunkCoords3D",
          "kind": "re-export",
          "signature": "chunkCoords3D",
          "summary": ""
        },
        {
          "name": "chunkId2D",
          "kind": "re-export",
          "signature": "chunkId2D",
          "summary": ""
        },
        {
          "name": "chunkId3D",
          "kind": "re-export",
          "signature": "chunkId3D",
          "summary": ""
        },
        {
          "name": "classifyConfluence",
          "kind": "re-export",
          "signature": "classifyConfluence",
          "summary": ""
        },
        {
          "name": "commutes",
          "kind": "re-export",
          "signature": "commutes",
          "summary": ""
        },
        {
          "name": "compareHLC",
          "kind": "re-export",
          "signature": "compareHLC",
          "summary": ""
        },
        {
          "name": "computeStateRoot",
          "kind": "re-export",
          "signature": "computeStateRoot",
          "summary": ""
        },
        {
          "name": "constraint",
          "kind": "re-export",
          "signature": "constraint",
          "summary": ""
        },
        {
          "name": "correct",
          "kind": "re-export",
          "signature": "correct",
          "summary": ""
        },
        {
          "name": "cosineSimilarity",
          "kind": "re-export",
          "signature": "cosineSimilarity",
          "summary": ""
        },
        {
          "name": "createCommitCoordinator",
          "kind": "re-export",
          "signature": "createCommitCoordinator",
          "summary": ""
        },
        {
          "name": "createCommitGate",
          "kind": "re-export",
          "signature": "createCommitGate",
          "summary": ""
        },
        {
          "name": "createSigner",
          "kind": "re-export",
          "signature": "createSigner",
          "summary": ""
        },
        {
          "name": "createTimeSource",
          "kind": "re-export",
          "signature": "createTimeSource",
          "summary": ""
        },
        {
          "name": "dct1D",
          "kind": "re-export",
          "signature": "dct1D",
          "summary": ""
        },
        {
          "name": "dct2D",
          "kind": "re-export",
          "signature": "dct2D",
          "summary": ""
        },
        {
          "name": "dependsOn",
          "kind": "re-export",
          "signature": "dependsOn",
          "summary": ""
        },
        {
          "name": "detectWriteSkew",
          "kind": "re-export",
          "signature": "detectWriteSkew",
          "summary": ""
        },
        {
          "name": "exploreCommitMachine",
          "kind": "re-export",
          "signature": "exploreCommitMachine",
          "summary": ""
        },
        {
          "name": "exportKeyRaw",
          "kind": "re-export",
          "signature": "exportKeyRaw",
          "summary": ""
        },
        {
          "name": "fact",
          "kind": "re-export",
          "signature": "fact",
          "summary": ""
        },
        {
          "name": "fromHilbertId2D",
          "kind": "re-export",
          "signature": "fromHilbertId2D",
          "summary": ""
        },
        {
          "name": "fromSpatialId2D",
          "kind": "re-export",
          "signature": "fromSpatialId2D",
          "summary": ""
        },
        {
          "name": "fromSpatialId3D",
          "kind": "re-export",
          "signature": "fromSpatialId3D",
          "summary": ""
        },
        {
          "name": "generateAesKey",
          "kind": "re-export",
          "signature": "generateAesKey",
          "summary": ""
        },
        {
          "name": "hammingDistance",
          "kind": "re-export",
          "signature": "hammingDistance",
          "summary": ""
        },
        {
          "name": "hashFactString",
          "kind": "re-export",
          "signature": "hashFactString",
          "summary": ""
        },
        {
          "name": "hashIdEquals",
          "kind": "re-export",
          "signature": "hashIdEquals",
          "summary": ""
        },
        {
          "name": "hashIdFast",
          "kind": "re-export",
          "signature": "hashIdFast",
          "summary": ""
        },
        {
          "name": "hashIdSecure",
          "kind": "re-export",
          "signature": "hashIdSecure",
          "summary": ""
        },
        {
          "name": "hashU32Sequence",
          "kind": "re-export",
          "signature": "hashU32Sequence",
          "summary": ""
        },
        {
          "name": "hexId",
          "kind": "re-export",
          "signature": "hexId",
          "summary": ""
        },
        {
          "name": "hilbertId2D",
          "kind": "re-export",
          "signature": "hilbertId2D",
          "summary": ""
        },
        {
          "name": "idct1D",
          "kind": "re-export",
          "signature": "idct1D",
          "summary": ""
        },
        {
          "name": "idct2D",
          "kind": "re-export",
          "signature": "idct2D",
          "summary": ""
        },
        {
          "name": "importAesKey",
          "kind": "re-export",
          "signature": "importAesKey",
          "summary": ""
        },
        {
          "name": "ingestUntrusted",
          "kind": "re-export",
          "signature": "ingestUntrusted",
          "summary": ""
        },
        {
          "name": "isTombstone",
          "kind": "re-export",
          "signature": "isTombstone",
          "summary": ""
        },
        {
          "name": "isUSO",
          "kind": "re-export",
          "signature": "isUSO",
          "summary": ""
        },
        {
          "name": "isUntrusted",
          "kind": "re-export",
          "signature": "isUntrusted",
          "summary": ""
        },
        {
          "name": "l2Distance",
          "kind": "re-export",
          "signature": "l2Distance",
          "summary": ""
        },
        {
          "name": "link",
          "kind": "re-export",
          "signature": "link",
          "summary": ""
        },
        {
          "name": "makeAffordance",
          "kind": "re-export",
          "signature": "makeAffordance",
          "summary": ""
        },
        {
          "name": "makeCapability",
          "kind": "re-export",
          "signature": "makeCapability",
          "summary": ""
        },
        {
          "name": "makeCheckpoint",
          "kind": "re-export",
          "signature": "makeCheckpoint",
          "summary": ""
        },
        {
          "name": "makeCodeEntry",
          "kind": "re-export",
          "signature": "makeCodeEntry",
          "summary": ""
        },
        {
          "name": "makeEffectIntent",
          "kind": "re-export",
          "signature": "makeEffectIntent",
          "summary": ""
        },
        {
          "name": "makeProvenance",
          "kind": "re-export",
          "signature": "makeProvenance",
          "summary": ""
        },
        {
          "name": "makeReceipt",
          "kind": "re-export",
          "signature": "makeReceipt",
          "summary": ""
        },
        {
          "name": "makeTransaction",
          "kind": "re-export",
          "signature": "makeTransaction",
          "summary": ""
        },
        {
          "name": "makeUSO",
          "kind": "re-export",
          "signature": "makeUSO",
          "summary": ""
        },
        {
          "name": "makeWitness",
          "kind": "re-export",
          "signature": "makeWitness",
          "summary": ""
        },
        {
          "name": "mergeEquivalent",
          "kind": "re-export",
          "signature": "mergeEquivalent",
          "summary": ""
        },
        {
          "name": "mutuallyExclusive",
          "kind": "re-export",
          "signature": "mutuallyExclusive",
          "summary": ""
        },
        {
          "name": "nearestAttractor",
          "kind": "re-export",
          "signature": "nearestAttractor",
          "summary": ""
        },
        {
          "name": "neighbors2D",
          "kind": "re-export",
          "signature": "neighbors2D",
          "summary": ""
        },
        {
          "name": "objectVersionOutput",
          "kind": "re-export",
          "signature": "objectVersionOutput",
          "summary": ""
        },
        {
          "name": "packPattern",
          "kind": "re-export",
          "signature": "packPattern",
          "summary": ""
        },
        {
          "name": "parseHashId",
          "kind": "re-export",
          "signature": "parseHashId",
          "summary": ""
        },
        {
          "name": "pattern3x3ToVector",
          "kind": "re-export",
          "signature": "pattern3x3ToVector",
          "summary": ""
        },
        {
          "name": "patternHashId",
          "kind": "re-export",
          "signature": "patternHashId",
          "summary": ""
        },
        {
          "name": "policyRule",
          "kind": "re-export",
          "signature": "policyRule",
          "summary": ""
        },
        {
          "name": "primeAt",
          "kind": "re-export",
          "signature": "primeAt",
          "summary": ""
        },
        {
          "name": "projectSequence",
          "kind": "re-export",
          "signature": "projectSequence",
          "summary": ""
        },
        {
          "name": "prune",
          "kind": "re-export",
          "signature": "prune",
          "summary": ""
        },
        {
          "name": "quantize",
          "kind": "re-export",
          "signature": "quantize",
          "summary": ""
        },
        {
          "name": "resonanceDCT",
          "kind": "re-export",
          "signature": "resonanceDCT",
          "summary": ""
        },
        {
          "name": "resonanceWHT",
          "kind": "re-export",
          "signature": "resonanceWHT",
          "summary": ""
        },
        {
          "name": "revoke",
          "kind": "re-export",
          "signature": "revoke",
          "summary": ""
        },
        {
          "name": "rootFromStores",
          "kind": "re-export",
          "signature": "rootFromStores",
          "summary": ""
        },
        {
          "name": "sagaStep",
          "kind": "re-export",
          "signature": "sagaStep",
          "summary": ""
        },
        {
          "name": "sealTransaction",
          "kind": "re-export",
          "signature": "sealTransaction",
          "summary": ""
        },
        {
          "name": "sealTransactionFast",
          "kind": "re-export",
          "signature": "sealTransactionFast",
          "summary": ""
        },
        {
          "name": "secureCryptoAvailable",
          "kind": "re-export",
          "signature": "secureCryptoAvailable",
          "summary": ""
        },
        {
          "name": "sigContains",
          "kind": "re-export",
          "signature": "sigContains",
          "summary": ""
        },
        {
          "name": "sigEquals",
          "kind": "re-export",
          "signature": "sigEquals",
          "summary": ""
        },
        {
          "name": "spatialId2D",
          "kind": "re-export",
          "signature": "spatialId2D",
          "summary": ""
        },
        {
          "name": "spatialId3D",
          "kind": "re-export",
          "signature": "spatialId3D",
          "summary": ""
        },
        {
          "name": "symbolicSig",
          "kind": "re-export",
          "signature": "symbolicSig",
          "summary": ""
        },
        {
          "name": "symmetries",
          "kind": "re-export",
          "signature": "symmetries",
          "summary": ""
        },
        {
          "name": "tombstoneTarget",
          "kind": "re-export",
          "signature": "tombstoneTarget",
          "summary": ""
        },
        {
          "name": "toposort",
          "kind": "re-export",
          "signature": "toposort",
          "summary": ""
        },
        {
          "name": "transactionBody",
          "kind": "re-export",
          "signature": "transactionBody",
          "summary": ""
        },
        {
          "name": "unpackPattern",
          "kind": "re-export",
          "signature": "unpackPattern",
          "summary": ""
        },
        {
          "name": "validateFacts",
          "kind": "re-export",
          "signature": "validateFacts",
          "summary": ""
        },
        {
          "name": "verifyCheckpoint",
          "kind": "re-export",
          "signature": "verifyCheckpoint",
          "summary": ""
        },
        {
          "name": "verifyWithKey",
          "kind": "re-export",
          "signature": "verifyWithKey",
          "summary": ""
        },
        {
          "name": "walshHadamard",
          "kind": "re-export",
          "signature": "walshHadamard",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/integrity/Checkpoint",
      "path": "engine/reference/state/integrity/Checkpoint.md",
      "source": "engine/state/integrity/Checkpoint.js",
      "import": "/engine/state/integrity/Checkpoint.js",
      "sourceHash": "46b5a0c1dc9e58cb7b25eeb592bb3cbd9cbfba0aad688589a7e6ab003af756ff",
      "summary": "state/integrity/Checkpoint.js — compaction + fast restoration (spec §13).  A checkpoint summarizes history without pretending it never existed: it links to the previous checkpoint and the event range it covers, and pins the canonical state root, unspent-output root, and policy/schema/validator versions. A restored system must verify its state root before accepting new commits (spec rule 64). Checkpoints carry an optional authority signature.",
      "exports": [
        {
          "name": "makeCheckpoint",
          "kind": "function",
          "signature": "makeCheckpoint(c = {})",
          "summary": "Build a checkpoint record."
        },
        {
          "name": "verifyCheckpoint",
          "kind": "function",
          "signature": "verifyCheckpoint(checkpoint, computedStateRoot, predecessor = null)",
          "summary": "Verify a checkpoint's stateRoot matches a freshly computed root, and (if a predecessor is provided) that the chain links correctly (spec rule 60,64)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/integrity/EventLog",
      "path": "engine/reference/state/integrity/EventLog.md",
      "source": "engine/state/integrity/EventLog.js",
      "import": "/engine/state/integrity/EventLog.js",
      "sourceHash": "eaebe8fceca85068f8b1037ead95e891f7680436b4312537a0e0ee4c707ee355",
      "summary": "state/integrity/EventLog.js — append-only commit stream (spec §13).  Committed changes are appended to an immutable, hash-chained event log. Materialized views can be rebuilt without altering history (event sourcing). Each entry links to the previous entry's hash, so any tampering with earlier history changes every subsequent link — a lightweight Merkle chain. The hash is the fast tagged id of the canonical entry (hot path); authority signatures live on the witness receipts the entries reference.",
      "exports": [
        {
          "name": "EventLog",
          "kind": "class",
          "signature": "class EventLog",
          "summary": ""
        },
        {
          "name": "EVENTLOG_GENESIS",
          "kind": "re-export",
          "signature": "EVENTLOG_GENESIS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/integrity/GarbageCollector",
      "path": "engine/reference/state/integrity/GarbageCollector.md",
      "source": "engine/state/integrity/GarbageCollector.js",
      "import": "/engine/state/integrity/GarbageCollector.js",
      "sourceHash": "62218686e9650b899a6c141660947b1ad328416d08db1db03bf012677b247968",
      "summary": "state/integrity/GarbageCollector.js — Integrity-plane garbage collection (spec §3 plane 8, rule 61; liveness \"GC never removes pinned authoritative state\").  GC reclaims storage by collecting objects that are no longer reachable from a set of SIGNED ROOTS (latest checkpoint, unspent outputs, retained branches) and not protected by a retention policy. It is mark-and-sweep over the reference graph: anything reachable from a root — or explicitly pinned — is retained; everything else is eligible. The hard invariant is that GC can NEVER remove pinned authoritative state, even if it looks unreferenced.",
      "exports": [
        {
          "name": "GarbageCollector",
          "kind": "class",
          "signature": "class GarbageCollector",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/integrity/Retention",
      "path": "engine/reference/state/integrity/Retention.md",
      "source": "engine/state/integrity/Retention.js",
      "import": "/engine/state/integrity/Retention.js",
      "sourceHash": "ef281fa36c2cab017da5d495db57940736d793de9bfc3559b79622010d4ddc3a",
      "summary": "state/integrity/Retention.js — Integrity-plane encryption & retention manager (spec §13 \"Privacy and deletion\", rule 62).  Append-only logs conflict with deletion requirements. The resolution: store sensitive payloads ENCRYPTED under a scoped key, leaving only minimal, non-sensitive audit metadata in the permanent record. Destroying the scope key renders the encrypted payload infeasible to recover — NIST \"cryptographic erase\" — so the audit trail survives while the sensitive bytes are irrecoverable. The cipher here is a deterministic keyed stream (model-grade, not production crypto): the point is the KEY-LIFECYCLE invariant, i.e. erase the key ⇒ payload unrecoverable, metadata retained.",
      "exports": [
        {
          "name": "RetentionManager",
          "kind": "class",
          "signature": "class RetentionManager",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/integrity/SecureCrypto",
      "path": "engine/reference/state/integrity/SecureCrypto.md",
      "source": "engine/state/integrity/SecureCrypto.js",
      "import": "/engine/state/integrity/SecureCrypto.js",
      "sourceHash": "deee6e24372e7688689cd9bd28d157ff7dabe6c1266972b35492195e4ac92993",
      "summary": "state/integrity/SecureCrypto.js — production-grade authenticated encryption (spec §13 privacy, §17 deterministic-core boundary).  Real AEAD via Web Crypto AES-256-GCM. Used by SecureRetention for sensitive payloads so that destroying the key (cryptographic erase) renders ciphertext infeasible to recover, and any tampering with ciphertext/AAD fails the GCM authentication tag. This is the production swap-in for the model-grade keyed stream used elsewhere. All operations are async (SubtleCrypto); callers that need a sync path keep the deterministic fallback in RetentionManager.",
      "exports": [
        {
          "name": "secureCryptoAvailable",
          "kind": "function",
          "signature": "secureCryptoAvailable()",
          "summary": ""
        },
        {
          "name": "bytesToHex",
          "kind": "function",
          "signature": "bytesToHex(bytes)",
          "summary": ""
        },
        {
          "name": "hexToBytes",
          "kind": "function",
          "signature": "hexToBytes(hex)",
          "summary": ""
        },
        {
          "name": "generateAesKey",
          "kind": "function",
          "signature": "async generateAesKey()",
          "summary": "Generate a fresh AES-256-GCM key (extractable, for raw export/erase tests)."
        },
        {
          "name": "exportKeyRaw",
          "kind": "function",
          "signature": "async exportKeyRaw(key)",
          "summary": ""
        },
        {
          "name": "importAesKey",
          "kind": "function",
          "signature": "async importAesKey(raw)",
          "summary": ""
        },
        {
          "name": "aeadSeal",
          "kind": "function",
          "signature": "async aeadSeal(key, plaintext, aad = '')",
          "summary": "AEAD-seal a plaintext string. `aad` (additional authenticated data) binds the ciphertext to a context (e.g. the scope id) without encrypting it."
        },
        {
          "name": "aeadOpen",
          "kind": "function",
          "signature": "async aeadOpen(key, envelope, aad = '')",
          "summary": "AEAD-open an envelope. Returns plaintext, or null if the key is wrong/erased or the ciphertext/AAD was tampered with (GCM tag check fails)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/integrity/SecureRetention",
      "path": "engine/reference/state/integrity/SecureRetention.md",
      "source": "engine/state/integrity/SecureRetention.js",
      "import": "/engine/state/integrity/SecureRetention.js",
      "sourceHash": "d6d48eb8ac1236ae39dc2d650e98eaa4a623c14edc64db94ffc2867cc47ffa57",
      "summary": "state/integrity/SecureRetention.js — production AES-256-GCM retention manager (spec §13, rule 62). The cryptographic counterpart of RetentionManager.  Sensitive payloads are sealed under a per-scope AES-GCM key held only in memory as a non-extractable-by-policy CryptoKey reference. Cryptographic erase drops that reference, after which the ciphertext is infeasible to recover (NIST crypto-erase), while non-sensitive audit metadata on the envelope survives. GCM's authentication tag also makes any tampering with the ciphertext or the scope-bound AAD fail closed (open → null).",
      "exports": [
        {
          "name": "SecureRetentionManager",
          "kind": "class",
          "signature": "class SecureRetentionManager",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/integrity/StateRoot",
      "path": "engine/reference/state/integrity/StateRoot.md",
      "source": "engine/state/integrity/StateRoot.js",
      "import": "/engine/state/integrity/StateRoot.js",
      "sourceHash": "ad2a2eb8c80cd5db7feac4530ba93845649c7eb13012fa781698dba0ebd21556",
      "summary": "state/integrity/StateRoot.js — Merkle-style canonical state root (spec §13,§19).  A state root is the hash of the canonical, ORDER-INDEPENDENT summary of the authoritative state: the live fact set, the unspent-output id set, and the entity head version ids. The committed state root must exactly match the committed outputs (safety invariant). A hash proves exact content only — not correctness — so the root is used for integrity/restoration, never as a semantic-truth or authority claim (spec rule 52).",
      "exports": [
        {
          "name": "computeStateRoot",
          "kind": "function",
          "signature": "computeStateRoot({ facts = [], unspent = [], entityHeads = [] } = {})",
          "summary": "Compute a state root from the authoritative components. Any iterable is accepted; members are sorted for order-independence."
        },
        {
          "name": "rootFromStores",
          "kind": "function",
          "signature": "rootFromStores({ factStore = null, usoRegistry = null, entityRegistry = null } = {})",
          "summary": "Convenience: derive a state root from live engine registries."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/observer/Projection",
      "path": "engine/reference/state/observer/Projection.md",
      "source": "engine/state/observer/Projection.js",
      "import": "/engine/state/observer/Projection.js",
      "sourceHash": "d2300c07124521ef57b540e6bcbcf2761358fb4dac9e67ef4617793089ee1200",
      "summary": "state/observer/Projection.js — the observer creates EXPERIENCED order.  Core truth may be unordered or branched. An observer sees one path, but that is only a projection: render order is not truth, UI order is not truth, debug order is not truth. Only committed facts are canonical — so every projection here carries `isTruth: false` and a witness. Turning a projection into truth requires a CommitGate.",
      "exports": [
        {
          "name": "projectSequence",
          "kind": "function",
          "signature": "projectSequence(store, links = [])",
          "summary": "Project one experienced sequence from a fact store. Independent facts stay deterministically ordered (reproducible), causal links force precedence."
        },
        {
          "name": "chooseBranch",
          "kind": "function",
          "signature": "chooseBranch(branches, selector = ()",
          "summary": "Choose one branch for an observer to experience. Does NOT commit — the other branches remain possible (recorded as \"rejected/not observed\" in the witness) until a CommitGate finalizes one as canonical."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/perception/ResonanceIndex",
      "path": "engine/reference/state/perception/ResonanceIndex.md",
      "source": "engine/state/perception/ResonanceIndex.js",
      "import": "/engine/state/perception/ResonanceIndex.js",
      "sourceHash": "0e3f5587329856f3053582785978e91908c9700a31307d544d93832f72857b64",
      "summary": "state/perception/ResonanceIndex.js — the Resonance/Perception extension reattached as an OPTIONAL indexing layer (spec §16, rules 52–56).  This is where the codebook / resonance / spatial layers belong: approximate retrieval, never the trusted authority path. The discipline is strict and one-directional:  approximate similarity  → retrieves CANDIDATES   (cosine over feature vectors) exact identity (hash)    → verifies BYTES         (cryptographic/fast hash) semantic constraints     → verify MEANING         (predicate over content) commit logic             → establishes TRUTH      (elsewhere; not here)  A near match is only ever a suggestion. This module will NEVER return a similar-but-not-byte-identical item as a verified match — similarity suggests candidates; it never establishes identity (rule 53). Nearest-neighbour search may repair a visual cache or rank suggestions, but must never silently repair inventory, permissions, ownership, or other authoritative semantic state.",
      "exports": [
        {
          "name": "ResonanceIndex",
          "kind": "class",
          "signature": "class ResonanceIndex",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/replication/ByzantineAdapter",
      "path": "engine/reference/state/replication/ByzantineAdapter.md",
      "source": "engine/state/replication/ByzantineAdapter.js",
      "import": "/engine/state/replication/ByzantineAdapter.js",
      "sourceHash": "64828e6cdbfb7a1432377334ea3070c1a6c5e7def1e78a1488fbd9bf36d2a1dc",
      "summary": "state/replication/ByzantineAdapter.js — optional Byzantine-fault-tolerant authority (spec §8 hostile peer-to-peer profile, rule 38).  This is the explicitly-separate hostile-P2P profile, NOT implied by the default crash-fault deployment. It tolerates up to f Byzantine (arbitrary / malicious) nodes given n ≥ 3f+1 members, committing a value only when at least a 2f+1 quorum cast MATCHING votes for it. Two safety mechanisms:  • Equivocation detection — a node that votes for two different values in the same round is provably faulty; it is marked Byzantine and ALL its votes are discarded, so a double-voter cannot help two values reach quorum. • 2f+1 quorum — with n ≥ 3f+1 and ≤ f faulty nodes, any value with 2f+1 votes has ≥ f+1 honest votes, so two conflicting values can never both commit (their honest supporters would have to overlap).  Votes are expected to be signed; an optional verifier rejects unsigned/forged votes. Membership/Sybil control is a deployment policy declared separately.",
      "exports": [
        {
          "name": "ByzantineAdapter",
          "kind": "class",
          "signature": "class ByzantineAdapter",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/replication/CheckpointQuorum",
      "path": "engine/reference/state/replication/CheckpointQuorum.md",
      "source": "engine/state/replication/CheckpointQuorum.js",
      "import": "/engine/state/replication/CheckpointQuorum.js",
      "sourceHash": "de90fc4b44a4011222359cb41ccf5fb87ab0f64d6c306b498cbbe204afd95cb7",
      "summary": "state/replication/CheckpointQuorum.js — quorum-signed checkpoint proofs (spec §13 checkpoints + §8 replication, rule 64).  A checkpoint summarizes history with a canonical state root. In a replicated deployment a checkpoint becomes authoritative only when a QUORUM of members attest to the SAME state root — this is the proof a restored node verifies before accepting commits (rule 64). Members that attest a different root are recorded as DIVERGENT and never counted toward the quorum, so a minority of faulty/forked replicas cannot finalize a bad checkpoint.",
      "exports": [
        {
          "name": "CheckpointQuorum",
          "kind": "class",
          "signature": "class CheckpointQuorum",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/replication/CrossShardCoordinator",
      "path": "engine/reference/state/replication/CrossShardCoordinator.md",
      "source": "engine/state/replication/CrossShardCoordinator.js",
      "import": "/engine/state/replication/CrossShardCoordinator.js",
      "sourceHash": "58d046977273af707a6faaea3ed3e6253b30a58f82e0d96ad0fe2671a9399e5d",
      "summary": "state/replication/CrossShardCoordinator.js — cross-domain atomic commit (spec §10, rule 40).  Cross-domain atomicity is the most expensive operation, so it is used only when true all-or-nothing behavior is required. This coordinator implements two-phase commit with the §10 hardening: • locks are acquired in CANONICAL order (sorted shard/key) to avoid deadlock; • a durable PREPARED record is written so a coordinator that crashes after prepare can be recovered and the commit completed (classic 2PC blocks on coordinator failure; the prepared record makes it recoverable); • for operations that do NOT need atomicity, a SAGA fallback is offered instead, since compensation is cheaper than distributed commit.",
      "exports": [
        {
          "name": "CrossShardCoordinator",
          "kind": "class",
          "signature": "class CrossShardCoordinator",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/replication/RaftAdapter",
      "path": "engine/reference/state/replication/RaftAdapter.md",
      "source": "engine/state/replication/RaftAdapter.js",
      "import": "/engine/state/replication/RaftAdapter.js",
      "sourceHash": "9f5e598c3a2b6d304fc065fa64afc376cfd67f72f173bacd92e816e72b97d990",
      "summary": "state/replication/RaftAdapter.js — crash-fault replicated authority (spec §8 Replication, rules 37–39).  An in-memory Raft cluster used where authority is genuinely SHARED. It manages leader election (with the Raft up-to-date restriction so a leader never lacks a committed entry) and quorum commit: a command is committed only once it lives on a majority of the cluster, so it survives any minority of crashes. The failure model is explicitly CRASH-FAULT (not Byzantine), and progress requires a quorum — when too many nodes are down the cluster correctly STALLS rather than risking divergence (rule 38/39: declare the failure model; partitions force an availability/consistency choice).",
      "exports": [
        {
          "name": "RaftAdapter",
          "kind": "class",
          "signature": "class RaftAdapter",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/replication/ReplicatedLog",
      "path": "engine/reference/state/replication/ReplicatedLog.md",
      "source": "engine/state/replication/ReplicatedLog.js",
      "import": "/engine/state/replication/ReplicatedLog.js",
      "sourceHash": "c705b4927fce176bb782e9b6071128a951b9214c75b7a146901ab2d3b75d67da",
      "summary": "state/replication/ReplicatedLog.js — a single replica's replicated commit log (spec §8 \"Replication\", §11 consensus-backed commit record).  Implements the Raft log model: each entry is { index, term, command }. The LOG-MATCHING property is enforced on replication — an AppendEntries is rejected unless the follower's entry at prevIndex has prevTerm; conflicting suffixes are truncated before appending. Consequently, if two logs hold an entry with the same index and term, the logs are identical up to that index. `commitIndex` only advances over entries known durable on a quorum (the RaftAdapter drives that), so a committed entry is never lost under the declared crash-fault model.",
      "exports": [
        {
          "name": "ReplicatedLog",
          "kind": "class",
          "signature": "class ReplicatedLog",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/replication/ShardRouter",
      "path": "engine/reference/state/replication/ShardRouter.md",
      "source": "engine/state/replication/ShardRouter.js",
      "import": "/engine/state/replication/ShardRouter.js",
      "sourceHash": "6834395199d1df1fdb68a514278841c31af5379030ec0187562730f2bb2d0814",
      "summary": "state/replication/ShardRouter.js — deterministic key→shard routing and commit-domain boundaries (spec §10, rule 1 of cross-domain preference order).  A shard is a commit domain: state strongly related to an invariant should land in ONE shard so its commit is local and atomic. The router maps a logical key to a shard deterministically (same key → same shard on every node) using the engine's canonical fast hash, so routing needs no coordination. Transactions touching more than one shard are flagged as cross-shard (handled by the CrossShardCoordinator) — the router never silently spans domains.",
      "exports": [
        {
          "name": "ShardRouter",
          "kind": "class",
          "signature": "class ShardRouter",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/resonance/ResonanceVector",
      "path": "engine/reference/state/resonance/ResonanceVector.md",
      "source": "engine/state/resonance/ResonanceVector.js",
      "import": "/engine/state/resonance/ResonanceVector.js",
      "sourceHash": "258e3eb24924ee8be631265e23c485040caafc541d2a10f096cac836abce6129",
      "summary": "state/resonance/ResonanceVector.js — build + compare resonance signatures and snap to the nearest attractor by SIMILARITY.  Layer law: \"resonance suggests\". This module reports closeness; it never decides identity (hash) or meaning (symbolicSig) or truth (commit). Two patterns can be near in resonance yet mean opposites (potion vs poison) — callers must still check symbolicSig / hash / constraints before trusting.",
      "exports": [
        {
          "name": "resonanceWHT",
          "kind": "function",
          "signature": "resonanceWHT(id)",
          "summary": "Resonance vector for a tiny 3x3 pattern (Walsh/Hadamard; integer-exact)."
        },
        {
          "name": "resonanceDCT",
          "kind": "function",
          "signature": "resonanceDCT(block, N)",
          "summary": "Resonance vector for an NxN visual block (DCT-II)."
        },
        {
          "name": "cosineSimilarity",
          "kind": "function",
          "signature": "cosineSimilarity(a, b)",
          "summary": "Cosine similarity in [-1, 1] (1 = identical direction). 0 if either is null."
        },
        {
          "name": "l2Distance",
          "kind": "function",
          "signature": "l2Distance(a, b)",
          "summary": "Euclidean (L2) distance between two equal-length vectors."
        },
        {
          "name": "nearestAttractor",
          "kind": "function",
          "signature": "nearestAttractor(vec, attractors, { metric = 'cosine' } = {})",
          "summary": "Nearest attractor by similarity. metric 'cosine' (higher score = closer) or 'l2' (score = negative distance so higher is always closer)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/resonance/Transforms",
      "path": "engine/reference/state/resonance/Transforms.md",
      "source": "engine/state/resonance/Transforms.js",
      "import": "/engine/state/resonance/Transforms.js",
      "sourceHash": "c84066ca406382cb0d10de65eff1a96df8db8be82adb83da43e76a9aeb4e67b6",
      "summary": "state/resonance/Transforms.js — Phase 3 transforms.  Walsh/Hadamard  tiny binary patterns (3x3, 4x4)   [new] DCT-II          small visual blocks (8x8, 16x16)  Scale routing (per the plan): Walsh for tiny binary, DCT for small visual, wavelets for 32x32+/3D (added later). These produce the \"resonance vector\": a compressed signature of what a pattern RESEMBLES — never its identity.",
      "exports": [
        {
          "name": "walshHadamard",
          "kind": "function",
          "signature": "walshHadamard(input)",
          "summary": "In-place-style fast WHT. Integer input → integer output. Length must be a power of two. WHT(WHT(v)) === n * v (involutive up to the length scale)."
        },
        {
          "name": "pattern3x3ToVector",
          "kind": "function",
          "signature": "pattern3x3ToVector(id)",
          "summary": "Map a packed 3x3 pattern to a length-16 bipolar vector ({0,1} → {-1,+1}, zero-padded to the next power of two) ready for the WHT."
        },
        {
          "name": "dct1D",
          "kind": "function",
          "signature": "dct1D(input)",
          "summary": "1-D DCT-II (orthonormal)."
        },
        {
          "name": "idct1D",
          "kind": "function",
          "signature": "idct1D(input)",
          "summary": "1-D inverse DCT-II (orthonormal)."
        },
        {
          "name": "dct2D",
          "kind": "function",
          "signature": "dct2D(block, N)",
          "summary": "2-D DCT-II of an NxN block (row-major Float array of length N*N)."
        },
        {
          "name": "idct2D",
          "kind": "function",
          "signature": "idct2D(block, N)",
          "summary": "2-D inverse DCT-II."
        },
        {
          "name": "quantize",
          "kind": "function",
          "signature": "quantize(vec, q = 1)",
          "summary": "Quantize a coefficient vector to integers by step `q` (lossy resonance)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/sim/WorldDynamics",
      "path": "engine/reference/state/sim/WorldDynamics.md",
      "source": "engine/state/sim/WorldDynamics.js",
      "import": "/engine/state/sim/WorldDynamics.js",
      "sourceHash": "ce1f249abc2d30204c6aa8ab63199d6f4d899008a06fdb238d41afa66190b1a4",
      "summary": "state/sim/WorldDynamics.js — deterministic stepped world dynamics over simulation time (spec §17 CPU deterministic core, rules 66/68 deterministic replay).  World dynamics advance simulated state one tick at a time. To keep canonical state reproducible (and replayable for verification), any randomness comes from a SEEDED deterministic PRNG — never Math.random or wall-clock. Running the same dynamics from the same seed and inputs always yields byte-identical results, which deterministic replay and fault-injection testing depend on.",
      "exports": [
        {
          "name": "WorldDynamics",
          "kind": "class",
          "signature": "class WorldDynamics",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/spatial/SpatialCode",
      "path": "engine/reference/state/spatial/SpatialCode.md",
      "source": "engine/state/spatial/SpatialCode.js",
      "import": "/engine/state/spatial/SpatialCode.js",
      "sourceHash": "1ae3df44bb0beb06b17615406a3fdc8199b9a486254b63b065849012903f4478",
      "summary": "state/spatial/SpatialCode.js — Phase 2: a pattern knows WHERE it belongs.  Layer law: \"Morton = hot runtime, Hilbert = cold storage / large chunk packing\". We reuse the engine's deterministic MathBits curves rather than re-deriving them; this module only adds chunk addressing + neighbor lookup and the URC contract that spatialID is \"where\", never \"what\" or \"truth\".",
      "exports": [
        {
          "name": "spatialId2D",
          "kind": "function",
          "signature": "spatialId2D(x, y)",
          "summary": "2D Morton/Z-order spatial id (16 bits per axis)."
        },
        {
          "name": "fromSpatialId2D",
          "kind": "function",
          "signature": "fromSpatialId2D(code)",
          "summary": "Inverse of spatialId2D → [x, y]."
        },
        {
          "name": "spatialId3D",
          "kind": "function",
          "signature": "spatialId3D(x, y, z)",
          "summary": "3D Morton spatial id (10 bits per axis)."
        },
        {
          "name": "fromSpatialId3D",
          "kind": "function",
          "signature": "fromSpatialId3D(code)",
          "summary": "Inverse of spatialId3D → [x, y, z]."
        },
        {
          "name": "hilbertId2D",
          "kind": "function",
          "signature": "hilbertId2D(n, x, y)",
          "summary": "Hilbert distance for (x,y) on a 2^k grid of side `n`."
        },
        {
          "name": "fromHilbertId2D",
          "kind": "function",
          "signature": "fromHilbertId2D(n, d)",
          "summary": "Inverse of hilbertId2D → [x, y]."
        },
        {
          "name": "chunkCoords2D",
          "kind": "function",
          "signature": "chunkCoords2D(x, y, chunkSize)",
          "summary": "World coords → chunk coords for a square chunk grid."
        },
        {
          "name": "chunkId2D",
          "kind": "function",
          "signature": "chunkId2D(x, y, chunkSize)",
          "summary": "Stable chunk id (Morton of chunk coords) for GPU-buffer packing + cache locality."
        },
        {
          "name": "chunkCoords3D",
          "kind": "function",
          "signature": "chunkCoords3D(x, y, z, chunkSize)",
          "summary": ""
        },
        {
          "name": "chunkId3D",
          "kind": "function",
          "signature": "chunkId3D(x, y, z, chunkSize)",
          "summary": ""
        },
        {
          "name": "neighbors2D",
          "kind": "function",
          "signature": "neighbors2D(x, y, { diagonal = false } = {})",
          "summary": "Spatial ids of a cell's neighbors (non-negative coords only)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/time/Fencing",
      "path": "engine/reference/state/time/Fencing.md",
      "source": "engine/state/time/Fencing.js",
      "import": "/engine/state/time/Fencing.js",
      "sourceHash": "67e97d89c0134475a8bcde12673e805b6b9c5f57629ba5deaef3388450f5786c",
      "summary": "state/time/Fencing.js — monotonic fencing tokens (spec §9, rule 12).  A lease optimizes liveness; it is NOT final authority. A paused client may resume after its lease expired. Correctness-critical resources therefore require a monotonically increasing fencing token that the PROTECTED RESOURCE itself verifies: a stale token can never mutate protected state (safety invariant, spec §19). Each commit domain issues strictly increasing tokens; the domain rejects any token <= the last one it accepted.",
      "exports": [
        {
          "name": "FencingDomain",
          "kind": "class",
          "signature": "class FencingDomain",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/time/SimulationClock",
      "path": "engine/reference/state/time/SimulationClock.md",
      "source": "engine/state/time/SimulationClock.js",
      "import": "/engine/state/time/SimulationClock.js",
      "sourceHash": "48b4876a848da392b5b3928399217219a96e4e6bbf4d7e3a37fc20e2fd702170",
      "summary": "state/time/SimulationClock.js — simulation time (spec §9 \"Simulation time\").  Simulation time is a domain-specific relationship between simulated changes (physics steps, biological cycles, world epochs, oscillator phases). There may be MANY simulation clocks and NO universal model clock — each advances independently. Simulation clocks are distinct from causal time (dependencies) and operational time (deadlines/leases); they never establish authority.  Advancing is deterministic: the same sequence of steps yields the same tick, which is required for deterministic replay (rule 66/68).",
      "exports": [
        {
          "name": "SimulationClock",
          "kind": "class",
          "signature": "class SimulationClock",
          "summary": ""
        },
        {
          "name": "SimulationClockSet",
          "kind": "class",
          "signature": "class SimulationClockSet",
          "summary": "A set of independent simulation clocks. Each domain advances on its own; there is deliberately no method to advance them all in lockstep to a global time."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/time/TimeModel",
      "path": "engine/reference/state/time/TimeModel.md",
      "source": "engine/state/time/TimeModel.js",
      "import": "/engine/state/time/TimeModel.js",
      "sourceHash": "0bdd3b7172370cbfcd9dcd5fd225980d5363b5977d150171630f9b0b9d451011",
      "summary": "state/time/TimeModel.js — time is NOT a counter.  A state only has \"time\" if it subscribes to a time source. Real time = change + comparison + memory + causality + irreversible direction. Different sources express different truths; a state can be timeless (NONE) while an observer experiences progression.",
      "exports": [
        {
          "name": "createTimeSource",
          "kind": "function",
          "signature": "createTimeSource(mode = TIME_MODES.NONE)",
          "summary": "Create a time source. `step(input)` advances per-mode and returns the new value; the engine never does `time++` globally. CAUSAL    input.causalSteps CLOCKED   input.dt (oscillator phase) ENTROPIC  input.irreversibleChange (abs — monotonic) OBSERVER  input.observed (boolean) MEMORY    input.stateDistance (>= 0) HYBRID    any combination of the above"
        },
        {
          "name": "TIME_MODES",
          "kind": "constant",
          "signature": "TIME_MODES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/transaction/CommitCoordinator",
      "path": "engine/reference/state/transaction/CommitCoordinator.md",
      "source": "engine/state/transaction/CommitCoordinator.js",
      "import": "/engine/state/transaction/CommitCoordinator.js",
      "sourceHash": "f702038a6f10a27cc51d35dfeb5abce808bf475c38df3528cb7ae8dfbb9c2aa1",
      "summary": "state/transaction/CommitCoordinator.js — the atomic commit protocol (spec §7).  No authoritative state change happens outside this pipeline (spec rule 19). It runs the 14-step protocol over a sealed transaction envelope and a set of canonical registries, then either commits atomically and returns a signed witness receipt, or rejects with a receipt explaining what failed. The pipeline enforces the CSE safety invariants: single-spend USOs, expected versions, valid + non-revoked authority, fencing-token freshness, predicate and invariant checks, idempotent replay, and a post-state root that matches the committed outputs.",
      "exports": [
        {
          "name": "createCommitCoordinator",
          "kind": "function",
          "signature": "createCommitCoordinator(cfg = {})",
          "summary": "Create a commit coordinator bound to a set of canonical registries."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/transaction/Idempotency",
      "path": "engine/reference/state/transaction/Idempotency.md",
      "source": "engine/state/transaction/Idempotency.js",
      "import": "/engine/state/transaction/Idempotency.js",
      "sourceHash": "8d7cb7b0c12812beb440fd504dd472efffeb57b75c8c028db79f4b31a7757b0d",
      "summary": "state/transaction/Idempotency.js — replay protection (spec rule 21).  Every potentially duplicated operation carries an idempotency key (`actor:task:operation`). The default registry preserves canonical at-most- once receipts without eviction for CommitCoordinator and other durable callers. A bounded TTL/LRU policy is available only by explicit opt-in for process-local replay caches whose mutation safety lives in canonical state or a separate durable dispatch fence.",
      "exports": [
        {
          "name": "IdempotencyRegistry",
          "kind": "class",
          "signature": "class IdempotencyRegistry",
          "summary": ""
        },
        {
          "name": "IDEMPOTENCY_REPLAY_MAX_ENTRIES",
          "kind": "constant",
          "signature": "IDEMPOTENCY_REPLAY_MAX_ENTRIES",
          "summary": ""
        },
        {
          "name": "IDEMPOTENCY_REPLAY_TTL_MS",
          "kind": "constant",
          "signature": "IDEMPOTENCY_REPLAY_TTL_MS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/transaction/ProposalPool",
      "path": "engine/reference/state/transaction/ProposalPool.md",
      "source": "engine/state/transaction/ProposalPool.js",
      "import": "/engine/state/transaction/ProposalPool.js",
      "sourceHash": "30d500678e499b4789dbcd8fdae335687d4543c34d0a91931c727bdea628021a",
      "summary": "state/transaction/ProposalPool.js — Transaction-plane proposal pool (spec §3 plane 5, rules 27–28).  Before a transaction reaches the CommitCoordinator it is a PROPOSAL: a candidate that has not yet won its conflict domain. Two proposals that consume the same USO conflict — they must COMPETE, never silently overwrite (rule 27). The pool groups proposals by the exclusive inputs they contend for, picks at most one winner per conflict set (deterministically), and marks the losers as `superseded` so they re-observe and re-plan (rule 28). The pool decides only candidacy; the commit gate still establishes truth.",
      "exports": [
        {
          "name": "ProposalPool",
          "kind": "class",
          "signature": "class ProposalPool",
          "summary": ""
        },
        {
          "name": "PROPOSAL_STATUS",
          "kind": "constant",
          "signature": "PROPOSAL_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/transaction/Transaction",
      "path": "engine/reference/state/transaction/Transaction.md",
      "source": "engine/state/transaction/Transaction.js",
      "import": "/engine/state/transaction/Transaction.js",
      "sourceHash": "76b4537dbeb294cb335748389d432f52027e8101690eaa8104e53aae15e51353",
      "summary": "state/transaction/Transaction.js — the one canonical transaction envelope.  Every authoritative state change flows through this envelope (spec §6). A transaction must STATE everything whose correctness depends on current state: read-set (expected versions), predicates, consumed inputs (USOs), created outputs, capabilities and external-effect intents. Checking only written objects is insufficient — predicate/write-skew anomalies require the read+predicate sets to be declared up front (spec rule 20).  The envelope is a plain, canonicalizable object; its transactionID is the secure hash of its canonical bytes (signature excluded), so the id is stable and tamper-evident.",
      "exports": [
        {
          "name": "makeTransaction",
          "kind": "function",
          "signature": "makeTransaction(spec = {})",
          "summary": "Build a canonical transaction envelope. Missing fields default to safe empty values so the shape is always complete (no partial transactions)."
        },
        {
          "name": "transactionBody",
          "kind": "function",
          "signature": "transactionBody(env)",
          "summary": "Canonical bytes of an envelope EXCLUDING id + signature (the signed body)."
        },
        {
          "name": "sealTransactionFast",
          "kind": "function",
          "signature": "sealTransactionFast(env)",
          "summary": "Attach a synchronous (fast) transactionID. Use for runtime/non-critical transactions where a 32-bit identity is enough."
        },
        {
          "name": "sealTransaction",
          "kind": "function",
          "signature": "async sealTransaction(env, signer = null)",
          "summary": "Attach a secure (SHA-256) transactionID and an optional signature produced by an authority signer. The signature covers the transactionID."
        },
        {
          "name": "TX_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "TX_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/uso/USO",
      "path": "engine/reference/state/uso/USO.md",
      "source": "engine/state/uso/USO.js",
      "import": "/engine/state/uso/USO.js",
      "sourceHash": "30aa210bd56b290be93243c00510e0a30cd7bdb853afb2f3055f5f39eb5ebdef",
      "summary": "state/uso/USO.js — Unspent State Output: the single-spend primitive (spec §5).  Adapted from Bitcoin's UTXO model: an exclusive, consumable, finalizable, or scarce resource. A transaction consumes inputs and creates replacement outputs; a consumed output can never be accepted again. Spendability (defined here) is separate from which conflicting spend wins (decided by the commit coordinator), exactly as Bitcoin separates outputs from consensus.  Use USOs for: exclusive ownership, scarce inventory, single-winner decisions, object-mutation rights, permission use, branch finalization, irreversible commits. Do NOT use them for hover/particles/observations/debug notes.",
      "exports": [
        {
          "name": "makeUSO",
          "kind": "function",
          "signature": "makeUSO(spec = {})",
          "summary": "Create an unspent state output. The id is derived from kind + entity + a discriminator (e.g. version) so distinct outputs get distinct ids and equal ones collapse. Payload is opaque domain data."
        },
        {
          "name": "objectVersionOutput",
          "kind": "function",
          "signature": "objectVersionOutput(entity, versionId, payload = null)",
          "summary": "Convenience: an object-version output (the common mutable-object case)."
        },
        {
          "name": "isUSO",
          "kind": "function",
          "signature": "isUSO(v)",
          "summary": "True if a value looks like a USO (has a string id and a kind)."
        },
        {
          "name": "USO_KIND",
          "kind": "constant",
          "signature": "USO_KIND",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/uso/USORegistry",
      "path": "engine/reference/state/uso/USORegistry.md",
      "source": "engine/state/uso/USORegistry.js",
      "import": "/engine/state/uso/USORegistry.js",
      "sourceHash": "0f8678a8f2a6094162b7cd3b59e548750d376aa6a72b81dd4198d8fc85f2911a",
      "summary": "state/uso/USORegistry.js — the unspent-output set + double-commit detector.  Tracks which outputs currently exist (unspent) and which have been consumed (spent). Enforces the core safety invariant: an output is never committed as spent twice (spec §19). A spend transaction's inputs must ALL be currently unspent; on commit they move to the spent set and the new outputs are created atomically by the caller (CommitCoordinator).",
      "exports": [
        {
          "name": "USORegistry",
          "kind": "class",
          "signature": "class USORegistry",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/util/canonical",
      "path": "engine/reference/state/util/canonical.md",
      "source": "engine/state/util/canonical.js",
      "import": "/engine/state/util/canonical.js",
      "sourceHash": "4bcf05c213e3ed7871ef155b3261e112a681401d96f2535b8a657c746cb41111",
      "summary": "state/util/canonical.js — deterministic serialization + self-describing, algorithm-tagged hash IDs (CSE Integrity plane, spec §13).  Equivalent data MUST produce byte-identical bytes before hashing or signing (spec rule 58). We implement an RFC 8785-style canonical JSON: object keys are sorted by UTF-16 code unit, arrays keep order, no insignificant whitespace, and non-finite numbers are rejected. Hash IDs are multihash-style (`alg:bits:hex`) so the algorithm can migrate later (spec rule 59).  Two tiers, matching the engine's hybrid integrity policy: • hot-path id   — synchronous 32-bit FNV (runtime identity / state roots). • authority id  — async Web Crypto SHA-256 (capabilities, receipts, checkpoints) where security matters.",
      "exports": [
        {
          "name": "canonicalize",
          "kind": "function",
          "signature": "canonicalize(value)",
          "summary": "Produce a deterministic canonical JSON string for any JSON-compatible value. Object keys are sorted; Maps and Sets are normalized; arrays preserve order."
        },
        {
          "name": "canonicalBytes",
          "kind": "function",
          "signature": "canonicalBytes(value, { domain = DOMAIN_SEPARATOR, schemaVersion = '' } = {})",
          "summary": "Domain-separated canonical bytes string used as hash/sign input (spec §13)."
        },
        {
          "name": "hashIdFast",
          "kind": "function",
          "signature": "hashIdFast(value, opts = {})",
          "summary": "Synchronous hot-path id: 32-bit FNV over canonical bytes. Tagged so it is self-describing and migratable. Fast, NOT collision-resistant — identity for runtime state, never a security claim (spec rule 52)."
        },
        {
          "name": "hashIdSecure",
          "kind": "function",
          "signature": "async hashIdSecure(value, opts = {})",
          "summary": "Async authority id: Web Crypto SHA-256 over canonical bytes. Use for capabilities, witness receipts, checkpoints, and signed transactions. Throws if SubtleCrypto is unavailable (callers degrade explicitly)."
        },
        {
          "name": "parseHashId",
          "kind": "function",
          "signature": "parseHashId(id)",
          "summary": "Parse a tagged hash id into `{ alg, bits, hex }` or null."
        },
        {
          "name": "hashIdEquals",
          "kind": "function",
          "signature": "hashIdEquals(a, b)",
          "summary": "True when two tagged hash ids are byte-equal (same algorithm + digest)."
        },
        {
          "name": "DOMAIN_SEPARATOR",
          "kind": "constant",
          "signature": "DOMAIN_SEPARATOR",
          "summary": "Domain separator prefix so hashes of different structures never collide."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/util/hashing",
      "path": "engine/reference/state/util/hashing.md",
      "source": "engine/state/util/hashing.js",
      "import": "/engine/state/util/hashing.js",
      "sourceHash": "32e1db855efe92846cae55e3ad907198286d09d08fe968fa609a35a4e8617528",
      "summary": "state/util/hashing.js — canonical, order-independent identity hashing for the URC fact/state layers. Reuses the engine's deterministic ChecksumMath rather than rolling new hashes (layer law: \"hash = identity\", nothing more).",
      "exports": [
        {
          "name": "hashFactString",
          "kind": "function",
          "signature": "hashFactString(value)",
          "summary": "Deterministic 32-bit hash of a single string fact."
        },
        {
          "name": "hashU32Sequence",
          "kind": "function",
          "signature": "hashU32Sequence(values)",
          "summary": "Deterministic 32-bit hash of an ordered sequence of uint32 (e.g. a packed pattern)."
        },
        {
          "name": "canonicalSetHash",
          "kind": "function",
          "signature": "canonicalSetHash(facts)",
          "summary": "Canonical, ORDER-INDEPENDENT hash of a set of facts. Facts are stringified, de-duplicated and sorted so that {A,B} and {B,A} collapse to the same id — this is what makes `State.id = hash(canonicalFacts)` sequence-free."
        },
        {
          "name": "hexId",
          "kind": "function",
          "signature": "hexId(value)",
          "summary": "Stable hex fingerprint for an unsigned 32-bit value (cold-path display/keys)."
        },
        {
          "name": "hashIdTailUint32",
          "kind": "function",
          "signature": "hashIdTailUint32(hashId, fallback = 0)",
          "summary": "Parse a tagged hash id's low 32-bit hex tail for deterministic bucketing/seeding."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/verify/ModelCheck",
      "path": "engine/reference/state/verify/ModelCheck.md",
      "source": "engine/state/verify/ModelCheck.js",
      "import": "/engine/state/verify/ModelCheck.js",
      "sourceHash": "edaa1923cfeeeb55341de9af3c66c9a20cd2fca049c567cdef9e5ade1d4a7a71",
      "summary": "state/verify/ModelCheck.js — browser-runnable bounded model checker for the CSE commit state machine (spec §19, rule 66: model-check the core protocol).  This is the executable companion to verify/cse-core.tla. Where TLC would exhaustively explore the TLA+ model, this performs the SAME exhaustive exploration in JavaScript so it runs inside the verify.html harness with no external tooling. It enumerates every reachable state under all interleavings of commit actions and checks the core safety invariants on each:  • NoDoubleSpend     — an output is never simultaneously unspent and spent. • SingleSpend       — no output is consumed by two committed transactions. • EveryCommitWitnessed — every committed transaction has a witness.  A transaction is enabled iff it is uncommitted and all of its inputs are still unspent; applying it consumes inputs, creates outputs, and records a witness.",
      "exports": [
        {
          "name": "exploreCommitMachine",
          "kind": "function",
          "signature": "exploreCommitMachine(cfg = {})",
          "summary": "Exhaustively explore the commit state machine."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/version",
      "path": "engine/reference/state/version.md",
      "source": "engine/state/version.js",
      "import": "/engine/state/version.js",
      "sourceHash": "713dcfc117eb6abe25754ceae9ad4e521192260fc265fd0d3b00b0ed74f13389",
      "summary": "============================================================ Universal Resonance State Engine (URC) — version source. ============================================================ Order-on-demand state engine: unordered facts, a resonance codebook, causal order only when forced, branches when order matters, and commit gates that decide final truth. The machine runs in order; the MODEL does not assume order unless forced.  Versions are facts too: migration rules reference these stamps, e.g. \"URC-v1 dense #88 maps to URC-v2 dense #402 iff hashID and symbolicSig match\". ============================================================",
      "exports": [
        {
          "name": "urcVersionStamp",
          "kind": "function",
          "signature": "urcVersionStamp()",
          "summary": "Version stamp embedded on every State/CodeEntry/Receipt for migration + audit."
        },
        {
          "name": "URC_VERSION",
          "kind": "constant",
          "signature": "URC_VERSION",
          "summary": ""
        },
        {
          "name": "URC_CODEBOOK",
          "kind": "constant",
          "signature": "URC_CODEBOOK",
          "summary": ""
        },
        {
          "name": "URC_SCHEMA",
          "kind": "constant",
          "signature": "URC_SCHEMA",
          "summary": ""
        },
        {
          "name": "URC_TRANSFORM",
          "kind": "constant",
          "signature": "URC_TRANSFORM",
          "summary": ""
        },
        {
          "name": "URC_BUILD_TAG",
          "kind": "constant",
          "signature": "URC_BUILD_TAG",
          "summary": ""
        },
        {
          "name": "CSE_TX_SCHEMA",
          "kind": "constant",
          "signature": "CSE_TX_SCHEMA",
          "summary": ""
        },
        {
          "name": "CSE_VALIDATOR",
          "kind": "constant",
          "signature": "CSE_VALIDATOR",
          "summary": ""
        },
        {
          "name": "CSE_POLICY",
          "kind": "constant",
          "signature": "CSE_POLICY",
          "summary": ""
        },
        {
          "name": "CSE_PHASES",
          "kind": "constant",
          "signature": "CSE_PHASES",
          "summary": ""
        },
        {
          "name": "URC_FULL",
          "kind": "constant",
          "signature": "URC_FULL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/witness/Witness",
      "path": "engine/reference/state/witness/Witness.md",
      "source": "engine/state/witness/Witness.js",
      "import": "/engine/state/witness/Witness.js",
      "sourceHash": "3ec2fd8fbd5904c13b6a449f60b166140defbe3ecd725198e5006f390653b320",
      "summary": "state/witness/Witness.js — debug proof for every projection / commit.  Replaces \"1 happened, 2 happened, 3 happened\" timelines with: these facts existed · these rules fired · these branches were possible · this projection was shown · this commit was chosen.",
      "exports": [
        {
          "name": "makeWitness",
          "kind": "function",
          "signature": "makeWitness(w = {})",
          "summary": ""
        },
        {
          "name": "makeReceipt",
          "kind": "function",
          "signature": "makeReceipt(r = {})",
          "summary": "Build a full CSE witness receipt for a transaction commit decision (spec §7). The receipt proves WHAT was checked and WHAT the engine decided — it does not claim the input observations were objectively true. Every committed transition has exactly one receipt (safety invariant, spec §19)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/workflow/Inbox",
      "path": "engine/reference/state/workflow/Inbox.md",
      "source": "engine/state/workflow/Inbox.js",
      "import": "/engine/state/workflow/Inbox.js",
      "sourceHash": "3044f5af81824fba14614f1f08602ba4fc8b564ee1682107ebd2f78beee6aee7",
      "summary": "state/workflow/Inbox.js — idempotent inbox / effect receiver (spec §11, rule 42).  The outbox delivers at-least-once, so the receiving side MUST deduplicate by the stable effect id to make the end-to-end behavior effectively-once. The inbox records the first result for each effect id; a redelivery returns the stored result and does NOT re-run the handler (mirrors the transaction IdempotencyRegistry, but for inbound external effects).",
      "exports": [
        {
          "name": "Inbox",
          "kind": "class",
          "signature": "class Inbox",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/workflow/Outbox",
      "path": "engine/reference/state/workflow/Outbox.md",
      "source": "engine/state/workflow/Outbox.js",
      "import": "/engine/state/workflow/Outbox.js",
      "sourceHash": "f0b780d825cf53cb8542712c4f0667bb2d59ac18759fc56b46bd0b2937b74c42",
      "summary": "state/workflow/Outbox.js — transactional outbox (spec §11, rule 41).  A canonical commit cannot atomically control an unrelated email server, payment processor, OS call, or device. CSE solves this dual-write problem by writing an external-effect INTENT into the same atomic transaction as the internal state change (the CommitCoordinator appends intents here on commit); a separate worker later delivers each intent and receivers deduplicate by a stable effect id (rule 42). This module owns the durable intent queue and its status lifecycle:  pending → delivering → delivered → acked ↘ failed → (reconcile | retry)  Re-recording the same effect id is a no-op, so commit retries never enqueue an effect twice. Delivery is at-least-once; idempotent receivers (see Inbox.js) make the end-to-end behavior effectively-once.",
      "exports": [
        {
          "name": "Outbox",
          "kind": "class",
          "signature": "class Outbox",
          "summary": ""
        },
        {
          "name": "makeEffectIntent",
          "kind": "function",
          "signature": "makeEffectIntent(spec = {})",
          "summary": "Declare an external-effect intent. Every effect must state its reversibility profile so the workflow plane knows whether it can be compensated, retried, or must pause for approval (spec §11)."
        },
        {
          "name": "EFFECT_STATUS",
          "kind": "constant",
          "signature": "EFFECT_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/workflow/Reconciler",
      "path": "engine/reference/state/workflow/Reconciler.md",
      "source": "engine/state/workflow/Reconciler.js",
      "import": "/engine/state/workflow/Reconciler.js",
      "sourceHash": "b553fd85501660cc794d8df70528641de86ce7b70140e3236733916eec65373f",
      "summary": "state/workflow/Reconciler.js — external-effect reconciler (spec §11, rule 43).  When a delivery outcome is unknown (timeout, crash between send and ack, etc.) the effect is parked in the outbox as RECONCILE rather than guessed. The reconciler queries the external system's authoritative status for each parked effect and resolves it: confirm (it actually happened → ack), retry (it did not happen and is safe to resend → back to pending), or escalate (needs human authority attention). Ambiguity is resolved by EVIDENCE, never assumption.",
      "exports": [
        {
          "name": "Reconciler",
          "kind": "class",
          "signature": "class Reconciler",
          "summary": ""
        },
        {
          "name": "RECONCILE_RESULT",
          "kind": "constant",
          "signature": "RECONCILE_RESULT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/workflow/Saga",
      "path": "engine/reference/state/workflow/Saga.md",
      "source": "engine/state/workflow/Saga.js",
      "import": "/engine/state/workflow/Saga.js",
      "sourceHash": "12e52301526fb2bfd492c45db5f1df06966e58aad36e8a66291084d958e78f50",
      "summary": "state/workflow/Saga.js — saga coordinator + compensation registry (spec §11).  For multi-step workflows that span commit domains or external systems, true distributed atomic commit is avoided where possible (rule 40). Instead a saga runs a sequence of LOCAL steps, each with a forward action and a compensating action. If a step fails, the already-completed steps are compensated in reverse order. Compensation is a NEW action, not deletion of history (rule 44), and some effects cannot be perfectly undone — every saga declares a PIVOT step after which forward-only recovery applies because compensation is no longer possible (rule 45, the irreversible pivot).",
      "exports": [
        {
          "name": "Saga",
          "kind": "class",
          "signature": "class Saga",
          "summary": ""
        },
        {
          "name": "sagaStep",
          "kind": "function",
          "signature": "sagaStep(s)",
          "summary": "Define a saga step."
        },
        {
          "name": "SAGA_STATUS",
          "kind": "constant",
          "signature": "SAGA_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/worldmodel/AffordanceRegistry",
      "path": "engine/reference/state/worldmodel/AffordanceRegistry.md",
      "source": "engine/state/worldmodel/AffordanceRegistry.js",
      "import": "/engine/state/worldmodel/AffordanceRegistry.js",
      "sourceHash": "d506b519cfb7fd2d6c1c2c2772b3a19b739563347e7d48abce9674de8e692b1b",
      "summary": "state/worldmodel/AffordanceRegistry.js — declares LEGAL actions rather than letting the model invent tool syntax (spec §15 \"Affordance registry\", rule 34/50).  Each affordance binds an action to an object type and declares: preconditions (named predicates evaluated against context), the capability required to do it, predicted effects, a risk level, and a rollback/compensation hint. The planner asks \"what may I legally do to this object?\" and the registry answers from explicit declarations. High-risk / irreversible actions require explicit approval — the registry surfaces this but NEVER authorizes by itself (the capability + commit layer remains the authority).",
      "exports": [
        {
          "name": "AffordanceRegistry",
          "kind": "class",
          "signature": "class AffordanceRegistry",
          "summary": ""
        },
        {
          "name": "makeAffordance",
          "kind": "function",
          "signature": "makeAffordance(a = {})",
          "summary": ""
        },
        {
          "name": "RISK",
          "kind": "constant",
          "signature": "RISK",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/worldmodel/BeliefStore",
      "path": "engine/reference/state/worldmodel/BeliefStore.md",
      "source": "engine/state/worldmodel/BeliefStore.js",
      "import": "/engine/state/worldmodel/BeliefStore.js",
      "sourceHash": "983aee55f515dff1e008f6f4d2bf057b757792435e803675691f61d7cdab8cc8",
      "summary": "state/worldmodel/BeliefStore.js — separates the AI's belief model from canonical state (spec §15, rules 46–48).  The world model maintains five strictly-separated worlds:  CANONICAL — authoritative committed state (mirror, written ONLY by commit) OBSERVED  — currently sensed / retrieved information BELIEF    — inferences and uncertain interpretations PREDICTED — counterfactual futures from the model/sandbox PROPOSED  — the branch an agent wants to commit  Hard rule (47): a prediction or belief can NEVER become canonical directly. This store exposes NO method to write CANONICAL except `syncCanonical`, which represents the commit gate mirroring an already-committed result back into the model. predict()/believe()/observe()/propose() can never touch it.  Rule 48: uncertainty grows with prediction horizon unless new evidence reduces it — predict() decays confidence by horizon; observe() can restore it.",
      "exports": [
        {
          "name": "BeliefStore",
          "kind": "class",
          "signature": "class BeliefStore",
          "summary": ""
        },
        {
          "name": "WORLD",
          "kind": "constant",
          "signature": "WORLD",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/worldmodel/CausalDynamics",
      "path": "engine/reference/state/worldmodel/CausalDynamics.md",
      "source": "engine/state/worldmodel/CausalDynamics.js",
      "import": "/engine/state/worldmodel/CausalDynamics.js",
      "sourceHash": "d03ce880a448e2e6eb37573fab8b6ea5a0be5e0bef74f1e2647bf36d71a12e74",
      "summary": "state/worldmodel/CausalDynamics.js — AI World Model causal-dynamics model (spec §15 \"Causal dynamics model\", rules 47–49).  Predicts how the world MAY change under an action: a registry of declared transition functions, each producing a predicted next state plus an effect summary the sandbox/planner can score. Predictions are hypotheses only — they never mutate canonical state (rule 47). An unknown action is reported as `known:false` and leaves state unchanged rather than guessing. The model also learns from outcomes: feeding observed effects back adjusts a per-action confidence so planning becomes calibrated (rule 49), pairing with ToolEffectModel's discrepancy tracking.",
      "exports": [
        {
          "name": "CausalDynamics",
          "kind": "class",
          "signature": "class CausalDynamics",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/worldmodel/ObjectGraph",
      "path": "engine/reference/state/worldmodel/ObjectGraph.md",
      "source": "engine/state/worldmodel/ObjectGraph.js",
      "import": "/engine/state/worldmodel/ObjectGraph.js",
      "sourceHash": "0f19f945cb1cba52d180a9da42c244fcb0a96a138554e7fda5fc70a653dedd5c",
      "summary": "state/worldmodel/ObjectGraph.js — object identity + relationship graph (spec §15 \"Object identity graph\" + \"Spatial and relationship graph\").  Tracks objects with STABLE logical ids (independent of their content version) and typed directed relations between them: inside, near, connected-to, blocks, contains, reachable-from, visible-from, depends-on. Relations support reachability queries (e.g. \"is room A reachable from room B over `connected`?\") which the planner uses without ever asserting canonical truth.",
      "exports": [
        {
          "name": "ObjectGraph",
          "kind": "class",
          "signature": "class ObjectGraph",
          "summary": ""
        },
        {
          "name": "RELATION",
          "kind": "constant",
          "signature": "RELATION",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/worldmodel/PredictionSandbox",
      "path": "engine/reference/state/worldmodel/PredictionSandbox.md",
      "source": "engine/state/worldmodel/PredictionSandbox.js",
      "import": "/engine/state/worldmodel/PredictionSandbox.js",
      "sourceHash": "d8e4b02a9e4996f6c1aa4fc783d1d0453cbbe83196926571754d0488fc85057d",
      "summary": "state/worldmodel/PredictionSandbox.js — isolated counterfactual rollouts (spec §15 \"Prediction sandbox\", rules 18, 47, 48).  The model proposes multiple futures WITHOUT modifying canonical state. Every produced state is a prediction (`canonical:false`, `isTruth:false`) — it can only become real by being turned into a transaction and passing the commit gate. The sandbox enforces the §18 / §15 disciplines: short receding-horizon rollouts, branch budgets (width × depth), and uncertainty that grows with the horizon. To guarantee non-mutation it deep-clones the state before every transition, so even a transition that mutates its argument cannot touch the caller's canonical snapshot.",
      "exports": [
        {
          "name": "PredictionSandbox",
          "kind": "class",
          "signature": "class PredictionSandbox",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/worldmodel/ToolEffectModel",
      "path": "engine/reference/state/worldmodel/ToolEffectModel.md",
      "source": "engine/state/worldmodel/ToolEffectModel.js",
      "import": "/engine/state/worldmodel/ToolEffectModel.js",
      "sourceHash": "46952379486b55e14e736f63d3446912c85b8ab015bef0339448662b21e8306d",
      "summary": "state/worldmodel/ToolEffectModel.js — expected-vs-observed tool consequences and a discrepancy learner (spec §15 \"Tool effect model\" + \"Discrepancy learner\", rule 49/51).  For each tool the model records what it EXPECTED to happen; after the action the actual result is observed and compared. The discrepancy updates a running calibration score so the planner learns which tools are reliable. World-model quality is judged by action outcomes and calibration — not appearance (rule 51). The agent re-observes after acting (rule 49); this is where that loop is closed.",
      "exports": [
        {
          "name": "ToolEffectModel",
          "kind": "class",
          "signature": "class ToolEffectModel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "state/worldmodel/UntrustedBoundary",
      "path": "engine/reference/state/worldmodel/UntrustedBoundary.md",
      "source": "engine/state/worldmodel/UntrustedBoundary.js",
      "import": "/engine/state/worldmodel/UntrustedBoundary.js",
      "sourceHash": "3fe3b79e8b8f38eb9946312508590320ee704a2e768f044cf40cb3ed5d5e58a8",
      "summary": "state/worldmodel/UntrustedBoundary.js — the prompt-injection boundary (spec §15 \"Prompt-injection boundary\", rules 33, 50).  All webpages, files, emails, tool outputs, other agents, and generated text are UNTRUSTED OBSERVATIONS — never authority instructions. This boundary is the single chokepoint where such content enters the world model: it wraps the content as an untrusted observation (CERTAINTY.UNTRUSTED) and makes it structurally impossible to treat as policy or to mint authority from it.  The model MAY observe broadly, infer cautiously, propose actions, and simulate futures. It MAY NOT mint authority, bypass capabilities, declare its prediction canonical, or treat retrieved text as trusted policy. Authority decisions live OUTSIDE the model (capability + commit), so this module deliberately exposes no path from untrusted content to a capability or a canonical write.",
      "exports": [
        {
          "name": "UntrustedBoundary",
          "kind": "class",
          "signature": "class UntrustedBoundary",
          "summary": ""
        },
        {
          "name": "ingestUntrusted",
          "kind": "function",
          "signature": "ingestUntrusted(content, meta = {})",
          "summary": "Ingest external/tool/model content as an untrusted observation. The returned record is explicitly non-authoritative and carries untrusted provenance."
        },
        {
          "name": "canAuthorize",
          "kind": "function",
          "signature": "canAuthorize(record)",
          "summary": "True only for records that may carry authority. Untrusted records: always false."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/CanvasSurface",
      "path": "engine/reference/surfaces/CanvasSurface.md",
      "source": "engine/surfaces/CanvasSurface.js",
      "import": "/engine/surfaces/CanvasSurface.js",
      "sourceHash": "4bf5192a5779dae86ee6692c117fbacddbbfe20b249d316982b9f2293d183b81",
      "summary": "engine/surfaces/CanvasSurface.js — the base pixel source: a 2D canvas drawn by a callback. CodeSurface and TerminalSurface build on it. A source exposes the contract SurfaceManager expects: `.canvas`, optional `.dirty`, `.render(dt)`, `.resize(w,h)`, `.onPointer(e)`, `.onKey(e)`, `.dispose()`.",
      "exports": [
        {
          "name": "make2DCanvas",
          "kind": "function",
          "signature": "make2DCanvas(width, height)",
          "summary": "Allocate a 2D canvas (OffscreenCanvas when available, else a DOM canvas)."
        },
        {
          "name": "createCanvasSurface",
          "kind": "function",
          "signature": "createCanvasSurface(opts = {})",
          "summary": "A generic canvas source."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/CodeSurface",
      "path": "engine/reference/surfaces/CodeSurface.md",
      "source": "engine/surfaces/CodeSurface.js",
      "import": "/engine/surfaces/CodeSurface.js",
      "sourceHash": "94a89ae3efe9ad28f6a8c65df7c17e1821ffcf7d2f1c0248bdf837d081e1a587",
      "summary": "engine/surfaces/CodeSurface.js — an editable, syntax-lite code view rendered to a canvas so it can live on a mesh. Supports typing, Backspace, Enter, arrow navigation, Home/End, and vertical scroll that follows the caret. Highlighting is intentionally lightweight (comments / strings / numbers / keywords) — enough to read code on a surface without pulling in a full language grammar.",
      "exports": [
        {
          "name": "createCodeSurface",
          "kind": "function",
          "signature": "createCodeSurface(opts = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/MediaSurface",
      "path": "engine/reference/surfaces/MediaSurface.md",
      "source": "engine/surfaces/MediaSurface.js",
      "import": "/engine/surfaces/MediaSurface.js",
      "sourceHash": "6d5c06e9861c404d150ed4a395555635f72e386e4739ffb808576e14877f47de",
      "summary": "Browser-media producers for RenderSurface. These sources only expose pixels that the caller explicitly supplies or requests; camera capture is never started implicitly and owned MediaStreams are always stopped on dispose.",
      "exports": [
        {
          "name": "createImageSurface",
          "kind": "function",
          "signature": "createImageSurface(opts = {})",
          "summary": "Wrap an ImageBitmap, image element, canvas, or URL as a static pixel source. URL-created images default to anonymous CORS and expose a `ready` promise."
        },
        {
          "name": "createVideoSurface",
          "kind": "function",
          "signature": "createVideoSurface(opts = {})",
          "summary": "Wrap an HTMLVideoElement or create one from a URL/MediaStream."
        },
        {
          "name": "createCameraSurface",
          "kind": "function",
          "signature": "async createCameraSurface(opts = {})",
          "summary": "Request a camera only after an explicit caller action, then expose it as a video source. The returned source owns and stops every acquired track."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/RenderSurface",
      "path": "engine/reference/surfaces/RenderSurface.md",
      "source": "engine/surfaces/RenderSurface.js",
      "import": "/engine/surfaces/RenderSurface.js",
      "sourceHash": "eea289670c0ffdc88b583cb6298de8ed5c4f7a5411bd2ca8bdee57680e4e9bd0",
      "summary": "engine/surfaces/RenderSurface.js — a RenderSurface is a live, drawable texture fed by a source (canvas / code / terminal / camera / webgpu / image / video) that can be mapped onto a mesh as baseColor/emissive and optionally receive pointer/keyboard input via UV hit-testing.  This module owns the schema + update policy (when a surface should re-upload to the GPU) and is deliberately GPU-free: SurfaceManager performs the upload, the source produces pixels, and RenderSurfaceMaterial binds it to a mesh. Keeping these concerns separate makes surfaces reusable across demos, editor, runtime.",
      "exports": [
        {
          "name": "createRenderSurface",
          "kind": "function",
          "signature": "createRenderSurface(init = {})",
          "summary": "Create a RenderSurface descriptor."
        },
        {
          "name": "markSurfaceDirty",
          "kind": "function",
          "signature": "markSurfaceDirty(surface)",
          "summary": "Flag a surface as needing a GPU re-upload."
        },
        {
          "name": "resizeSurface",
          "kind": "function",
          "signature": "resizeSurface(surface, width, height)",
          "summary": "Resize a surface (also resizes its source canvas) and flag it dirty."
        },
        {
          "name": "surfaceNeedsUpload",
          "kind": "function",
          "signature": "surfaceNeedsUpload(surface, nowMs)",
          "summary": "Decide whether a surface should upload to the GPU this tick. Pure (no side effects) so it is unit-testable; SurfaceManager applies the result."
        },
        {
          "name": "SURFACE_SOURCE",
          "kind": "constant",
          "signature": "SURFACE_SOURCE",
          "summary": "What feeds a surface's pixels."
        },
        {
          "name": "UPDATE_MODE",
          "kind": "constant",
          "signature": "UPDATE_MODE",
          "summary": "Update cadence. `dirty` only re-uploads when the source flags a change; `interval` re-uploads at most every intervalMs; `realtime` every frame the surface is visible. `static` uploads once."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/RenderSurfaceMaterial",
      "path": "engine/reference/surfaces/RenderSurfaceMaterial.md",
      "source": "engine/surfaces/RenderSurfaceMaterial.js",
      "import": "/engine/surfaces/RenderSurfaceMaterial.js",
      "sourceHash": "daf321bc73b4c01ea3ca70bd9ac42bc936ed902081d9330f2fdc5d0f2247cd51",
      "summary": "engine/surfaces/RenderSurfaceMaterial.js — bind a RenderSurface onto a mesh as baseColor or emissive, in world- or screen-space, reusing the EngineMaterial schema so surfaces flow through the same material/binding path as imported textures. The GPU resource accessor lets any renderer drop the surface's live texture into a bind group without knowing how it is produced.",
      "exports": [
        {
          "name": "createSurfaceMaterial",
          "kind": "function",
          "signature": "createSurfaceMaterial(surface, opts = {})",
          "summary": "Create an EngineMaterial that samples a RenderSurface. Screens usually want the UNLIT workflow + the EMISSIVE slot (they emit their own light) so they stay bright regardless of scene lighting."
        },
        {
          "name": "surfaceTextureResource",
          "kind": "function",
          "signature": "surfaceTextureResource(surface)",
          "summary": "Live GPU resource for a surface, for inserting into a bind group."
        },
        {
          "name": "materialSurfaceBinding",
          "kind": "function",
          "signature": "materialSurfaceBinding(material)",
          "summary": "Is this material backed by a render surface? Returns its binding block or null."
        },
        {
          "name": "surfaceIdFromTextureId",
          "kind": "function",
          "signature": "surfaceIdFromTextureId(textureId)",
          "summary": "Map a virtual surface texture id (`surface://id`) back to the surface id."
        },
        {
          "name": "SURFACE_SLOT",
          "kind": "constant",
          "signature": "SURFACE_SLOT",
          "summary": ""
        },
        {
          "name": "SURFACE_SPACE",
          "kind": "constant",
          "signature": "SURFACE_SPACE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/SurfaceInputMapper",
      "path": "engine/reference/surfaces/SurfaceInputMapper.md",
      "source": "engine/surfaces/SurfaceInputMapper.js",
      "import": "/engine/surfaces/SurfaceInputMapper.js",
      "sourceHash": "d864d06f7a25fe31e79d3d50ede74e8e5ff99b9b063c145115a1fb8f187ed93f",
      "summary": "engine/surfaces/SurfaceInputMapper.js — route input to a focused RenderSurface.  Pointer events arrive as a UV hit (from the renderer's raycast against the mesh the surface is mapped to); this maps UV → surface pixel coords and dispatches to the surface's source. Keyboard events go to whichever surface is \"focused\" (typically the last one clicked). Only surfaces whose `permissions.input` is true receive events — surfaces are inert by default.",
      "exports": [
        {
          "name": "uvToPixel",
          "kind": "function",
          "signature": "uvToPixel(surface, u, v)",
          "summary": "Convert a UV hit (with v measured top-down) to integer surface pixels."
        },
        {
          "name": "createSurfaceInputMapper",
          "kind": "function",
          "signature": "createSurfaceInputMapper(opts = {})",
          "summary": "Create an input mapper over a set of surfaces (or a SurfaceManager)."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/SurfaceManager",
      "path": "engine/reference/surfaces/SurfaceManager.md",
      "source": "engine/surfaces/SurfaceManager.js",
      "import": "/engine/surfaces/SurfaceManager.js",
      "sourceHash": "f7b8b39ee773a689afe77fe2e7964ac241e0305e94cfb9e0515371b4e9b64108",
      "summary": "engine/surfaces/SurfaceManager.js — owns the GPU texture lifetime and the update scheduler for a set of RenderSurfaces. Each tick it asks the policy (surfaceNeedsUpload) which surfaces changed/are due/are realtime-and-visible, renders just those sources, and uploads them — so nothing touches the GPU unless it must (dirty-only by default, interval-capped, slept when off-screen).  The actual GPU calls are isolated behind an injectable `uploader`, so the scheduling logic is testable headless (gates) without a WebGPU device.",
      "exports": [
        {
          "name": "surfaceImageSource",
          "kind": "function",
          "signature": "surfaceImageSource(surface)",
          "summary": "The uploadable image source backing a surface (canvas / img / video)."
        },
        {
          "name": "surfaceImageReady",
          "kind": "function",
          "signature": "surfaceImageReady(surface)",
          "summary": "True when an external-image source has decoded enough pixels to copy."
        },
        {
          "name": "createSurfaceManager",
          "kind": "function",
          "signature": "createSurfaceManager(device, opts = {})",
          "summary": "Create a surface manager."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/TerminalSurface",
      "path": "engine/reference/surfaces/TerminalSurface.md",
      "source": "engine/surfaces/TerminalSurface.js",
      "import": "/engine/surfaces/TerminalSurface.js",
      "sourceHash": "368f590b25901974bdd842c5b67ccc16d6671b8b73b82e0bf156af52bdacdbf1",
      "summary": "engine/surfaces/TerminalSurface.js — an interactive terminal/REPL rendered to a canvas so it can live on a mesh. It keeps a scrollback buffer + an input line, echoes typing, and dispatches a command on Enter via `onCommand(line) -> string | string[] | void`. Safe by design: it only renders its OWN buffer — there is no shell, no eval, nothing external (the host wires whatever onCommand does).",
      "exports": [
        {
          "name": "createTerminalSurface",
          "kind": "function",
          "signature": "createTerminalSurface(opts = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/WebGPUSurface",
      "path": "engine/reference/surfaces/WebGPUSurface.md",
      "source": "engine/surfaces/WebGPUSurface.js",
      "import": "/engine/surfaces/WebGPUSurface.js",
      "sourceHash": "be3d3b66333eb31d642cca0cc3612869e5a751077960064e3e1a77a4d2b91fca",
      "summary": "engine/surfaces/WebGPUSurface.js — a surface source that ADOPTS an externally rendered GPU texture instead of uploading pixels from a canvas. The host renders into its own render target(s) and hands the current texture/view to the surface each frame via `adopt()`; SurfaceManager then exposes it like any other surface (sampleable on a mesh) with zero copies. This backs feedback/mirror effects and \"stream the screen onto a screen\" use-cases (SURFACE_SOURCE.WEBGPU).  Safety: it only ever adopts textures the host already owns — there is no capture of arbitrary external content.",
      "exports": [
        {
          "name": "createWebGPUSurface",
          "kind": "function",
          "signature": "createWebGPUSurface(opts = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "surfaces/index",
      "path": "engine/reference/surfaces/index.md",
      "source": "engine/surfaces/index.js",
      "import": "/engine/surfaces/index.js",
      "sourceHash": "2de6faf8310d59cdea22356f1c8169b3bd63e64557e643cefab5281e25c39623",
      "summary": "engine/surfaces/index.js — Render Surfaces barrel (spec Phase 4).  A RenderSurface turns a live source (canvas / code / terminal / camera / webgpu / image / video) into a GPU texture that can be mapped onto a mesh as baseColor or emissive and optionally receive pointer/keyboard input via UV hit-testing. The SurfaceManager owns texture lifetime + an update scheduler so nothing touches the GPU unless it must (dirty-only, interval-capped, slept when off-screen). Sources only ever render their OWN content (safety by design).",
      "exports": [
        {
          "name": "SURFACE_SLOT",
          "kind": "re-export",
          "signature": "SURFACE_SLOT",
          "summary": ""
        },
        {
          "name": "SURFACE_SOURCE",
          "kind": "re-export",
          "signature": "SURFACE_SOURCE",
          "summary": ""
        },
        {
          "name": "SURFACE_SPACE",
          "kind": "re-export",
          "signature": "SURFACE_SPACE",
          "summary": ""
        },
        {
          "name": "UPDATE_MODE",
          "kind": "re-export",
          "signature": "UPDATE_MODE",
          "summary": ""
        },
        {
          "name": "createCameraSurface",
          "kind": "re-export",
          "signature": "createCameraSurface",
          "summary": ""
        },
        {
          "name": "createCanvasSurface",
          "kind": "re-export",
          "signature": "createCanvasSurface",
          "summary": ""
        },
        {
          "name": "createCodeSurface",
          "kind": "re-export",
          "signature": "createCodeSurface",
          "summary": ""
        },
        {
          "name": "createImageSurface",
          "kind": "re-export",
          "signature": "createImageSurface",
          "summary": ""
        },
        {
          "name": "createRenderSurface",
          "kind": "re-export",
          "signature": "createRenderSurface",
          "summary": ""
        },
        {
          "name": "createSurfaceInputMapper",
          "kind": "re-export",
          "signature": "createSurfaceInputMapper",
          "summary": ""
        },
        {
          "name": "createSurfaceManager",
          "kind": "re-export",
          "signature": "createSurfaceManager",
          "summary": ""
        },
        {
          "name": "createSurfaceMaterial",
          "kind": "re-export",
          "signature": "createSurfaceMaterial",
          "summary": ""
        },
        {
          "name": "createTerminalSurface",
          "kind": "re-export",
          "signature": "createTerminalSurface",
          "summary": ""
        },
        {
          "name": "createVideoSurface",
          "kind": "re-export",
          "signature": "createVideoSurface",
          "summary": ""
        },
        {
          "name": "createWebGPUSurface",
          "kind": "re-export",
          "signature": "createWebGPUSurface",
          "summary": ""
        },
        {
          "name": "make2DCanvas",
          "kind": "re-export",
          "signature": "make2DCanvas",
          "summary": ""
        },
        {
          "name": "markSurfaceDirty",
          "kind": "re-export",
          "signature": "markSurfaceDirty",
          "summary": ""
        },
        {
          "name": "materialSurfaceBinding",
          "kind": "re-export",
          "signature": "materialSurfaceBinding",
          "summary": ""
        },
        {
          "name": "resizeSurface",
          "kind": "re-export",
          "signature": "resizeSurface",
          "summary": ""
        },
        {
          "name": "surfaceIdFromTextureId",
          "kind": "re-export",
          "signature": "surfaceIdFromTextureId",
          "summary": ""
        },
        {
          "name": "surfaceImageReady",
          "kind": "re-export",
          "signature": "surfaceImageReady",
          "summary": ""
        },
        {
          "name": "surfaceImageSource",
          "kind": "re-export",
          "signature": "surfaceImageSource",
          "summary": ""
        },
        {
          "name": "surfaceNeedsUpload",
          "kind": "re-export",
          "signature": "surfaceNeedsUpload",
          "summary": ""
        },
        {
          "name": "surfaceTextureResource",
          "kind": "re-export",
          "signature": "surfaceTextureResource",
          "summary": ""
        },
        {
          "name": "uvToPixel",
          "kind": "re-export",
          "signature": "uvToPixel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/IntegrationTests",
      "path": "engine/reference/tools/IntegrationTests.md",
      "source": "engine/tools/IntegrationTests.js",
      "import": "/engine/tools/IntegrationTests.js",
      "sourceHash": "044e6c35a0510e125abdbc67dffc65b7ef8453cb06832689e3a4a09724bfc11e",
      "summary": "Test result",
      "exports": [
        {
          "name": "TestResult",
          "kind": "class",
          "signature": "class TestResult",
          "summary": "Test result"
        },
        {
          "name": "TestSuite",
          "kind": "class",
          "signature": "class TestSuite",
          "summary": "Test suite for organizing tests"
        },
        {
          "name": "TestRunner",
          "kind": "class",
          "signature": "class TestRunner",
          "summary": ""
        },
        {
          "name": "createVehicleMountingTests",
          "kind": "function",
          "signature": "createVehicleMountingTests()",
          "summary": ""
        },
        {
          "name": "createMultiplayerSyncTests",
          "kind": "function",
          "signature": "createMultiplayerSyncTests()",
          "summary": ""
        },
        {
          "name": "createMemoryLeakTests",
          "kind": "function",
          "signature": "createMemoryLeakTests()",
          "summary": ""
        },
        {
          "name": "createFrameBudgetTests",
          "kind": "function",
          "signature": "createFrameBudgetTests()",
          "summary": ""
        },
        {
          "name": "createCrossSystemTests",
          "kind": "function",
          "signature": "createCrossSystemTests()",
          "summary": ""
        },
        {
          "name": "runIntegrationTests",
          "kind": "function",
          "signature": "async runIntegrationTests()",
          "summary": ""
        },
        {
          "name": "TestStatus",
          "kind": "constant",
          "signature": "TestStatus",
          "summary": "Test result status"
        },
        {
          "name": "assert",
          "kind": "constant",
          "signature": "assert",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/aiming/GlobalAim",
      "path": "engine/reference/tools/aiming/GlobalAim.md",
      "source": "engine/tools/aiming/GlobalAim.js",
      "import": "/engine/tools/aiming/GlobalAim.js",
      "sourceHash": "d3689d2e57e874a626eadd68c67410f17472e72a340ff5575b312e44d225d049",
      "summary": "Get an entity's world position with an optional vertical offset. Returns null if the entity or Transform is missing.",
      "exports": [
        {
          "name": "getEntityWorldPosition",
          "kind": "function",
          "signature": "getEntityWorldPosition(ecsWorld, entityId, heightOffset = 0)",
          "summary": "Get an entity's world position with an optional vertical offset. Returns null if the entity or Transform is missing."
        },
        {
          "name": "computeAimBetweenEntities",
          "kind": "function",
          "signature": "computeAimBetweenEntities(ecsWorld, sourceEntityId, targetEntityId, options = {},)",
          "summary": "Compute an aim line from one entity to another. Returns { origin, target, direction, distance } or null if invalid."
        },
        {
          "name": "computeAimFromEntityToPoint",
          "kind": "function",
          "signature": "computeAimFromEntityToPoint(ecsWorld, sourceEntityId, worldPoint, options = {},)",
          "summary": "Compute an aim line from an entity to an arbitrary world-space point."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/animation/FBXAscii",
      "path": "engine/reference/tools/animation/FBXAscii.md",
      "source": "engine/tools/animation/FBXAscii.js",
      "import": "/engine/tools/animation/FBXAscii.js",
      "sourceHash": "3c377bdd3748f3ea1e6e5f15cebb18b7f2514cb535bb66b2c1f7dd1f34986b21",
      "summary": "",
      "exports": [
        {
          "name": "parseFBXAscii",
          "kind": "function",
          "signature": "parseFBXAscii(text)",
          "summary": ""
        },
        {
          "name": "buildMixamoSkeletonFromFBX",
          "kind": "function",
          "signature": "buildMixamoSkeletonFromFBX(fbx, opts = {})",
          "summary": ""
        },
        {
          "name": "sampleMixamoFBXAnimationClip",
          "kind": "function",
          "signature": "sampleMixamoFBXAnimationClip(fbx, skeleton, opts = {})",
          "summary": ""
        },
        {
          "name": "findSkeletonJointIndexByName",
          "kind": "function",
          "signature": "findSkeletonJointIndexByName(skeleton, jointName)",
          "summary": ""
        },
        {
          "name": "computeClipLocalMatricesAtFrame",
          "kind": "function",
          "signature": "computeClipLocalMatricesAtFrame(clip, skeleton, frameIndex, out = null)",
          "summary": ""
        },
        {
          "name": "computeClipGlobalMatricesAtFrame",
          "kind": "function",
          "signature": "computeClipGlobalMatricesAtFrame(clip, skeleton, frameIndex, out = null)",
          "summary": ""
        },
        {
          "name": "extractRootTranslationTrack",
          "kind": "function",
          "signature": "extractRootTranslationTrack(clip, skeleton, opts = {})",
          "summary": ""
        },
        {
          "name": "extractRootMotion",
          "kind": "function",
          "signature": "extractRootMotion(clip, skeleton, opts = {})",
          "summary": ""
        },
        {
          "name": "buildTeacherJointPositionDataset",
          "kind": "function",
          "signature": "buildTeacherJointPositionDataset(clip, skeleton, opts = {})",
          "summary": ""
        },
        {
          "name": "loadMixamoFBXAscii",
          "kind": "function",
          "signature": "loadMixamoFBXAscii(text, opts = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/camera/CameraController",
      "path": "engine/reference/tools/camera/CameraController.md",
      "source": "engine/tools/camera/CameraController.js",
      "import": "/engine/tools/camera/CameraController.js",
      "sourceHash": "31cd3d9e89325a7ea00cda92d4c7088daff2d4a85c5972a1f33a87972d93b5b1",
      "summary": "CameraController.js - admitted state management around StandardCameraController.",
      "exports": [
        {
          "name": "cameraEntityBoundsReport",
          "kind": "function",
          "signature": "cameraEntityBoundsReport(subjects)",
          "summary": ""
        },
        {
          "name": "cameraCollisionOptionsReport",
          "kind": "function",
          "signature": "cameraCollisionOptionsReport(options = {})",
          "summary": ""
        },
        {
          "name": "cameraFocusReport",
          "kind": "function",
          "signature": "cameraFocusReport(camera, target, options = {})",
          "summary": ""
        },
        {
          "name": "cameraEntityFocusReport",
          "kind": "function",
          "signature": "cameraEntityFocusReport(camera, subjects, options = {})",
          "summary": ""
        },
        {
          "name": "focusThirdPersonCamera",
          "kind": "function",
          "signature": "focusThirdPersonCamera(camera, target, options = {})",
          "summary": ""
        },
        {
          "name": "focusThirdPersonCameraOnEntities",
          "kind": "function",
          "signature": "focusThirdPersonCameraOnEntities(camera, subjects, options = {})",
          "summary": ""
        },
        {
          "name": "cameraFocusTransitionReport",
          "kind": "function",
          "signature": "cameraFocusTransitionReport(camera, deltaSeconds, options = {})",
          "summary": ""
        },
        {
          "name": "cameraControllerStepReport",
          "kind": "function",
          "signature": "cameraControllerStepReport(camera, input, options)",
          "summary": ""
        },
        {
          "name": "stepCamera",
          "kind": "function",
          "signature": "stepCamera(camera, input, options = {})",
          "summary": ""
        },
        {
          "name": "cameraControllerEntityReport",
          "kind": "function",
          "signature": "cameraControllerEntityReport(camera, cameraEntityId)",
          "summary": ""
        },
        {
          "name": "syncCameraToEcs",
          "kind": "function",
          "signature": "syncCameraToEcs(camera, ecsWorld, cameraEntityId)",
          "summary": ""
        },
        {
          "name": "updateCameraFull",
          "kind": "function",
          "signature": "updateCameraFull(camera, input, options = {})",
          "summary": ""
        },
        {
          "name": "cameraModeSwitchReport",
          "kind": "function",
          "signature": "cameraModeSwitchReport(camera, mode, options = {})",
          "summary": ""
        },
        {
          "name": "switchCameraMode",
          "kind": "function",
          "signature": "switchCameraMode(camera, mode, options = {})",
          "summary": ""
        },
        {
          "name": "CAMERA_CONTROLLER_LIMITS",
          "kind": "constant",
          "signature": "CAMERA_CONTROLLER_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/camera/StandardCameraController",
      "path": "engine/reference/tools/camera/StandardCameraController.md",
      "source": "engine/tools/camera/StandardCameraController.js",
      "import": "/engine/tools/camera/StandardCameraController.js",
      "sourceHash": "a9464657d30e1628b9121e2c24555234b1356c3debc987bdf4521354b343801e",
      "summary": "",
      "exports": [
        {
          "name": "standardCameraKeysReport",
          "kind": "function",
          "signature": "standardCameraKeysReport(keys = {})",
          "summary": ""
        },
        {
          "name": "standardCameraMovementResponseReport",
          "kind": "function",
          "signature": "standardCameraMovementResponseReport(currentAxes, targetAxes, options = {})",
          "summary": ""
        },
        {
          "name": "standardCameraZoomReport",
          "kind": "function",
          "signature": "standardCameraZoomReport(distance, options = {})",
          "summary": ""
        },
        {
          "name": "standardCameraBoomReport",
          "kind": "function",
          "signature": "standardCameraBoomReport(target, desiredEye, hit = null, options = {})",
          "summary": ""
        },
        {
          "name": "standardCameraMovementIntentReport",
          "kind": "function",
          "signature": "standardCameraMovementIntentReport(keys, yaw, distance, movementAxes = [0, 0, 0], responseOptions = {},)",
          "summary": ""
        },
        {
          "name": "standardCameraStateReport",
          "kind": "function",
          "signature": "standardCameraStateReport(state)",
          "summary": ""
        },
        {
          "name": "standardCameraSphereFitReport",
          "kind": "function",
          "signature": "standardCameraSphereFitReport(radius, options = {})",
          "summary": ""
        },
        {
          "name": "standardCameraBoundsReport",
          "kind": "function",
          "signature": "standardCameraBoundsReport(bounds)",
          "summary": ""
        },
        {
          "name": "standardCameraBoundsFocusReport",
          "kind": "function",
          "signature": "standardCameraBoundsFocusReport(bounds, options = {})",
          "summary": ""
        },
        {
          "name": "standardCameraFocusReport",
          "kind": "function",
          "signature": "standardCameraFocusReport(state, target, options = {})",
          "summary": ""
        },
        {
          "name": "standardCameraFocusTransitionReport",
          "kind": "function",
          "signature": "standardCameraFocusTransitionReport(transition, deltaSeconds)",
          "summary": ""
        },
        {
          "name": "standardCameraOptionsReport",
          "kind": "function",
          "signature": "standardCameraOptionsReport(options)",
          "summary": ""
        },
        {
          "name": "standardCameraUpdateReport",
          "kind": "function",
          "signature": "standardCameraUpdateReport(state, options)",
          "summary": ""
        },
        {
          "name": "updateStandardCamera",
          "kind": "function",
          "signature": "updateStandardCamera(state, options)",
          "summary": ""
        },
        {
          "name": "getStandardCameraEyeBasis",
          "kind": "function",
          "signature": "getStandardCameraEyeBasis(state)",
          "summary": ""
        },
        {
          "name": "STANDARD_CAMERA_LIMITS",
          "kind": "constant",
          "signature": "STANDARD_CAMERA_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/console/HtmlConsole",
      "path": "engine/reference/tools/console/HtmlConsole.md",
      "source": "engine/tools/console/HtmlConsole.js",
      "import": "/engine/tools/console/HtmlConsole.js",
      "sourceHash": "4ca0f7bf3d740f7ff4ead8de24c3ee4faa39ac33d9d877bb5b42ce659e8956e5",
      "summary": "Render console-hook arguments without invoking getters or leaking common credential fields. Output is deliberately bounded so one diagnostic object cannot freeze the in-OS console or flood a durable log.",
      "exports": [
        {
          "name": "formatConsoleHookArguments",
          "kind": "function",
          "signature": "formatConsoleHookArguments(args, options = {})",
          "summary": "Render console-hook arguments without invoking getters or leaking common credential fields. Output is deliberately bounded so one diagnostic object cannot freeze the in-OS console or flood a durable log."
        },
        {
          "name": "createHtmlConsole",
          "kind": "function",
          "signature": "createHtmlConsole(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/gizmos/RopeGizmo",
      "path": "engine/reference/tools/gizmos/RopeGizmo.md",
      "source": "engine/tools/gizmos/RopeGizmo.js",
      "import": "/engine/tools/gizmos/RopeGizmo.js",
      "sourceHash": "fea430a35f959794e366034ceda162b26511ebc6229db2668f5197cb3c0d9740",
      "summary": "RopeGizmo - Visual handles for manipulating rope attachment points Features: - Draggable spheres at start/end attachment points - Catenary curve visualization between endpoints - Entity snapping when dragging near entities - Visual feedback for hover/drag states Based on common patterns from Unity/Unreal constraint gizmos: - Anchor points shown as spherical handles - Lines/curves connecting attachment points - Snapping to nearby entities for easy attachment",
      "exports": [
        {
          "name": "RopeGizmo",
          "kind": "class",
          "signature": "class RopeGizmo",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/gizmos/TransformGizmo",
      "path": "engine/reference/tools/gizmos/TransformGizmo.md",
      "source": "engine/tools/gizmos/TransformGizmo.js",
      "import": "/engine/tools/gizmos/TransformGizmo.js",
      "sourceHash": "6283dc1085c4f565e67988f244728caa41312028d7ee757c08465a543930f700",
      "summary": "TransformGizmo - Visual handles for manipulating entity transforms Now powered by vGPU driver",
      "exports": [
        {
          "name": "TransformGizmo",
          "kind": "class",
          "signature": "class TransformGizmo",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/gizmos/index",
      "path": "engine/reference/tools/gizmos/index.md",
      "source": "engine/tools/gizmos/index.js",
      "import": "/engine/tools/gizmos/index.js",
      "sourceHash": "8fd83ac7c19eeacc1189a5e758d6dd9c43be66a2cc8ceb080c7cbed1771afddd",
      "summary": "Gizmos - Visual manipulation handles for editor and runtime",
      "exports": [
        {
          "name": "RopeGizmo",
          "kind": "re-export",
          "signature": "RopeGizmo",
          "summary": ""
        },
        {
          "name": "TransformGizmo",
          "kind": "re-export",
          "signature": "TransformGizmo",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/input/StandardInputController",
      "path": "engine/reference/tools/input/StandardInputController.md",
      "source": "engine/tools/input/StandardInputController.js",
      "import": "/engine/tools/input/StandardInputController.js",
      "sourceHash": "6cbe3cc9d7367740279841d00b8a335f841df134cd64f9e4cdae5963289125e5",
      "summary": "Create an input controller state object.",
      "exports": [
        {
          "name": "standardInputActionMapReport",
          "kind": "function",
          "signature": "standardInputActionMapReport(actionMap, options = {})",
          "summary": ""
        },
        {
          "name": "standardInputActionStateReport",
          "kind": "function",
          "signature": "standardInputActionStateReport(actionMap, pressedBindings)",
          "summary": ""
        },
        {
          "name": "rebindStandardInputAction",
          "kind": "function",
          "signature": "rebindStandardInputAction(ctrl, action, bindings, options = {})",
          "summary": ""
        },
        {
          "name": "standardGamepadMovementReport",
          "kind": "function",
          "signature": "standardGamepadMovementReport(gamepad, options = {})",
          "summary": ""
        },
        {
          "name": "standardGamepadButtonReport",
          "kind": "function",
          "signature": "standardGamepadButtonReport(button, options = {})",
          "summary": ""
        },
        {
          "name": "standardInputWheelZoomReport",
          "kind": "function",
          "signature": "standardInputWheelZoomReport(currentDelta, eventDelta)",
          "summary": ""
        },
        {
          "name": "standardGamepadHapticEffectReport",
          "kind": "function",
          "signature": "standardGamepadHapticEffectReport(gamepad, options = {})",
          "summary": ""
        },
        {
          "name": "playStandardGamepadHaptics",
          "kind": "function",
          "signature": "async playStandardGamepadHaptics(gamepad, options = {})",
          "summary": ""
        },
        {
          "name": "standardGamepadInputReport",
          "kind": "function",
          "signature": "standardGamepadInputReport(gamepad, options = {})",
          "summary": ""
        },
        {
          "name": "pollInputGamepad",
          "kind": "function",
          "signature": "pollInputGamepad(ctrl, gamepads = undefined)",
          "summary": ""
        },
        {
          "name": "createInputController",
          "kind": "function",
          "signature": "createInputController(options = {})",
          "summary": "Create an input controller state object."
        },
        {
          "name": "attachInputListeners",
          "kind": "function",
          "signature": "attachInputListeners(ctrl, callbacks = {})",
          "summary": "Attach input listeners to the controller. Returns a cleanup function to remove all listeners."
        },
        {
          "name": "detachInputListeners",
          "kind": "function",
          "signature": "detachInputListeners(ctrl)",
          "summary": "Remove all input listeners."
        },
        {
          "name": "consumeMouseDelta",
          "kind": "function",
          "signature": "consumeMouseDelta(ctrl)",
          "summary": "Reset mouse deltas after consuming them for camera update."
        },
        {
          "name": "consumeZoomDelta",
          "kind": "function",
          "signature": "consumeZoomDelta(ctrl)",
          "summary": "Get current keyboard state."
        },
        {
          "name": "getKeys",
          "kind": "function",
          "signature": "getKeys(ctrl)",
          "summary": ""
        },
        {
          "name": "getInputActions",
          "kind": "function",
          "signature": "getInputActions(ctrl)",
          "summary": ""
        },
        {
          "name": "getInputActionMap",
          "kind": "function",
          "signature": "getInputActionMap(ctrl)",
          "summary": ""
        },
        {
          "name": "getMovementAxes",
          "kind": "function",
          "signature": "getMovementAxes(ctrl)",
          "summary": ""
        },
        {
          "name": "getLastMousePosition",
          "kind": "function",
          "signature": "getLastMousePosition(ctrl)",
          "summary": "Get last mouse position."
        },
        {
          "name": "STANDARD_INPUT_LIMITS",
          "kind": "constant",
          "signature": "STANDARD_INPUT_LIMITS",
          "summary": ""
        },
        {
          "name": "DEFAULT_STANDARD_INPUT_ACTION_MAP",
          "kind": "constant",
          "signature": "DEFAULT_STANDARD_INPUT_ACTION_MAP",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/EntitiesInspectorPanel",
      "path": "engine/reference/tools/inspector/EntitiesInspectorPanel.md",
      "source": "engine/tools/inspector/EntitiesInspectorPanel.js",
      "import": "/engine/tools/inspector/EntitiesInspectorPanel.js",
      "sourceHash": "96786ccad88e42dcd5bba09cf9264d16aab60c69e68335e100191c376cc09a3e",
      "summary": "",
      "exports": [
        {
          "name": "initEntitiesInspectorPanel",
          "kind": "function",
          "signature": "initEntitiesInspectorPanel(doc, entitiesPanel, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/EntitiesInspectorPanel.old",
      "path": "engine/reference/tools/inspector/EntitiesInspectorPanel.old.md",
      "source": "engine/tools/inspector/EntitiesInspectorPanel.old.js",
      "import": "/engine/tools/inspector/EntitiesInspectorPanel.old.js",
      "sourceHash": "163c72c780450d9bf6be62e7082167410b4333082a810112d8134a92998881fe",
      "summary": "",
      "exports": [
        {
          "name": "initEntitiesInspectorPanel",
          "kind": "re-export",
          "signature": "initEntitiesInspectorPanel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/EntityInspector",
      "path": "engine/reference/tools/inspector/EntityInspector.md",
      "source": "engine/tools/inspector/EntityInspector.js",
      "import": "/engine/tools/inspector/EntityInspector.js",
      "sourceHash": "c94f41d4d5ff8f67a37390b91f90bd76996546742951b5e2bcb99afdac8fa678",
      "summary": "",
      "exports": [
        {
          "name": "createEntityInspectorModel",
          "kind": "function",
          "signature": "createEntityInspectorModel(world, options = {})",
          "summary": ""
        },
        {
          "name": "setEntityComponentFromInspector",
          "kind": "function",
          "signature": "setEntityComponentFromInspector(world, entityId, componentName, value)",
          "summary": ""
        },
        {
          "name": "removeEntityComponentFromInspector",
          "kind": "function",
          "signature": "removeEntityComponentFromInspector(world, entityId, componentName)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/InspectorConfigFactory",
      "path": "engine/reference/tools/inspector/InspectorConfigFactory.md",
      "source": "engine/tools/inspector/InspectorConfigFactory.js",
      "import": "/engine/tools/inspector/InspectorConfigFactory.js",
      "sourceHash": "75a7f5e68ad63e74d4fb66f04b8f3dd58973571381afe8baa9f313b9072a9d31",
      "summary": "Create a standard inspector configuration.",
      "exports": [
        {
          "name": "createInspectorConfig",
          "kind": "function",
          "signature": "createInspectorConfig(options)",
          "summary": "Create a standard inspector configuration."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/InspectorPanel",
      "path": "engine/reference/tools/inspector/InspectorPanel.md",
      "source": "engine/tools/inspector/InspectorPanel.js",
      "import": "/engine/tools/inspector/InspectorPanel.js",
      "sourceHash": "3d94bd0eef0978dd394763a0a30998fb57bc0f96d6abe6bd631cb21bae9b49ee",
      "summary": "",
      "exports": [
        {
          "name": "attachInspectorPanel",
          "kind": "function",
          "signature": "attachInspectorPanel(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/NavInspector",
      "path": "engine/reference/tools/inspector/NavInspector.md",
      "source": "engine/tools/inspector/NavInspector.js",
      "import": "/engine/tools/inspector/NavInspector.js",
      "sourceHash": "847af051a44ed8599d461c949c148bc329814acf0aad5f6423cf92505e52b0bf",
      "summary": "",
      "exports": [
        {
          "name": "createNavInspectorModel",
          "kind": "function",
          "signature": "createNavInspectorModel(world)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/PhysicsSandboxInspector",
      "path": "engine/reference/tools/inspector/PhysicsSandboxInspector.md",
      "source": "engine/tools/inspector/PhysicsSandboxInspector.js",
      "import": "/engine/tools/inspector/PhysicsSandboxInspector.js",
      "sourceHash": "31217fc5ab33d62994e237e1c2222891709521c898b61c42f44d2b517e76a5e8",
      "summary": "",
      "exports": [
        {
          "name": "attachPhysicsSandboxInspector",
          "kind": "function",
          "signature": "attachPhysicsSandboxInspector(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/WorldInspector",
      "path": "engine/reference/tools/inspector/WorldInspector.md",
      "source": "engine/tools/inspector/WorldInspector.js",
      "import": "/engine/tools/inspector/WorldInspector.js",
      "sourceHash": "7b722c7e4d6f17f13a4e1a9beaec79f0496af6e8236783eba9d09bb33fc17330",
      "summary": "",
      "exports": [
        {
          "name": "createWorldInspectorModel",
          "kind": "function",
          "signature": "createWorldInspectorModel(world, options = {})",
          "summary": ""
        },
        {
          "name": "applyWorldInspectorModel",
          "kind": "function",
          "signature": "applyWorldInspectorModel(world, model)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/CameraComponentEditor",
      "path": "engine/reference/tools/inspector/entityEditors/CameraComponentEditor.md",
      "source": "engine/tools/inspector/entityEditors/CameraComponentEditor.js",
      "import": "/engine/tools/inspector/entityEditors/CameraComponentEditor.js",
      "sourceHash": "65e34e19e8dc6f8af1a17101dd734c490c6ab2e657d58404c2f2cc5948e6ec98",
      "summary": "",
      "exports": [
        {
          "name": "renderCameraComponentEditor",
          "kind": "function",
          "signature": "renderCameraComponentEditor(doc, container, state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/JsonComponentEditor",
      "path": "engine/reference/tools/inspector/entityEditors/JsonComponentEditor.md",
      "source": "engine/tools/inspector/entityEditors/JsonComponentEditor.js",
      "import": "/engine/tools/inspector/entityEditors/JsonComponentEditor.js",
      "sourceHash": "d92117141e3b2277e08c8bf7243400412ad7075ae7dd26bf2c2546d16dbb1daa",
      "summary": "",
      "exports": [
        {
          "name": "renderJsonComponentEditor",
          "kind": "function",
          "signature": "renderJsonComponentEditor(doc, container, editor, value)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/LightComponentEditor",
      "path": "engine/reference/tools/inspector/entityEditors/LightComponentEditor.md",
      "source": "engine/tools/inspector/entityEditors/LightComponentEditor.js",
      "import": "/engine/tools/inspector/entityEditors/LightComponentEditor.js",
      "sourceHash": "fa0d717feda51f3ee8c60f2b93695a57c4e542530996b37613fc989f35729b11",
      "summary": "",
      "exports": [
        {
          "name": "renderLightComponentEditor",
          "kind": "function",
          "signature": "renderLightComponentEditor(doc, container, state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/ModelAnimationEditor",
      "path": "engine/reference/tools/inspector/entityEditors/ModelAnimationEditor.md",
      "source": "engine/tools/inspector/entityEditors/ModelAnimationEditor.js",
      "import": "/engine/tools/inspector/entityEditors/ModelAnimationEditor.js",
      "sourceHash": "9ed4ad0c48cc501e3277b796dfa6c0107c6ddf2a754054e355d5c80a8ae2784c",
      "summary": "",
      "exports": [
        {
          "name": "renderModelAnimationEditor",
          "kind": "function",
          "signature": "async renderModelAnimationEditor(doc, container, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/ModelMorphEditor",
      "path": "engine/reference/tools/inspector/entityEditors/ModelMorphEditor.md",
      "source": "engine/tools/inspector/entityEditors/ModelMorphEditor.js",
      "import": "/engine/tools/inspector/entityEditors/ModelMorphEditor.js",
      "sourceHash": "e26787d717c20a26d6c4e4689fbcdfa727b80276cc937bc82c2b4c764b17474e",
      "summary": "",
      "exports": [
        {
          "name": "renderModelMorphEditor",
          "kind": "function",
          "signature": "async renderModelMorphEditor(doc, container, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/PhysicalMaterialComponentEditor",
      "path": "engine/reference/tools/inspector/entityEditors/PhysicalMaterialComponentEditor.md",
      "source": "engine/tools/inspector/entityEditors/PhysicalMaterialComponentEditor.js",
      "import": "/engine/tools/inspector/entityEditors/PhysicalMaterialComponentEditor.js",
      "sourceHash": "9a4ad312d59cce7849ef25765166039bf487b25104aa99ecf18571996b68d6be",
      "summary": "Physical Material Component Editor — renders preset dropdown + property sliders for density, elasticity, hardness, brittleness, strength, friction, restitution, deformable/breakable flags, fracture pattern, and damage status.",
      "exports": [
        {
          "name": "renderPhysicalMaterialComponentEditor",
          "kind": "function",
          "signature": "renderPhysicalMaterialComponentEditor(doc, container, state)",
          "summary": "Physical Material Component Editor — renders preset dropdown + property sliders for density, elasticity, hardness, brittleness, strength, friction, restitution, deformable/breakable flags, fracture pattern, and damage status."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/PhysicsRopeComponentEditor",
      "path": "engine/reference/tools/inspector/entityEditors/PhysicsRopeComponentEditor.md",
      "source": "engine/tools/inspector/entityEditors/PhysicsRopeComponentEditor.js",
      "import": "/engine/tools/inspector/entityEditors/PhysicsRopeComponentEditor.js",
      "sourceHash": "5d47eec49bd20d250bfdcaa4ecee1f53e36d15d9a597fb0c23cb1494a82b60d6",
      "summary": "PhysicsRopeComponentEditor.js - Rope Property Editor Renders rope-specific properties in the entity inspector when a rope entity is selected. Uses shared ROPE_INSPECTOR_SCHEMA from RopeSchema.js for full consistency with RopeTool.",
      "exports": [
        {
          "name": "renderPhysicsRopeComponentEditor",
          "kind": "function",
          "signature": "renderPhysicsRopeComponentEditor(doc, container, entitiesState)",
          "summary": "Render the PhysicsRope component editor using shared schema"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/RenderableComponentEditor",
      "path": "engine/reference/tools/inspector/entityEditors/RenderableComponentEditor.md",
      "source": "engine/tools/inspector/entityEditors/RenderableComponentEditor.js",
      "import": "/engine/tools/inspector/entityEditors/RenderableComponentEditor.js",
      "sourceHash": "585c5fcce8098b561a225874eb66809edd149c86dc2117e497f8bf56bdc2873c",
      "summary": "",
      "exports": [
        {
          "name": "renderRenderableComponentEditor",
          "kind": "function",
          "signature": "renderRenderableComponentEditor(doc, container, state)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/entityEditors/TransformComponentEditor",
      "path": "engine/reference/tools/inspector/entityEditors/TransformComponentEditor.md",
      "source": "engine/tools/inspector/entityEditors/TransformComponentEditor.js",
      "import": "/engine/tools/inspector/entityEditors/TransformComponentEditor.js",
      "sourceHash": "1e685dd23b3d698d11de9bce8822c51e83d2c1fc946b57f8bd231dd340a83816",
      "summary": "",
      "exports": [
        {
          "name": "renderTransformComponentEditor",
          "kind": "function",
          "signature": "renderTransformComponentEditor(doc, container, state)",
          "summary": ""
        },
        {
          "name": "SNAP_SETTINGS",
          "kind": "constant",
          "signature": "SNAP_SETTINGS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/EntitiesInspectorPanel",
      "path": "engine/reference/tools/inspector/panels/EntitiesInspectorPanel.md",
      "source": "engine/tools/inspector/panels/EntitiesInspectorPanel.js",
      "import": "/engine/tools/inspector/panels/EntitiesInspectorPanel.js",
      "sourceHash": "1e8c409b6ca34d1ad7212b0b023a47bbd7bae222c268f4ef2a2ab7157d6235e5",
      "summary": "",
      "exports": [
        {
          "name": "initEntitiesInspectorPanel",
          "kind": "re-export",
          "signature": "initEntitiesInspectorPanel",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/InspectorStyles",
      "path": "engine/reference/tools/inspector/panels/InspectorStyles.md",
      "source": "engine/tools/inspector/panels/InspectorStyles.js",
      "import": "/engine/tools/inspector/panels/InspectorStyles.js",
      "sourceHash": "d1637bdf43f751e641c20838afecc27af3ed91189b5562bc51b94b17a4acdb5c",
      "summary": "Inject shared inspector styles into the document. Safe to call multiple times - will only inject once.",
      "exports": [
        {
          "name": "injectInspectorStyles",
          "kind": "function",
          "signature": "injectInspectorStyles(doc = document)",
          "summary": "Inject shared inspector styles into the document. Safe to call multiple times - will only inject once."
        },
        {
          "name": "applyPanelContainerStyles",
          "kind": "function",
          "signature": "applyPanelContainerStyles(container)",
          "summary": "Apply standard inspector panel container styles to a DOM element."
        },
        {
          "name": "areStylesInjected",
          "kind": "function",
          "signature": "areStylesInjected()",
          "summary": "Check if inspector styles have been injected"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/NavInspectorPanel",
      "path": "engine/reference/tools/inspector/panels/NavInspectorPanel.md",
      "source": "engine/tools/inspector/panels/NavInspectorPanel.js",
      "import": "/engine/tools/inspector/panels/NavInspectorPanel.js",
      "sourceHash": "80d61d38b45bac8e335e80352a3b11a338d47a751b2381264324f2b1f5944949",
      "summary": "",
      "exports": [
        {
          "name": "initNavInspectorPanel",
          "kind": "function",
          "signature": "initNavInspectorPanel(doc, navPanel, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/SpawnerInspectorPanel",
      "path": "engine/reference/tools/inspector/panels/SpawnerInspectorPanel.md",
      "source": "engine/tools/inspector/panels/SpawnerInspectorPanel.js",
      "import": "/engine/tools/inspector/panels/SpawnerInspectorPanel.js",
      "sourceHash": "8a2bd375c55f902f408c34130d565e2e7b6d8305a42185dcc1a34f223b768d13",
      "summary": "",
      "exports": [
        {
          "name": "initSpawnerInspectorPanel",
          "kind": "function",
          "signature": "initSpawnerInspectorPanel(doc, spawnerPanel, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/SpellBookPanel",
      "path": "engine/reference/tools/inspector/panels/SpellBookPanel.md",
      "source": "engine/tools/inspector/panels/SpellBookPanel.js",
      "import": "/engine/tools/inspector/panels/SpellBookPanel.js",
      "sourceHash": "9637801dc6c6d653b04503e710ac02d7165f771eccf90281c3107d54376d7aeb",
      "summary": "Spell Book Inspector Panel Browse, manage, and organize saved spells. Integrates with SpellBook for persistence.",
      "exports": [
        {
          "name": "initSpellBookPanel",
          "kind": "function",
          "signature": "initSpellBookPanel(container, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/SpellBuilderPanel",
      "path": "engine/reference/tools/inspector/panels/SpellBuilderPanel.md",
      "source": "engine/tools/inspector/panels/SpellBuilderPanel.js",
      "import": "/engine/tools/inspector/panels/SpellBuilderPanel.js",
      "sourceHash": "6126bc62a6d27e3b6a0e62068996fc8d6edc8595b02528300bc579aca3c33ac8",
      "summary": "Spell Builder Inspector Panel Real-time spell effect editor integrated with the engine inspector. Allows creating, customizing, and previewing particle-based spells.",
      "exports": [
        {
          "name": "initSpellBuilderPanel",
          "kind": "function",
          "signature": "initSpellBuilderPanel(container, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/WorldInspectorPanel",
      "path": "engine/reference/tools/inspector/panels/WorldInspectorPanel.md",
      "source": "engine/tools/inspector/panels/WorldInspectorPanel.js",
      "import": "/engine/tools/inspector/panels/WorldInspectorPanel.js",
      "sourceHash": "e64709a6112daa53240e5fd1632d8dc5dd0190ba8a25f5a91f935bf59ec97b29",
      "summary": "",
      "exports": [
        {
          "name": "initWorldInspectorPanel",
          "kind": "function",
          "signature": "initWorldInspectorPanel(doc, worldPanel, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/index",
      "path": "engine/reference/tools/inspector/panels/index.md",
      "source": "engine/tools/inspector/panels/index.js",
      "import": "/engine/tools/inspector/panels/index.js",
      "sourceHash": "5a5efc9f699194925653ef8e9c8fd52c448a174ab6247bacf382eb6101fb9c05",
      "summary": "",
      "exports": [
        {
          "name": "INSPECTOR_THEME",
          "kind": "re-export",
          "signature": "INSPECTOR_THEME",
          "summary": ""
        },
        {
          "name": "addCheckboxRow",
          "kind": "re-export",
          "signature": "addCheckboxRow",
          "summary": ""
        },
        {
          "name": "addConfigRow",
          "kind": "re-export",
          "signature": "addConfigRow",
          "summary": ""
        },
        {
          "name": "addNumberRow",
          "kind": "re-export",
          "signature": "addNumberRow",
          "summary": ""
        },
        {
          "name": "addSliderRow",
          "kind": "re-export",
          "signature": "addSliderRow",
          "summary": ""
        },
        {
          "name": "addTextRow",
          "kind": "re-export",
          "signature": "addTextRow",
          "summary": ""
        },
        {
          "name": "applyPanelContainerStyles",
          "kind": "re-export",
          "signature": "applyPanelContainerStyles",
          "summary": ""
        },
        {
          "name": "areStylesInjected",
          "kind": "re-export",
          "signature": "areStylesInjected",
          "summary": ""
        },
        {
          "name": "createPropertySection",
          "kind": "re-export",
          "signature": "createPropertySection",
          "summary": ""
        },
        {
          "name": "createStatItem",
          "kind": "re-export",
          "signature": "createStatItem",
          "summary": ""
        },
        {
          "name": "createThemedBox",
          "kind": "re-export",
          "signature": "createThemedBox",
          "summary": ""
        },
        {
          "name": "createThemedCheckboxRow",
          "kind": "re-export",
          "signature": "createThemedCheckboxRow",
          "summary": ""
        },
        {
          "name": "createThemedSlider",
          "kind": "re-export",
          "signature": "createThemedSlider",
          "summary": ""
        },
        {
          "name": "initEntitiesInspectorPanel",
          "kind": "re-export",
          "signature": "initEntitiesInspectorPanel",
          "summary": ""
        },
        {
          "name": "initNavInspectorPanel",
          "kind": "re-export",
          "signature": "initNavInspectorPanel",
          "summary": ""
        },
        {
          "name": "initSpawnerInspectorPanel",
          "kind": "re-export",
          "signature": "initSpawnerInspectorPanel",
          "summary": ""
        },
        {
          "name": "initSpellBookPanel",
          "kind": "re-export",
          "signature": "initSpellBookPanel",
          "summary": ""
        },
        {
          "name": "initSpellBuilderPanel",
          "kind": "re-export",
          "signature": "initSpellBuilderPanel",
          "summary": ""
        },
        {
          "name": "initWorldInspectorPanel",
          "kind": "re-export",
          "signature": "initWorldInspectorPanel",
          "summary": ""
        },
        {
          "name": "injectInspectorStyles",
          "kind": "re-export",
          "signature": "injectInspectorStyles",
          "summary": ""
        },
        {
          "name": "renderInspectorSchema",
          "kind": "re-export",
          "signature": "renderInspectorSchema",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spawner/ElementLayers",
      "path": "engine/reference/tools/inspector/panels/spawner/ElementLayers.md",
      "source": "engine/tools/inspector/panels/spawner/ElementLayers.js",
      "import": "/engine/tools/inspector/panels/spawner/ElementLayers.js",
      "sourceHash": "27722216d7b2df09c103e220502c35b0477ce45e7508707dc5ea20d6f10dddcc",
      "summary": "",
      "exports": [
        {
          "name": "createElementLayers",
          "kind": "function",
          "signature": "createElementLayers(doc, { elements, onChange })",
          "summary": ""
        },
        {
          "name": "ELEMENT_COLORS",
          "kind": "re-export",
          "signature": "ELEMENT_COLORS",
          "summary": ""
        },
        {
          "name": "ELEMENT_ICONS",
          "kind": "re-export",
          "signature": "ELEMENT_ICONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spawner/EmitterInspectorCard",
      "path": "engine/reference/tools/inspector/panels/spawner/EmitterInspectorCard.md",
      "source": "engine/tools/inspector/panels/spawner/EmitterInspectorCard.js",
      "import": "/engine/tools/inspector/panels/spawner/EmitterInspectorCard.js",
      "sourceHash": "b066d6a1c835ffb8f319bcc7d1e6b096161fbe8c2d507cbecde45f812d68be63",
      "summary": "EmitterInspectorCard.js - Shared emitter property card component Modular emitter editor used by both Spawner and Entities inspector panels. Configurable sections: header, elements, physics, aim.",
      "exports": [
        {
          "name": "createEmitterInspectorCard",
          "kind": "function",
          "signature": "createEmitterInspectorCard(doc, options = {})",
          "summary": "Create a modular emitter inspector card."
        },
        {
          "name": "STATE_ICONS",
          "kind": "constant",
          "signature": "STATE_ICONS",
          "summary": ""
        },
        {
          "name": "STATE_COLORS",
          "kind": "constant",
          "signature": "STATE_COLORS",
          "summary": ""
        },
        {
          "name": "ELEMENT_ICONS",
          "kind": "constant",
          "signature": "ELEMENT_ICONS",
          "summary": ""
        },
        {
          "name": "ELEMENT_COLORS",
          "kind": "constant",
          "signature": "ELEMENT_COLORS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spawner/GyroAimControl",
      "path": "engine/reference/tools/inspector/panels/spawner/GyroAimControl.md",
      "source": "engine/tools/inspector/panels/spawner/GyroAimControl.js",
      "import": "/engine/tools/inspector/panels/spawner/GyroAimControl.js",
      "sourceHash": "9350ce6c7b1cfb39c7063d66f1f26db05a9fe93ec5d7414a49244c4fc21f9c8c",
      "summary": "",
      "exports": [
        {
          "name": "createGyroAimControl",
          "kind": "function",
          "signature": "createGyroAimControl(doc, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spawner/PhysicsProps",
      "path": "engine/reference/tools/inspector/panels/spawner/PhysicsProps.md",
      "source": "engine/tools/inspector/panels/spawner/PhysicsProps.js",
      "import": "/engine/tools/inspector/panels/spawner/PhysicsProps.js",
      "sourceHash": "e1f48cc2b8fdf5dd5d14c1d152a0a5f223f63a44f87917f91a96bbd90e02de2a",
      "summary": "Physics properties grid component Uses slider-based controls with value readouts to match element styling.",
      "exports": [
        {
          "name": "createPhysicsProps",
          "kind": "function",
          "signature": "createPhysicsProps(doc, { emitterCfg })",
          "summary": ""
        },
        {
          "name": "createMatterProps",
          "kind": "function",
          "signature": "createMatterProps(doc, { emitterCfg, onProfileChange })",
          "summary": "Create the Matter / Substance section for the emitter inspector. Shows substance dropdown, temperature slider, charge slider, state badge, active physics badges, and conditional SPH params."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spawner/StateSelector",
      "path": "engine/reference/tools/inspector/panels/spawner/StateSelector.md",
      "source": "engine/tools/inspector/panels/spawner/StateSelector.js",
      "import": "/engine/tools/inspector/panels/spawner/StateSelector.js",
      "sourceHash": "ef48f34ccdf20a7aa57b355a1561a35617a464ae0d39c0cab52c43705e427d6c",
      "summary": "",
      "exports": [
        {
          "name": "createStateSelector",
          "kind": "function",
          "signature": "createStateSelector(doc, { state })",
          "summary": ""
        },
        {
          "name": "STATE_ICONS",
          "kind": "re-export",
          "signature": "STATE_ICONS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spawner/index",
      "path": "engine/reference/tools/inspector/panels/spawner/index.md",
      "source": "engine/tools/inspector/panels/spawner/index.js",
      "import": "/engine/tools/inspector/panels/spawner/index.js",
      "sourceHash": "41cd4cd0e95300c1be60a2dee72d25e7189e7a0a4534a9df43f81dfde48f83e1",
      "summary": "Deep copy element defaults for a state",
      "exports": [
        {
          "name": "getElementsForState",
          "kind": "function",
          "signature": "getElementsForState(stateId)",
          "summary": "Deep copy element defaults for a state"
        },
        {
          "name": "STATE_ELEMENT_DEFAULTS",
          "kind": "constant",
          "signature": "STATE_ELEMENT_DEFAULTS",
          "summary": "Default element configurations for each state of matter"
        },
        {
          "name": "ELEMENT_COLORS",
          "kind": "re-export",
          "signature": "ELEMENT_COLORS",
          "summary": ""
        },
        {
          "name": "ELEMENT_ICONS",
          "kind": "re-export",
          "signature": "ELEMENT_ICONS",
          "summary": ""
        },
        {
          "name": "EMITTER_ELEMENT_COLORS",
          "kind": "re-export",
          "signature": "EMITTER_ELEMENT_COLORS",
          "summary": ""
        },
        {
          "name": "EMITTER_ELEMENT_ICONS",
          "kind": "re-export",
          "signature": "EMITTER_ELEMENT_ICONS",
          "summary": ""
        },
        {
          "name": "EMITTER_STATE_ICONS",
          "kind": "re-export",
          "signature": "EMITTER_STATE_ICONS",
          "summary": ""
        },
        {
          "name": "STATE_COLORS",
          "kind": "re-export",
          "signature": "STATE_COLORS",
          "summary": ""
        },
        {
          "name": "STATE_ICONS",
          "kind": "re-export",
          "signature": "STATE_ICONS",
          "summary": ""
        },
        {
          "name": "createElementLayers",
          "kind": "re-export",
          "signature": "createElementLayers",
          "summary": ""
        },
        {
          "name": "createEmitterInspectorCard",
          "kind": "re-export",
          "signature": "createEmitterInspectorCard",
          "summary": ""
        },
        {
          "name": "createGyroAimControl",
          "kind": "re-export",
          "signature": "createGyroAimControl",
          "summary": ""
        },
        {
          "name": "createPhysicsProps",
          "kind": "re-export",
          "signature": "createPhysicsProps",
          "summary": ""
        },
        {
          "name": "createStateSelector",
          "kind": "re-export",
          "signature": "createStateSelector",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spell-configs/SpellBook",
      "path": "engine/reference/tools/inspector/panels/spell-configs/SpellBook.md",
      "source": "engine/tools/inspector/panels/spell-configs/SpellBook.js",
      "import": "/engine/tools/inspector/panels/spell-configs/SpellBook.js",
      "sourceHash": "ffb66f55f69db346762f9f20d1e48c57bfdd7ce629c0c00e2d843820811eff3d",
      "summary": "SpellBook.js — local stub for the external spell book persistence system.",
      "exports": [
        {
          "name": "getSpellBook",
          "kind": "function",
          "signature": "getSpellBook()",
          "summary": ""
        },
        {
          "name": "initSpellBookWithPresets",
          "kind": "function",
          "signature": "initSpellBookWithPresets()",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spell-configs/SpellConfig",
      "path": "engine/reference/tools/inspector/panels/spell-configs/SpellConfig.md",
      "source": "engine/tools/inspector/panels/spell-configs/SpellConfig.js",
      "import": "/engine/tools/inspector/panels/spell-configs/SpellConfig.js",
      "sourceHash": "5663ec6328259df17fc05d21e3983983c3d8b45fa6d6410fa08865ed8c27c248",
      "summary": "SpellConfig.js — local stub for the external spell configuration system.",
      "exports": [
        {
          "name": "cloneSpellConfig",
          "kind": "function",
          "signature": "cloneSpellConfig(id)",
          "summary": ""
        },
        {
          "name": "rgbToHex",
          "kind": "function",
          "signature": "rgbToHex(r, g, b)",
          "summary": ""
        },
        {
          "name": "hexToRgb",
          "kind": "function",
          "signature": "hexToRgb(hex)",
          "summary": ""
        },
        {
          "name": "SPELL_CATEGORIES",
          "kind": "constant",
          "signature": "SPELL_CATEGORIES",
          "summary": "SpellConfig.js — local stub for the external spell configuration system."
        },
        {
          "name": "SPELL_PRESETS",
          "kind": "constant",
          "signature": "SPELL_PRESETS",
          "summary": ""
        },
        {
          "name": "SPELL_PARAM_SCHEMA",
          "kind": "constant",
          "signature": "SPELL_PARAM_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/panels/spell-configs/SpellEffectFactory",
      "path": "engine/reference/tools/inspector/panels/spell-configs/SpellEffectFactory.md",
      "source": "engine/tools/inspector/panels/spell-configs/SpellEffectFactory.js",
      "import": "/engine/tools/inspector/panels/spell-configs/SpellEffectFactory.js",
      "sourceHash": "6ceca82449683db2f4bc1e1c71dff86099588ef608ad0a442c5cba7e9dfb1e69",
      "summary": "SpellEffectFactory.js — local stub for the external spell particle effect factory.",
      "exports": [
        {
          "name": "createEmitterConfig",
          "kind": "function",
          "signature": "createEmitterConfig(config = {})",
          "summary": "SpellEffectFactory.js — local stub for the external spell particle effect factory."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/ui/InspectorControls",
      "path": "engine/reference/tools/inspector/ui/InspectorControls.md",
      "source": "engine/tools/inspector/ui/InspectorControls.js",
      "import": "/engine/tools/inspector/ui/InspectorControls.js",
      "sourceHash": "7aed8a1658c51d11bcac50eaa948be7eac2e1bbf12617038bccc3ba954c5a1f3",
      "summary": "Create a themed section box (card-like container)",
      "exports": [
        {
          "name": "createThemedBox",
          "kind": "function",
          "signature": "createThemedBox(doc, title, options = {})",
          "summary": "Create a themed section box (card-like container)"
        },
        {
          "name": "createStatItem",
          "kind": "function",
          "signature": "createStatItem(doc, label, value, color)",
          "summary": "Create a themed stat item (for performance stats, etc.)"
        },
        {
          "name": "createThemedCheckboxRow",
          "kind": "function",
          "signature": "createThemedCheckboxRow(doc, label, checked, onChange)",
          "summary": "Create a themed checkbox row"
        },
        {
          "name": "createThemedSlider",
          "kind": "function",
          "signature": "createThemedSlider(doc, options = {})",
          "summary": "Create a themed slider with label and value display"
        },
        {
          "name": "createSliderTicks",
          "kind": "function",
          "signature": "createSliderTicks(doc, snapPoints)",
          "summary": ""
        },
        {
          "name": "getSnapPoints",
          "kind": "function",
          "signature": "getSnapPoints(min, max, snapPoints, tickCount = 6)",
          "summary": ""
        },
        {
          "name": "snapValueToPoints",
          "kind": "function",
          "signature": "snapValueToPoints(value, snapPoints)",
          "summary": ""
        },
        {
          "name": "formatSliderValue",
          "kind": "function",
          "signature": "formatSliderValue(value, formatter, precision = 2)",
          "summary": ""
        },
        {
          "name": "createPropertySection",
          "kind": "function",
          "signature": "createPropertySection(doc, container, titleText)",
          "summary": ""
        },
        {
          "name": "createCollapsibleSection",
          "kind": "function",
          "signature": "createCollapsibleSection(doc, container, titleText, startCollapsed = false)",
          "summary": ""
        },
        {
          "name": "addSelectRow",
          "kind": "function",
          "signature": "addSelectRow(doc, section, labelText, items, getValue, setValue)",
          "summary": ""
        },
        {
          "name": "addVectorRow",
          "kind": "function",
          "signature": "addVectorRow(doc, section, options = {})",
          "summary": ""
        },
        {
          "name": "getValueAtPath",
          "kind": "function",
          "signature": "getValueAtPath(obj, path)",
          "summary": ""
        },
        {
          "name": "setValueAtPath",
          "kind": "function",
          "signature": "setValueAtPath(obj, path, value)",
          "summary": ""
        },
        {
          "name": "renderInspectorSchema",
          "kind": "function",
          "signature": "renderInspectorSchema(doc, container, schema, ctx = {})",
          "summary": ""
        },
        {
          "name": "addNumberRow",
          "kind": "function",
          "signature": "addNumberRow(doc, section, labelText, getValue, setValue, step)",
          "summary": ""
        },
        {
          "name": "bindNumberInput",
          "kind": "function",
          "signature": "bindNumberInput(input, options = {})",
          "summary": ""
        },
        {
          "name": "bindRangeInput",
          "kind": "function",
          "signature": "bindRangeInput(input, options = {})",
          "summary": ""
        },
        {
          "name": "bindTextInput",
          "kind": "function",
          "signature": "bindTextInput(input, options = {})",
          "summary": ""
        },
        {
          "name": "bindCheckboxInput",
          "kind": "function",
          "signature": "bindCheckboxInput(input, options = {})",
          "summary": ""
        },
        {
          "name": "bindSelectInput",
          "kind": "function",
          "signature": "bindSelectInput(select, options = {})",
          "summary": ""
        },
        {
          "name": "showInspectorTextInputModal",
          "kind": "function",
          "signature": "showInspectorTextInputModal(doc, options = {})",
          "summary": ""
        },
        {
          "name": "showInspectorContextMenu",
          "kind": "function",
          "signature": "showInspectorContextMenu(doc, options = {})",
          "summary": ""
        },
        {
          "name": "addConfigRow",
          "kind": "function",
          "signature": "addConfigRow(doc, container, options)",
          "summary": ""
        },
        {
          "name": "addSliderRow",
          "kind": "function",
          "signature": "addSliderRow(doc, section, labelText, min, max, step, getValue, setValue, options = {},)",
          "summary": ""
        },
        {
          "name": "addCheckboxRow",
          "kind": "function",
          "signature": "addCheckboxRow(doc, section, labelText, getValue, setValue)",
          "summary": ""
        },
        {
          "name": "addTextRow",
          "kind": "function",
          "signature": "addTextRow(doc, section, labelText, getValue, setValue)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/inspector/ui/InspectorTheme",
      "path": "engine/reference/tools/inspector/ui/InspectorTheme.md",
      "source": "engine/tools/inspector/ui/InspectorTheme.js",
      "import": "/engine/tools/inspector/ui/InspectorTheme.js",
      "sourceHash": "242c82b0418282f7234360756735ae2e72d9d3c5a6eb78eb2ffa5231d4624150",
      "summary": "Apply theme styles to an element",
      "exports": [
        {
          "name": "applyThemeStyles",
          "kind": "function",
          "signature": "applyThemeStyles(el, styles)",
          "summary": "Apply theme styles to an element"
        },
        {
          "name": "createThemedButton",
          "kind": "function",
          "signature": "createThemedButton(doc, text, variant = \"primary\", onClick)",
          "summary": "Create a themed button"
        },
        {
          "name": "createThemedInput",
          "kind": "function",
          "signature": "createThemedInput(doc, type = \"text\")",
          "summary": "Create a themed input"
        },
        {
          "name": "createThemedLabel",
          "kind": "function",
          "signature": "createThemedLabel(doc, text)",
          "summary": "Create a themed label"
        },
        {
          "name": "createThemedSectionHeader",
          "kind": "function",
          "signature": "createThemedSectionHeader(doc, text, icon = \"\")",
          "summary": "Create a themed section header"
        },
        {
          "name": "createThemedTab",
          "kind": "function",
          "signature": "createThemedTab(doc, text, isActive = false, onClick)",
          "summary": "Create a themed tab button"
        },
        {
          "name": "createThemedBadge",
          "kind": "function",
          "signature": "createThemedBadge(doc, text, color = \"info\")",
          "summary": "Create a themed badge"
        },
        {
          "name": "INSPECTOR_THEME",
          "kind": "constant",
          "signature": "INSPECTOR_THEME",
          "summary": "InspectorTheme.js - Unified theme system for all inspector panels Provides consistent colors, spacing, and styling across all inspector UI."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/interaction/GrabController",
      "path": "engine/reference/tools/interaction/GrabController.md",
      "source": "engine/tools/interaction/GrabController.js",
      "import": "/engine/tools/interaction/GrabController.js",
      "sourceHash": "7682d405ca3b532d60c2ced337f3d1904d3ef627d7f1df55e2ffe01e9549cf5e",
      "summary": "Hold-to-grab interaction for the engine's picking demo path. This controller intentionally suspends rigid-body simulation while an entity follows a pick ray. Play-mode force grabs remain owned by PhysicsGrab.js. Rotational handles, collision-aware sweeps, constraints, and throw momentum remain explicit gaps rather than being approximated here.",
      "exports": [
        {
          "name": "grabControllerEntityReport",
          "kind": "function",
          "signature": "grabControllerEntityReport(entityId)",
          "summary": ""
        },
        {
          "name": "grabControllerTimingReport",
          "kind": "function",
          "signature": "grabControllerTimingReport(distance, holdMs = 750)",
          "summary": ""
        },
        {
          "name": "grabControllerRayReport",
          "kind": "function",
          "signature": "grabControllerRayReport(ray, distance)",
          "summary": ""
        },
        {
          "name": "createGrabState",
          "kind": "function",
          "signature": "createGrabState()",
          "summary": ""
        },
        {
          "name": "startGrabCandidate",
          "kind": "function",
          "signature": "startGrabCandidate(grabState, ecsWorld, entityId, distance, holdMs = 750)",
          "summary": ""
        },
        {
          "name": "cancelGrabCandidate",
          "kind": "function",
          "signature": "cancelGrabCandidate(grabState)",
          "summary": ""
        },
        {
          "name": "releaseGrabbed",
          "kind": "function",
          "signature": "releaseGrabbed(grabState, ecsWorld)",
          "summary": ""
        },
        {
          "name": "updateGrabbedEntity",
          "kind": "function",
          "signature": "updateGrabbedEntity(grabState, ecsWorld, ray)",
          "summary": "Update a grabbed entity position along an admitted pick ray."
        },
        {
          "name": "clearGrabForEntity",
          "kind": "function",
          "signature": "clearGrabForEntity(grabState, entityId)",
          "summary": "Clear only grab state owned by a deleted entity."
        },
        {
          "name": "GRAB_CONTROLLER_LIMITS",
          "kind": "constant",
          "signature": "GRAB_CONTROLLER_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/picking/RayPicking",
      "path": "engine/reference/tools/picking/RayPicking.md",
      "source": "engine/tools/picking/RayPicking.js",
      "import": "/engine/tools/picking/RayPicking.js",
      "sourceHash": "76d2ac98845591fb3147343a616ba53bc3a03062e3addb4be448ff0e38512581",
      "summary": "RayPicking.js - Unified, admitted camera and room/entity picking wrappers.",
      "exports": [
        {
          "name": "resolvePickFovRadians",
          "kind": "function",
          "signature": "resolvePickFovRadians(options = {}, camera = null, config = null)",
          "summary": ""
        },
        {
          "name": "rayPickerOptionsReport",
          "kind": "function",
          "signature": "rayPickerOptionsReport(options)",
          "summary": ""
        },
        {
          "name": "createRayPicker",
          "kind": "function",
          "signature": "createRayPicker(options = {})",
          "summary": ""
        },
        {
          "name": "getCameraEyeBasisFromState",
          "kind": "function",
          "signature": "getCameraEyeBasisFromState(camera)",
          "summary": ""
        },
        {
          "name": "getPickRayFromState",
          "kind": "function",
          "signature": "getPickRayFromState(canvas, camera, clientX, clientY, options = {})",
          "summary": ""
        },
        {
          "name": "RAY_PICKER_LIMITS",
          "kind": "constant",
          "signature": "RAY_PICKER_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/picking/RoomPicking",
      "path": "engine/reference/tools/picking/RoomPicking.md",
      "source": "engine/tools/picking/RoomPicking.js",
      "import": "/engine/tools/picking/RoomPicking.js",
      "sourceHash": "c0109e3e9f16c29de0b075750162ec99b6f7619585977cfce70ce45fd3270d12",
      "summary": "",
      "exports": [
        {
          "name": "pickingRayReport",
          "kind": "function",
          "signature": "pickingRayReport(ray)",
          "summary": ""
        },
        {
          "name": "roomPickingOptionsReport",
          "kind": "function",
          "signature": "roomPickingOptionsReport(options = {})",
          "summary": ""
        },
        {
          "name": "entityPickingOptionsReport",
          "kind": "function",
          "signature": "entityPickingOptionsReport(options = {})",
          "summary": ""
        },
        {
          "name": "pickRoomSurfaceFromRay",
          "kind": "function",
          "signature": "pickRoomSurfaceFromRay(ray, options = {})",
          "summary": ""
        },
        {
          "name": "pickEntityFromRay",
          "kind": "function",
          "signature": "pickEntityFromRay(ray, ecsWorld, spawnedEntities, options = {})",
          "summary": ""
        },
        {
          "name": "ROOM_PICKING_LIMITS",
          "kind": "constant",
          "signature": "ROOM_PICKING_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/picking/ScreenRayCaster",
      "path": "engine/reference/tools/picking/ScreenRayCaster.md",
      "source": "engine/tools/picking/ScreenRayCaster.js",
      "import": "/engine/tools/picking/ScreenRayCaster.js",
      "sourceHash": "a71e3211eae2c763a0a6c31992faf9e62c312ed71565596adb013f32093b212b",
      "summary": "",
      "exports": [
        {
          "name": "screenPickInputReport",
          "kind": "function",
          "signature": "screenPickInputReport(canvas, clientX, clientY, fovRadians = SCREEN_RAY_LIMITS.defaultFovRadians)",
          "summary": ""
        },
        {
          "name": "screenCameraBasisReport",
          "kind": "function",
          "signature": "screenCameraBasisReport(basis)",
          "summary": ""
        },
        {
          "name": "screenCameraStateReport",
          "kind": "function",
          "signature": "screenCameraStateReport(cameraState)",
          "summary": ""
        },
        {
          "name": "getPickRayForCanvas",
          "kind": "function",
          "signature": "getPickRayForCanvas(canvas, cameraState, clientX, clientY, options = {})",
          "summary": ""
        },
        {
          "name": "SCREEN_RAY_LIMITS",
          "kind": "constant",
          "signature": "SCREEN_RAY_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/rigging/SkinWeightTransfer",
      "path": "engine/reference/tools/rigging/SkinWeightTransfer.md",
      "source": "engine/tools/rigging/SkinWeightTransfer.js",
      "import": "/engine/tools/rigging/SkinWeightTransfer.js",
      "sourceHash": "772d4a423b2d06e5878cd194ccf5c2d22380ef36ec8b66aecb9a82ed83d9a94a",
      "summary": "",
      "exports": [
        {
          "name": "SkinWeightTransferGPU",
          "kind": "class",
          "signature": "class SkinWeightTransferGPU",
          "summary": ""
        },
        {
          "name": "buildSourceSurfaceBVH",
          "kind": "function",
          "signature": "buildSourceSurfaceBVH(sourcePositions, sourceIndices)",
          "summary": ""
        },
        {
          "name": "estimateAlignmentICP",
          "kind": "function",
          "signature": "estimateAlignmentICP(opts)",
          "summary": ""
        },
        {
          "name": "transferSkinWeightsCPU",
          "kind": "function",
          "signature": "transferSkinWeightsCPU(opts)",
          "summary": ""
        },
        {
          "name": "transferSkinWeightsGPU",
          "kind": "function",
          "signature": "async transferSkinWeightsGPU(device, opts, limits = {})",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/scene/SceneSerializer",
      "path": "engine/reference/tools/scene/SceneSerializer.md",
      "source": "engine/tools/scene/SceneSerializer.js",
      "import": "/engine/tools/scene/SceneSerializer.js",
      "sourceHash": "1a49418c5dd01b45aab96dbc6d60326b2ecd1538a6bea5da16712b9df21bb8b5",
      "summary": "Serialize spawned entities to JSON-compatible object.",
      "exports": [
        {
          "name": "serializeScene",
          "kind": "function",
          "signature": "serializeScene(options)",
          "summary": "Serialize spawned entities to JSON-compatible object."
        },
        {
          "name": "exportSceneToJson",
          "kind": "function",
          "signature": "exportSceneToJson(options)",
          "summary": "Export scene to JSON string."
        },
        {
          "name": "downloadScene",
          "kind": "function",
          "signature": "downloadScene(options, filename = \"scene.json\")",
          "summary": "Download scene as JSON file."
        },
        {
          "name": "parseSceneJson",
          "kind": "function",
          "signature": "parseSceneJson(json)",
          "summary": "Parse scene JSON data."
        },
        {
          "name": "loadSceneFromJson",
          "kind": "function",
          "signature": "loadSceneFromJson(options)",
          "summary": "Load scene from JSON and spawn entities."
        },
        {
          "name": "loadSceneFromFile",
          "kind": "function",
          "signature": "async loadSceneFromFile(file, options)",
          "summary": "Load scene from file input."
        },
        {
          "name": "createSceneFileInput",
          "kind": "function",
          "signature": "createSceneFileInput(options)",
          "summary": "Create a file input for loading scenes."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/spawn/GhostPreviewController",
      "path": "engine/reference/tools/spawn/GhostPreviewController.md",
      "source": "engine/tools/spawn/GhostPreviewController.js",
      "import": "/engine/tools/spawn/GhostPreviewController.js",
      "sourceHash": "2a77bafcf1348f5dee4c898c6e09b47f916e8ad66b5a93b32546ff82725b887b",
      "summary": "",
      "exports": [
        {
          "name": "getGhostPreviewInfo",
          "kind": "function",
          "signature": "getGhostPreviewInfo(params)",
          "summary": ""
        },
        {
          "name": "createGhostSelectionState",
          "kind": "function",
          "signature": "createGhostSelectionState()",
          "summary": ""
        },
        {
          "name": "addGhostToSelection",
          "kind": "function",
          "signature": "addGhostToSelection(selection, options)",
          "summary": ""
        },
        {
          "name": "setActiveGhostInSelection",
          "kind": "function",
          "signature": "setActiveGhostInSelection(selection, id)",
          "summary": ""
        },
        {
          "name": "setActiveGhostBasePosition",
          "kind": "function",
          "signature": "setActiveGhostBasePosition(selection, position, type)",
          "summary": ""
        },
        {
          "name": "setActiveGhostOffset",
          "kind": "function",
          "signature": "setActiveGhostOffset(selection, offset)",
          "summary": ""
        },
        {
          "name": "getGhostWorldPosition",
          "kind": "function",
          "signature": "getGhostWorldPosition(ghost)",
          "summary": ""
        },
        {
          "name": "getActiveGhost",
          "kind": "function",
          "signature": "getActiveGhost(selection)",
          "summary": ""
        },
        {
          "name": "getActiveGhostWorldPosition",
          "kind": "function",
          "signature": "getActiveGhostWorldPosition(selection)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/spawn/PhysicsSpawnController",
      "path": "engine/reference/tools/spawn/PhysicsSpawnController.md",
      "source": "engine/tools/spawn/PhysicsSpawnController.js",
      "import": "/engine/tools/spawn/PhysicsSpawnController.js",
      "sourceHash": "7783e663203ee3c3c8d9e16714dffe9e31749da39081fa34ff40a43cf1a4d664",
      "summary": "",
      "exports": [
        {
          "name": "spawnPhysicsObjectAtPosition",
          "kind": "function",
          "signature": "spawnPhysicsObjectAtPosition(ecsWorld, position, type = \"cube\", spawnerProps = null, logger = null,)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/spawn/SpawnManager",
      "path": "engine/reference/tools/spawn/SpawnManager.md",
      "source": "engine/tools/spawn/SpawnManager.js",
      "import": "/engine/tools/spawn/SpawnManager.js",
      "sourceHash": "7e4acba2a20deccfe8c3aae1d47ae47a13ee6889678a66c41dbfac33fd86a09f",
      "summary": "Spawn a physics object with full render resource setup.",
      "exports": [
        {
          "name": "spawnEntity",
          "kind": "function",
          "signature": "spawnEntity(options)",
          "summary": "Spawn a physics object with full render resource setup."
        },
        {
          "name": "spawnParticleEmitter",
          "kind": "function",
          "signature": "spawnParticleEmitter(options)",
          "summary": "Spawn a particle emitter at position."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "tools/spawn/SpawnTypeDefaults",
      "path": "engine/reference/tools/spawn/SpawnTypeDefaults.md",
      "source": "engine/tools/spawn/SpawnTypeDefaults.js",
      "import": "/engine/tools/spawn/SpawnTypeDefaults.js",
      "sourceHash": "3a06f1da521b70bd739569400d3e8a6511c422cc1ada84378163a19062dd98df",
      "summary": "Get all available spawn types.",
      "exports": [
        {
          "name": "getAvailableSpawnTypes",
          "kind": "function",
          "signature": "getAvailableSpawnTypes()",
          "summary": "Get all available spawn types."
        },
        {
          "name": "getSpawnTypesByCategory",
          "kind": "function",
          "signature": "getSpawnTypesByCategory(category)",
          "summary": "Get spawn types by category."
        },
        {
          "name": "getSpawnTypeColor",
          "kind": "function",
          "signature": "getSpawnTypeColor(type)",
          "summary": "Get the default color for a spawn type."
        },
        {
          "name": "getSpawnTypeMeshKey",
          "kind": "function",
          "signature": "getSpawnTypeMeshKey(type)",
          "summary": "Get the mesh type for a spawn type."
        },
        {
          "name": "resolveSpawnAppearance",
          "kind": "function",
          "signature": "resolveSpawnAppearance(type, spawnerProps, meshes)",
          "summary": "Resolve color and mesh for a spawned entity. Uses spawnerProps.color if provided, otherwise falls back to type defaults."
        },
        {
          "name": "createMeshLookup",
          "kind": "function",
          "signature": "createMeshLookup(options)",
          "summary": "Create a mesh lookup object from individual mesh references."
        },
        {
          "name": "SPAWN_TYPE_COLORS",
          "kind": "constant",
          "signature": "SPAWN_TYPE_COLORS",
          "summary": "Default colors for each spawn type"
        },
        {
          "name": "SPAWN_TYPE_MESHES",
          "kind": "constant",
          "signature": "SPAWN_TYPE_MESHES",
          "summary": "Mesh type mapping (which mesh to use for each spawn type)"
        },
        {
          "name": "SPAWN_TYPE_CATEGORIES",
          "kind": "constant",
          "signature": "SPAWN_TYPE_CATEGORIES",
          "summary": "Spawn type categories for UI organization"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "version",
      "path": "engine/reference/version.md",
      "source": "engine/version.js",
      "import": "/engine/version.js",
      "sourceHash": "3d3ffc8640c204acb6380f24bde83b4bd0e41b99fd723d430cb6d2a6a1d0afef",
      "summary": "============================================================ Particle Realms — Canonical Version Source ============================================================ Import this module from anywhere in the engine or editor. The landing page (tests/index.html) also reads these values. ============================================================",
      "exports": [
        {
          "name": "ENGINE_VERSION",
          "kind": "constant",
          "signature": "ENGINE_VERSION",
          "summary": ""
        },
        {
          "name": "EDITOR_VERSION",
          "kind": "constant",
          "signature": "EDITOR_VERSION",
          "summary": ""
        },
        {
          "name": "PLAUNA_VERSION",
          "kind": "constant",
          "signature": "PLAUNA_VERSION",
          "summary": ""
        },
        {
          "name": "AGI_CORE_VERSION",
          "kind": "constant",
          "signature": "AGI_CORE_VERSION",
          "summary": ""
        },
        {
          "name": "BUILD_TAG",
          "kind": "constant",
          "signature": "BUILD_TAG",
          "summary": ""
        },
        {
          "name": "ENGINE_FULL",
          "kind": "constant",
          "signature": "ENGINE_FULL",
          "summary": ""
        },
        {
          "name": "EDITOR_FULL",
          "kind": "constant",
          "signature": "EDITOR_FULL",
          "summary": ""
        },
        {
          "name": "PLAUNA_FULL",
          "kind": "constant",
          "signature": "PLAUNA_FULL",
          "summary": ""
        },
        {
          "name": "AGI_CORE_FULL",
          "kind": "constant",
          "signature": "AGI_CORE_FULL",
          "summary": ""
        },
        {
          "name": "VERSION_BANNER",
          "kind": "constant",
          "signature": "VERSION_BANNER",
          "summary": ""
        },
        {
          "name": "ENGINE_STARTED",
          "kind": "constant",
          "signature": "ENGINE_STARTED",
          "summary": ""
        },
        {
          "name": "EDITOR_STARTED",
          "kind": "constant",
          "signature": "EDITOR_STARTED",
          "summary": ""
        },
        {
          "name": "STATS",
          "kind": "constant",
          "signature": "STATS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/ChunkCullCompute",
      "path": "engine/reference/voxel/ChunkCullCompute.md",
      "source": "engine/voxel/ChunkCullCompute.js",
      "import": "/engine/voxel/ChunkCullCompute.js",
      "sourceHash": "12cecef546d51ea02e7fe797e966f87071b0c6c7167d81220bf9d1e1ed09e32d",
      "summary": "",
      "exports": [
        {
          "name": "ChunkCullCompute",
          "kind": "class",
          "signature": "class ChunkCullCompute",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/ChunkRegistry",
      "path": "engine/reference/voxel/ChunkRegistry.md",
      "source": "engine/voxel/ChunkRegistry.js",
      "import": "/engine/voxel/ChunkRegistry.js",
      "sourceHash": "2afee90aecba37b4ad1bdb48e945da83d94ee4109b9d8b5efa4caa8b78ee94ad",
      "summary": "ChunkRegistry.js - Central Chunk Existence and Integrity Registry Solves: 1. Duplicate generation - fast O(1) existence check before generating 2. Corruption detection - content hash verification 3. Race conditions - atomic claim/release for chunk operations 4. Missing chunks - tracks all known chunks with metadata Uses: - In-memory Map for fast lookups - Content hashing (xxHash) for integrity verification - Temp file staging for atomic saves - Persistent index file for cross-session awareness",
      "exports": [
        {
          "name": "BloomFilter",
          "kind": "class",
          "signature": "class BloomFilter",
          "summary": "Bloom Filter for ultra-fast chunk existence checks - O(1) time for add/check - No false negatives (if says \"no\", definitely doesn't exist) - Small false positive rate (~0.8%) - Uses ~2% memory of equivalent Set"
        },
        {
          "name": "ChunkRegistry",
          "kind": "class",
          "signature": "class ChunkRegistry",
          "summary": ""
        },
        {
          "name": "xxHash32",
          "kind": "function",
          "signature": "xxHash32(data, seed = 0)",
          "summary": "Fast 32-bit hash for chunk content verification"
        },
        {
          "name": "hashVoxels",
          "kind": "function",
          "signature": "hashVoxels(voxels)",
          "summary": "Hash voxel data for quick integrity check Uses sampling for very large arrays (faster)"
        },
        {
          "name": "chunkRegistryBloomCoordinateHash",
          "kind": "function",
          "signature": "chunkRegistryBloomCoordinateHash(cx, cy, cz)",
          "summary": ""
        },
        {
          "name": "encodeMorton3D",
          "kind": "function",
          "signature": "encodeMorton3D(x, y, z)",
          "summary": "Encode 3D chunk coordinates to Morton code (Z-order) Interleaves bits for better cache locality in spatial queries"
        },
        {
          "name": "decodeMorton3D",
          "kind": "function",
          "signature": "decodeMorton3D(morton)",
          "summary": "Decode Morton code back to 3D coordinates"
        },
        {
          "name": "appendTrailer",
          "kind": "function",
          "signature": "appendTrailer(data)",
          "summary": "Append trailer canary to data for torn write detection"
        },
        {
          "name": "verifyTrailer",
          "kind": "function",
          "signature": "verifyTrailer(data)",
          "summary": "Verify trailer canary is present (write was complete)"
        },
        {
          "name": "getChunkRegistry",
          "kind": "function",
          "signature": "getChunkRegistry()",
          "summary": "Get the global ChunkRegistry instance"
        },
        {
          "name": "initChunkRegistry",
          "kind": "function",
          "signature": "async initChunkRegistry(backend)",
          "summary": "Initialize the global registry with a storage backend"
        },
        {
          "name": "ChunkStatus",
          "kind": "constant",
          "signature": "ChunkStatus",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/ChunkSorter",
      "path": "engine/reference/voxel/ChunkSorter.md",
      "source": "engine/voxel/ChunkSorter.js",
      "import": "/engine/voxel/ChunkSorter.js",
      "sourceHash": "4b217062213e6ccf27c968c6101062ba830ba7a4c8ea9c668e663074c8375fb0",
      "summary": "ChunkSorter - Manages chunk draw order and visibility",
      "exports": [
        {
          "name": "ChunkSorter",
          "kind": "class",
          "signature": "class ChunkSorter",
          "summary": "ChunkSorter - Manages chunk draw order and visibility"
        },
        {
          "name": "getCameraForward",
          "kind": "function",
          "signature": "getCameraForward(viewMatrix)",
          "summary": "Utility function to extract camera forward from view matrix"
        },
        {
          "name": "getCameraPosition",
          "kind": "function",
          "signature": "getCameraPosition(invViewMatrix)",
          "summary": "Utility function to extract camera position from inverse view matrix"
        },
        {
          "name": "FACE_NAMES",
          "kind": "constant",
          "signature": "FACE_NAMES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/ColoredLighting",
      "path": "engine/reference/voxel/ColoredLighting.md",
      "source": "engine/voxel/ColoredLighting.js",
      "import": "/engine/voxel/ColoredLighting.js",
      "sourceHash": "f76a4bb2a60703e075b52cfc6a846f329bc1fa1c18db87bb7597f26a3ec0c14d",
      "summary": "Pack RGB + Sky into a 16-bit value",
      "exports": [
        {
          "name": "ColoredLightingSystem",
          "kind": "class",
          "signature": "class ColoredLightingSystem",
          "summary": ""
        },
        {
          "name": "packLight",
          "kind": "function",
          "signature": "packLight(r, g, b, sky = 0)",
          "summary": "Pack RGB + Sky into a 16-bit value"
        },
        {
          "name": "unpackLight",
          "kind": "function",
          "signature": "unpackLight(packed)",
          "summary": "Unpack light into components"
        },
        {
          "name": "getChannel",
          "kind": "function",
          "signature": "getChannel(packed, shift)",
          "summary": "Get single channel from packed light"
        },
        {
          "name": "lightMax",
          "kind": "function",
          "signature": "lightMax(a, b)",
          "summary": "Component-wise maximum of two light values"
        },
        {
          "name": "lightDecrement",
          "kind": "function",
          "signature": "lightDecrement(packed, amount = 1)",
          "summary": "Component-wise decrement with saturation (no underflow)"
        },
        {
          "name": "hasLight",
          "kind": "function",
          "signature": "hasLight(packed)",
          "summary": "Check if light value is non-zero"
        },
        {
          "name": "lightToRGB",
          "kind": "function",
          "signature": "lightToRGB(packed, skyBrightness = 1.0)",
          "summary": "Convert light to normalized RGB (0-1 range)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/DirtyChunkManager",
      "path": "engine/reference/voxel/DirtyChunkManager.md",
      "source": "engine/voxel/DirtyChunkManager.js",
      "import": "/engine/voxel/DirtyChunkManager.js",
      "sourceHash": "ebf19748ed94ccdde42e099c6822d3f5935254432a88c15d89e19f6804f71a66",
      "summary": "Represents a dirty chunk entry",
      "exports": [
        {
          "name": "DirtyChunkEntry",
          "kind": "class",
          "signature": "class DirtyChunkEntry",
          "summary": "Represents a dirty chunk entry"
        },
        {
          "name": "DirtyChunkManager",
          "kind": "class",
          "signature": "class DirtyChunkManager",
          "summary": ""
        },
        {
          "name": "GeometryDirtyTracker",
          "kind": "class",
          "signature": "class GeometryDirtyTracker extends DirtyChunkManager",
          "summary": "Geometry-specific dirty tracker (for mesh rebuilds)"
        },
        {
          "name": "LightingDirtyTracker",
          "kind": "class",
          "signature": "class LightingDirtyTracker extends DirtyChunkManager",
          "summary": "Lighting-specific dirty tracker (for DDGI updates)"
        },
        {
          "name": "parseChunkKey",
          "kind": "function",
          "signature": "parseChunkKey(key)",
          "summary": "Parse chunk key to coordinates"
        },
        {
          "name": "makeChunkKey",
          "kind": "function",
          "signature": "makeChunkKey(x, y, z)",
          "summary": "Create chunk key from coordinates"
        },
        {
          "name": "MAX_DIRTY_PER_FRAME",
          "kind": "constant",
          "signature": "MAX_DIRTY_PER_FRAME",
          "summary": "Maximum chunks that can be processed per frame"
        },
        {
          "name": "ChunkState",
          "kind": "constant",
          "signature": "ChunkState",
          "summary": "Chunk states"
        },
        {
          "name": "DIRTY_FLAGS",
          "kind": "re-export",
          "signature": "DIRTY_FLAGS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/FaceListMesher",
      "path": "engine/reference/voxel/FaceListMesher.md",
      "source": "engine/voxel/FaceListMesher.js",
      "import": "/engine/voxel/FaceListMesher.js",
      "sourceHash": "b74ef9652d47c1b5956fd3268375413a62e963d95acb6ed28e1198c55001db43",
      "summary": "",
      "exports": [
        {
          "name": "GPUBufferPool",
          "kind": "class",
          "signature": "class GPUBufferPool",
          "summary": ""
        },
        {
          "name": "FaceListMesher",
          "kind": "class",
          "signature": "class FaceListMesher",
          "summary": ""
        },
        {
          "name": "FACE_PULL_SHADER_BASE",
          "kind": "constant",
          "signature": "FACE_PULL_SHADER_BASE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/FacePool",
      "path": "engine/reference/voxel/FacePool.md",
      "source": "engine/voxel/FacePool.js",
      "import": "/engine/voxel/FacePool.js",
      "sourceHash": "bbcbaca27e24d366cc738cb7985f454438bc82c47bd817bf1b05ee38fd7eafd9",
      "summary": "",
      "exports": [
        {
          "name": "FacePool",
          "kind": "class",
          "signature": "class FacePool",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/MC33Tables",
      "path": "engine/reference/voxel/MC33Tables.md",
      "source": "engine/voxel/MC33Tables.js",
      "import": "/engine/voxel/MC33Tables.js",
      "sourceHash": "ca9a9380ff70ca9929549985939e51c4002f741c6ef25c7fc64c1b5d6ef25c32",
      "summary": "Evaluate the asymptotic decider for a face Given 4 corner values of a face (v0, v1, v2, v3 in order around face), determine how the isosurface crosses the face. For a face to be ambiguous, corners must alternate in sign: (v0 > 0, v1 < 0, v2 > 0, v3 < 0) or vice versa The asymptotic decider computes: A = v0 + v2 (diagonal sum) B = v1 + v3 (other diagonal sum) If A * (v0 - v1) > 0: connect (v0,v2) pair Else: connect (v1,v3) pair Equivalently, compute Q = v0*v2 - v1*v3 Q > 0: separating, Q < 0: connecting",
      "exports": [
        {
          "name": "asymptoticDecider",
          "kind": "function",
          "signature": "asymptoticDecider(v0, v1, v2, v3)",
          "summary": "Evaluate the asymptotic decider for a face Given 4 corner values of a face (v0, v1, v2, v3 in order around face), determine how the isosurface crosses the face. For a face to be ambiguous, corners must alternate in sign: (v0 > 0, v1 < 0, v2 > 0, v3 < 0) or vice versa The asymptotic decider computes: A = v0 + v2 (diagonal sum) B = v1 + v3 (other diagonal sum) If A * (v0 - v1) > 0: connect (v0,v2) pair Else: connect (v1,v3) pair Equivalently, compute Q = v0*v2 - v1*v3 Q > 0: separating, Q < 0: connecting"
        },
        {
          "name": "isFaceAmbiguous",
          "kind": "function",
          "signature": "isFaceAmbiguous(cubeIndex, faceIndex)",
          "summary": "Check if a face has ambiguity given cube configuration"
        },
        {
          "name": "getAmbiguousFaces",
          "kind": "function",
          "signature": "getAmbiguousFaces(cubeIndex)",
          "summary": "Get all ambiguous faces for a cube configuration"
        },
        {
          "name": "interiorTest",
          "kind": "function",
          "signature": "interiorTest(values)",
          "summary": "Test for interior ambiguity in Case 13 configurations Case 13 has a potential tunnel through the cube center The interior test computes the bilinear patch at cube center and checks if it separates or connects the corner groups"
        },
        {
          "name": "getMC33Subcase",
          "kind": "function",
          "signature": "getMC33Subcase(cubeIndex, values)",
          "summary": "Compute the MC33 subcase for a given cube configuration"
        },
        {
          "name": "generateWGSLTables",
          "kind": "function",
          "signature": "generateWGSLTables()",
          "summary": "Generate WGSL constant arrays for MC33 tables For use in compute shaders"
        },
        {
          "name": "rotateEdges",
          "kind": "function",
          "signature": "rotateEdges(edges, rotation)",
          "summary": "Apply rotation to edge indices"
        },
        {
          "name": "MC33_CASE",
          "kind": "constant",
          "signature": "MC33_CASE",
          "summary": "MC33 base case for each of the 256 cube configurations Standard MC has 15 cases, MC33 extends to 33 by splitting ambiguous ones Cases 0-14: Standard unambiguous cases Cases with face ambiguity: 3, 4, 6, 7, 10, 12, 13 Cases with interior ambiguity: 4, 6, 7, 10, 12, 13"
        },
        {
          "name": "MC33_SUBCASE_COUNT",
          "kind": "constant",
          "signature": "MC33_SUBCASE_COUNT",
          "summary": "Number of subcases for each MC33 case Most cases have 1 subcase (no ambiguity) Ambiguous cases have 2-6 subcases depending on face/interior tests"
        },
        {
          "name": "CUBE_FACES",
          "kind": "constant",
          "signature": "CUBE_FACES",
          "summary": "Face indices for the 6 cube faces Each face defined by 4 corner indices in CCW order (from outside)"
        },
        {
          "name": "AMBIGUOUS_FACES",
          "kind": "constant",
          "signature": "AMBIGUOUS_FACES",
          "summary": "For each ambiguous case, which faces need to be tested Bit flags: bit 0 = face 0, bit 1 = face 1, etc."
        },
        {
          "name": "SUBCASE_LOOKUP",
          "kind": "constant",
          "signature": "SUBCASE_LOOKUP",
          "summary": "Subcase lookup for each ambiguous case Index by face test results (bit flags)"
        },
        {
          "name": "MC33_TRI_TABLE",
          "kind": "constant",
          "signature": "MC33_TRI_TABLE",
          "summary": "Triangle configurations for MC33 subcases For ambiguous cases, provides alternate triangulations Format: [case][subcase] = [edge indices for triangles, -1 terminated] Note: This is a subset of the full 1296-entry table Full table would be generated programmatically or loaded from binary"
        },
        {
          "name": "CANONICAL_ROTATION",
          "kind": "constant",
          "signature": "CANONICAL_ROTATION",
          "summary": "Rotation lookup to map arbitrary configs to canonical form MC33 uses 48 symmetries (24 rotations × 2 reflections) This reduces the 256 configurations to ~23 canonical cases Each entry: [canonical_index, rotation_index]"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/MarchingCubesMesher",
      "path": "engine/reference/voxel/MarchingCubesMesher.md",
      "source": "engine/voxel/MarchingCubesMesher.js",
      "import": "/engine/voxel/MarchingCubesMesher.js",
      "sourceHash": "8dd9b725dff10314eb53d3d00425411439971114f3e90d9d42a256ed3817177e",
      "summary": "MarchingCubesMesher.js - Smooth Voxel Terrain via Isosurface Extraction INTEGRATION: - GPU compute shader for parallel cube processing - Uses VoxelMeshCompute for output buffer management - Integrates with ChunkManager for chunk-based meshing Implements the Marching Cubes algorithm for smooth terrain: - Extracts isosurface from 3D density field - Produces smooth, organic terrain instead of blocky voxels - Supports interpolated vertex positions for smooth gradients - Generates per-vertex normals for proper lighting - fBM SDF terrain (Inigo Quilez style) for native smooth noise MC33 Extension (Chernyaev 1995): - Resolves topological ambiguities for watertight meshes - Uses asymptotic decider for face ambiguity resolution - Interior tests for tunnel cases (Case 13) - 33 distinct cases vs standard 15 Based on: - Lorensen & Cline's Marching Cubes (1987) - Chernyaev's Marching Cubes 33 (1995) - Inigo Quilez fBM SDF: https://iquilezles.org/articles/fbmsdf/ Usage: const mesh = meshChunkSmooth(chunk, getDensity); const meshMC33 = meshChunkMC33(chunk, getDensity); // Watertight // Or with SDF: const density = sdfTerrain(x, y, z, config);",
      "exports": [
        {
          "name": "MarchingCubesMesher",
          "kind": "class",
          "signature": "class MarchingCubesMesher",
          "summary": "Marching Cubes Mesher class for integration with existing systems"
        },
        {
          "name": "meshChunkSmooth",
          "kind": "function",
          "signature": "meshChunkSmooth(chunk, getDensity, options = {})",
          "summary": "Mesh a chunk using Marching Cubes for smooth terrain"
        },
        {
          "name": "meshChunkMC33",
          "kind": "function",
          "signature": "meshChunkMC33(chunk, getDensity, options = {})",
          "summary": "Mesh a chunk using MC33 for watertight meshes Resolves topological ambiguities that cause holes in standard MC"
        },
        {
          "name": "resolveFaceAmbiguity",
          "kind": "function",
          "signature": "resolveFaceAmbiguity(cubeIndex, densities, faceIndex)",
          "summary": "Test if a face is ambiguous and resolve using asymptotic decider Exported for use in GPU shader validation"
        },
        {
          "name": "smin",
          "kind": "function",
          "signature": "smin(a, b, k = 0.1)",
          "summary": "Smooth minimum (polynomial) - blends two distances smoothly"
        },
        {
          "name": "fbm3D",
          "kind": "function",
          "signature": "fbm3D(x, y, z, config = {})",
          "summary": "fBM (Fractal Brownian Motion) noise"
        },
        {
          "name": "sdfTerrain",
          "kind": "function",
          "signature": "sdfTerrain(x, y, z, config = {})",
          "summary": "SDF Terrain density function (Inigo Quilez style) Returns negative inside terrain, positive outside"
        },
        {
          "name": "sdfSphere",
          "kind": "function",
          "signature": "sdfSphere(x, y, z, cx, cy, cz, radius)",
          "summary": "SDF Sphere primitive"
        },
        {
          "name": "sdfBox",
          "kind": "function",
          "signature": "sdfBox(x, y, z, cx, cy, cz, sx, sy, sz)",
          "summary": "SDF Box primitive"
        },
        {
          "name": "sdfUnion",
          "kind": "function",
          "signature": "sdfUnion(d1, d2)",
          "summary": "Union of two SDFs"
        },
        {
          "name": "sdfSmoothUnion",
          "kind": "function",
          "signature": "sdfSmoothUnion(d1, d2, k = 0.1)",
          "summary": "Smooth union of two SDFs"
        },
        {
          "name": "sdfSubtract",
          "kind": "function",
          "signature": "sdfSubtract(d1, d2)",
          "summary": "Subtraction of SDFs (d2 from d1)"
        },
        {
          "name": "sdfIntersect",
          "kind": "function",
          "signature": "sdfIntersect(d1, d2)",
          "summary": "Intersection of SDFs"
        },
        {
          "name": "generateTransitionCell",
          "kind": "function",
          "signature": "generateTransitionCell(densityHigh, densityLow, face, cellSize, isolevel = 0)",
          "summary": "Generate transition cell mesh for LOD boundary"
        },
        {
          "name": "needsTransitionCell",
          "kind": "function",
          "signature": "needsTransitionCell(chunkLOD, neighborLOD)",
          "summary": "Check if chunk needs transition cells on a face"
        },
        {
          "name": "getTransitionRatio",
          "kind": "function",
          "signature": "getTransitionRatio(chunkLOD, neighborLOD)",
          "summary": "Get transition cell size ratio"
        },
        {
          "name": "dualContourVertex",
          "kind": "function",
          "signature": "dualContourVertex(density, gradients, isolevel = 0)",
          "summary": "Dual Contouring vertex placement using QEF (Quadric Error Function) Unlike Marching Cubes, places vertex at optimal position inside cell"
        },
        {
          "name": "dualContourCell",
          "kind": "function",
          "signature": "dualContourCell(density, isolevel = 0)",
          "summary": "Check if cell contains surface using Dual Contouring"
        },
        {
          "name": "calculateWorldSpaceAO",
          "kind": "function",
          "signature": "calculateWorldSpaceAO(sampleDensity, wx, wy, wz, radius = 2, samples = 8)",
          "summary": "Calculate world-space AO from density field"
        },
        {
          "name": "calculateGradientAO",
          "kind": "function",
          "signature": "calculateGradientAO(sampleDensity, wx, wy, wz)",
          "summary": "Calculate AO from density gradient (faster, smoother)"
        },
        {
          "name": "MARCHING_CUBES_MATERIAL_PCG_HASH_WGSL",
          "kind": "constant",
          "signature": "MARCHING_CUBES_MATERIAL_PCG_HASH_WGSL",
          "summary": ""
        },
        {
          "name": "MESH_MODE",
          "kind": "constant",
          "signature": "MESH_MODE",
          "summary": ""
        },
        {
          "name": "TRIPLANAR_SHADER",
          "kind": "constant",
          "signature": "TRIPLANAR_SHADER",
          "summary": ""
        },
        {
          "name": "MATERIAL_BLEND_SHADER",
          "kind": "constant",
          "signature": "MATERIAL_BLEND_SHADER",
          "summary": ""
        },
        {
          "name": "SDF_RAYMARCH_SHADER",
          "kind": "constant",
          "signature": "SDF_RAYMARCH_SHADER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/MaterialSchema",
      "path": "engine/reference/voxel/MaterialSchema.md",
      "source": "engine/voxel/MaterialSchema.js",
      "import": "/engine/voxel/MaterialSchema.js",
      "sourceHash": "6529046c60f728ab681b8bc293442a633b5243ef5152ab153579783f1017dc2a",
      "summary": "Get material ID by name (safe lookup)",
      "exports": [
        {
          "name": "getMaterialId",
          "kind": "function",
          "signature": "getMaterialId(name)",
          "summary": "Get material ID by name (safe lookup)"
        },
        {
          "name": "getMaterialName",
          "kind": "function",
          "signature": "getMaterialName(id)",
          "summary": "Get material name by ID (safe lookup)"
        },
        {
          "name": "getMaterialColor",
          "kind": "function",
          "signature": "getMaterialColor(id)",
          "summary": "Get material color by ID"
        },
        {
          "name": "getMaterialProperties",
          "kind": "function",
          "signature": "getMaterialProperties(id)",
          "summary": "Get material properties by ID"
        },
        {
          "name": "isTransparent",
          "kind": "function",
          "signature": "isTransparent(id)",
          "summary": "Check if material is transparent"
        },
        {
          "name": "isSolid",
          "kind": "function",
          "signature": "isSolid(id)",
          "summary": "Check if material is solid"
        },
        {
          "name": "isFluid",
          "kind": "function",
          "signature": "isFluid(id)",
          "summary": "Check if material is fluid"
        },
        {
          "name": "isEmissive",
          "kind": "function",
          "signature": "isEmissive(id)",
          "summary": "Check if material is emissive"
        },
        {
          "name": "validateSchema",
          "kind": "function",
          "signature": "validateSchema()",
          "summary": "Validate schema integrity"
        },
        {
          "name": "SCHEMA_VERSION",
          "kind": "constant",
          "signature": "SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "MATERIAL_DEFINITIONS",
          "kind": "constant",
          "signature": "MATERIAL_DEFINITIONS",
          "summary": "Material definition schema Each material has: - name: Unique identifier (used as enum key) - color: RGBA array [0-255, 0-255, 0-255, 0-255] - colorNormalized: RGBA array [0-1, 0-1, 0-1, 0-1] (auto-generated) - properties: Material behavior flags"
        },
        {
          "name": "MATERIAL",
          "kind": "constant",
          "signature": "MATERIAL",
          "summary": ""
        },
        {
          "name": "MATERIAL_COLORS",
          "kind": "constant",
          "signature": "MATERIAL_COLORS",
          "summary": ""
        },
        {
          "name": "MATERIAL_PROPERTIES",
          "kind": "constant",
          "signature": "MATERIAL_PROPERTIES",
          "summary": ""
        },
        {
          "name": "MATERIAL_NAMES",
          "kind": "constant",
          "signature": "MATERIAL_NAMES",
          "summary": ""
        },
        {
          "name": "MATERIAL_IDS",
          "kind": "constant",
          "signature": "MATERIAL_IDS",
          "summary": ""
        },
        {
          "name": "MATERIAL_COUNT",
          "kind": "constant",
          "signature": "MATERIAL_COUNT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/MeshletCullCompute",
      "path": "engine/reference/voxel/MeshletCullCompute.md",
      "source": "engine/voxel/MeshletCullCompute.js",
      "import": "/engine/voxel/MeshletCullCompute.js",
      "sourceHash": "bca4362274f8b522c3e188a9603efcdcf58468003589cf9cb5cbae58117ac489",
      "summary": "",
      "exports": [
        {
          "name": "MeshletCullCompute",
          "kind": "class",
          "signature": "class MeshletCullCompute",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/NeighborCache",
      "path": "engine/reference/voxel/NeighborCache.md",
      "source": "engine/voxel/NeighborCache.js",
      "import": "/engine/voxel/NeighborCache.js",
      "sourceHash": "94d1ed668f47aaf4d6252e84860a5951ed6a8875812a2648b1c053e10b5787f5",
      "summary": "ChunkNeighborCache - Per-chunk neighbor references",
      "exports": [
        {
          "name": "ChunkNeighborCache",
          "kind": "class",
          "signature": "class ChunkNeighborCache",
          "summary": "ChunkNeighborCache - Per-chunk neighbor references"
        },
        {
          "name": "NeighborCacheManager",
          "kind": "class",
          "signature": "class NeighborCacheManager",
          "summary": "NeighborCacheManager - Manages neighbor caches for all chunks"
        },
        {
          "name": "NEIGHBOR_DIR",
          "kind": "constant",
          "signature": "NEIGHBOR_DIR",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/ProceduralMaterialBaker",
      "path": "engine/reference/voxel/ProceduralMaterialBaker.md",
      "source": "engine/voxel/ProceduralMaterialBaker.js",
      "import": "/engine/voxel/ProceduralMaterialBaker.js",
      "sourceHash": "cc4ac75476e0c1729beb4d536105dc95b7a88f68e6058117727ab32309d378d4",
      "summary": "",
      "exports": [
        {
          "name": "ProceduralMaterialBaker",
          "kind": "class",
          "signature": "class ProceduralMaterialBaker",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/SubChunkMeshCompute",
      "path": "engine/reference/voxel/SubChunkMeshCompute.md",
      "source": "engine/voxel/SubChunkMeshCompute.js",
      "import": "/engine/voxel/SubChunkMeshCompute.js",
      "sourceHash": "04162de95f7205f121932c0f7dc21362b5988af1756fe0cdac682ba2d0280ee7",
      "summary": "",
      "exports": [
        {
          "name": "SubChunkMeshCompute",
          "kind": "class",
          "signature": "class SubChunkMeshCompute",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/TextureArrayManager",
      "path": "engine/reference/voxel/TextureArrayManager.md",
      "source": "engine/voxel/TextureArrayManager.js",
      "import": "/engine/voxel/TextureArrayManager.js",
      "sourceHash": "44ae79f3601c0fe314f3ef53ae3d7a91a340844f48a1213afaa481929fb4bc3a",
      "summary": "TextureArrayManager.js - Texture Array for Voxel Materials Uses a 2D texture array instead of a texture atlas for voxel materials. Benefits over atlas: - No UV calculation needed (just use material index) - Proper mipmapping per texture (no bleeding) - Cleaner shader code - Easy to add/remove materials Usage in shader: @group(0) @binding(X) var materials: texture_2d_array<f32>; let color = textureSample(materials, sampler, uv, materialIndex);",
      "exports": [
        {
          "name": "TextureArrayManager",
          "kind": "class",
          "signature": "class TextureArrayManager",
          "summary": "TextureArrayManager - Manages a texture array for voxel materials"
        },
        {
          "name": "textureArrayMaterialNoiseHash",
          "kind": "function",
          "signature": "textureArrayMaterialNoiseHash(px, py, materialIndex)",
          "summary": ""
        },
        {
          "name": "textureArrayMaterialNoiseDelta",
          "kind": "function",
          "signature": "textureArrayMaterialNoiseDelta(px, py, materialIndex, amplitude = 0.1)",
          "summary": ""
        },
        {
          "name": "TEXTURE_ARRAY_WGSL",
          "kind": "constant",
          "signature": "TEXTURE_ARRAY_WGSL",
          "summary": ""
        },
        {
          "name": "TEXTURE_ARRAY_WGSL_GROUP2",
          "kind": "constant",
          "signature": "TEXTURE_ARRAY_WGSL_GROUP2",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelAO",
      "path": "engine/reference/voxel/VoxelAO.md",
      "source": "engine/voxel/VoxelAO.js",
      "import": "/engine/voxel/VoxelAO.js",
      "sourceHash": "9c9b581a3d273eeda4840470ee0f1cf79a6e1be056532af40566efd8e7052b02",
      "summary": "VoxelAOCalculator - GPU compute shader for AO calculation",
      "exports": [
        {
          "name": "VoxelAOCalculator",
          "kind": "class",
          "signature": "class VoxelAOCalculator",
          "summary": "VoxelAOCalculator - GPU compute shader for AO calculation"
        },
        {
          "name": "calculateVertexAO",
          "kind": "function",
          "signature": "calculateVertexAO(isOpaque, x, y, z, face, corner)",
          "summary": "Calculate vertex AO for a single corner"
        },
        {
          "name": "calculateFaceAO",
          "kind": "function",
          "signature": "calculateFaceAO(isOpaque, x, y, z, face)",
          "summary": "Calculate all 4 corner AO values for a face"
        },
        {
          "name": "packAO",
          "kind": "function",
          "signature": "packAO(ao)",
          "summary": "Pack 4 AO values into a single u32 (8 bits each)"
        },
        {
          "name": "unpackAO",
          "kind": "function",
          "signature": "unpackAO(packed)",
          "summary": "Unpack u32 to 4 AO values"
        },
        {
          "name": "shouldFlipQuad",
          "kind": "function",
          "signature": "shouldFlipQuad(ao)",
          "summary": "Determine if face vertices should be flipped for better AO interpolation Fixes the \"anisotropy\" problem where diagonal looks different based on quad orientation"
        },
        {
          "name": "VOXEL_AO_WGSL",
          "kind": "constant",
          "signature": "VOXEL_AO_WGSL",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelConstants",
      "path": "engine/reference/voxel/VoxelConstants.md",
      "source": "engine/voxel/VoxelConstants.js",
      "import": "/engine/voxel/VoxelConstants.js",
      "sourceHash": "2a82e872a45ef5cb721a11d701ed8f4316ac6e93c4e16519f537f6bf7d7fd1e2",
      "summary": "Get the depth tier configuration for a given Y coordinate",
      "exports": [
        {
          "name": "getDepthTier",
          "kind": "function",
          "signature": "getDepthTier(y)",
          "summary": "Get the depth tier configuration for a given Y coordinate"
        },
        {
          "name": "getDepthTierBlend",
          "kind": "function",
          "signature": "getDepthTierBlend(y)",
          "summary": "Interpolate between depth tiers for smooth transitions"
        },
        {
          "name": "CHUNK_SIZE",
          "kind": "constant",
          "signature": "CHUNK_SIZE",
          "summary": ""
        },
        {
          "name": "CHUNK_SIZE_SQ",
          "kind": "constant",
          "signature": "CHUNK_SIZE_SQ",
          "summary": ""
        },
        {
          "name": "CHUNK_VOLUME",
          "kind": "constant",
          "signature": "CHUNK_VOLUME",
          "summary": ""
        },
        {
          "name": "DEPTH_TIERS",
          "kind": "constant",
          "signature": "DEPTH_TIERS",
          "summary": "Depth tiers define how terrain generation changes with depth. Each tier has different noise parameters, materials, and features."
        },
        {
          "name": "FACE_NORMALS",
          "kind": "constant",
          "signature": "FACE_NORMALS",
          "summary": ""
        },
        {
          "name": "FACE_NAMES",
          "kind": "constant",
          "signature": "FACE_NAMES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelMeshCompute",
      "path": "engine/reference/voxel/VoxelMeshCompute.md",
      "source": "engine/voxel/VoxelMeshCompute.js",
      "import": "/engine/voxel/VoxelMeshCompute.js",
      "sourceHash": "fbb5fa952d6cc8d5f2ec369caef05b48df1132bee7d8b5e5bda8efffffb5a820",
      "summary": "",
      "exports": [
        {
          "name": "VoxelMeshCompute",
          "kind": "class",
          "signature": "class VoxelMeshCompute",
          "summary": ""
        },
        {
          "name": "COMPACT_VERTEX_SHADER",
          "kind": "constant",
          "signature": "COMPACT_VERTEX_SHADER",
          "summary": ""
        },
        {
          "name": "COMPACT_VERTEX_LAYOUT",
          "kind": "constant",
          "signature": "COMPACT_VERTEX_LAYOUT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelMesher",
      "path": "engine/reference/voxel/VoxelMesher.md",
      "source": "engine/voxel/VoxelMesher.js",
      "import": "/engine/voxel/VoxelMesher.js",
      "sourceHash": "aa11895ee1323c90446a747c12998fa8c130c1b5d3ecfdb6913a8dcf5c980cea",
      "summary": "Check if a material is transparent",
      "exports": [
        {
          "name": "isTransparentMaterial",
          "kind": "function",
          "signature": "isTransparentMaterial(material)",
          "summary": "Check if a material is transparent"
        },
        {
          "name": "isChunkFaceSolid",
          "kind": "function",
          "signature": "isChunkFaceSolid(chunk, face)",
          "summary": "Check if a chunk's boundary face is fully solid (all voxels on that face are non-air) Used to skip meshing faces that are completely hidden by a solid neighbor"
        },
        {
          "name": "getChunkOcclusionMask",
          "kind": "function",
          "signature": "getChunkOcclusionMask(getNeighborChunk, cx, cy, cz)",
          "summary": "Get occlusion mask for a chunk based on neighbor chunk boundaries Returns a bitmask where bit N is set if face N is fully occluded"
        },
        {
          "name": "getViewCullingMask",
          "kind": "function",
          "signature": "getViewCullingMask(cx, cy, cz, cameraPos)",
          "summary": "Get view-dependent face culling mask Skips chunk faces that face away from camera (backface culling at chunk level)"
        },
        {
          "name": "meshChunk",
          "kind": "function",
          "signature": "meshChunk(chunk, getNeighborVoxel = null, occludedFaces = 0)",
          "summary": "Generate mesh for a voxel chunk using simple per-face meshing with AO Returns separate meshes for opaque and transparent (water) geometry"
        },
        {
          "name": "meshChunkLOD",
          "kind": "function",
          "signature": "meshChunkLOD(chunk, lodLevel = 0, getNeighborVoxel = null, neighborLODs = null)",
          "summary": ""
        },
        {
          "name": "meshChunkGreedy",
          "kind": "function",
          "signature": "meshChunkGreedy(chunk, getNeighborVoxel = null)",
          "summary": "Generate mesh using greedy meshing (fewer quads, better performance) Note: Currently does not separate water - falls back to simple meshing for chunks with water"
        },
        {
          "name": "createChunkBuffers",
          "kind": "function",
          "signature": "createChunkBuffers(device, chunk, meshData)",
          "summary": "Create GPU buffers for chunk mesh (both opaque and water)"
        },
        {
          "name": "meshSubChunk",
          "kind": "function",
          "signature": "meshSubChunk(chunk, subSize, sx, sy, sz, getNeighborVoxel = null)",
          "summary": "Mesh a sub-region of a chunk (8³ or 16³) Used for ultra-fast partial updates in cascaded chunk architecture"
        },
        {
          "name": "initGPUSubChunkMeshing",
          "kind": "function",
          "signature": "async initGPUSubChunkMeshing(device)",
          "summary": "Initialize GPU sub-chunk meshing"
        },
        {
          "name": "hasGPUSubChunkMeshing",
          "kind": "function",
          "signature": "hasGPUSubChunkMeshing()",
          "summary": "Check if GPU sub-chunk meshing is available"
        },
        {
          "name": "meshSubChunk4GPU",
          "kind": "function",
          "signature": "async meshSubChunk4GPU(chunk, sx, sy, sz)",
          "summary": "Mesh a 4³ sub-chunk on GPU (10× faster than CPU)"
        },
        {
          "name": "meshSubChunk8GPU",
          "kind": "function",
          "signature": "async meshSubChunk8GPU(chunk, sx, sy, sz)",
          "summary": "Mesh an 8³ sub-chunk on GPU (10× faster than CPU)"
        },
        {
          "name": "releaseGPUSubChunkMesh",
          "kind": "function",
          "signature": "releaseGPUSubChunkMesh(mesh)",
          "summary": "Return GPU sub-chunk output buffers to the engine pool."
        },
        {
          "name": "returnGPUBuffers",
          "kind": "function",
          "signature": "returnGPUBuffers(vertexBuffer, indexBuffer, indirectBuffer)",
          "summary": "Return GPU buffers to pool for reuse"
        },
        {
          "name": "getGPUSubChunkStats",
          "kind": "function",
          "signature": "getGPUSubChunkStats()",
          "summary": "Get GPU sub-chunk meshing statistics"
        },
        {
          "name": "getMeshGranularity",
          "kind": "function",
          "signature": "getMeshGranularity(distance, hasRecentModifications = false, modCount = 0)",
          "summary": "Get mesh granularity based on distance from camera (4-Tier System)"
        },
        {
          "name": "gpuBufferPool",
          "kind": "constant",
          "signature": "gpuBufferPool",
          "summary": ""
        },
        {
          "name": "VERTEX_STRIDE",
          "kind": "constant",
          "signature": "VERTEX_STRIDE",
          "summary": ""
        },
        {
          "name": "FACE_NORMALS",
          "kind": "re-export",
          "signature": "FACE_NORMALS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelModifyCompute",
      "path": "engine/reference/voxel/VoxelModifyCompute.md",
      "source": "engine/voxel/VoxelModifyCompute.js",
      "import": "/engine/voxel/VoxelModifyCompute.js",
      "sourceHash": "18790fb8c6666575fdfd9619cbb65298ca7cfec6196c8737555a32233f3c6372",
      "summary": "VoxelModifyCompute.js - GPU Voxel Modification System Now powered by vGPU driver Performs sphere and box removal operations on voxel chunks using compute shaders. Outputs removed voxels for particle spawning.",
      "exports": [
        {
          "name": "VoxelModifyCompute",
          "kind": "class",
          "signature": "class VoxelModifyCompute",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelRaycast",
      "path": "engine/reference/voxel/VoxelRaycast.md",
      "source": "engine/voxel/VoxelRaycast.js",
      "import": "/engine/voxel/VoxelRaycast.js",
      "sourceHash": "ca5300498c226775d58513ba9e250847f97ebfc7fcf899e8f60bde58fefcabf0",
      "summary": "GPU-accelerated batch voxel raycasting system Use when processing 100+ rays per frame",
      "exports": [
        {
          "name": "VoxelRaycastGPU",
          "kind": "class",
          "signature": "class VoxelRaycastGPU",
          "summary": "GPU-accelerated batch voxel raycasting system Use when processing 100+ rays per frame"
        },
        {
          "name": "raycastVoxels",
          "kind": "function",
          "signature": "raycastVoxels(origin, direction, getVoxel, options = {})",
          "summary": "Raycast through voxel world using DDA algorithm Returns first solid voxel hit along ray"
        },
        {
          "name": "hasVoxelLineOfSight",
          "kind": "function",
          "signature": "hasVoxelLineOfSight(from, to, getVoxel, options = {})",
          "summary": "Check line of sight between two points through voxels Returns true if no solid voxels block the path"
        },
        {
          "name": "pickBlock",
          "kind": "function",
          "signature": "pickBlock(origin, direction, getVoxel, maxDistance = 10)",
          "summary": "Block picking - raycast from camera with face/placement info Returns both the hit block and the adjacent empty block for placement"
        },
        {
          "name": "traceVoxelPath",
          "kind": "function",
          "signature": "traceVoxelPath(origin, direction, getVoxel, maxDistance = 50, options = {})",
          "summary": "Trace ray through voxels collecting all intersected voxels Useful for beam weapons, explosion rays, etc."
        },
        {
          "name": "createVoxelGetter",
          "kind": "function",
          "signature": "createVoxelGetter(chunkManager)",
          "summary": "Create a voxel getter function from ChunkManager"
        },
        {
          "name": "hasLineOfSightCombined",
          "kind": "function",
          "signature": "hasLineOfSightCombined(from, to, obstacles, getVoxel, options = {})",
          "summary": "Combined LOS check - uses voxels AND AABB obstacles Drop-in replacement for AIAiming.hasLineOfSight"
        },
        {
          "name": "computePixelToRayMatrix",
          "kind": "function",
          "signature": "computePixelToRayMatrix(cameraPos, cameraRotation, fovRad, screenWidth, screenHeight)",
          "summary": "Compute a single matrix that transforms screen pixel coords to world-space ray directions. This avoids per-pixel matrix multiplications in shaders. Usage: rayDir = normalize((pixelToRay * vec4(pixelX, pixelY, 1, 1)).xyz - cameraPos)"
        },
        {
          "name": "screenPixelToRay",
          "kind": "function",
          "signature": "screenPixelToRay(pixelX, pixelY, pixelToRay, cameraPos)",
          "summary": "Generate ray from screen pixel using precomputed pixel-to-ray matrix"
        },
        {
          "name": "raycastVoxelsDebug",
          "kind": "function",
          "signature": "raycastVoxelsDebug(origin, direction, getVoxel, maxDistance = 100)",
          "summary": "Raycast with step counting for performance debugging"
        },
        {
          "name": "stepsToHeatColor",
          "kind": "function",
          "signature": "stepsToHeatColor(steps, maxSteps = 300)",
          "summary": "Convert step count to heat map color (inferno palette)"
        },
        {
          "name": "triangleVoxelIntersect",
          "kind": "function",
          "signature": "triangleVoxelIntersect(a, b, c, voxelMin, voxelMax)",
          "summary": "Check if a triangle intersects a voxel using separating axis theorem. Based on DeadlockCode's implementation."
        },
        {
          "name": "voxelizeMesh",
          "kind": "function",
          "signature": "voxelizeMesh(vertices, triangles, resolution, boundsMin, boundsMax)",
          "summary": "Voxelize a triangle mesh into a voxel grid"
        },
        {
          "name": "RAYCAST_DEBUG_MODE",
          "kind": "constant",
          "signature": "RAYCAST_DEBUG_MODE",
          "summary": "Debug render modes for raycast visualization"
        },
        {
          "name": "MAX_RAY_DISTANCE",
          "kind": "re-export",
          "signature": "MAX_RAY_DISTANCE",
          "summary": ""
        },
        {
          "name": "VOXEL_RAYCAST_SHADER",
          "kind": "re-export",
          "signature": "VOXEL_RAYCAST_SHADER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelRenderer",
      "path": "engine/reference/voxel/VoxelRenderer.md",
      "source": "engine/voxel/VoxelRenderer.js",
      "import": "/engine/voxel/VoxelRenderer.js",
      "sourceHash": "5650772696ae36a6861e3881136b9955054b050e36f83b62261b474baeeebff5",
      "summary": "",
      "exports": [
        {
          "name": "VoxelRenderer",
          "kind": "class",
          "signature": "class VoxelRenderer",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelSdfBrickBridge",
      "path": "engine/reference/voxel/VoxelSdfBrickBridge.md",
      "source": "engine/voxel/VoxelSdfBrickBridge.js",
      "import": "/engine/voxel/VoxelSdfBrickBridge.js",
      "sourceHash": "9d7cd33472aba0cce73589dc243c01b5cd32ac126d391c2aee6ad82793c3c1f3",
      "summary": "Adapter only: voxel storage and dirty-queue ownership remain with the voxel subsystem. Callers pass the dirty entries they already admitted this frame.",
      "exports": [
        {
          "name": "VoxelSdfBrickBridge",
          "kind": "class",
          "signature": "class VoxelSdfBrickBridge",
          "summary": "Adapter only: voxel storage and dirty-queue ownership remain with the voxel subsystem. Callers pass the dirty entries they already admitted this frame."
        },
        {
          "name": "buildVoxelSdfBrickPair",
          "kind": "function",
          "signature": "buildVoxelSdfBrickPair(options = {})",
          "summary": "Convert one voxel chunk plus a one-voxel neighbor apron into independently generated coarse and fine sampled-field pages. The coarse page is an intentionally expanded conservative proxy, so a fine-page miss degrades shape accuracy instead of silently removing occupied geometry."
        },
        {
          "name": "voxelSdfPageToNexel",
          "kind": "function",
          "signature": "voxelSdfPageToNexel(page, options = {})",
          "summary": ""
        },
        {
          "name": "createVoxelSdfBrickBridge",
          "kind": "function",
          "signature": "createVoxelSdfBrickBridge(options)",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/VoxelShaders",
      "path": "engine/reference/voxel/VoxelShaders.md",
      "source": "engine/voxel/VoxelShaders.js",
      "import": "/engine/voxel/VoxelShaders.js",
      "sourceHash": "02850a7dc1c37a9f19d7466e7a9497a18b81df205bd230c3743bfbdd1e43b2cc",
      "summary": "VoxelShaders.js - WGSL shader strings for VoxelRenderer Extracted from VoxelRenderer.js for modularity",
      "exports": [
        {
          "name": "buildVoxelShaderCompactBase",
          "kind": "function",
          "signature": "buildVoxelShaderCompactBase(VOXEL_SHADER)",
          "summary": ""
        },
        {
          "name": "buildVoxelShaderCompactOpaque",
          "kind": "function",
          "signature": "buildVoxelShaderCompactOpaque(compactBase)",
          "summary": ""
        },
        {
          "name": "buildVoxelShaderCompactWater",
          "kind": "function",
          "signature": "buildVoxelShaderCompactWater(compactBase)",
          "summary": ""
        },
        {
          "name": "buildShadowShaderCompact",
          "kind": "function",
          "signature": "buildShadowShaderCompact()",
          "summary": ""
        },
        {
          "name": "SHADOW_MAP_SIZE",
          "kind": "constant",
          "signature": "SHADOW_MAP_SIZE",
          "summary": ""
        },
        {
          "name": "FRAME_UNIFORMS_STRUCT",
          "kind": "constant",
          "signature": "FRAME_UNIFORMS_STRUCT",
          "summary": ""
        },
        {
          "name": "FRAME_UNIFORMS_SIZE",
          "kind": "constant",
          "signature": "FRAME_UNIFORMS_SIZE",
          "summary": ""
        },
        {
          "name": "FRAME_UNIFORMS_FLOATS",
          "kind": "constant",
          "signature": "FRAME_UNIFORMS_FLOATS",
          "summary": ""
        },
        {
          "name": "FACE_PULL_MESHLET_SHADER",
          "kind": "constant",
          "signature": "FACE_PULL_MESHLET_SHADER",
          "summary": ""
        },
        {
          "name": "FACE_PULL_SHADER",
          "kind": "constant",
          "signature": "FACE_PULL_SHADER",
          "summary": ""
        },
        {
          "name": "FACE_PULL_SHADOW_SHADER",
          "kind": "constant",
          "signature": "FACE_PULL_SHADOW_SHADER",
          "summary": ""
        },
        {
          "name": "SHADOW_SHADER",
          "kind": "constant",
          "signature": "SHADOW_SHADER",
          "summary": ""
        },
        {
          "name": "VOXEL_SHADER",
          "kind": "constant",
          "signature": "VOXEL_SHADER",
          "summary": ""
        },
        {
          "name": "VOXEL_SHADER_COMPACT_BASE",
          "kind": "constant",
          "signature": "VOXEL_SHADER_COMPACT_BASE",
          "summary": ""
        },
        {
          "name": "VOXEL_SHADER_COMPACT_OPAQUE",
          "kind": "constant",
          "signature": "VOXEL_SHADER_COMPACT_OPAQUE",
          "summary": ""
        },
        {
          "name": "VOXEL_SHADER_COMPACT_WATER",
          "kind": "constant",
          "signature": "VOXEL_SHADER_COMPACT_WATER",
          "summary": ""
        },
        {
          "name": "SHADOW_SHADER_COMPACT",
          "kind": "constant",
          "signature": "SHADOW_SHADER_COMPACT",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "voxel/index",
      "path": "engine/reference/voxel/index.md",
      "source": "engine/voxel/index.js",
      "import": "/engine/voxel/index.js",
      "sourceHash": "e4b05678c6e966ab3c291d8d983e1d723499133f117c181d2fc4e35e08ecb2c7",
      "summary": "engine/voxel/index.js - Voxel System Barrel Export Core voxel functionality. Other systems have been moved to: - engine/render/passes/ - Post-processing passes - engine/render/atmosphere/ - Sky and atmospheric rendering - engine/world/ - World generation, streaming, storage, time - engine/sim/physics/ - Physics systems - engine/sim/fluids/ - Fluid simulation - engine/core/gpu/ - GPU utilities - engine/core/math/ - Math utilities - engine/core/memory/ - Memory management - engine/core/profiler/ - Profiling - engine/game/ - Gameplay systems",
      "exports": [
        {
          "name": "AERIAL_PERSPECTIVE_WGSL",
          "kind": "re-export",
          "signature": "AERIAL_PERSPECTIVE_WGSL",
          "summary": ""
        },
        {
          "name": "AMBIGUOUS_FACES",
          "kind": "re-export",
          "signature": "AMBIGUOUS_FACES",
          "summary": ""
        },
        {
          "name": "ATMOSPHERIC_SCATTERING_WGSL",
          "kind": "re-export",
          "signature": "ATMOSPHERIC_SCATTERING_WGSL",
          "summary": ""
        },
        {
          "name": "AdaptiveChunkBudget",
          "kind": "re-export",
          "signature": "AdaptiveChunkBudget",
          "summary": ""
        },
        {
          "name": "AerialPerspectiveSystem",
          "kind": "re-export",
          "signature": "AerialPerspectiveSystem",
          "summary": ""
        },
        {
          "name": "AreaResamplePass",
          "kind": "re-export",
          "signature": "AreaResamplePass",
          "summary": ""
        },
        {
          "name": "AtmosphericScatteringSystem",
          "kind": "re-export",
          "signature": "AtmosphericScatteringSystem",
          "summary": ""
        },
        {
          "name": "AutoExposurePass",
          "kind": "re-export",
          "signature": "AutoExposurePass",
          "summary": ""
        },
        {
          "name": "BIOME",
          "kind": "re-export",
          "signature": "BIOME",
          "summary": ""
        },
        {
          "name": "BVHBuilder",
          "kind": "re-export",
          "signature": "BVHBuilder",
          "summary": ""
        },
        {
          "name": "BVHNode",
          "kind": "re-export",
          "signature": "BVHNode",
          "summary": ""
        },
        {
          "name": "BVH_TRAVERSAL_WGSL",
          "kind": "re-export",
          "signature": "BVH_TRAVERSAL_WGSL",
          "summary": ""
        },
        {
          "name": "BezierDistanceCompute",
          "kind": "re-export",
          "signature": "BezierDistanceCompute",
          "summary": ""
        },
        {
          "name": "BinaryReader",
          "kind": "re-export",
          "signature": "BinaryReader",
          "summary": ""
        },
        {
          "name": "BinaryWriter",
          "kind": "re-export",
          "signature": "BinaryWriter",
          "summary": ""
        },
        {
          "name": "BloomFilter",
          "kind": "re-export",
          "signature": "BloomFilter",
          "summary": ""
        },
        {
          "name": "BloomPass",
          "kind": "re-export",
          "signature": "BloomPass",
          "summary": ""
        },
        {
          "name": "CANONICAL_ROTATION",
          "kind": "re-export",
          "signature": "CANONICAL_ROTATION",
          "summary": ""
        },
        {
          "name": "CHUNK_SIZE",
          "kind": "re-export",
          "signature": "CHUNK_SIZE",
          "summary": ""
        },
        {
          "name": "CHUNK_SIZE_SQ",
          "kind": "re-export",
          "signature": "CHUNK_SIZE_SQ",
          "summary": ""
        },
        {
          "name": "CHUNK_VOLUME",
          "kind": "re-export",
          "signature": "CHUNK_VOLUME",
          "summary": ""
        },
        {
          "name": "CUBE_FACES",
          "kind": "re-export",
          "signature": "CUBE_FACES",
          "summary": ""
        },
        {
          "name": "CascadeMetrics",
          "kind": "re-export",
          "signature": "CascadeMetrics",
          "summary": ""
        },
        {
          "name": "CascadedShadowMap",
          "kind": "re-export",
          "signature": "CascadedShadowMap",
          "summary": ""
        },
        {
          "name": "CascadedShadowMapper",
          "kind": "re-export",
          "signature": "CascadedShadowMapper",
          "summary": ""
        },
        {
          "name": "CelestialBodiesWGSL",
          "kind": "re-export",
          "signature": "CelestialBodiesWGSL",
          "summary": ""
        },
        {
          "name": "ChromaticAberrationPass",
          "kind": "re-export",
          "signature": "ChromaticAberrationPass",
          "summary": ""
        },
        {
          "name": "ChunkBufferPool",
          "kind": "re-export",
          "signature": "ChunkBufferPool",
          "summary": ""
        },
        {
          "name": "ChunkCompressor",
          "kind": "re-export",
          "signature": "ChunkCompressor",
          "summary": ""
        },
        {
          "name": "ChunkCullCompute",
          "kind": "re-export",
          "signature": "ChunkCullCompute",
          "summary": ""
        },
        {
          "name": "ChunkHistory",
          "kind": "re-export",
          "signature": "ChunkHistory",
          "summary": ""
        },
        {
          "name": "ChunkJobCoordinator",
          "kind": "re-export",
          "signature": "ChunkJobCoordinator",
          "summary": ""
        },
        {
          "name": "ChunkLoadingZone",
          "kind": "re-export",
          "signature": "ChunkLoadingZone",
          "summary": ""
        },
        {
          "name": "ChunkNeighborCache",
          "kind": "re-export",
          "signature": "ChunkNeighborCache",
          "summary": ""
        },
        {
          "name": "ChunkNetworking",
          "kind": "re-export",
          "signature": "ChunkNetworking",
          "summary": ""
        },
        {
          "name": "ChunkPersistence",
          "kind": "re-export",
          "signature": "ChunkPersistence",
          "summary": ""
        },
        {
          "name": "ChunkRegistry",
          "kind": "re-export",
          "signature": "ChunkRegistry",
          "summary": ""
        },
        {
          "name": "ChunkSeamSystem",
          "kind": "re-export",
          "signature": "ChunkSeamSystem",
          "summary": ""
        },
        {
          "name": "ChunkSorter",
          "kind": "re-export",
          "signature": "ChunkSorter",
          "summary": ""
        },
        {
          "name": "ChunkState",
          "kind": "re-export",
          "signature": "ChunkState",
          "summary": ""
        },
        {
          "name": "ChunkStatus",
          "kind": "re-export",
          "signature": "ChunkStatus",
          "summary": ""
        },
        {
          "name": "ChunkStreamer",
          "kind": "re-export",
          "signature": "ChunkStreamer",
          "summary": ""
        },
        {
          "name": "ChunkStreaming",
          "kind": "re-export",
          "signature": "ChunkStreaming",
          "summary": ""
        },
        {
          "name": "ChunkStreamingCompute",
          "kind": "re-export",
          "signature": "ChunkStreamingCompute",
          "summary": ""
        },
        {
          "name": "ChunkUpdater",
          "kind": "re-export",
          "signature": "ChunkUpdater",
          "summary": ""
        },
        {
          "name": "ChunkWorkerPool",
          "kind": "re-export",
          "signature": "ChunkWorkerPool",
          "summary": ""
        },
        {
          "name": "ColorGradingPass",
          "kind": "re-export",
          "signature": "ColorGradingPass",
          "summary": ""
        },
        {
          "name": "ColoredLightingSystem",
          "kind": "re-export",
          "signature": "ColoredLightingSystem",
          "summary": ""
        },
        {
          "name": "CompressedChunk",
          "kind": "re-export",
          "signature": "CompressedChunk",
          "summary": ""
        },
        {
          "name": "Constellations",
          "kind": "re-export",
          "signature": "Constellations",
          "summary": ""
        },
        {
          "name": "ContactShadowsPass",
          "kind": "re-export",
          "signature": "ContactShadowsPass",
          "summary": ""
        },
        {
          "name": "DEFAULT_BLEND_RADIUS",
          "kind": "re-export",
          "signature": "DEFAULT_BLEND_RADIUS",
          "summary": ""
        },
        {
          "name": "DEFAULT_BUDGETS",
          "kind": "re-export",
          "signature": "DEFAULT_BUDGETS",
          "summary": ""
        },
        {
          "name": "DEFAULT_RESOLUTION",
          "kind": "re-export",
          "signature": "DEFAULT_RESOLUTION",
          "summary": ""
        },
        {
          "name": "DEPTH_TIERS",
          "kind": "re-export",
          "signature": "DEPTH_TIERS",
          "summary": ""
        },
        {
          "name": "DepthOfFieldPass",
          "kind": "re-export",
          "signature": "DepthOfFieldPass",
          "summary": ""
        },
        {
          "name": "DirtyChunkEntry",
          "kind": "re-export",
          "signature": "DirtyChunkEntry",
          "summary": ""
        },
        {
          "name": "DirtyChunkManager",
          "kind": "re-export",
          "signature": "DirtyChunkManager",
          "summary": ""
        },
        {
          "name": "DiskMeshCache",
          "kind": "re-export",
          "signature": "DiskMeshCache",
          "summary": ""
        },
        {
          "name": "DistanceFogSystem",
          "kind": "re-export",
          "signature": "DistanceFogSystem",
          "summary": ""
        },
        {
          "name": "DualModeRenderer",
          "kind": "re-export",
          "signature": "DualModeRenderer",
          "summary": ""
        },
        {
          "name": "DualRNG",
          "kind": "re-export",
          "signature": "DualRNG",
          "summary": ""
        },
        {
          "name": "EPSILON",
          "kind": "re-export",
          "signature": "EPSILON",
          "summary": ""
        },
        {
          "name": "FACE_NAMES",
          "kind": "re-export",
          "signature": "FACE_NAMES",
          "summary": ""
        },
        {
          "name": "FACE_NORMALS",
          "kind": "re-export",
          "signature": "FACE_NORMALS",
          "summary": ""
        },
        {
          "name": "FACE_PULL_SHADER_BASE",
          "kind": "re-export",
          "signature": "FACE_PULL_SHADER_BASE",
          "summary": ""
        },
        {
          "name": "FDTDSolver",
          "kind": "re-export",
          "signature": "FDTDSolver",
          "summary": ""
        },
        {
          "name": "FOG_TYPE",
          "kind": "re-export",
          "signature": "FOG_TYPE",
          "summary": ""
        },
        {
          "name": "FOG_WGSL",
          "kind": "re-export",
          "signature": "FOG_WGSL",
          "summary": ""
        },
        {
          "name": "FXAAPass",
          "kind": "re-export",
          "signature": "FXAAPass",
          "summary": ""
        },
        {
          "name": "FaceListMesher",
          "kind": "re-export",
          "signature": "FaceListMesher",
          "summary": ""
        },
        {
          "name": "FilmGrainPass",
          "kind": "re-export",
          "signature": "FilmGrainPass",
          "summary": ""
        },
        {
          "name": "FluidSimulator",
          "kind": "re-export",
          "signature": "FluidSimulator",
          "summary": ""
        },
        {
          "name": "FrameBudgetManager",
          "kind": "re-export",
          "signature": "FrameBudgetManager",
          "summary": ""
        },
        {
          "name": "GOD_RAYS_WGSL",
          "kind": "re-export",
          "signature": "GOD_RAYS_WGSL",
          "summary": ""
        },
        {
          "name": "GPUBufferPool",
          "kind": "re-export",
          "signature": "GPUBufferPool",
          "summary": ""
        },
        {
          "name": "GPULineVoxelizer",
          "kind": "re-export",
          "signature": "GPULineVoxelizer",
          "summary": ""
        },
        {
          "name": "GPUWorldGenerator",
          "kind": "re-export",
          "signature": "GPUWorldGenerator",
          "summary": ""
        },
        {
          "name": "GenerationPhase",
          "kind": "re-export",
          "signature": "GenerationPhase",
          "summary": ""
        },
        {
          "name": "GeometryDirtyTracker",
          "kind": "re-export",
          "signature": "GeometryDirtyTracker",
          "summary": ""
        },
        {
          "name": "GodRays",
          "kind": "re-export",
          "signature": "GodRays",
          "summary": ""
        },
        {
          "name": "HDRPipeline",
          "kind": "re-export",
          "signature": "HDRPipeline",
          "summary": ""
        },
        {
          "name": "HDR_PIPELINE_WGSL",
          "kind": "re-export",
          "signature": "HDR_PIPELINE_WGSL",
          "summary": ""
        },
        {
          "name": "HiZPass",
          "kind": "re-export",
          "signature": "HiZPass",
          "summary": ""
        },
        {
          "name": "HistoryManager",
          "kind": "re-export",
          "signature": "HistoryManager",
          "summary": ""
        },
        {
          "name": "HybridChunkCompressor",
          "kind": "re-export",
          "signature": "HybridChunkCompressor",
          "summary": ""
        },
        {
          "name": "HybridConnectivity",
          "kind": "re-export",
          "signature": "HybridConnectivity",
          "summary": ""
        },
        {
          "name": "HydraulicErosion",
          "kind": "re-export",
          "signature": "HydraulicErosion",
          "summary": ""
        },
        {
          "name": "INF_T",
          "kind": "re-export",
          "signature": "INF_T",
          "summary": ""
        },
        {
          "name": "JOB_SOURCE",
          "kind": "re-export",
          "signature": "JOB_SOURCE",
          "summary": ""
        },
        {
          "name": "JOB_STATE",
          "kind": "re-export",
          "signature": "JOB_STATE",
          "summary": ""
        },
        {
          "name": "LOAD_PATTERN",
          "kind": "re-export",
          "signature": "LOAD_PATTERN",
          "summary": ""
        },
        {
          "name": "LayerMap",
          "kind": "re-export",
          "signature": "LayerMap",
          "summary": ""
        },
        {
          "name": "LensFlarePass",
          "kind": "re-export",
          "signature": "LensFlarePass",
          "summary": ""
        },
        {
          "name": "LightingDirtyTracker",
          "kind": "re-export",
          "signature": "LightingDirtyTracker",
          "summary": ""
        },
        {
          "name": "LineMaterials",
          "kind": "re-export",
          "signature": "LineMaterials",
          "summary": ""
        },
        {
          "name": "LineNetwork",
          "kind": "re-export",
          "signature": "LineNetwork",
          "summary": ""
        },
        {
          "name": "LineToVoxelizer",
          "kind": "re-export",
          "signature": "LineToVoxelizer",
          "summary": ""
        },
        {
          "name": "LoadRequestRingBuffer",
          "kind": "re-export",
          "signature": "LoadRequestRingBuffer",
          "summary": ""
        },
        {
          "name": "MATERIAL",
          "kind": "re-export",
          "signature": "MATERIAL",
          "summary": ""
        },
        {
          "name": "MATERIAL_BLEND_SHADER",
          "kind": "re-export",
          "signature": "MATERIAL_BLEND_SHADER",
          "summary": ""
        },
        {
          "name": "MATERIAL_COLORS",
          "kind": "re-export",
          "signature": "MATERIAL_COLORS",
          "summary": ""
        },
        {
          "name": "MATERIAL_COLORS_NORMALIZED",
          "kind": "re-export",
          "signature": "MATERIAL_COLORS_NORMALIZED",
          "summary": ""
        },
        {
          "name": "MATERIAL_COUNT",
          "kind": "re-export",
          "signature": "MATERIAL_COUNT",
          "summary": ""
        },
        {
          "name": "MATERIAL_DEFINITIONS",
          "kind": "re-export",
          "signature": "MATERIAL_DEFINITIONS",
          "summary": ""
        },
        {
          "name": "MATERIAL_IDS",
          "kind": "re-export",
          "signature": "MATERIAL_IDS",
          "summary": ""
        },
        {
          "name": "MATERIAL_NAMES",
          "kind": "re-export",
          "signature": "MATERIAL_NAMES",
          "summary": ""
        },
        {
          "name": "MATERIAL_PROPERTIES",
          "kind": "re-export",
          "signature": "MATERIAL_PROPERTIES",
          "summary": ""
        },
        {
          "name": "MAX_DIRTY_PER_FRAME",
          "kind": "re-export",
          "signature": "MAX_DIRTY_PER_FRAME",
          "summary": ""
        },
        {
          "name": "MAX_RAY_DISTANCE",
          "kind": "re-export",
          "signature": "MAX_RAY_DISTANCE",
          "summary": ""
        },
        {
          "name": "MC33_CASE",
          "kind": "re-export",
          "signature": "MC33_CASE",
          "summary": ""
        },
        {
          "name": "MC33_SUBCASE_COUNT",
          "kind": "re-export",
          "signature": "MC33_SUBCASE_COUNT",
          "summary": ""
        },
        {
          "name": "MC33_TRI_TABLE",
          "kind": "re-export",
          "signature": "MC33_TRI_TABLE",
          "summary": ""
        },
        {
          "name": "MESH_MODE",
          "kind": "re-export",
          "signature": "MESH_MODE",
          "summary": ""
        },
        {
          "name": "MappedBufferRing",
          "kind": "re-export",
          "signature": "MappedBufferRing",
          "summary": ""
        },
        {
          "name": "MarchingCubesMesher",
          "kind": "re-export",
          "signature": "MarchingCubesMesher",
          "summary": ""
        },
        {
          "name": "MinimapRenderer",
          "kind": "re-export",
          "signature": "MinimapRenderer",
          "summary": ""
        },
        {
          "name": "Moon",
          "kind": "re-export",
          "signature": "Moon",
          "summary": ""
        },
        {
          "name": "MoonDefaults",
          "kind": "re-export",
          "signature": "MoonDefaults",
          "summary": ""
        },
        {
          "name": "MoonPresets",
          "kind": "re-export",
          "signature": "MoonPresets",
          "summary": ""
        },
        {
          "name": "MoonSystem",
          "kind": "re-export",
          "signature": "MoonSystem",
          "summary": ""
        },
        {
          "name": "MoonType",
          "kind": "re-export",
          "signature": "MoonType",
          "summary": ""
        },
        {
          "name": "MoonWGSL",
          "kind": "re-export",
          "signature": "MoonWGSL",
          "summary": ""
        },
        {
          "name": "MotionBlurPass",
          "kind": "re-export",
          "signature": "MotionBlurPass",
          "summary": ""
        },
        {
          "name": "MovementPredictor",
          "kind": "re-export",
          "signature": "MovementPredictor",
          "summary": ""
        },
        {
          "name": "NEIGHBOR_DIR",
          "kind": "re-export",
          "signature": "NEIGHBOR_DIR",
          "summary": ""
        },
        {
          "name": "NeighborCacheManager",
          "kind": "re-export",
          "signature": "NeighborCacheManager",
          "summary": ""
        },
        {
          "name": "NetworkEdge",
          "kind": "re-export",
          "signature": "NetworkEdge",
          "summary": ""
        },
        {
          "name": "NetworkNode",
          "kind": "re-export",
          "signature": "NetworkNode",
          "summary": ""
        },
        {
          "name": "ObjectPool",
          "kind": "re-export",
          "signature": "ObjectPool",
          "summary": ""
        },
        {
          "name": "OutlinePass",
          "kind": "re-export",
          "signature": "OutlinePass",
          "summary": ""
        },
        {
          "name": "PLANET_CURVATURE_WGSL",
          "kind": "re-export",
          "signature": "PLANET_CURVATURE_WGSL",
          "summary": ""
        },
        {
          "name": "PRIORITY_BUCKET",
          "kind": "re-export",
          "signature": "PRIORITY_BUCKET",
          "summary": ""
        },
        {
          "name": "PROCEDURAL_SKY_WGSL",
          "kind": "re-export",
          "signature": "PROCEDURAL_SKY_WGSL",
          "summary": ""
        },
        {
          "name": "PaniniProjectionPass",
          "kind": "re-export",
          "signature": "PaniniProjectionPass",
          "summary": ""
        },
        {
          "name": "PerformanceOptimizer",
          "kind": "re-export",
          "signature": "PerformanceOptimizer",
          "summary": ""
        },
        {
          "name": "PhasorRays",
          "kind": "re-export",
          "signature": "PhasorRays",
          "summary": ""
        },
        {
          "name": "PhotonicCrystal",
          "kind": "re-export",
          "signature": "PhotonicCrystal",
          "summary": ""
        },
        {
          "name": "PipelineCache",
          "kind": "re-export",
          "signature": "PipelineCache",
          "summary": ""
        },
        {
          "name": "PlanetCurvatureSystem",
          "kind": "re-export",
          "signature": "PlanetCurvatureSystem",
          "summary": ""
        },
        {
          "name": "PlanetPreviewRenderer",
          "kind": "re-export",
          "signature": "PlanetPreviewRenderer",
          "summary": ""
        },
        {
          "name": "PriorityBucketQueue",
          "kind": "re-export",
          "signature": "PriorityBucketQueue",
          "summary": ""
        },
        {
          "name": "PriorityChunkLoader",
          "kind": "re-export",
          "signature": "PriorityChunkLoader",
          "summary": ""
        },
        {
          "name": "ProceduralSky",
          "kind": "re-export",
          "signature": "ProceduralSky",
          "summary": ""
        },
        {
          "name": "ProceduralTreeGenerator",
          "kind": "re-export",
          "signature": "ProceduralTreeGenerator",
          "summary": ""
        },
        {
          "name": "ProgressiveChunkLoader",
          "kind": "re-export",
          "signature": "ProgressiveChunkLoader",
          "summary": ""
        },
        {
          "name": "PurkinjeEffectPass",
          "kind": "re-export",
          "signature": "PurkinjeEffectPass",
          "summary": ""
        },
        {
          "name": "RAYCAST_DEBUG_MODE",
          "kind": "re-export",
          "signature": "RAYCAST_DEBUG_MODE",
          "summary": ""
        },
        {
          "name": "RLEChunkCompressor",
          "kind": "re-export",
          "signature": "RLEChunkCompressor",
          "summary": ""
        },
        {
          "name": "RegionFile",
          "kind": "re-export",
          "signature": "RegionFile",
          "summary": ""
        },
        {
          "name": "RegionManager",
          "kind": "re-export",
          "signature": "RegionManager",
          "summary": ""
        },
        {
          "name": "RenderBundleCache",
          "kind": "re-export",
          "signature": "RenderBundleCache",
          "summary": ""
        },
        {
          "name": "SCHEMA_VERSION",
          "kind": "re-export",
          "signature": "SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "SDF_RAYMARCH_SHADER",
          "kind": "re-export",
          "signature": "SDF_RAYMARCH_SHADER",
          "summary": ""
        },
        {
          "name": "SSAOPass",
          "kind": "re-export",
          "signature": "SSAOPass",
          "summary": ""
        },
        {
          "name": "SSGIPass",
          "kind": "re-export",
          "signature": "SSGIPass",
          "summary": ""
        },
        {
          "name": "SSRPass",
          "kind": "re-export",
          "signature": "SSRPass",
          "summary": ""
        },
        {
          "name": "SUBCASE_LOOKUP",
          "kind": "re-export",
          "signature": "SUBCASE_LOOKUP",
          "summary": ""
        },
        {
          "name": "SUN_PHASE",
          "kind": "re-export",
          "signature": "SUN_PHASE",
          "summary": ""
        },
        {
          "name": "SharpeningPass",
          "kind": "re-export",
          "signature": "SharpeningPass",
          "summary": ""
        },
        {
          "name": "SpaceWGSL",
          "kind": "re-export",
          "signature": "SpaceWGSL",
          "summary": ""
        },
        {
          "name": "SpatialHash",
          "kind": "re-export",
          "signature": "SpatialHash",
          "summary": ""
        },
        {
          "name": "SpatialHashCompute",
          "kind": "re-export",
          "signature": "SpatialHashCompute",
          "summary": ""
        },
        {
          "name": "StarDefaults",
          "kind": "re-export",
          "signature": "StarDefaults",
          "summary": ""
        },
        {
          "name": "StarField",
          "kind": "re-export",
          "signature": "StarField",
          "summary": ""
        },
        {
          "name": "StarLayer",
          "kind": "re-export",
          "signature": "StarLayer",
          "summary": ""
        },
        {
          "name": "StarLayerPresets",
          "kind": "re-export",
          "signature": "StarLayerPresets",
          "summary": ""
        },
        {
          "name": "StarSystem",
          "kind": "re-export",
          "signature": "StarSystem",
          "summary": ""
        },
        {
          "name": "StarsWGSL",
          "kind": "re-export",
          "signature": "StarsWGSL",
          "summary": ""
        },
        {
          "name": "StructureType",
          "kind": "re-export",
          "signature": "StructureType",
          "summary": ""
        },
        {
          "name": "SubChunkBufferPool",
          "kind": "re-export",
          "signature": "SubChunkBufferPool",
          "summary": ""
        },
        {
          "name": "SubChunkMeshCompute",
          "kind": "re-export",
          "signature": "SubChunkMeshCompute",
          "summary": ""
        },
        {
          "name": "Sun",
          "kind": "re-export",
          "signature": "Sun",
          "summary": ""
        },
        {
          "name": "SunDefaults",
          "kind": "re-export",
          "signature": "SunDefaults",
          "summary": ""
        },
        {
          "name": "SunWGSL",
          "kind": "re-export",
          "signature": "SunWGSL",
          "summary": ""
        },
        {
          "name": "TAAPass",
          "kind": "re-export",
          "signature": "TAAPass",
          "summary": ""
        },
        {
          "name": "TONEMAP_OPERATOR",
          "kind": "re-export",
          "signature": "TONEMAP_OPERATOR",
          "summary": ""
        },
        {
          "name": "TRIPLANAR_SHADER",
          "kind": "re-export",
          "signature": "TRIPLANAR_SHADER",
          "summary": ""
        },
        {
          "name": "TectonicSimulation",
          "kind": "re-export",
          "signature": "TectonicSimulation",
          "summary": ""
        },
        {
          "name": "TextureArrayManager",
          "kind": "re-export",
          "signature": "TextureArrayManager",
          "summary": ""
        },
        {
          "name": "ThermalErosion",
          "kind": "re-export",
          "signature": "ThermalErosion",
          "summary": ""
        },
        {
          "name": "UnderwaterPass",
          "kind": "re-export",
          "signature": "UnderwaterPass",
          "summary": ""
        },
        {
          "name": "UnifiedTerrainPipeline",
          "kind": "re-export",
          "signature": "UnifiedTerrainPipeline",
          "summary": ""
        },
        {
          "name": "UniformBufferRing",
          "kind": "re-export",
          "signature": "UniformBufferRing",
          "summary": ""
        },
        {
          "name": "UnionFind",
          "kind": "re-export",
          "signature": "UnionFind",
          "summary": ""
        },
        {
          "name": "VERTEX_STRIDE",
          "kind": "re-export",
          "signature": "VERTEX_STRIDE",
          "summary": ""
        },
        {
          "name": "VOLUMETRIC_PARAMS",
          "kind": "re-export",
          "signature": "VOLUMETRIC_PARAMS",
          "summary": ""
        },
        {
          "name": "VOXEL_AO_WGSL",
          "kind": "re-export",
          "signature": "VOXEL_AO_WGSL",
          "summary": ""
        },
        {
          "name": "VOXEL_RAYCAST_SHADER",
          "kind": "re-export",
          "signature": "VOXEL_RAYCAST_SHADER",
          "summary": ""
        },
        {
          "name": "VertexPool",
          "kind": "re-export",
          "signature": "VertexPool",
          "summary": ""
        },
        {
          "name": "VignettePass",
          "kind": "re-export",
          "signature": "VignettePass",
          "summary": ""
        },
        {
          "name": "VolumetricCloudsPass",
          "kind": "re-export",
          "signature": "VolumetricCloudsPass",
          "summary": ""
        },
        {
          "name": "VolumetricRaymarcher",
          "kind": "re-export",
          "signature": "VolumetricRaymarcher",
          "summary": ""
        },
        {
          "name": "VolumetricRenderMode",
          "kind": "re-export",
          "signature": "VolumetricRenderMode",
          "summary": ""
        },
        {
          "name": "VoronoiTextureBlend",
          "kind": "re-export",
          "signature": "VoronoiTextureBlend",
          "summary": ""
        },
        {
          "name": "VoxelAOCalculator",
          "kind": "re-export",
          "signature": "VoxelAOCalculator",
          "summary": ""
        },
        {
          "name": "VoxelMeshCompute",
          "kind": "re-export",
          "signature": "VoxelMeshCompute",
          "summary": ""
        },
        {
          "name": "VoxelMesher",
          "kind": "re-export",
          "signature": "VoxelMesher",
          "summary": ""
        },
        {
          "name": "VoxelModifyCompute",
          "kind": "re-export",
          "signature": "VoxelModifyCompute",
          "summary": ""
        },
        {
          "name": "VoxelRaycastGPU",
          "kind": "re-export",
          "signature": "VoxelRaycastGPU",
          "summary": ""
        },
        {
          "name": "VoxelRenderer",
          "kind": "re-export",
          "signature": "VoxelRenderer",
          "summary": ""
        },
        {
          "name": "VoxelSdfBrickBridge",
          "kind": "re-export",
          "signature": "VoxelSdfBrickBridge",
          "summary": ""
        },
        {
          "name": "VoxelUnionFind",
          "kind": "re-export",
          "signature": "VoxelUnionFind",
          "summary": ""
        },
        {
          "name": "WindErosion",
          "kind": "re-export",
          "signature": "WindErosion",
          "summary": ""
        },
        {
          "name": "WindSimulation",
          "kind": "re-export",
          "signature": "WindSimulation",
          "summary": ""
        },
        {
          "name": "WindSystem",
          "kind": "re-export",
          "signature": "WindSystem",
          "summary": ""
        },
        {
          "name": "World3DPreviewRenderer",
          "kind": "re-export",
          "signature": "World3DPreviewRenderer",
          "summary": ""
        },
        {
          "name": "WorldGenerator",
          "kind": "re-export",
          "signature": "WorldGenerator",
          "summary": ""
        },
        {
          "name": "WorldMapGenerator",
          "kind": "re-export",
          "signature": "WorldMapGenerator",
          "summary": ""
        },
        {
          "name": "WorldParticleRenderer",
          "kind": "re-export",
          "signature": "WorldParticleRenderer",
          "summary": ""
        },
        {
          "name": "WorldStorage",
          "kind": "re-export",
          "signature": "WorldStorage",
          "summary": ""
        },
        {
          "name": "ZONE_STATE",
          "kind": "re-export",
          "signature": "ZONE_STATE",
          "summary": ""
        },
        {
          "name": "appendTrailer",
          "kind": "re-export",
          "signature": "appendTrailer",
          "summary": ""
        },
        {
          "name": "applyDelta",
          "kind": "re-export",
          "signature": "applyDelta",
          "summary": ""
        },
        {
          "name": "asymptoticDecider",
          "kind": "re-export",
          "signature": "asymptoticDecider",
          "summary": ""
        },
        {
          "name": "bezierClosestNewton",
          "kind": "re-export",
          "signature": "bezierClosestNewton",
          "summary": ""
        },
        {
          "name": "bezierDistanceBatch",
          "kind": "re-export",
          "signature": "bezierDistanceBatch",
          "summary": ""
        },
        {
          "name": "bezierDistanceCapsule",
          "kind": "re-export",
          "signature": "bezierDistanceCapsule",
          "summary": ""
        },
        {
          "name": "bezierDistanceHybrid",
          "kind": "re-export",
          "signature": "bezierDistanceHybrid",
          "summary": ""
        },
        {
          "name": "buildVoxelSdfBrickPair",
          "kind": "re-export",
          "signature": "buildVoxelSdfBrickPair",
          "summary": ""
        },
        {
          "name": "calculateFaceAO",
          "kind": "re-export",
          "signature": "calculateFaceAO",
          "summary": ""
        },
        {
          "name": "calculateGradientAO",
          "kind": "re-export",
          "signature": "calculateGradientAO",
          "summary": ""
        },
        {
          "name": "calculateVertexAO",
          "kind": "re-export",
          "signature": "calculateVertexAO",
          "summary": ""
        },
        {
          "name": "calculateWorldSpaceAO",
          "kind": "re-export",
          "signature": "calculateWorldSpaceAO",
          "summary": ""
        },
        {
          "name": "capsuleClosestT",
          "kind": "re-export",
          "signature": "capsuleClosestT",
          "summary": ""
        },
        {
          "name": "chunkKey",
          "kind": "re-export",
          "signature": "chunkKey",
          "summary": ""
        },
        {
          "name": "compressChunk",
          "kind": "re-export",
          "signature": "compressChunk",
          "summary": ""
        },
        {
          "name": "computePixelToRayMatrix",
          "kind": "re-export",
          "signature": "computePixelToRayMatrix",
          "summary": ""
        },
        {
          "name": "crc32",
          "kind": "re-export",
          "signature": "crc32",
          "summary": ""
        },
        {
          "name": "createChunkBuffers",
          "kind": "re-export",
          "signature": "createChunkBuffers",
          "summary": ""
        },
        {
          "name": "createRaycastMesh",
          "kind": "re-export",
          "signature": "createRaycastMesh",
          "summary": ""
        },
        {
          "name": "createVoxelGetter",
          "kind": "re-export",
          "signature": "createVoxelGetter",
          "summary": ""
        },
        {
          "name": "createVoxelSdfBrickBridge",
          "kind": "re-export",
          "signature": "createVoxelSdfBrickBridge",
          "summary": ""
        },
        {
          "name": "curvesToGPUBuffer",
          "kind": "re-export",
          "signature": "curvesToGPUBuffer",
          "summary": ""
        },
        {
          "name": "curvesToSegments",
          "kind": "re-export",
          "signature": "curvesToSegments",
          "summary": ""
        },
        {
          "name": "decodeColumn",
          "kind": "re-export",
          "signature": "decodeColumn",
          "summary": ""
        },
        {
          "name": "decodeMorton3D",
          "kind": "re-export",
          "signature": "decodeMorton3D",
          "summary": ""
        },
        {
          "name": "decompressChunk",
          "kind": "re-export",
          "signature": "decompressChunk",
          "summary": ""
        },
        {
          "name": "deserializeChunk",
          "kind": "re-export",
          "signature": "deserializeChunk",
          "summary": ""
        },
        {
          "name": "dualContourCell",
          "kind": "re-export",
          "signature": "dualContourCell",
          "summary": ""
        },
        {
          "name": "dualContourVertex",
          "kind": "re-export",
          "signature": "dualContourVertex",
          "summary": ""
        },
        {
          "name": "encodeColumn",
          "kind": "re-export",
          "signature": "encodeColumn",
          "summary": ""
        },
        {
          "name": "encodeMorton3D",
          "kind": "re-export",
          "signature": "encodeMorton3D",
          "summary": ""
        },
        {
          "name": "estimateChunkSize",
          "kind": "re-export",
          "signature": "estimateChunkSize",
          "summary": ""
        },
        {
          "name": "fbm3D",
          "kind": "re-export",
          "signature": "fbm3D",
          "summary": ""
        },
        {
          "name": "generateRoots",
          "kind": "re-export",
          "signature": "generateRoots",
          "summary": ""
        },
        {
          "name": "generateTransitionCell",
          "kind": "re-export",
          "signature": "generateTransitionCell",
          "summary": ""
        },
        {
          "name": "generateTree",
          "kind": "re-export",
          "signature": "generateTree",
          "summary": ""
        },
        {
          "name": "generateTunnel",
          "kind": "re-export",
          "signature": "generateTunnel",
          "summary": ""
        },
        {
          "name": "generateWGSLTables",
          "kind": "re-export",
          "signature": "generateWGSLTables",
          "summary": ""
        },
        {
          "name": "getAmbiguousFaces",
          "kind": "re-export",
          "signature": "getAmbiguousFaces",
          "summary": ""
        },
        {
          "name": "getCameraForward",
          "kind": "re-export",
          "signature": "getCameraForward",
          "summary": ""
        },
        {
          "name": "getCameraPosition",
          "kind": "re-export",
          "signature": "getCameraPosition",
          "summary": ""
        },
        {
          "name": "getChannel",
          "kind": "re-export",
          "signature": "getChannel",
          "summary": ""
        },
        {
          "name": "getChunkOcclusionMask",
          "kind": "re-export",
          "signature": "getChunkOcclusionMask",
          "summary": ""
        },
        {
          "name": "getChunkRegistry",
          "kind": "re-export",
          "signature": "getChunkRegistry",
          "summary": ""
        },
        {
          "name": "getDepthTier",
          "kind": "re-export",
          "signature": "getDepthTier",
          "summary": ""
        },
        {
          "name": "getDepthTierBlend",
          "kind": "re-export",
          "signature": "getDepthTierBlend",
          "summary": ""
        },
        {
          "name": "getFrameBudgetManager",
          "kind": "re-export",
          "signature": "getFrameBudgetManager",
          "summary": ""
        },
        {
          "name": "getGPUSubChunkStats",
          "kind": "re-export",
          "signature": "getGPUSubChunkStats",
          "summary": ""
        },
        {
          "name": "getGlobalRNG",
          "kind": "re-export",
          "signature": "getGlobalRNG",
          "summary": ""
        },
        {
          "name": "getMC33Subcase",
          "kind": "re-export",
          "signature": "getMC33Subcase",
          "summary": ""
        },
        {
          "name": "getMaterialColor",
          "kind": "re-export",
          "signature": "getMaterialColor",
          "summary": ""
        },
        {
          "name": "getMaterialId",
          "kind": "re-export",
          "signature": "getMaterialId",
          "summary": ""
        },
        {
          "name": "getMaterialName",
          "kind": "re-export",
          "signature": "getMaterialName",
          "summary": ""
        },
        {
          "name": "getMaterialProperties",
          "kind": "re-export",
          "signature": "getMaterialProperties",
          "summary": ""
        },
        {
          "name": "getMeshGranularity",
          "kind": "re-export",
          "signature": "getMeshGranularity",
          "summary": ""
        },
        {
          "name": "getTransitionRatio",
          "kind": "re-export",
          "signature": "getTransitionRatio",
          "summary": ""
        },
        {
          "name": "getViewCullingMask",
          "kind": "re-export",
          "signature": "getViewCullingMask",
          "summary": ""
        },
        {
          "name": "gpuBufferPool",
          "kind": "re-export",
          "signature": "gpuBufferPool",
          "summary": ""
        },
        {
          "name": "greedyMesh",
          "kind": "re-export",
          "signature": "greedyMesh",
          "summary": ""
        },
        {
          "name": "hasGPUSubChunkMeshing",
          "kind": "re-export",
          "signature": "hasGPUSubChunkMeshing",
          "summary": ""
        },
        {
          "name": "hasLight",
          "kind": "re-export",
          "signature": "hasLight",
          "summary": ""
        },
        {
          "name": "hasLineOfSightCombined",
          "kind": "re-export",
          "signature": "hasLineOfSightCombined",
          "summary": ""
        },
        {
          "name": "hasVoxelLineOfSight",
          "kind": "re-export",
          "signature": "hasVoxelLineOfSight",
          "summary": ""
        },
        {
          "name": "hashVoxels",
          "kind": "re-export",
          "signature": "hashVoxels",
          "summary": ""
        },
        {
          "name": "initChunkRegistry",
          "kind": "re-export",
          "signature": "initChunkRegistry",
          "summary": ""
        },
        {
          "name": "initGPUSubChunkMeshing",
          "kind": "re-export",
          "signature": "initGPUSubChunkMeshing",
          "summary": ""
        },
        {
          "name": "initGlobalRNG",
          "kind": "re-export",
          "signature": "initGlobalRNG",
          "summary": ""
        },
        {
          "name": "interiorTest",
          "kind": "re-export",
          "signature": "interiorTest",
          "summary": ""
        },
        {
          "name": "isChunkFaceSolid",
          "kind": "re-export",
          "signature": "isChunkFaceSolid",
          "summary": ""
        },
        {
          "name": "isEmissive",
          "kind": "re-export",
          "signature": "isEmissive",
          "summary": ""
        },
        {
          "name": "isFaceAmbiguous",
          "kind": "re-export",
          "signature": "isFaceAmbiguous",
          "summary": ""
        },
        {
          "name": "isFluid",
          "kind": "re-export",
          "signature": "isFluid",
          "summary": ""
        },
        {
          "name": "isSolid",
          "kind": "re-export",
          "signature": "isSolid",
          "summary": ""
        },
        {
          "name": "isTransparent",
          "kind": "re-export",
          "signature": "isTransparent",
          "summary": ""
        },
        {
          "name": "isTransparentMaterial",
          "kind": "re-export",
          "signature": "isTransparentMaterial",
          "summary": ""
        },
        {
          "name": "lightDecrement",
          "kind": "re-export",
          "signature": "lightDecrement",
          "summary": ""
        },
        {
          "name": "lightMax",
          "kind": "re-export",
          "signature": "lightMax",
          "summary": ""
        },
        {
          "name": "lightToRGB",
          "kind": "re-export",
          "signature": "lightToRGB",
          "summary": ""
        },
        {
          "name": "linearToMorton",
          "kind": "re-export",
          "signature": "linearToMorton",
          "summary": ""
        },
        {
          "name": "makeChunkKey",
          "kind": "re-export",
          "signature": "makeChunkKey",
          "summary": ""
        },
        {
          "name": "meshChunk",
          "kind": "re-export",
          "signature": "meshChunk",
          "summary": ""
        },
        {
          "name": "meshChunkGreedy",
          "kind": "re-export",
          "signature": "meshChunkGreedy",
          "summary": ""
        },
        {
          "name": "meshChunkLOD",
          "kind": "re-export",
          "signature": "meshChunkLOD",
          "summary": ""
        },
        {
          "name": "meshChunkSmooth",
          "kind": "re-export",
          "signature": "meshChunkSmooth",
          "summary": ""
        },
        {
          "name": "meshSubChunk",
          "kind": "re-export",
          "signature": "meshSubChunk",
          "summary": ""
        },
        {
          "name": "meshSubChunk4GPU",
          "kind": "re-export",
          "signature": "meshSubChunk4GPU",
          "summary": ""
        },
        {
          "name": "meshSubChunk8GPU",
          "kind": "re-export",
          "signature": "meshSubChunk8GPU",
          "summary": ""
        },
        {
          "name": "mortonToLinear",
          "kind": "re-export",
          "signature": "mortonToLinear",
          "summary": ""
        },
        {
          "name": "multiCurveDistance",
          "kind": "re-export",
          "signature": "multiCurveDistance",
          "summary": ""
        },
        {
          "name": "multiCurveDistanceSmooth",
          "kind": "re-export",
          "signature": "multiCurveDistanceSmooth",
          "summary": ""
        },
        {
          "name": "needsTransitionCell",
          "kind": "re-export",
          "signature": "needsTransitionCell",
          "summary": ""
        },
        {
          "name": "packAO",
          "kind": "re-export",
          "signature": "packAO",
          "summary": ""
        },
        {
          "name": "packLight",
          "kind": "re-export",
          "signature": "packLight",
          "summary": ""
        },
        {
          "name": "parseChunkKey",
          "kind": "re-export",
          "signature": "parseChunkKey",
          "summary": ""
        },
        {
          "name": "pickBlock",
          "kind": "re-export",
          "signature": "pickBlock",
          "summary": ""
        },
        {
          "name": "positionHash",
          "kind": "re-export",
          "signature": "positionHash",
          "summary": ""
        },
        {
          "name": "rayTriangleIntersect",
          "kind": "re-export",
          "signature": "rayTriangleIntersect",
          "summary": ""
        },
        {
          "name": "raycastVoxels",
          "kind": "re-export",
          "signature": "raycastVoxels",
          "summary": ""
        },
        {
          "name": "raycastVoxelsDebug",
          "kind": "re-export",
          "signature": "raycastVoxelsDebug",
          "summary": ""
        },
        {
          "name": "releaseGPUSubChunkMesh",
          "kind": "re-export",
          "signature": "releaseGPUSubChunkMesh",
          "summary": ""
        },
        {
          "name": "returnGPUBuffers",
          "kind": "re-export",
          "signature": "returnGPUBuffers",
          "summary": ""
        },
        {
          "name": "rotateEdges",
          "kind": "re-export",
          "signature": "rotateEdges",
          "summary": ""
        },
        {
          "name": "screenPixelToRay",
          "kind": "re-export",
          "signature": "screenPixelToRay",
          "summary": ""
        },
        {
          "name": "sdCapsule",
          "kind": "re-export",
          "signature": "sdCapsule",
          "summary": ""
        },
        {
          "name": "sdfBox",
          "kind": "re-export",
          "signature": "sdfBox",
          "summary": ""
        },
        {
          "name": "sdfIntersect",
          "kind": "re-export",
          "signature": "sdfIntersect",
          "summary": ""
        },
        {
          "name": "sdfSmoothUnion",
          "kind": "re-export",
          "signature": "sdfSmoothUnion",
          "summary": ""
        },
        {
          "name": "sdfSphere",
          "kind": "re-export",
          "signature": "sdfSphere",
          "summary": ""
        },
        {
          "name": "sdfSubtract",
          "kind": "re-export",
          "signature": "sdfSubtract",
          "summary": ""
        },
        {
          "name": "sdfTerrain",
          "kind": "re-export",
          "signature": "sdfTerrain",
          "summary": ""
        },
        {
          "name": "sdfUnion",
          "kind": "re-export",
          "signature": "sdfUnion",
          "summary": ""
        },
        {
          "name": "serializeBVHForGPU",
          "kind": "re-export",
          "signature": "serializeBVHForGPU",
          "summary": ""
        },
        {
          "name": "serializeChunk",
          "kind": "re-export",
          "signature": "serializeChunk",
          "summary": ""
        },
        {
          "name": "shouldFlipQuad",
          "kind": "re-export",
          "signature": "shouldFlipQuad",
          "summary": ""
        },
        {
          "name": "shouldSkipWork",
          "kind": "re-export",
          "signature": "shouldSkipWork",
          "summary": ""
        },
        {
          "name": "smin",
          "kind": "re-export",
          "signature": "smin",
          "summary": ""
        },
        {
          "name": "stepsToHeatColor",
          "kind": "re-export",
          "signature": "stepsToHeatColor",
          "summary": ""
        },
        {
          "name": "traceVoxelPath",
          "kind": "re-export",
          "signature": "traceVoxelPath",
          "summary": ""
        },
        {
          "name": "traverseBVH",
          "kind": "re-export",
          "signature": "traverseBVH",
          "summary": ""
        },
        {
          "name": "triangleVoxelIntersect",
          "kind": "re-export",
          "signature": "triangleVoxelIntersect",
          "summary": ""
        },
        {
          "name": "unpackAO",
          "kind": "re-export",
          "signature": "unpackAO",
          "summary": ""
        },
        {
          "name": "unpackLight",
          "kind": "re-export",
          "signature": "unpackLight",
          "summary": ""
        },
        {
          "name": "validateSchema",
          "kind": "re-export",
          "signature": "validateSchema",
          "summary": ""
        },
        {
          "name": "verifyCRC32",
          "kind": "re-export",
          "signature": "verifyCRC32",
          "summary": ""
        },
        {
          "name": "verifyTrailer",
          "kind": "re-export",
          "signature": "verifyTrailer",
          "summary": ""
        },
        {
          "name": "voxelSdfPageToNexel",
          "kind": "re-export",
          "signature": "voxelSdfPageToNexel",
          "summary": ""
        },
        {
          "name": "voxelizeMesh",
          "kind": "re-export",
          "signature": "voxelizeMesh",
          "summary": ""
        },
        {
          "name": "xxHash32",
          "kind": "re-export",
          "signature": "xxHash32",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/FDTDSolver",
      "path": "engine/reference/world/FDTDSolver.md",
      "source": "engine/world/FDTDSolver.js",
      "import": "/engine/world/FDTDSolver.js",
      "sourceHash": "983a58cbe176b5c32046f3e1c4b60172abebce77bbe966c59fa70e808b9d0c8f",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/FloatingOrigin",
      "path": "engine/reference/world/FloatingOrigin.md",
      "source": "engine/world/FloatingOrigin.js",
      "import": "/engine/world/FloatingOrigin.js",
      "sourceHash": "302fc1eb954cdd6baccb0f70c855e946d7fe22dc62be2bfc46ff5cc7f90bdfdd",
      "summary": "Shift an array of objects by the rebase offset Objects must have x, y, z properties",
      "exports": [
        {
          "name": "FloatingOrigin",
          "kind": "class",
          "signature": "class FloatingOrigin",
          "summary": ""
        },
        {
          "name": "shiftObjects",
          "kind": "function",
          "signature": "shiftObjects(objects, shiftX, shiftY, shiftZ)",
          "summary": "Shift an array of objects by the rebase offset Objects must have x, y, z properties"
        },
        {
          "name": "shiftPosition",
          "kind": "function",
          "signature": "shiftPosition(pos, shiftX, shiftY, shiftZ)",
          "summary": "Shift a position array [x, y, z] by the rebase offset"
        },
        {
          "name": "REBASE_THRESHOLD",
          "kind": "constant",
          "signature": "REBASE_THRESHOLD",
          "summary": "Distance from local origin at which to trigger a rebase (in world units)"
        },
        {
          "name": "REBASE_SNAP",
          "kind": "constant",
          "signature": "REBASE_SNAP",
          "summary": "Chunk size for coordinate snapping during rebase"
        },
        {
          "name": "SECTOR_REBASE_THRESHOLD",
          "kind": "constant",
          "signature": "SECTOR_REBASE_THRESHOLD",
          "summary": "Sector-based rebase threshold (rebase when crossing sector boundaries)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/HierarchicalCoords",
      "path": "engine/reference/world/HierarchicalCoords.md",
      "source": "engine/world/HierarchicalCoords.js",
      "import": "/engine/world/HierarchicalCoords.js",
      "sourceHash": "fe09aaa59cd014caf938a9601e484489c003fedc8b18871d37bc8785f9d0d6bf",
      "summary": "Represents a position using sector + local coordinates Sector is integer grid position, local is f32-safe offset within sector",
      "exports": [
        {
          "name": "HierarchicalPosition",
          "kind": "class",
          "signature": "class HierarchicalPosition",
          "summary": "Represents a position using sector + local coordinates Sector is integer grid position, local is f32-safe offset within sector"
        },
        {
          "name": "BigHierarchicalPosition",
          "kind": "class",
          "signature": "class BigHierarchicalPosition",
          "summary": "Extended hierarchical position using BigInt for extreme planet scales Use only when sector coordinates exceed MAX_SAFE_SECTOR"
        },
        {
          "name": "getSectorsInRadius",
          "kind": "function",
          "signature": "getSectorsInRadius(center, radiusSectors)",
          "summary": "Get all sector keys within radius of a position"
        },
        {
          "name": "parseSectorKey",
          "kind": "function",
          "signature": "parseSectorKey(key)",
          "summary": "Parse sector key back to coordinates"
        },
        {
          "name": "getChunkKeyHierarchical",
          "kind": "function",
          "signature": "getChunkKeyHierarchical(pos, chunkSize)",
          "summary": "Calculate sector-aligned chunk key Useful for chunk loading that respects sector boundaries"
        },
        {
          "name": "worldToHierarchical",
          "kind": "function",
          "signature": "worldToHierarchical(x, y, z)",
          "summary": "Convert world coordinates to hierarchical"
        },
        {
          "name": "hierarchicalToWorld",
          "kind": "function",
          "signature": "hierarchicalToWorld(pos)",
          "summary": "Convert hierarchical to world coordinates"
        },
        {
          "name": "toCameraSpace",
          "kind": "function",
          "signature": "toCameraSpace(worldPos, cameraPos)",
          "summary": "Get camera-relative coordinates (f32 safe for GPU)"
        },
        {
          "name": "SECTOR_SIZE",
          "kind": "constant",
          "signature": "SECTOR_SIZE",
          "summary": "Size of one sector in world units (10km)"
        },
        {
          "name": "SECTOR_HALF",
          "kind": "constant",
          "signature": "SECTOR_HALF",
          "summary": "Half sector size for boundary checks"
        },
        {
          "name": "SECTOR_INV",
          "kind": "constant",
          "signature": "SECTOR_INV",
          "summary": "Inverse for fast division"
        },
        {
          "name": "MAX_SAFE_SECTOR",
          "kind": "constant",
          "signature": "MAX_SAFE_SECTOR",
          "summary": "Maximum safe integer for sector coords (before BigInt needed)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/PhasorRays",
      "path": "engine/reference/world/PhasorRays.md",
      "source": "engine/world/PhasorRays.js",
      "import": "/engine/world/PhasorRays.js",
      "sourceHash": "f2fc69844626f212945ee7f14c5870528b2cffa8c45fa7842194bf4445769c7c",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/PhotonicCrystal",
      "path": "engine/reference/world/PhotonicCrystal.md",
      "source": "engine/world/PhotonicCrystal.js",
      "import": "/engine/world/PhotonicCrystal.js",
      "sourceHash": "036ec70b748b60acb5f8c99b865a9dc373aa683f7b6641d2cbb7a3d1ead5fc6a",
      "summary": "",
      "exports": [],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/PlanetPhysics",
      "path": "engine/reference/world/PlanetPhysics.md",
      "source": "engine/world/PlanetPhysics.js",
      "import": "/engine/world/PlanetPhysics.js",
      "sourceHash": "af875224ea72c42a40fd2b457555f9e8acb3cd507eb42196404ff36b78110a15",
      "summary": "Double-precision 3D vector using hi/lo split",
      "exports": [
        {
          "name": "DoubleVec3",
          "kind": "class",
          "signature": "class DoubleVec3",
          "summary": "Double-precision 3D vector using hi/lo split"
        },
        {
          "name": "Quaternion",
          "kind": "class",
          "signature": "class Quaternion",
          "summary": ""
        },
        {
          "name": "Planet",
          "kind": "class",
          "signature": "class Planet",
          "summary": ""
        },
        {
          "name": "PlanetarySystem",
          "kind": "class",
          "signature": "class PlanetarySystem",
          "summary": ""
        },
        {
          "name": "splitDouble",
          "kind": "function",
          "signature": "splitDouble(value)",
          "summary": "Split a double into hi/lo f32 pair for GPU precision"
        },
        {
          "name": "combineDouble",
          "kind": "function",
          "signature": "combineDouble(hi, lo)",
          "summary": "Combine hi/lo f32 pair back to double"
        },
        {
          "name": "G",
          "kind": "constant",
          "signature": "G",
          "summary": "Gravitational constant (scaled for game)"
        },
        {
          "name": "DEFAULT_PLANET_RADIUS",
          "kind": "constant",
          "signature": "DEFAULT_PLANET_RADIUS",
          "summary": "Default planet radius (180,000 km = 180,000,000 m)"
        },
        {
          "name": "DEFAULT_PLANET_MASS",
          "kind": "constant",
          "signature": "DEFAULT_PLANET_MASS",
          "summary": "Default planet mass (for Earth-like surface gravity)"
        },
        {
          "name": "DEFAULT_ROTATION_PERIOD",
          "kind": "constant",
          "signature": "DEFAULT_ROTATION_PERIOD",
          "summary": "Default rotation period in seconds (24 hours)"
        },
        {
          "name": "MIN_GRAVITY",
          "kind": "constant",
          "signature": "MIN_GRAVITY",
          "summary": "Minimum gravity magnitude (to avoid division issues)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/PlanetaryCoords",
      "path": "engine/reference/world/PlanetaryCoords.md",
      "source": "engine/world/PlanetaryCoords.js",
      "import": "/engine/world/PlanetaryCoords.js",
      "sourceHash": "c43582d5f5f678bf2c1e97b289fea76600421a0b5aa908810d92f68d1dcbf472",
      "summary": "Planetary world configuration",
      "exports": [
        {
          "name": "PlanetaryWorld",
          "kind": "class",
          "signature": "class PlanetaryWorld",
          "summary": "Planetary world configuration"
        },
        {
          "name": "ascProject",
          "kind": "function",
          "signature": "ascProject(u, v)",
          "summary": "ASC (Adjusted Spherified Cube) projection Maps a point on a cube face to a point on a unit sphere"
        },
        {
          "name": "ascInverse",
          "kind": "function",
          "signature": "ascInverse(x, y, z)",
          "summary": "Inverse ASC projection Maps a direction on unit sphere back to cube face coordinates"
        },
        {
          "name": "faceToDirection",
          "kind": "function",
          "signature": "faceToDirection(face, u, v)",
          "summary": "Convert face coordinates to a direction on the unit sphere"
        },
        {
          "name": "planetaryToWorld",
          "kind": "function",
          "signature": "planetaryToWorld(face, shell, u, v, planetRadius = DEFAULT_PLANET_RADIUS)",
          "summary": "Convert planetary coordinates to world position"
        },
        {
          "name": "worldToPlanetary",
          "kind": "function",
          "signature": "worldToPlanetary(x, y, z, planetRadius = DEFAULT_PLANET_RADIUS)",
          "summary": "Convert world position to planetary coordinates"
        },
        {
          "name": "getGravityDirection",
          "kind": "function",
          "signature": "getGravityDirection(x, y, z)",
          "summary": "Get gravity direction at a world position (points toward center)"
        },
        {
          "name": "getUpDirection",
          "kind": "function",
          "signature": "getUpDirection(x, y, z)",
          "summary": "Get \"up\" direction at a world position (away from center)"
        },
        {
          "name": "planetaryChunkKey",
          "kind": "function",
          "signature": "planetaryChunkKey(face, shell, cu, cv)",
          "summary": "Get chunk key for planetary coordinates"
        },
        {
          "name": "parsePlanetaryChunkKey",
          "kind": "function",
          "signature": "parsePlanetaryChunkKey(key)",
          "summary": "Parse planetary chunk key"
        },
        {
          "name": "worldToPlanetaryChunk",
          "kind": "function",
          "signature": "worldToPlanetaryChunk(x, y, z, chunkSize = 32, planetRadius = DEFAULT_PLANET_RADIUS)",
          "summary": "Convert world position to planetary chunk coordinates"
        },
        {
          "name": "FACE",
          "kind": "constant",
          "signature": "FACE",
          "summary": ""
        },
        {
          "name": "FACE_NAMES",
          "kind": "constant",
          "signature": "FACE_NAMES",
          "summary": ""
        },
        {
          "name": "DEFAULT_PLANET_RADIUS",
          "kind": "constant",
          "signature": "DEFAULT_PLANET_RADIUS",
          "summary": ""
        },
        {
          "name": "SHELL_THICKNESS",
          "kind": "constant",
          "signature": "SHELL_THICKNESS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/SurfaceAttachment",
      "path": "engine/reference/world/SurfaceAttachment.md",
      "source": "engine/world/SurfaceAttachment.js",
      "import": "/engine/world/SurfaceAttachment.js",
      "sourceHash": "4ddb6cf61d83b7dd2002bb4096e293634a6b6faa7261a1341067e98fbb250d20",
      "summary": "Represents a point on a surface where attachment occurs",
      "exports": [
        {
          "name": "AttachmentPoint",
          "kind": "class",
          "signature": "class AttachmentPoint",
          "summary": "Represents a point on a surface where attachment occurs"
        },
        {
          "name": "SurfaceAttachment",
          "kind": "class",
          "signature": "class SurfaceAttachment",
          "summary": "Manages attachment state for a single entity"
        },
        {
          "name": "AttachmentManager",
          "kind": "class",
          "signature": "class AttachmentManager",
          "summary": "Manages attachments for multiple entities"
        },
        {
          "name": "AttachmentType",
          "kind": "constant",
          "signature": "AttachmentType",
          "summary": "Attachment types"
        },
        {
          "name": "BreakCondition",
          "kind": "constant",
          "signature": "BreakCondition",
          "summary": "Break conditions"
        },
        {
          "name": "DEFAULT_PARAMS",
          "kind": "constant",
          "signature": "DEFAULT_PARAMS",
          "summary": "Default attachment parameters"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/WorldSchema",
      "path": "engine/reference/world/WorldSchema.md",
      "source": "engine/world/WorldSchema.js",
      "import": "/engine/world/WorldSchema.js",
      "sourceHash": "cccbf358396686f6b7d0fb96d0bb3fe53bbab3356825106ddad65a45d82caf46",
      "summary": "Get biome type ID from name",
      "exports": [
        {
          "name": "getBiomeTypeId",
          "kind": "function",
          "signature": "getBiomeTypeId(biomeName)",
          "summary": "Get biome type ID from name"
        },
        {
          "name": "getBiomeTypeName",
          "kind": "function",
          "signature": "getBiomeTypeName(biomeId)",
          "summary": "Get biome type name from ID"
        },
        {
          "name": "validateTerrain",
          "kind": "function",
          "signature": "validateTerrain(config)",
          "summary": "Validate terrain config"
        },
        {
          "name": "validateWeather",
          "kind": "function",
          "signature": "validateWeather(config)",
          "summary": "Validate weather config"
        },
        {
          "name": "validateWorldConfig",
          "kind": "function",
          "signature": "validateWorldConfig(config)",
          "summary": "Validate world config"
        },
        {
          "name": "createDefaultTerrain",
          "kind": "function",
          "signature": "createDefaultTerrain()",
          "summary": "Create default terrain config"
        },
        {
          "name": "createDefaultWeather",
          "kind": "function",
          "signature": "createDefaultWeather()",
          "summary": "Create default weather"
        },
        {
          "name": "createDefaultWorldConfig",
          "kind": "function",
          "signature": "createDefaultWorldConfig(seed = Date.now()",
          "summary": "Create default world config"
        },
        {
          "name": "createClimateFromPosition",
          "kind": "function",
          "signature": "createClimateFromPosition(latitude, altitude, oceanDistance)",
          "summary": "Create climate from biome position"
        },
        {
          "name": "getBiomeFromClimate",
          "kind": "function",
          "signature": "getBiomeFromClimate(climate)",
          "summary": "Get biome from climate"
        },
        {
          "name": "getWeatherPreset",
          "kind": "function",
          "signature": "getWeatherPreset(typeName)",
          "summary": "Get weather preset"
        },
        {
          "name": "getTimePhase",
          "kind": "function",
          "signature": "getTimePhase(hour)",
          "summary": "Get time phase for hour"
        },
        {
          "name": "BIOME_TYPES",
          "kind": "constant",
          "signature": "BIOME_TYPES",
          "summary": "Biome type definitions"
        },
        {
          "name": "CLIMATE_PARAMS",
          "kind": "constant",
          "signature": "CLIMATE_PARAMS",
          "summary": "Climate parameter ranges (0-1)"
        },
        {
          "name": "CLIMATE_SCHEMA",
          "kind": "constant",
          "signature": "CLIMATE_SCHEMA",
          "summary": "Climate schema for biome selection"
        },
        {
          "name": "BIOME_SCHEMA",
          "kind": "constant",
          "signature": "BIOME_SCHEMA",
          "summary": "Biome definition schema"
        },
        {
          "name": "NOISE_SCHEMA",
          "kind": "constant",
          "signature": "NOISE_SCHEMA",
          "summary": "Noise parameters schema"
        },
        {
          "name": "EROSION_TYPES",
          "kind": "constant",
          "signature": "EROSION_TYPES",
          "summary": "Erosion types"
        },
        {
          "name": "TERRAIN_SCHEMA",
          "kind": "constant",
          "signature": "TERRAIN_SCHEMA",
          "summary": "Terrain generation schema"
        },
        {
          "name": "CHUNK_SIZES",
          "kind": "constant",
          "signature": "CHUNK_SIZES",
          "summary": "Chunk sizes"
        },
        {
          "name": "ZONE_TYPES",
          "kind": "constant",
          "signature": "ZONE_TYPES",
          "summary": "Zone types for streaming"
        },
        {
          "name": "CHUNK_STREAMING_SCHEMA",
          "kind": "constant",
          "signature": "CHUNK_STREAMING_SCHEMA",
          "summary": "Chunk streaming schema"
        },
        {
          "name": "WEATHER_TYPES",
          "kind": "constant",
          "signature": "WEATHER_TYPES",
          "summary": "Weather types"
        },
        {
          "name": "WEATHER_SCHEMA",
          "kind": "constant",
          "signature": "WEATHER_SCHEMA",
          "summary": "Weather schema"
        },
        {
          "name": "TIME_PHASES",
          "kind": "constant",
          "signature": "TIME_PHASES",
          "summary": "Time of day phases"
        },
        {
          "name": "WORLD_TIME_SCHEMA",
          "kind": "constant",
          "signature": "WORLD_TIME_SCHEMA",
          "summary": "World time schema"
        },
        {
          "name": "WORLD_CONFIG_SCHEMA",
          "kind": "constant",
          "signature": "WORLD_CONFIG_SCHEMA",
          "summary": "Complete world configuration"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/WorldTime",
      "path": "engine/reference/world/WorldTime.md",
      "source": "engine/world/WorldTime.js",
      "import": "/engine/world/WorldTime.js",
      "sourceHash": "9c0c9af5250b975db8cefabc83d927f799e3253f118622202b252da498855515",
      "summary": "WorldTime.js - Comprehensive Temporal Architecture Implements robust server-side time tracking based on: - Tick-based architecture with 64-bit precision (BigInt) - Hierarchical Timing Wheels for O(1) event scheduling - Custom calendar system derived from total ticks - Timescale ratios (game time vs real time) - Offline progression support - Network clock synchronization Reference: \"Temporal Architecture in Virtual Environments\"",
      "exports": [
        {
          "name": "GameDate",
          "kind": "class",
          "signature": "class GameDate",
          "summary": "GameDate - A view of the world time as calendar date Never store date components directly - always derive from ticks"
        },
        {
          "name": "HierarchicalTimingWheel",
          "kind": "class",
          "signature": "class HierarchicalTimingWheel",
          "summary": "HierarchicalTimingWheel - Multi-level timing wheel for efficient scheduling Level 0: Ticks (20 slots = 1 second at 20 TPS) Level 1: Seconds (60 slots = 1 minute) Level 2: Minutes (60 slots = 1 hour) Level 3: Hours (24 slots = 1 day) Level 4: Days (28 slots = 1 month)"
        },
        {
          "name": "WorldTimeSystem",
          "kind": "class",
          "signature": "class WorldTimeSystem",
          "summary": "WorldTimeSystem - Main time tracking system Features: - 64-bit tick precision - Configurable timescale - Event scheduling via timing wheel - Offline progression - Network sync support"
        },
        {
          "name": "TICKS_PER_SECOND",
          "kind": "constant",
          "signature": "TICKS_PER_SECOND",
          "summary": ""
        },
        {
          "name": "TICK_DURATION_MS",
          "kind": "constant",
          "signature": "TICK_DURATION_MS",
          "summary": "Tick duration in milliseconds"
        },
        {
          "name": "PRECISION_TICKS_PER_SECOND",
          "kind": "constant",
          "signature": "PRECISION_TICKS_PER_SECOND",
          "summary": "High-precision ticks (100-nanosecond intervals, like .NET DateTime.Ticks)"
        },
        {
          "name": "TIMESCALE",
          "kind": "constant",
          "signature": "TIMESCALE",
          "summary": "Timescale presets (game:real ratios)"
        },
        {
          "name": "CALENDAR_CONFIG",
          "kind": "constant",
          "signature": "CALENDAR_CONFIG",
          "summary": "Calendar configuration"
        },
        {
          "name": "SECONDS_PER_DAY",
          "kind": "constant",
          "signature": "SECONDS_PER_DAY",
          "summary": "Derived constants"
        },
        {
          "name": "DAYS_PER_YEAR",
          "kind": "constant",
          "signature": "DAYS_PER_YEAR",
          "summary": ""
        },
        {
          "name": "TICKS_PER_DAY",
          "kind": "constant",
          "signature": "TICKS_PER_DAY",
          "summary": ""
        },
        {
          "name": "TICKS_PER_YEAR",
          "kind": "constant",
          "signature": "TICKS_PER_YEAR",
          "summary": ""
        },
        {
          "name": "MOON_PHASE",
          "kind": "constant",
          "signature": "MOON_PHASE",
          "summary": "Moon phases"
        },
        {
          "name": "SEASON",
          "kind": "constant",
          "signature": "SEASON",
          "summary": "Season names"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/ZoneManager",
      "path": "engine/reference/world/ZoneManager.md",
      "source": "engine/world/ZoneManager.js",
      "import": "/engine/world/ZoneManager.js",
      "sourceHash": "d554ae82dc2af776ceef23a2d3fff73a1510bc845d732270719d118f48a268be",
      "summary": "Represents a single zone in the world",
      "exports": [
        {
          "name": "Zone",
          "kind": "class",
          "signature": "class Zone",
          "summary": "Represents a single zone in the world"
        },
        {
          "name": "ZoneManager",
          "kind": "class",
          "signature": "class ZoneManager",
          "summary": "Manages all zones in the world"
        },
        {
          "name": "ZONE_TYPE",
          "kind": "constant",
          "signature": "ZONE_TYPE",
          "summary": "Zone types"
        },
        {
          "name": "ZONE_SHAPE",
          "kind": "constant",
          "signature": "ZONE_SHAPE",
          "summary": "Zone shapes"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/GPUWorldGenerator",
      "path": "engine/reference/world/generation/GPUWorldGenerator.md",
      "source": "engine/world/generation/GPUWorldGenerator.js",
      "import": "/engine/world/generation/GPUWorldGenerator.js",
      "sourceHash": "55a71c84f3c2ebda639c8a7acb7b8aa52e45f750d820f4afad38edbd28fae508",
      "summary": "",
      "exports": [
        {
          "name": "GPUWorldGenerator",
          "kind": "class",
          "signature": "class GPUWorldGenerator",
          "summary": ""
        },
        {
          "name": "NOISE_LIBRARY_WGSL",
          "kind": "constant",
          "signature": "NOISE_LIBRARY_WGSL",
          "summary": ""
        },
        {
          "name": "CLIMATE_BIOME_WGSL",
          "kind": "constant",
          "signature": "CLIMATE_BIOME_WGSL",
          "summary": ""
        },
        {
          "name": "CAVE_WGSL",
          "kind": "constant",
          "signature": "CAVE_WGSL",
          "summary": ""
        },
        {
          "name": "STRUCTURE_WGSL",
          "kind": "constant",
          "signature": "STRUCTURE_WGSL",
          "summary": ""
        },
        {
          "name": "TERRAIN_GEN_SHADER",
          "kind": "constant",
          "signature": "TERRAIN_GEN_SHADER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/HydraulicErosion",
      "path": "engine/reference/world/generation/HydraulicErosion.md",
      "source": "engine/world/generation/HydraulicErosion.js",
      "import": "/engine/world/generation/HydraulicErosion.js",
      "sourceHash": "916f93618a5067c0429e05f2f5364762290b3a062233b404bf25943a299de8cd",
      "summary": "HydraulicErosion - GPU particle-based erosion with momentum",
      "exports": [
        {
          "name": "HydraulicErosion",
          "kind": "class",
          "signature": "class HydraulicErosion",
          "summary": "HydraulicErosion - GPU particle-based erosion with momentum"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/LayerMap",
      "path": "engine/reference/world/generation/LayerMap.md",
      "source": "engine/world/generation/LayerMap.js",
      "import": "/engine/world/generation/LayerMap.js",
      "sourceHash": "6d15bee4cf217f81cf0ae7be0e391f9a0136b55ee98dad415660c1eee1b7c0ab",
      "summary": "LayerMap - GPU-resident stratigraphic terrain data structure",
      "exports": [
        {
          "name": "LayerMap",
          "kind": "class",
          "signature": "class LayerMap",
          "summary": "LayerMap - GPU-resident stratigraphic terrain data structure"
        },
        {
          "name": "MATERIAL_ID",
          "kind": "constant",
          "signature": "MATERIAL_ID",
          "summary": ""
        },
        {
          "name": "MATERIAL_PROPERTIES",
          "kind": "constant",
          "signature": "MATERIAL_PROPERTIES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/ProceduralTreeGenerator",
      "path": "engine/reference/world/generation/ProceduralTreeGenerator.md",
      "source": "engine/world/generation/ProceduralTreeGenerator.js",
      "import": "/engine/world/generation/ProceduralTreeGenerator.js",
      "sourceHash": "2a7c938c6d4e8dda1610a9ec68332d5f5057be0c35311a8cc22f479ffd77d27a",
      "summary": "GPU Grass Instancer - Generates millions of grass blades via mesh shaders INTEGRATION: - Uses shared particle system for grass blade physics - Uses SpatialHashCompute for wind field queries - Uses WindSimulation for dynamic wind effects Uses indirect instancing with per-blade data generated on GPU: - Position jittered from grid - Height/width variation - Wind animation parameters - LOD based on camera distance",
      "exports": [
        {
          "name": "ProceduralTreeGenerator",
          "kind": "class",
          "signature": "class ProceduralTreeGenerator",
          "summary": ""
        },
        {
          "name": "GrassInstancer",
          "kind": "class",
          "signature": "class GrassInstancer",
          "summary": "GPU Grass Instancer - Generates millions of grass blades via mesh shaders INTEGRATION: - Uses shared particle system for grass blade physics - Uses SpatialHashCompute for wind field queries - Uses WindSimulation for dynamic wind effects Uses indirect instancing with per-blade data generated on GPU: - Position jittered from grid - Height/width variation - Wind animation parameters - LOD based on camera distance"
        },
        {
          "name": "proceduralTreePositionHash3D",
          "kind": "function",
          "signature": "proceduralTreePositionHash3D(x, y, z)",
          "summary": "Hash function for position-based determinism"
        },
        {
          "name": "proceduralTreeDefaultSeed2D",
          "kind": "function",
          "signature": "proceduralTreeDefaultSeed2D(x, z)",
          "summary": ""
        },
        {
          "name": "grassPatchBladeSeed3D",
          "kind": "function",
          "signature": "grassPatchBladeSeed3D(patchX, patchZ, bladeIndex)",
          "summary": ""
        },
        {
          "name": "TREE_SPECIES",
          "kind": "constant",
          "signature": "TREE_SPECIES",
          "summary": ""
        },
        {
          "name": "BIOME_TREE_DENSITY",
          "kind": "constant",
          "signature": "BIOME_TREE_DENSITY",
          "summary": ""
        },
        {
          "name": "FLUFFY_FOLIAGE_SHADER",
          "kind": "constant",
          "signature": "FLUFFY_FOLIAGE_SHADER",
          "summary": ""
        },
        {
          "name": "GRASS_TYPES",
          "kind": "constant",
          "signature": "GRASS_TYPES",
          "summary": ""
        },
        {
          "name": "STYLIZED_GRASS_SHADER",
          "kind": "constant",
          "signature": "STYLIZED_GRASS_SHADER",
          "summary": ""
        },
        {
          "name": "FLUFFY_GRASS_SHADER",
          "kind": "constant",
          "signature": "FLUFFY_GRASS_SHADER",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/TectonicSimulation",
      "path": "engine/reference/world/generation/TectonicSimulation.md",
      "source": "engine/world/generation/TectonicSimulation.js",
      "import": "/engine/world/generation/TectonicSimulation.js",
      "sourceHash": "47436cdd589d77b4126d5fe2d00bb1b77f5fd446e11a5cbdaba46da221850ff1",
      "summary": "TectonicSimulation - GPU plate tectonics using clustered convection",
      "exports": [
        {
          "name": "TectonicSimulation",
          "kind": "class",
          "signature": "class TectonicSimulation",
          "summary": "TectonicSimulation - GPU plate tectonics using clustered convection"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/ThermalErosion",
      "path": "engine/reference/world/generation/ThermalErosion.md",
      "source": "engine/world/generation/ThermalErosion.js",
      "import": "/engine/world/generation/ThermalErosion.js",
      "sourceHash": "48afd7165c4d4bf422887822902f0144f8e39929cfd46e2e8dca121a18e7d799",
      "summary": "ThermalErosion.js - GPU Material-Specific Talus Angle Erosion Implements thermal erosion (slippage) with: - Per-material talus angles (angle of repose) - Mass-conserving material transfer between cells - Support for LayerMap stratigraphy Based on: SoilMachine thermal erosion Key concept: If slope > tan(θ_material), mass transfers downhill - Sand: ~30° (gentle slopes) - Rock: ~85° (near-vertical cliffs)",
      "exports": [
        {
          "name": "ThermalErosion",
          "kind": "class",
          "signature": "class ThermalErosion",
          "summary": "ThermalErosion - GPU material-specific talus angle erosion"
        },
        {
          "name": "TALUS_ANGLES",
          "kind": "constant",
          "signature": "TALUS_ANGLES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/UnifiedTerrainPipeline",
      "path": "engine/reference/world/generation/UnifiedTerrainPipeline.md",
      "source": "engine/world/generation/UnifiedTerrainPipeline.js",
      "import": "/engine/world/generation/UnifiedTerrainPipeline.js",
      "sourceHash": "1cef600c521069f2be4faf138a0a7d398e1ad96815566f99c35fcd33bdfcb19a",
      "summary": "UnifiedTerrainPipeline.js - Complete Procedural Geomorphology System Orchestrates the full terrain generation and simulation pipeline: 1. TECTONICS (Initialization Phase) - Clustered Convection plate simulation - JFA Voronoi for plate boundaries - Subduction/collision → bedrock heightmap 2. HYDROLOGY (Real-time Simulation) - Momentum-based particle erosion - Meandering river formation - Sediment transport & deposition 3. STRATIGRAPHY (LayerMap) - Multi-layer terrain storage - Per-material properties - Talus angle enforcement 4. THERMAL EROSION (Real-time) - Material-specific slippage - Cliff formation - Scree slopes Based on: Nick McDonald's research (Clustered Convection, SimpleHydrology, SoilMachine)",
      "exports": [
        {
          "name": "UnifiedTerrainPipeline",
          "kind": "class",
          "signature": "class UnifiedTerrainPipeline",
          "summary": "UnifiedTerrainPipeline - Orchestrates all terrain generation systems"
        },
        {
          "name": "HydraulicErosion",
          "kind": "re-export",
          "signature": "HydraulicErosion",
          "summary": ""
        },
        {
          "name": "LayerMap",
          "kind": "re-export",
          "signature": "LayerMap",
          "summary": ""
        },
        {
          "name": "MATERIAL_ID",
          "kind": "re-export",
          "signature": "MATERIAL_ID",
          "summary": ""
        },
        {
          "name": "MATERIAL_PROPERTIES",
          "kind": "re-export",
          "signature": "MATERIAL_PROPERTIES",
          "summary": ""
        },
        {
          "name": "TALUS_ANGLES",
          "kind": "re-export",
          "signature": "TALUS_ANGLES",
          "summary": ""
        },
        {
          "name": "TectonicSimulation",
          "kind": "re-export",
          "signature": "TectonicSimulation",
          "summary": ""
        },
        {
          "name": "ThermalErosion",
          "kind": "re-export",
          "signature": "ThermalErosion",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/VoronoiTextureBlend",
      "path": "engine/reference/world/generation/VoronoiTextureBlend.md",
      "source": "engine/world/generation/VoronoiTextureBlend.js",
      "import": "/engine/world/generation/VoronoiTextureBlend.js",
      "sourceHash": "5dd8b1b606daad1c0f2179082296d9f50da78dc06947b546ac564384e738755c",
      "summary": "Sample Voronoi data at a world position (CPU fallback)",
      "exports": [
        {
          "name": "VoronoiTextureBlend",
          "kind": "class",
          "signature": "class VoronoiTextureBlend",
          "summary": ""
        },
        {
          "name": "voronoiTextureVariationHash",
          "kind": "function",
          "signature": "voronoiTextureVariationHash(x, z, index)",
          "summary": ""
        },
        {
          "name": "sampleVoronoi",
          "kind": "function",
          "signature": "sampleVoronoi(centroids, x, z)",
          "summary": "Sample Voronoi data at a world position (CPU fallback)"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/WindErosion",
      "path": "engine/reference/world/generation/WindErosion.md",
      "source": "engine/world/generation/WindErosion.js",
      "import": "/engine/world/generation/WindErosion.js",
      "sourceHash": "37b72e2bb29df3f5fa606be423fa8a67c6be10504b0be065fd94d17b6eae2702",
      "summary": "",
      "exports": [
        {
          "name": "WindErosion",
          "kind": "class",
          "signature": "class WindErosion",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/WorldGenerator",
      "path": "engine/reference/world/generation/WorldGenerator.md",
      "source": "engine/world/generation/WorldGenerator.js",
      "import": "/engine/world/generation/WorldGenerator.js",
      "sourceHash": "cd440250acccdf5d9fca827629708bfd48b449e073f66f7baa4209f51965a444",
      "summary": "",
      "exports": [
        {
          "name": "WorldGenerator",
          "kind": "class",
          "signature": "class WorldGenerator",
          "summary": ""
        },
        {
          "name": "worldGeneratorHash3D",
          "kind": "function",
          "signature": "worldGeneratorHash3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "worldGeneratorDungeonSeed2D",
          "kind": "function",
          "signature": "worldGeneratorDungeonSeed2D(centerX, centerZ)",
          "summary": ""
        },
        {
          "name": "BIOME",
          "kind": "constant",
          "signature": "BIOME",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/WorldMapGenerator",
      "path": "engine/reference/world/generation/WorldMapGenerator.md",
      "source": "engine/world/generation/WorldMapGenerator.js",
      "import": "/engine/world/generation/WorldMapGenerator.js",
      "sourceHash": "f1406179c07c55b03a758f3c35b52cb9aa0d63d391ef7c2f68a94b3c44c5cef7",
      "summary": "WorldMapGenerator.js - Full World Map Preview Generator Generates a top-down world map from all loaded chunks, similar to Minecraft's world maps. Used for save file previews. Features: - Scans all chunks to build a complete heightmap - Color-codes terrain by material type - Height-based shading for 3D effect - Exports as PNG data URL or blob",
      "exports": [
        {
          "name": "WorldMapGenerator",
          "kind": "class",
          "signature": "class WorldMapGenerator",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/generation/index",
      "path": "engine/reference/world/generation/index.md",
      "source": "engine/world/generation/index.js",
      "import": "/engine/world/generation/index.js",
      "sourceHash": "f666d6e4c7badf237fefa5282a9bab5c8fe38a30633dc44686dd9c060e9b27b4",
      "summary": "",
      "exports": [
        {
          "name": "BIOME",
          "kind": "re-export",
          "signature": "BIOME",
          "summary": ""
        },
        {
          "name": "GPUWorldGenerator",
          "kind": "re-export",
          "signature": "GPUWorldGenerator",
          "summary": ""
        },
        {
          "name": "HydraulicErosion",
          "kind": "re-export",
          "signature": "HydraulicErosion",
          "summary": ""
        },
        {
          "name": "LayerMap",
          "kind": "re-export",
          "signature": "LayerMap",
          "summary": ""
        },
        {
          "name": "ProceduralTreeGenerator",
          "kind": "re-export",
          "signature": "ProceduralTreeGenerator",
          "summary": ""
        },
        {
          "name": "TectonicSimulation",
          "kind": "re-export",
          "signature": "TectonicSimulation",
          "summary": ""
        },
        {
          "name": "ThermalErosion",
          "kind": "re-export",
          "signature": "ThermalErosion",
          "summary": ""
        },
        {
          "name": "UnifiedTerrainPipeline",
          "kind": "re-export",
          "signature": "UnifiedTerrainPipeline",
          "summary": ""
        },
        {
          "name": "VoronoiTextureBlend",
          "kind": "re-export",
          "signature": "VoronoiTextureBlend",
          "summary": ""
        },
        {
          "name": "WindErosion",
          "kind": "re-export",
          "signature": "WindErosion",
          "summary": ""
        },
        {
          "name": "WorldGenerator",
          "kind": "re-export",
          "signature": "WorldGenerator",
          "summary": ""
        },
        {
          "name": "WorldMapGenerator",
          "kind": "re-export",
          "signature": "WorldMapGenerator",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/index",
      "path": "engine/reference/world/index.md",
      "source": "engine/world/index.js",
      "import": "/engine/world/index.js",
      "sourceHash": "425623b87c4f8abd264353ce451d1a5e14fdcf89a0767ca1c66e87ccd27a66ec",
      "summary": "",
      "exports": [
        {
          "name": "BIOME_SCHEMA",
          "kind": "re-export",
          "signature": "BIOME_SCHEMA",
          "summary": ""
        },
        {
          "name": "BIOME_TYPES",
          "kind": "re-export",
          "signature": "BIOME_TYPES",
          "summary": ""
        },
        {
          "name": "BigHierarchicalPosition",
          "kind": "re-export",
          "signature": "BigHierarchicalPosition",
          "summary": ""
        },
        {
          "name": "CALENDAR_CONFIG",
          "kind": "re-export",
          "signature": "CALENDAR_CONFIG",
          "summary": ""
        },
        {
          "name": "CHUNK_SIZES",
          "kind": "re-export",
          "signature": "CHUNK_SIZES",
          "summary": ""
        },
        {
          "name": "CHUNK_STREAMING_SCHEMA",
          "kind": "re-export",
          "signature": "CHUNK_STREAMING_SCHEMA",
          "summary": ""
        },
        {
          "name": "CLIMATE_PARAMS",
          "kind": "re-export",
          "signature": "CLIMATE_PARAMS",
          "summary": ""
        },
        {
          "name": "CLIMATE_SCHEMA",
          "kind": "re-export",
          "signature": "CLIMATE_SCHEMA",
          "summary": ""
        },
        {
          "name": "DEFAULT_PLANET_MASS",
          "kind": "re-export",
          "signature": "DEFAULT_PLANET_MASS",
          "summary": ""
        },
        {
          "name": "DEFAULT_PLANET_RADIUS",
          "kind": "re-export",
          "signature": "DEFAULT_PLANET_RADIUS",
          "summary": ""
        },
        {
          "name": "DEFAULT_ROTATION_PERIOD",
          "kind": "re-export",
          "signature": "DEFAULT_ROTATION_PERIOD",
          "summary": ""
        },
        {
          "name": "DoubleVec3",
          "kind": "re-export",
          "signature": "DoubleVec3",
          "summary": ""
        },
        {
          "name": "EROSION_TYPES",
          "kind": "re-export",
          "signature": "EROSION_TYPES",
          "summary": ""
        },
        {
          "name": "FACE",
          "kind": "re-export",
          "signature": "FACE",
          "summary": ""
        },
        {
          "name": "FloatingOrigin",
          "kind": "re-export",
          "signature": "FloatingOrigin",
          "summary": ""
        },
        {
          "name": "GRAVITATIONAL_CONSTANT",
          "kind": "re-export",
          "signature": "GRAVITATIONAL_CONSTANT",
          "summary": ""
        },
        {
          "name": "GameDate",
          "kind": "re-export",
          "signature": "GameDate",
          "summary": ""
        },
        {
          "name": "HierarchicalPosition",
          "kind": "re-export",
          "signature": "HierarchicalPosition",
          "summary": ""
        },
        {
          "name": "HierarchicalTimingWheel",
          "kind": "re-export",
          "signature": "HierarchicalTimingWheel",
          "summary": ""
        },
        {
          "name": "MAX_SAFE_SECTOR",
          "kind": "re-export",
          "signature": "MAX_SAFE_SECTOR",
          "summary": ""
        },
        {
          "name": "MIN_GRAVITY",
          "kind": "re-export",
          "signature": "MIN_GRAVITY",
          "summary": ""
        },
        {
          "name": "MOON_PHASE",
          "kind": "re-export",
          "signature": "MOON_PHASE",
          "summary": ""
        },
        {
          "name": "NOISE_SCHEMA",
          "kind": "re-export",
          "signature": "NOISE_SCHEMA",
          "summary": ""
        },
        {
          "name": "Planet",
          "kind": "re-export",
          "signature": "Planet",
          "summary": ""
        },
        {
          "name": "PlanetQuaternion",
          "kind": "re-export",
          "signature": "PlanetQuaternion",
          "summary": ""
        },
        {
          "name": "PlanetaryCoords",
          "kind": "re-export",
          "signature": "PlanetaryCoords",
          "summary": ""
        },
        {
          "name": "PlanetarySystem",
          "kind": "re-export",
          "signature": "PlanetarySystem",
          "summary": ""
        },
        {
          "name": "PlanetaryWorld",
          "kind": "re-export",
          "signature": "PlanetaryWorld",
          "summary": ""
        },
        {
          "name": "REBASE_SNAP",
          "kind": "re-export",
          "signature": "REBASE_SNAP",
          "summary": ""
        },
        {
          "name": "REBASE_THRESHOLD",
          "kind": "re-export",
          "signature": "REBASE_THRESHOLD",
          "summary": ""
        },
        {
          "name": "SEASON",
          "kind": "re-export",
          "signature": "SEASON",
          "summary": ""
        },
        {
          "name": "SECTOR_HALF",
          "kind": "re-export",
          "signature": "SECTOR_HALF",
          "summary": ""
        },
        {
          "name": "SECTOR_INV",
          "kind": "re-export",
          "signature": "SECTOR_INV",
          "summary": ""
        },
        {
          "name": "SECTOR_SIZE",
          "kind": "re-export",
          "signature": "SECTOR_SIZE",
          "summary": ""
        },
        {
          "name": "SHELL_THICKNESS",
          "kind": "re-export",
          "signature": "SHELL_THICKNESS",
          "summary": ""
        },
        {
          "name": "SurfaceAttachment",
          "kind": "re-export",
          "signature": "SurfaceAttachment",
          "summary": ""
        },
        {
          "name": "TERRAIN_SCHEMA",
          "kind": "re-export",
          "signature": "TERRAIN_SCHEMA",
          "summary": ""
        },
        {
          "name": "TICKS_PER_SECOND",
          "kind": "re-export",
          "signature": "TICKS_PER_SECOND",
          "summary": ""
        },
        {
          "name": "TICK_DURATION_MS",
          "kind": "re-export",
          "signature": "TICK_DURATION_MS",
          "summary": ""
        },
        {
          "name": "TIMESCALE",
          "kind": "re-export",
          "signature": "TIMESCALE",
          "summary": ""
        },
        {
          "name": "TIME_PHASES",
          "kind": "re-export",
          "signature": "TIME_PHASES",
          "summary": ""
        },
        {
          "name": "WEATHER_SCHEMA",
          "kind": "re-export",
          "signature": "WEATHER_SCHEMA",
          "summary": ""
        },
        {
          "name": "WEATHER_TYPES",
          "kind": "re-export",
          "signature": "WEATHER_TYPES",
          "summary": ""
        },
        {
          "name": "WORLD_CONFIG_SCHEMA",
          "kind": "re-export",
          "signature": "WORLD_CONFIG_SCHEMA",
          "summary": ""
        },
        {
          "name": "WORLD_TIME_SCHEMA",
          "kind": "re-export",
          "signature": "WORLD_TIME_SCHEMA",
          "summary": ""
        },
        {
          "name": "WorldTime",
          "kind": "re-export",
          "signature": "WorldTime",
          "summary": ""
        },
        {
          "name": "WorldTimeSystem",
          "kind": "re-export",
          "signature": "WorldTimeSystem",
          "summary": ""
        },
        {
          "name": "ZONE_TYPES",
          "kind": "re-export",
          "signature": "ZONE_TYPES",
          "summary": ""
        },
        {
          "name": "ZoneManager",
          "kind": "re-export",
          "signature": "ZoneManager",
          "summary": ""
        },
        {
          "name": "ascInverse",
          "kind": "re-export",
          "signature": "ascInverse",
          "summary": ""
        },
        {
          "name": "ascProject",
          "kind": "re-export",
          "signature": "ascProject",
          "summary": ""
        },
        {
          "name": "combineDouble",
          "kind": "re-export",
          "signature": "combineDouble",
          "summary": ""
        },
        {
          "name": "createClimateFromPosition",
          "kind": "re-export",
          "signature": "createClimateFromPosition",
          "summary": ""
        },
        {
          "name": "createDefaultTerrain",
          "kind": "re-export",
          "signature": "createDefaultTerrain",
          "summary": ""
        },
        {
          "name": "createDefaultWeather",
          "kind": "re-export",
          "signature": "createDefaultWeather",
          "summary": ""
        },
        {
          "name": "createDefaultWorldConfig",
          "kind": "re-export",
          "signature": "createDefaultWorldConfig",
          "summary": ""
        },
        {
          "name": "faceToDirection",
          "kind": "re-export",
          "signature": "faceToDirection",
          "summary": ""
        },
        {
          "name": "getBiomeFromClimate",
          "kind": "re-export",
          "signature": "getBiomeFromClimate",
          "summary": ""
        },
        {
          "name": "getBiomeTypeId",
          "kind": "re-export",
          "signature": "getBiomeTypeId",
          "summary": ""
        },
        {
          "name": "getBiomeTypeName",
          "kind": "re-export",
          "signature": "getBiomeTypeName",
          "summary": ""
        },
        {
          "name": "getChunkKeyHierarchical",
          "kind": "re-export",
          "signature": "getChunkKeyHierarchical",
          "summary": ""
        },
        {
          "name": "getGravityDirection",
          "kind": "re-export",
          "signature": "getGravityDirection",
          "summary": ""
        },
        {
          "name": "getSectorsInRadius",
          "kind": "re-export",
          "signature": "getSectorsInRadius",
          "summary": ""
        },
        {
          "name": "getTimePhase",
          "kind": "re-export",
          "signature": "getTimePhase",
          "summary": ""
        },
        {
          "name": "getUpDirection",
          "kind": "re-export",
          "signature": "getUpDirection",
          "summary": ""
        },
        {
          "name": "getWeatherPreset",
          "kind": "re-export",
          "signature": "getWeatherPreset",
          "summary": ""
        },
        {
          "name": "hierarchicalToWorld",
          "kind": "re-export",
          "signature": "hierarchicalToWorld",
          "summary": ""
        },
        {
          "name": "parsePlanetaryChunkKey",
          "kind": "re-export",
          "signature": "parsePlanetaryChunkKey",
          "summary": ""
        },
        {
          "name": "parseSectorKey",
          "kind": "re-export",
          "signature": "parseSectorKey",
          "summary": ""
        },
        {
          "name": "planetaryChunkKey",
          "kind": "re-export",
          "signature": "planetaryChunkKey",
          "summary": ""
        },
        {
          "name": "planetaryToWorld",
          "kind": "re-export",
          "signature": "planetaryToWorld",
          "summary": ""
        },
        {
          "name": "shiftObjects",
          "kind": "re-export",
          "signature": "shiftObjects",
          "summary": ""
        },
        {
          "name": "shiftPosition",
          "kind": "re-export",
          "signature": "shiftPosition",
          "summary": ""
        },
        {
          "name": "splitDouble",
          "kind": "re-export",
          "signature": "splitDouble",
          "summary": ""
        },
        {
          "name": "toCameraSpace",
          "kind": "re-export",
          "signature": "toCameraSpace",
          "summary": ""
        },
        {
          "name": "validateTerrain",
          "kind": "re-export",
          "signature": "validateTerrain",
          "summary": ""
        },
        {
          "name": "validateWeather",
          "kind": "re-export",
          "signature": "validateWeather",
          "summary": ""
        },
        {
          "name": "validateWorldConfig",
          "kind": "re-export",
          "signature": "validateWorldConfig",
          "summary": ""
        },
        {
          "name": "worldToHierarchical",
          "kind": "re-export",
          "signature": "worldToHierarchical",
          "summary": ""
        },
        {
          "name": "worldToPlanetary",
          "kind": "re-export",
          "signature": "worldToPlanetary",
          "summary": ""
        },
        {
          "name": "worldToPlanetaryChunk",
          "kind": "re-export",
          "signature": "worldToPlanetaryChunk",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/ChunkNetworking",
      "path": "engine/reference/world/storage/ChunkNetworking.md",
      "source": "engine/world/storage/ChunkNetworking.js",
      "import": "/engine/world/storage/ChunkNetworking.js",
      "sourceHash": "96f641211f124b04a23db9b283de4103709b57660ef661dae4e2c437f5a50d80",
      "summary": "Versioned multiplayer chunk synchronization with legacy read compatibility. V1 remains the write format during the expand phase. V1, V2, and the original unversioned response shape can be read, allowing rolling upgrades without relabelling or discarding old traffic.",
      "exports": [
        {
          "name": "ChunkNetworking",
          "kind": "class",
          "signature": "class ChunkNetworking",
          "summary": ""
        },
        {
          "name": "CHUNK_NETWORK_PROTOCOL",
          "kind": "constant",
          "signature": "CHUNK_NETWORK_PROTOCOL",
          "summary": "Versioned multiplayer chunk synchronization with legacy read compatibility. V1 remains the write format during the expand phase. V1, V2, and the original unversioned response shape can be read, allowing rolling upgrades without relabelling or discarding old traffic."
        },
        {
          "name": "CHUNK_NETWORK_WRITE_PROTOCOL",
          "kind": "constant",
          "signature": "CHUNK_NETWORK_WRITE_PROTOCOL",
          "summary": ""
        },
        {
          "name": "CHUNK_NETWORK_READ_PROTOCOLS",
          "kind": "constant",
          "signature": "CHUNK_NETWORK_READ_PROTOCOLS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/ChunkPersistence",
      "path": "engine/reference/world/storage/ChunkPersistence.md",
      "source": "engine/world/storage/ChunkPersistence.js",
      "import": "/engine/world/storage/ChunkPersistence.js",
      "sourceHash": "9d34635279d071c568a6c830f4327065a580235a2391827b3f05482795f9b0c4",
      "summary": "ChunkPersistence.js - Chunk Save/Load System Manages chunk persistence with: - Multiple save formats (binary, JSON, compressed) - Delta saves (only modified blocks) - Auto-save with configurable interval - Backup management",
      "exports": [
        {
          "name": "ChunkPersistence",
          "kind": "class",
          "signature": "class ChunkPersistence",
          "summary": ""
        },
        {
          "name": "chunkPersistenceCurrentKey",
          "kind": "function",
          "signature": "chunkPersistenceCurrentKey(legacyKey)",
          "summary": ""
        },
        {
          "name": "prepareChunkPersistenceRecord",
          "kind": "function",
          "signature": "prepareChunkPersistenceRecord(record)",
          "summary": "Validate one exact v1/v2 chunk record without manufacturing an upcast."
        },
        {
          "name": "CHUNK_PERSISTENCE_DB_NAME",
          "kind": "constant",
          "signature": "CHUNK_PERSISTENCE_DB_NAME",
          "summary": "ChunkPersistence.js - Chunk Save/Load System Manages chunk persistence with: - Multiple save formats (binary, JSON, compressed) - Delta saves (only modified blocks) - Auto-save with configurable interval - Backup management"
        },
        {
          "name": "CHUNK_PERSISTENCE_STORE_NAME",
          "kind": "constant",
          "signature": "CHUNK_PERSISTENCE_STORE_NAME",
          "summary": ""
        },
        {
          "name": "CHUNK_PERSISTENCE_RECORD_SCHEMA",
          "kind": "constant",
          "signature": "CHUNK_PERSISTENCE_RECORD_SCHEMA",
          "summary": ""
        },
        {
          "name": "CHUNK_PERSISTENCE_RECORD_VERSION",
          "kind": "constant",
          "signature": "CHUNK_PERSISTENCE_RECORD_VERSION",
          "summary": ""
        },
        {
          "name": "CHUNK_PERSISTENCE_RECORD_LIMITS",
          "kind": "constant",
          "signature": "CHUNK_PERSISTENCE_RECORD_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/ChunkSerializer",
      "path": "engine/reference/world/storage/ChunkSerializer.md",
      "source": "engine/world/storage/ChunkSerializer.js",
      "import": "/engine/world/storage/ChunkSerializer.js",
      "sourceHash": "743165cb7c7d8333cb429a44e554fa7d551e4fb08c60820c68ccfd017e97d223",
      "summary": "Serialize complete chunk state",
      "exports": [
        {
          "name": "serializeChunk",
          "kind": "function",
          "signature": "serializeChunk(chunk, options = {})",
          "summary": "Serialize complete chunk state"
        },
        {
          "name": "deserializeChunk",
          "kind": "function",
          "signature": "deserializeChunk(data, options = {})",
          "summary": "Deserialize chunk from binary data"
        },
        {
          "name": "applyDelta",
          "kind": "function",
          "signature": "applyDelta(voxels, modifications, forward = true)",
          "summary": "Apply delta modifications to voxel array"
        },
        {
          "name": "chunkKey",
          "kind": "function",
          "signature": "chunkKey(x, y, z)",
          "summary": "Create chunk key from coordinates"
        },
        {
          "name": "parseChunkKey",
          "kind": "function",
          "signature": "parseChunkKey(key)",
          "summary": "Parse chunk key to coordinates"
        },
        {
          "name": "estimateChunkSize",
          "kind": "function",
          "signature": "estimateChunkSize(chunk)",
          "summary": "Get serialized chunk size estimate"
        },
        {
          "name": "BinaryReader",
          "kind": "re-export",
          "signature": "BinaryReader",
          "summary": ""
        },
        {
          "name": "BinaryWriter",
          "kind": "re-export",
          "signature": "BinaryWriter",
          "summary": ""
        },
        {
          "name": "CHUNK_MAGIC",
          "kind": "re-export",
          "signature": "CHUNK_MAGIC",
          "summary": ""
        },
        {
          "name": "CHUNK_SIZE",
          "kind": "re-export",
          "signature": "CHUNK_SIZE",
          "summary": ""
        },
        {
          "name": "CHUNK_VERSION",
          "kind": "re-export",
          "signature": "CHUNK_VERSION",
          "summary": ""
        },
        {
          "name": "SECTION_DELTA",
          "kind": "re-export",
          "signature": "SECTION_DELTA",
          "summary": ""
        },
        {
          "name": "SECTION_ENTITIES",
          "kind": "re-export",
          "signature": "SECTION_ENTITIES",
          "summary": ""
        },
        {
          "name": "SECTION_METADATA",
          "kind": "re-export",
          "signature": "SECTION_METADATA",
          "summary": ""
        },
        {
          "name": "SECTION_VOXELS",
          "kind": "re-export",
          "signature": "SECTION_VOXELS",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/DiskMeshCache",
      "path": "engine/reference/world/storage/DiskMeshCache.md",
      "source": "engine/world/storage/DiskMeshCache.js",
      "import": "/engine/world/storage/DiskMeshCache.js",
      "sourceHash": "5021b6f614bfb706f7e822a9c2f3422001ce932762fd436a4f93549a13bf805c",
      "summary": "DiskMeshCache - IndexedDB-backed mesh cache",
      "exports": [
        {
          "name": "DiskMeshCache",
          "kind": "class",
          "signature": "class DiskMeshCache",
          "summary": "DiskMeshCache - IndexedDB-backed mesh cache"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/PaletteCompression",
      "path": "engine/reference/world/storage/PaletteCompression.md",
      "source": "engine/world/storage/PaletteCompression.js",
      "import": "/engine/world/storage/PaletteCompression.js",
      "sourceHash": "750016fa3bddc5a36be2fa1044ab892491e82f7857726a16e2d6739ae7668f58",
      "summary": "CompressedChunk - Palette-compressed voxel storage",
      "exports": [
        {
          "name": "CompressedChunk",
          "kind": "class",
          "signature": "class CompressedChunk",
          "summary": "CompressedChunk - Palette-compressed voxel storage"
        },
        {
          "name": "ChunkCompressor",
          "kind": "class",
          "signature": "class ChunkCompressor",
          "summary": "ChunkCompressor - Manages compression for multiple chunks"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/RLECompression",
      "path": "engine/reference/world/storage/RLECompression.md",
      "source": "engine/world/storage/RLECompression.js",
      "import": "/engine/world/storage/RLECompression.js",
      "sourceHash": "50a0b8b05348f22bf2baa074fac33f84c550e74b68cbded69c2b435b439bfcf8",
      "summary": "RLEChunkCompressor - RLE compression for entire chunks",
      "exports": [
        {
          "name": "RLEChunkCompressor",
          "kind": "class",
          "signature": "class RLEChunkCompressor",
          "summary": "RLEChunkCompressor - RLE compression for entire chunks"
        },
        {
          "name": "HybridChunkCompressor",
          "kind": "class",
          "signature": "class HybridChunkCompressor",
          "summary": "Hybrid compression: Palette + RLE First applies palette compression, then RLE on the indices"
        },
        {
          "name": "encodeColumn",
          "kind": "function",
          "signature": "encodeColumn(column)",
          "summary": "Encode a single column using RLE"
        },
        {
          "name": "decodeColumn",
          "kind": "function",
          "signature": "decodeColumn(encoded, expectedLength)",
          "summary": "Decode RLE column back to raw data"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/RegionFile",
      "path": "engine/reference/world/storage/RegionFile.md",
      "source": "engine/world/storage/RegionFile.js",
      "import": "/engine/world/storage/RegionFile.js",
      "sourceHash": "627dbc93c47116f1bb9c9969d734b0a2ed1f849f6c99d9867224043ed72a8b9e",
      "summary": "RegionFile - Manages a single region file containing 32x32 chunks",
      "exports": [
        {
          "name": "RegionFile",
          "kind": "class",
          "signature": "class RegionFile",
          "summary": "RegionFile - Manages a single region file containing 32x32 chunks"
        },
        {
          "name": "RegionManager",
          "kind": "class",
          "signature": "class RegionManager",
          "summary": "RegionManager - High-level interface for region-based chunk storage"
        },
        {
          "name": "CHUNKS_PER_REGION",
          "kind": "re-export",
          "signature": "CHUNKS_PER_REGION",
          "summary": ""
        },
        {
          "name": "HEADER_SIZE",
          "kind": "re-export",
          "signature": "HEADER_SIZE",
          "summary": ""
        },
        {
          "name": "REGION_SIZE",
          "kind": "re-export",
          "signature": "REGION_SIZE",
          "summary": ""
        },
        {
          "name": "SECTOR_SIZE",
          "kind": "re-export",
          "signature": "SECTOR_SIZE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/StorageBackends",
      "path": "engine/reference/world/storage/StorageBackends.md",
      "source": "engine/world/storage/StorageBackends.js",
      "import": "/engine/world/storage/StorageBackends.js",
      "sourceHash": "07a737f0a493661e3c9cae5d3366c220450da56323de49d97fab68397dad80ae",
      "summary": "StorageBackends.js - Storage backend implementations Extracted from WorldStorage.js for modularity Includes: - OPFSBackend (Origin Private File System) - IndexedDBBackend (fallback) - FileSystemBackend (user-selected folder)",
      "exports": [
        {
          "name": "OPFSBackend",
          "kind": "class",
          "signature": "class OPFSBackend",
          "summary": ""
        },
        {
          "name": "IndexedDBBackend",
          "kind": "class",
          "signature": "class IndexedDBBackend",
          "summary": ""
        },
        {
          "name": "FileSystemBackend",
          "kind": "class",
          "signature": "class FileSystemBackend",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/VoxelCompression",
      "path": "engine/reference/world/storage/VoxelCompression.md",
      "source": "engine/world/storage/VoxelCompression.js",
      "import": "/engine/world/storage/VoxelCompression.js",
      "sourceHash": "41f9a055eaf626355857e641a7045244c0921782ca8844970cdadb3c3335df0d",
      "summary": "Calculate CRC32 checksum",
      "exports": [
        {
          "name": "crc32",
          "kind": "function",
          "signature": "crc32(data)",
          "summary": "Calculate CRC32 checksum"
        },
        {
          "name": "verifyCRC32",
          "kind": "function",
          "signature": "verifyCRC32(data, expectedCRC)",
          "summary": "Verify data integrity"
        },
        {
          "name": "encodeMorton3D",
          "kind": "function",
          "signature": "encodeMorton3D(x, y, z)",
          "summary": "Encode 3D coordinates to Morton code (Z-order)"
        },
        {
          "name": "decodeMorton3D",
          "kind": "function",
          "signature": "decodeMorton3D(morton)",
          "summary": "Decode Morton code to 3D coordinates"
        },
        {
          "name": "generateMortonIndices",
          "kind": "function",
          "signature": "generateMortonIndices(size)",
          "summary": "Generate Morton-order traversal indices for a cubic chunk"
        },
        {
          "name": "getMortonIndices",
          "kind": "function",
          "signature": "getMortonIndices(size)",
          "summary": "Get cached Morton indices for chunk size"
        },
        {
          "name": "linearToMorton",
          "kind": "function",
          "signature": "linearToMorton(data, size)",
          "summary": "Reorder voxel data from linear to Morton order"
        },
        {
          "name": "mortonToLinear",
          "kind": "function",
          "signature": "mortonToLinear(data, size)",
          "summary": "Reorder voxel data from Morton to linear order"
        },
        {
          "name": "buildPalette",
          "kind": "function",
          "signature": "buildPalette(data)",
          "summary": "Build palette from voxel data"
        },
        {
          "name": "bitsForPalette",
          "kind": "function",
          "signature": "bitsForPalette(paletteSize)",
          "summary": "Calculate bits needed for palette size"
        },
        {
          "name": "paletteCompress",
          "kind": "function",
          "signature": "paletteCompress(data)",
          "summary": "Compress voxels using palette compression"
        },
        {
          "name": "paletteDecompress",
          "kind": "function",
          "signature": "paletteDecompress(palette, bits, packed, count)",
          "summary": "Decompress palette-compressed data"
        },
        {
          "name": "rleEncode",
          "kind": "function",
          "signature": "rleEncode(data)",
          "summary": "RLE compress data (auto-trigger: only encodes when beneficial) Format: Literal: byte (if byte != ESCAPE) Escape:  ESCAPE, 0, ESCAPE (literal escape byte) Run:     ESCAPE, count-3, value (run of count bytes)"
        },
        {
          "name": "rleDecode",
          "kind": "function",
          "signature": "rleDecode(data)",
          "summary": "RLE decompress data"
        },
        {
          "name": "compressChunk",
          "kind": "function",
          "signature": "compressChunk(voxels, chunkSize = 32)",
          "summary": "Full compression pipeline for voxel chunk Pipeline: Morton → Palette → RLE"
        },
        {
          "name": "decompressChunk",
          "kind": "function",
          "signature": "decompressChunk(compressed, chunkSize = 32)",
          "summary": "Decompress voxel chunk"
        },
        {
          "name": "encodeDelta",
          "kind": "function",
          "signature": "encodeDelta(modifications)",
          "summary": "Encode chunk modifications as delta"
        },
        {
          "name": "decodeDelta",
          "kind": "function",
          "signature": "decodeDelta(data)",
          "summary": "Decode delta modifications"
        },
        {
          "name": "compressionStats",
          "kind": "function",
          "signature": "compressionStats(original, compressed)",
          "summary": "Create a compression statistics report"
        },
        {
          "name": "testRoundtrip",
          "kind": "function",
          "signature": "testRoundtrip(data, chunkSize = 32)",
          "summary": "Test compression roundtrip"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/WorldStorage",
      "path": "engine/reference/world/storage/WorldStorage.md",
      "source": "engine/world/storage/WorldStorage.js",
      "import": "/engine/world/storage/WorldStorage.js",
      "sourceHash": "ef1f8bb02d3f28a4769b5aca365b9846e675ce5f240b3307c0131670c9e9b5ac",
      "summary": "WorldStorage - Main API for world persistence",
      "exports": [
        {
          "name": "WorldStorage",
          "kind": "class",
          "signature": "class WorldStorage",
          "summary": "WorldStorage - Main API for world persistence"
        },
        {
          "name": "validateWorldMetadata",
          "kind": "function",
          "signature": "validateWorldMetadata(metadata)",
          "summary": "Validate decoded world metadata without mutating it."
        },
        {
          "name": "parseWorldWalHeader",
          "kind": "function",
          "signature": "parseWorldWalHeader(data)",
          "summary": "Parse and validate a WAL header without mutating or persisting the input."
        },
        {
          "name": "parseWorldWal",
          "kind": "function",
          "signature": "parseWorldWal(data)",
          "summary": "Strictly parse and validate an entire WAL before any recovery mutation."
        },
        {
          "name": "WORLD_METADATA_VERSION",
          "kind": "constant",
          "signature": "WORLD_METADATA_VERSION",
          "summary": ""
        },
        {
          "name": "WORLD_WAL_VERSION",
          "kind": "constant",
          "signature": "WORLD_WAL_VERSION",
          "summary": ""
        },
        {
          "name": "FileSystemBackend",
          "kind": "re-export",
          "signature": "FileSystemBackend",
          "summary": ""
        },
        {
          "name": "IndexedDBBackend",
          "kind": "re-export",
          "signature": "IndexedDBBackend",
          "summary": ""
        },
        {
          "name": "OPFSBackend",
          "kind": "re-export",
          "signature": "OPFSBackend",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/storage/index",
      "path": "engine/reference/world/storage/index.md",
      "source": "engine/world/storage/index.js",
      "import": "/engine/world/storage/index.js",
      "sourceHash": "5c786ce5433a94c03856e517e78fb39f913f4b499220ac17b137b3597be6c001",
      "summary": "",
      "exports": [
        {
          "name": "BinaryReader",
          "kind": "re-export",
          "signature": "BinaryReader",
          "summary": ""
        },
        {
          "name": "BinaryWriter",
          "kind": "re-export",
          "signature": "BinaryWriter",
          "summary": ""
        },
        {
          "name": "CHUNK_NETWORK_PROTOCOL",
          "kind": "re-export",
          "signature": "CHUNK_NETWORK_PROTOCOL",
          "summary": ""
        },
        {
          "name": "CHUNK_NETWORK_READ_PROTOCOLS",
          "kind": "re-export",
          "signature": "CHUNK_NETWORK_READ_PROTOCOLS",
          "summary": ""
        },
        {
          "name": "CHUNK_NETWORK_WRITE_PROTOCOL",
          "kind": "re-export",
          "signature": "CHUNK_NETWORK_WRITE_PROTOCOL",
          "summary": ""
        },
        {
          "name": "ChunkCompressor",
          "kind": "re-export",
          "signature": "ChunkCompressor",
          "summary": ""
        },
        {
          "name": "ChunkNetworking",
          "kind": "re-export",
          "signature": "ChunkNetworking",
          "summary": ""
        },
        {
          "name": "ChunkPersistence",
          "kind": "re-export",
          "signature": "ChunkPersistence",
          "summary": ""
        },
        {
          "name": "CompressedChunk",
          "kind": "re-export",
          "signature": "CompressedChunk",
          "summary": ""
        },
        {
          "name": "DiskMeshCache",
          "kind": "re-export",
          "signature": "DiskMeshCache",
          "summary": ""
        },
        {
          "name": "HybridChunkCompressor",
          "kind": "re-export",
          "signature": "HybridChunkCompressor",
          "summary": ""
        },
        {
          "name": "RLEChunkCompressor",
          "kind": "re-export",
          "signature": "RLEChunkCompressor",
          "summary": ""
        },
        {
          "name": "RegionFile",
          "kind": "re-export",
          "signature": "RegionFile",
          "summary": ""
        },
        {
          "name": "RegionManager",
          "kind": "re-export",
          "signature": "RegionManager",
          "summary": ""
        },
        {
          "name": "WORLD_METADATA_VERSION",
          "kind": "re-export",
          "signature": "WORLD_METADATA_VERSION",
          "summary": ""
        },
        {
          "name": "WORLD_WAL_VERSION",
          "kind": "re-export",
          "signature": "WORLD_WAL_VERSION",
          "summary": ""
        },
        {
          "name": "WorldStorage",
          "kind": "re-export",
          "signature": "WorldStorage",
          "summary": ""
        },
        {
          "name": "applyDelta",
          "kind": "re-export",
          "signature": "applyDelta",
          "summary": ""
        },
        {
          "name": "chunkKey",
          "kind": "re-export",
          "signature": "chunkKey",
          "summary": ""
        },
        {
          "name": "compressChunk",
          "kind": "re-export",
          "signature": "compressChunk",
          "summary": ""
        },
        {
          "name": "crc32",
          "kind": "re-export",
          "signature": "crc32",
          "summary": ""
        },
        {
          "name": "decodeColumn",
          "kind": "re-export",
          "signature": "decodeColumn",
          "summary": ""
        },
        {
          "name": "decompressChunk",
          "kind": "re-export",
          "signature": "decompressChunk",
          "summary": ""
        },
        {
          "name": "deserializeChunk",
          "kind": "re-export",
          "signature": "deserializeChunk",
          "summary": ""
        },
        {
          "name": "encodeColumn",
          "kind": "re-export",
          "signature": "encodeColumn",
          "summary": ""
        },
        {
          "name": "estimateChunkSize",
          "kind": "re-export",
          "signature": "estimateChunkSize",
          "summary": ""
        },
        {
          "name": "linearToMorton",
          "kind": "re-export",
          "signature": "linearToMorton",
          "summary": ""
        },
        {
          "name": "mortonToLinear",
          "kind": "re-export",
          "signature": "mortonToLinear",
          "summary": ""
        },
        {
          "name": "parseChunkKey",
          "kind": "re-export",
          "signature": "parseChunkKey",
          "summary": ""
        },
        {
          "name": "parseWorldWal",
          "kind": "re-export",
          "signature": "parseWorldWal",
          "summary": ""
        },
        {
          "name": "parseWorldWalHeader",
          "kind": "re-export",
          "signature": "parseWorldWalHeader",
          "summary": ""
        },
        {
          "name": "serializeChunk",
          "kind": "re-export",
          "signature": "serializeChunk",
          "summary": ""
        },
        {
          "name": "validateWorldMetadata",
          "kind": "re-export",
          "signature": "validateWorldMetadata",
          "summary": ""
        },
        {
          "name": "verifyCRC32",
          "kind": "re-export",
          "signature": "verifyCRC32",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/AdaptiveChunkBudget",
      "path": "engine/reference/world/streaming/AdaptiveChunkBudget.md",
      "source": "engine/world/streaming/AdaptiveChunkBudget.js",
      "import": "/engine/world/streaming/AdaptiveChunkBudget.js",
      "sourceHash": "fa0743b289d2fc94ed406f933a94278d6c6bb69573e456b586efebe9de3d2e76",
      "summary": "AdaptiveChunkBudget.js - Self-optimizing chunk memory management Uses PID-style control with EMA smoothing for smooth, responsive adaptation. Based on game engine best practices for adaptive performance.",
      "exports": [
        {
          "name": "AdaptiveChunkBudget",
          "kind": "class",
          "signature": "class AdaptiveChunkBudget",
          "summary": "AdaptiveChunkBudget.js - Self-optimizing chunk memory management Uses PID-style control with EMA smoothing for smooth, responsive adaptation. Based on game engine best practices for adaptive performance."
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkHistory",
      "path": "engine/reference/world/streaming/ChunkHistory.md",
      "source": "engine/world/streaming/ChunkHistory.js",
      "import": "/engine/world/streaming/ChunkHistory.js",
      "sourceHash": "34e69343ed87f14cc464ac7b53ea16b61a0d46521011e585120051ca4556f78d",
      "summary": "HistoryManager - Global history management",
      "exports": [
        {
          "name": "HistoryManager",
          "kind": "class",
          "signature": "class HistoryManager",
          "summary": "HistoryManager - Global history management"
        },
        {
          "name": "ChunkHistory",
          "kind": "re-export",
          "signature": "ChunkHistory",
          "summary": ""
        },
        {
          "name": "ChunkSnapshot",
          "kind": "re-export",
          "signature": "ChunkSnapshot",
          "summary": ""
        },
        {
          "name": "EntityDespawnOperation",
          "kind": "re-export",
          "signature": "EntityDespawnOperation",
          "summary": ""
        },
        {
          "name": "EntityMoveOperation",
          "kind": "re-export",
          "signature": "EntityMoveOperation",
          "summary": ""
        },
        {
          "name": "EntitySpawnOperation",
          "kind": "re-export",
          "signature": "EntitySpawnOperation",
          "summary": ""
        },
        {
          "name": "FillOperation",
          "kind": "re-export",
          "signature": "FillOperation",
          "summary": ""
        },
        {
          "name": "OP_ENTITY_DESPAWN",
          "kind": "re-export",
          "signature": "OP_ENTITY_DESPAWN",
          "summary": ""
        },
        {
          "name": "OP_ENTITY_MOVE",
          "kind": "re-export",
          "signature": "OP_ENTITY_MOVE",
          "summary": ""
        },
        {
          "name": "OP_ENTITY_SPAWN",
          "kind": "re-export",
          "signature": "OP_ENTITY_SPAWN",
          "summary": ""
        },
        {
          "name": "OP_VOXEL_FILL",
          "kind": "re-export",
          "signature": "OP_VOXEL_FILL",
          "summary": ""
        },
        {
          "name": "OP_VOXEL_SET",
          "kind": "re-export",
          "signature": "OP_VOXEL_SET",
          "summary": ""
        },
        {
          "name": "VoxelOperation",
          "kind": "re-export",
          "signature": "VoxelOperation",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkJobCoordinator",
      "path": "engine/reference/world/streaming/ChunkJobCoordinator.md",
      "source": "engine/world/streaming/ChunkJobCoordinator.js",
      "import": "/engine/world/streaming/ChunkJobCoordinator.js",
      "sourceHash": "882f2a5255d1d84897a4b5b01a871c9568129a88538c7eaa4e9dc7a7e96731c5",
      "summary": "Encode 3D coordinates to Morton code (Z-order curve) Preserves spatial locality for cache-friendly iteration",
      "exports": [
        {
          "name": "ChunkJobCoordinator",
          "kind": "class",
          "signature": "class ChunkJobCoordinator",
          "summary": ""
        },
        {
          "name": "encodeMorton3D",
          "kind": "function",
          "signature": "encodeMorton3D(x, y, z)",
          "summary": "Encode 3D coordinates to Morton code (Z-order curve) Preserves spatial locality for cache-friendly iteration"
        },
        {
          "name": "decodeMorton3D",
          "kind": "function",
          "signature": "decodeMorton3D(morton)",
          "summary": "Decode Morton code back to 3D coordinates"
        },
        {
          "name": "mortonBigmin",
          "kind": "function",
          "signature": "mortonBigmin(current, minMorton, maxMorton)",
          "summary": "BIGMIN optimization: Find next Morton code inside query box Skips irrelevant ranges when iterating Morton-ordered data"
        },
        {
          "name": "JOB_STATE",
          "kind": "constant",
          "signature": "JOB_STATE",
          "summary": "ChunkJobCoordinator.js - Central Job Assignment for Chunk Loading Prevents duplicate chunk loads across multiple systems: - PriorityChunkLoader - ChunkStreaming - ChunkStreamingCompute - ChunkManager.updateStreaming Single source of truth for chunk job state."
        },
        {
          "name": "JOB_SOURCE",
          "kind": "constant",
          "signature": "JOB_SOURCE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkLoadingZone",
      "path": "engine/reference/world/streaming/ChunkLoadingZone.md",
      "source": "engine/world/streaming/ChunkLoadingZone.js",
      "import": "/engine/world/streaming/ChunkLoadingZone.js",
      "sourceHash": "41f454ca900c2455cb6eed2c612f1d2edb864a6a84b759f311f61101e39310bd",
      "summary": "ChunkLoadingZone - Manages player movement boundaries",
      "exports": [
        {
          "name": "ChunkLoadingZone",
          "kind": "class",
          "signature": "class ChunkLoadingZone",
          "summary": "ChunkLoadingZone - Manages player movement boundaries"
        },
        {
          "name": "ZONE_STATE",
          "kind": "constant",
          "signature": "ZONE_STATE",
          "summary": "ChunkLoadingZone.js - Virtual Buffer Wall System Prevents players from advancing past unloaded terrain. Creates an invisible barrier at the edge of generated chunks. Benefits: - Players never see unloaded terrain - Prevents falling through world - Smooth loading experience - Configurable buffer distance Zones: - SAFE: Fully loaded, player can move freely - BUFFER: Loading in progress, soft warning - BARRIER: Not yet loaded, cannot pass"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkSeamSystem",
      "path": "engine/reference/world/streaming/ChunkSeamSystem.md",
      "source": "engine/world/streaming/ChunkSeamSystem.js",
      "import": "/engine/world/streaming/ChunkSeamSystem.js",
      "sourceHash": "d165baf1694e2f814db2f61804919fc63d27f0d924a038c40d59750ed0636d57",
      "summary": "",
      "exports": [
        {
          "name": "ChunkSeamSystem",
          "kind": "class",
          "signature": "class ChunkSeamSystem",
          "summary": ""
        },
        {
          "name": "chunkSeamStructureHash3D",
          "kind": "function",
          "signature": "chunkSeamStructureHash3D(x, y, z)",
          "summary": ""
        },
        {
          "name": "chunkSeamSeededStructureHash3D",
          "kind": "function",
          "signature": "chunkSeamSeededStructureHash3D(x, y, z, seed)",
          "summary": ""
        },
        {
          "name": "chunkSeamChunkSeed3D",
          "kind": "function",
          "signature": "chunkSeamChunkSeed3D(cx, cy, cz, seed = 0)",
          "summary": ""
        },
        {
          "name": "chunkSeamPositionSeed3D",
          "kind": "function",
          "signature": "chunkSeamPositionSeed3D(x, y, z, seed = 0)",
          "summary": ""
        },
        {
          "name": "CHUNK_SIZE",
          "kind": "constant",
          "signature": "CHUNK_SIZE",
          "summary": ""
        },
        {
          "name": "StructureType",
          "kind": "constant",
          "signature": "StructureType",
          "summary": ""
        },
        {
          "name": "GenerationPhase",
          "kind": "constant",
          "signature": "GenerationPhase",
          "summary": ""
        },
        {
          "name": "GenerationPhaseNames",
          "kind": "constant",
          "signature": "GenerationPhaseNames",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkStreaming",
      "path": "engine/reference/world/streaming/ChunkStreaming.md",
      "source": "engine/world/streaming/ChunkStreaming.js",
      "import": "/engine/world/streaming/ChunkStreaming.js",
      "sourceHash": "23b7684476399fbbeae7d5ca0125a263a7ffa0939e9175962a19e61d936ba920",
      "summary": "",
      "exports": [
        {
          "name": "ChunkStreaming",
          "kind": "class",
          "signature": "class ChunkStreaming",
          "summary": ""
        },
        {
          "name": "LoadRequestRingBuffer",
          "kind": "re-export",
          "signature": "LoadRequestRingBuffer",
          "summary": ""
        },
        {
          "name": "PRIORITY_BUCKET",
          "kind": "re-export",
          "signature": "PRIORITY_BUCKET",
          "summary": ""
        },
        {
          "name": "PriorityBucketQueue",
          "kind": "re-export",
          "signature": "PriorityBucketQueue",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkStreamingCompute",
      "path": "engine/reference/world/streaming/ChunkStreamingCompute.md",
      "source": "engine/world/streaming/ChunkStreamingCompute.js",
      "import": "/engine/world/streaming/ChunkStreamingCompute.js",
      "sourceHash": "1f069143c15af5ef143d4ad4a903f038b83af9e70e4bafa05527c56d075bf239",
      "summary": "",
      "exports": [
        {
          "name": "ChunkStreamingCompute",
          "kind": "class",
          "signature": "class ChunkStreamingCompute",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkUpdater",
      "path": "engine/reference/world/streaming/ChunkUpdater.md",
      "source": "engine/world/streaming/ChunkUpdater.js",
      "import": "/engine/world/streaming/ChunkUpdater.js",
      "sourceHash": "97a2b58703cf213e0584942352b7203320d4dea337bdf15a66a09fc768b922e8",
      "summary": "ChunkUpdater.js - Block Update Queue Manager Manages block updates with: - Rate-limited updates per frame - Propagation for lighting/physics - Lazy update batching - Update coalescing",
      "exports": [
        {
          "name": "ChunkUpdater",
          "kind": "class",
          "signature": "class ChunkUpdater",
          "summary": "ChunkUpdater.js - Block Update Queue Manager Manages block updates with: - Rate-limited updates per frame - Propagation for lighting/physics - Lazy update batching - Update coalescing"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ChunkWorkerPool",
      "path": "engine/reference/world/streaming/ChunkWorkerPool.md",
      "source": "engine/world/streaming/ChunkWorkerPool.js",
      "import": "/engine/world/streaming/ChunkWorkerPool.js",
      "sourceHash": "1fe165dae01978a20090a514b909533803768dc193edefb39c957bbe359fd421",
      "summary": "ChunkWorkerPool - Manages a pool of Web Workers",
      "exports": [
        {
          "name": "ChunkWorkerPool",
          "kind": "class",
          "signature": "class ChunkWorkerPool",
          "summary": "ChunkWorkerPool - Manages a pool of Web Workers"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/MovementPredictor",
      "path": "engine/reference/world/streaming/MovementPredictor.md",
      "source": "engine/world/streaming/MovementPredictor.js",
      "import": "/engine/world/streaming/MovementPredictor.js",
      "sourceHash": "5909954d382479d379d31a5c008787d2b1512077450318dbb0d6c9be049f043d",
      "summary": "MovementPredictor - Predicts player movement for chunk prefetch",
      "exports": [
        {
          "name": "MovementPredictor",
          "kind": "class",
          "signature": "class MovementPredictor",
          "summary": "MovementPredictor - Predicts player movement for chunk prefetch"
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/PriorityChunkLoader",
      "path": "engine/reference/world/streaming/PriorityChunkLoader.md",
      "source": "engine/world/streaming/PriorityChunkLoader.js",
      "import": "/engine/world/streaming/PriorityChunkLoader.js",
      "sourceHash": "8189ea16c5303551bcd68271c0ac3fd1d1f1824b076d1008983a0be0b61cacdf",
      "summary": "PriorityChunkLoader.js - Distance-Based Chunk Loading Loads chunks in order from closest to player outward. Uses spiral/ring pattern for optimal loading experience. Benefits: - Player sees nearby terrain first - Smooth loading experience - Efficient resource usage - Integrates with ChunkLoadingZone Patterns: - SPIRAL: Classic spiral from center - RINGS: Concentric rings outward - DIRECTIONAL: Prioritize direction player is facing",
      "exports": [
        {
          "name": "PriorityChunkLoader",
          "kind": "class",
          "signature": "class PriorityChunkLoader",
          "summary": "PriorityChunkLoader - Manages chunk load ordering"
        },
        {
          "name": "LOAD_PATTERN",
          "kind": "constant",
          "signature": "LOAD_PATTERN",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/ProgressiveChunkLoader",
      "path": "engine/reference/world/streaming/ProgressiveChunkLoader.md",
      "source": "engine/world/streaming/ProgressiveChunkLoader.js",
      "import": "/engine/world/streaming/ProgressiveChunkLoader.js",
      "sourceHash": "c4984eadc4925c4de53320d7f67b89cab5e98c32eccef3b0a7f34dad88e08bc7",
      "summary": "ProgressiveChunkLoader - Manages progressive LOD loading",
      "exports": [
        {
          "name": "ProgressiveChunkLoader",
          "kind": "class",
          "signature": "class ProgressiveChunkLoader",
          "summary": "ProgressiveChunkLoader - Manages progressive LOD loading"
        },
        {
          "name": "ChunkRefinementState",
          "kind": "re-export",
          "signature": "ChunkRefinementState",
          "summary": ""
        },
        {
          "name": "PROGRESSIVE_LEVELS",
          "kind": "re-export",
          "signature": "PROGRESSIVE_LEVELS",
          "summary": ""
        },
        {
          "name": "REFINEMENT_DISTANCES",
          "kind": "re-export",
          "signature": "REFINEMENT_DISTANCES",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "world/streaming/index",
      "path": "engine/reference/world/streaming/index.md",
      "source": "engine/world/streaming/index.js",
      "import": "/engine/world/streaming/index.js",
      "sourceHash": "bfbb67b412b7038332453acf22c1df99216cb51645e5fc9db94cc98932cb00ba",
      "summary": "",
      "exports": [
        {
          "name": "AdaptiveChunkBudget",
          "kind": "re-export",
          "signature": "AdaptiveChunkBudget",
          "summary": ""
        },
        {
          "name": "ChunkHistory",
          "kind": "re-export",
          "signature": "ChunkHistory",
          "summary": ""
        },
        {
          "name": "ChunkJobCoordinator",
          "kind": "re-export",
          "signature": "ChunkJobCoordinator",
          "summary": ""
        },
        {
          "name": "ChunkLoadingZone",
          "kind": "re-export",
          "signature": "ChunkLoadingZone",
          "summary": ""
        },
        {
          "name": "ChunkSeamSystem",
          "kind": "re-export",
          "signature": "ChunkSeamSystem",
          "summary": ""
        },
        {
          "name": "ChunkStreamer",
          "kind": "re-export",
          "signature": "ChunkStreamer",
          "summary": ""
        },
        {
          "name": "ChunkStreaming",
          "kind": "re-export",
          "signature": "ChunkStreaming",
          "summary": ""
        },
        {
          "name": "ChunkStreamingCompute",
          "kind": "re-export",
          "signature": "ChunkStreamingCompute",
          "summary": ""
        },
        {
          "name": "ChunkUpdater",
          "kind": "re-export",
          "signature": "ChunkUpdater",
          "summary": ""
        },
        {
          "name": "ChunkWorkerPool",
          "kind": "re-export",
          "signature": "ChunkWorkerPool",
          "summary": ""
        },
        {
          "name": "GenerationPhase",
          "kind": "re-export",
          "signature": "GenerationPhase",
          "summary": ""
        },
        {
          "name": "HistoryManager",
          "kind": "re-export",
          "signature": "HistoryManager",
          "summary": ""
        },
        {
          "name": "JOB_SOURCE",
          "kind": "re-export",
          "signature": "JOB_SOURCE",
          "summary": ""
        },
        {
          "name": "JOB_STATE",
          "kind": "re-export",
          "signature": "JOB_STATE",
          "summary": ""
        },
        {
          "name": "LOAD_PATTERN",
          "kind": "re-export",
          "signature": "LOAD_PATTERN",
          "summary": ""
        },
        {
          "name": "LoadRequestRingBuffer",
          "kind": "re-export",
          "signature": "LoadRequestRingBuffer",
          "summary": ""
        },
        {
          "name": "MovementPredictor",
          "kind": "re-export",
          "signature": "MovementPredictor",
          "summary": ""
        },
        {
          "name": "PRIORITY_BUCKET",
          "kind": "re-export",
          "signature": "PRIORITY_BUCKET",
          "summary": ""
        },
        {
          "name": "PriorityBucketQueue",
          "kind": "re-export",
          "signature": "PriorityBucketQueue",
          "summary": ""
        },
        {
          "name": "PriorityChunkLoader",
          "kind": "re-export",
          "signature": "PriorityChunkLoader",
          "summary": ""
        },
        {
          "name": "ProgressiveChunkLoader",
          "kind": "re-export",
          "signature": "ProgressiveChunkLoader",
          "summary": ""
        },
        {
          "name": "StructureType",
          "kind": "re-export",
          "signature": "StructureType",
          "summary": ""
        },
        {
          "name": "ZONE_STATE",
          "kind": "re-export",
          "signature": "ZONE_STATE",
          "summary": ""
        }
      ],
      "subsystem": "engine"
    },
    {
      "schemaVersion": 1,
      "title": "boot",
      "path": "plauna/reference/boot.md",
      "source": "plauna/boot.js",
      "import": "/plauna/boot.js",
      "sourceHash": "d31c2e44005687827c650d109af0c4537f69ccd82d1141fcdeed63534897d78b",
      "summary": "============================================================================ PLAUNA ENGINE BOOTSTRAP ============================================================================ PlaunaDevShell is the main entry point for the Plauna UI system. It: 1. Initializes the rendering pipeline (WidgetRenderer, DOMRenderer) 2. Loads and applies themes from plauna/themes/{id}/theme.json 3. Sets up the workspace system for virtual desktops (optional GPU panels) 4. Injects base CSS for the widget gallery/showcase 5. Provides a public API for theme switching and widget rendering ARCHITECTURE FLOW: - PlaunaDevShell.boot(root, options) → PlaunaDevShell instance - _init() → loads styles, theme, workspace manager - ThemeLoader applies CSS variables to :root - WidgetRenderer converts UINode trees to DOM - WorkspaceManager (optional) handles GPU-accelerated panels USAGE: const shell = await PlaunaDevShell.boot(document.body, { logger: console }); shell.setTheme('dark'); const element = shell.render(myUINode); document.body.appendChild(element); THEME SYSTEM: - Themes live in plauna/themes/{id}/theme.json - Themes can extend other themes via \"extends\": \"parent\" - CSS variables are written to <style data-plauna-theme=\"1\"> tags - Per-session overrides can be applied via applyOverrides() WORKSPACE SYSTEM (OPTIONAL): - Requires gpuDevice option for WebGPU support - Creates virtual desktop layers for multi-panel layouts - Supports DOM panels and GPU panels (WebGPU textures) - Managed by WorkspaceManager class",
      "exports": [
        {
          "name": "PlaunaDevShell",
          "kind": "class",
          "signature": "class PlaunaDevShell",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "console/PlaunaConsole",
      "path": "plauna/reference/console/PlaunaConsole.md",
      "source": "plauna/console/PlaunaConsole.js",
      "import": "/plauna/console/PlaunaConsole.js",
      "sourceHash": "d070c3f2d9b3cc92382af993554f65fc4bd7425bec674bf37f4acc2cc86a287e",
      "summary": "PlaunaConsole - Main console system for Plauna Integrates HtmlConsole with Plauna-specific features and debugging capabilities",
      "exports": [
        {
          "name": "createPlaunaConsole",
          "kind": "function",
          "signature": "createPlaunaConsole(options = {})",
          "summary": ""
        },
        {
          "name": "getPlaunaConsole",
          "kind": "function",
          "signature": "getPlaunaConsole()",
          "summary": ""
        },
        {
          "name": "PlaunaConsole",
          "kind": "constant",
          "signature": "PlaunaConsole",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/BindingEngine",
      "path": "plauna/reference/core/BindingEngine.md",
      "source": "plauna/core/BindingEngine.js",
      "import": "/plauna/core/BindingEngine.js",
      "sourceHash": "84a41e35c48b8c31f4d13ec4b96ea21d53ab8d9748dd1ebb44dd39a6d15ec606",
      "summary": "Lifecycle-safe StateStore -> UINode bindings and UINode -> intent dispatch. Two-way bindings never promote local UI values into authoritative state.",
      "exports": [
        {
          "name": "BindingEngine",
          "kind": "class",
          "signature": "class BindingEngine",
          "summary": "Lifecycle-safe StateStore -> UINode bindings and UINode -> intent dispatch. Two-way bindings never promote local UI values into authoritative state."
        },
        {
          "name": "BindingUtils",
          "kind": "constant",
          "signature": "BindingUtils",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/DOMRenderer",
      "path": "plauna/reference/core/DOMRenderer.md",
      "source": "plauna/core/DOMRenderer.js",
      "import": "/plauna/core/DOMRenderer.js",
      "sourceHash": "baa0a98fc60b7e6b42dc3f78b1c776b6b50d478911019906e04e377413b17b20",
      "summary": "============================================================================ DOMRenderer - Visual Tree to DOM Renderer ============================================================================ DOMRenderer connects Plauna's retained-mode UINode system to the browser DOM. It takes a VisualTree (rooted UINode tree) and renders it to actual DOM elements. DIFFERENCES FROM WidgetRenderer: - WidgetRenderer: Converts single UINode widgets to DOM (used by widgets themselves) - DOMRenderer: Renders entire visual tree from game/engine to DOM (used by PlaunaApp) RENDERING FLOW: 1. render(visualTree) - Entry point, renders entire tree to container 2. renderNode(node) - Recursively renders node and all children 3. createDOMElement(node) - Creates DOM element based on node type 4. Applies styles, attributes, and content 5. Updates mapping tables for bidirectional lookup MAPPING TABLES: - nodeToDOM: Map<UINode, HTMLElement> - UINode → DOM element - domToNode: Map<HTMLElement, UINode> - DOM element → UINode (reverse lookup) - renderedNodes: Set<UINode> - Track which nodes have been rendered ELEMENT TYPE HANDLING: - 'text': Renders as <div> with text content - 'button': <button> element - 'input': <input> element with type, value, placeholder, validation attributes - 'image': <img> element with src, alt - 'svg': SVG namespace elements for graphics - Other: <div> as fallback DIRTY FLAG PROCESSING: - DIRTY.STYLE: Re-apply inline styles to DOM - DIRTY.LAYOUT: Re-compute position/size - DIRTY.PAINT: Re-render entire node - DIRTY.TEXT: Update text content - DIRTY.CHILDREN: Re-render child subtree UPDATE MECHANISM: - updateNode(node): Incrementally updates a single node based on dirty flags - updateDOMElement(element, node): Applies node properties to DOM element - processStyleDirty(nodes): Batch updates for style changes TEXT SERVICE: - Optional textService for internationalization - If provided, wraps text content through translation layer",
      "exports": [
        {
          "name": "DOMRenderer",
          "kind": "class",
          "signature": "class DOMRenderer",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/DirtyGraph",
      "path": "plauna/reference/core/DirtyGraph.md",
      "source": "plauna/core/DirtyGraph.js",
      "import": "/plauna/core/DirtyGraph.js",
      "sourceHash": "b7219d3bb232d8a74435db239bad02690060bf219da33bd28e93329d00c81301",
      "summary": "DirtyGraph - Optimized dirty flag propagation and update scheduling. Dirty flag management pattern: - Efficient dirty flag propagation for large UI trees - Categorizes dirty flags by type (STYLE, LAYOUT, PAINT, etc.) - Batch processing of dirty nodes - Performance tracking for propagation timing Propagation rules: - LAYOUT dirtiness propagates to parent - PAINT dirtiness propagates to parent if node affects parent's paint - CHILDREN dirtiness propagates to descendants - STYLE dirtiness propagates to descendants if style affects them Architecture: - dirtyNodes: Set of all dirty nodes - dirtySets: Map of flag → Set of nodes (categorized by flag type) - propagationQueue: Queue for deferred propagations - isProcessing: Flag to prevent re-entrant propagation",
      "exports": [
        {
          "name": "DirtyGraph",
          "kind": "class",
          "signature": "class DirtyGraph",
          "summary": ""
        },
        {
          "name": "DirtyFlags",
          "kind": "constant",
          "signature": "DirtyFlags",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/ModuleTester",
      "path": "plauna/reference/core/ModuleTester.md",
      "source": "plauna/core/ModuleTester.js",
      "import": "/plauna/core/ModuleTester.js",
      "sourceHash": "cd14bad87d5e35c23aaac9bf7879fcb1c695f58417d42c0d5b1a9216b57339c1",
      "summary": "PlaunaModuleTester - Smoke-test runner for modules/widgets. Module testing pattern: - Verifies module registration and instantiation - Exposes widget properties for console diagnostics - Summarizes complex values for readable output - Tracks widget registry and available widgets Testing features: - Module registration verification - Widget instantiation testing - Property exposure and summarization - Value normalization for comparison Helper functions: - summarizeValue(): Human-readable value summaries - normalizeComparableValue(): Normalize values for comparison - isPlainObject(): Check if value is plain object",
      "exports": [
        {
          "name": "PlaunaModuleTester",
          "kind": "class",
          "signature": "class PlaunaModuleTester",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/StateStore",
      "path": "plauna/reference/core/StateStore.md",
      "source": "plauna/core/StateStore.js",
      "import": "/plauna/core/StateStore.js",
      "sourceHash": "d9c02b06768a78d2cd3508ca0002f3540d762714191b06ccf7262580aec83b98",
      "summary": "Observable projection store used by Plauna bindings. The store is intentionally authority-neutral: networked UI writes arrive as projections, while user actions leave through BindingEngine intent handlers.",
      "exports": [
        {
          "name": "StateStore",
          "kind": "class",
          "signature": "class StateStore",
          "summary": ""
        },
        {
          "name": "createStore",
          "kind": "function",
          "signature": "createStore(initialState = {}, options = {})",
          "summary": ""
        },
        {
          "name": "useStore",
          "kind": "function",
          "signature": "useStore(store, path, defaultValue)",
          "summary": "Framework-neutral compatibility helper. The third tuple item subscribes to future values; no React global or hidden lifecycle is required."
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/UINode",
      "path": "plauna/reference/core/UINode.md",
      "source": "plauna/core/UINode.js",
      "import": "/plauna/core/UINode.js",
      "sourceHash": "7a6bbb78ba49c9db51262eb5cd32373711fdd14a414ca5f83159da87150607ea",
      "summary": "============================================================================ UINode - Retained Visual Tree Node ============================================================================ UINode is the base class for all UI nodes in Plauna's retained visual tree. It represents a node in a virtual DOM-like tree that can be rendered to actual DOM. KEY CONCEPTS: - Retained Mode: The tree persists in memory and is incrementally updated - Dirty Flags: Bits that track what parts of the node need re-rendering - Layout Box: Computed layout metrics (position, size, margins, padding) - Event Handlers: Map of event types to handler functions - Accessibility: ARIA attributes and role information DIRTY FLAGS (bitmask): - STYLE: CSS styles changed → re-apply styles to DOM - LAYOUT: Position/size changed → re-compute layout - PAINT: Visual appearance changed → re-render to DOM - TEXT: Text content changed → update text nodes - ACCESSIBILITY: ARIA attributes changed → update DOM attributes - CHILDREN: Child nodes added/removed → re-render subtree - FOCUS: Focus state changed → update focus ring NODE STATE (bitmask): - VISIBLE: Node is visible - FOCUSED: Node has keyboard focus - HOVERED: Mouse is over the node - ACTIVE: Node is being pressed/clicked - DISABLED: Node is disabled - FOCUSABLE: Node can receive focus - CHECKED: Checkbox/radio is checked - SELECTED: Option is selected - LOADING: Node is in loading/processing state - ERROR: Node is in error/validation failure state INPUT FLAGS (bitmask): - POINTER_CAPTURE: Node captures pointer events - KEYBOARD_CAPTURE: Node captures keyboard events - DRAG_TARGET: Node is a drag target - DROP_TARGET: Node is a drop target - SCROLLABLE: Node can be scrolled RENDER FLAGS (bitmask): - CLIPS_CONTENT: Children outside bounds are clipped - OPAQUE: Node is fully opaque (optimization hint) - REQUIRES_LAYER: Needs separate compositing layer - TRANSFORM_CHANGED: Transform property changed - OPACITY_CHANGED: Opacity property changed TREE STRUCTURE: - parent: Reference to parent UINode - children: Array of child UINodes - firstChild/lastChild: Linked list pointers for fast traversal - nextSibling/previousSibling: Linked list pointers for siblings LAYOUT BOX: - x, y: Position relative to parent - width, height: Computed size - minX, minY, maxX, maxY: Computed bounds - paddingLeft, paddingTop, paddingRight, paddingBottom: Padding - marginLeft, marginTop, marginRight, marginBottom: Margin - borderLeft, borderTop, borderRight, borderBottom: Border width",
      "exports": [
        {
          "name": "UINode",
          "kind": "class",
          "signature": "class UINode",
          "summary": ""
        },
        {
          "name": "DIRTY",
          "kind": "constant",
          "signature": "DIRTY",
          "summary": "UINode - Retained visual tree node. UINode pattern: - Base class for all UI nodes in Plauna's retained visual tree - Virtual DOM-like tree that persists in memory - Incrementally updated via dirty flags - Supports tree structure (parent/children/siblings) - Event handling and accessibility support Key concepts: - Dirty flags: Track what needs re-rendering - Layout box: Computed layout metrics - Event handlers: Map of event types to functions - Accessibility: ARIA attributes and role information"
        },
        {
          "name": "NODE_STATE",
          "kind": "constant",
          "signature": "NODE_STATE",
          "summary": ""
        },
        {
          "name": "INPUT_FLAGS",
          "kind": "constant",
          "signature": "INPUT_FLAGS",
          "summary": ""
        },
        {
          "name": "RENDER_FLAGS",
          "kind": "constant",
          "signature": "RENDER_FLAGS",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/VisualTree",
      "path": "plauna/reference/core/VisualTree.md",
      "source": "plauna/core/VisualTree.js",
      "import": "/plauna/core/VisualTree.js",
      "sourceHash": "40a304f28cba2cfd252ad92daebb8301147a991c2a93ac1cd0c3d704e2ec53f7",
      "summary": "VisualTree - Manages the retained visual tree and dirty propagation. Visual tree management pattern: - Manages UINode hierarchy with root node - Dirty flag management and propagation - Update scheduling with requestAnimationFrame - Performance tracking for update timing - Callback hooks for layout, paint, accessibility updates Features: - setRoot(): Change root node (marks subtree dirty) - markDirty(): Mark node as dirty (schedules update) - markSubtreeDirty(): Mark entire subtree as dirty - update(): Main update loop (processes dirty nodes) Update queues: - layoutQueue: Nodes needing layout recalculation - paintQueue: Nodes needing paint updates - textQueue: Nodes needing text content updates - accessibilityQueue: Nodes needing ARIA updates Architecture: - root: Root UINode of the tree - dirtyNodes: Set of all dirty nodes - isUpdating: Flag to prevent re-entrant updates - updateScheduled: Flag for RAF scheduling",
      "exports": [
        {
          "name": "VisualTree",
          "kind": "class",
          "signature": "class VisualTree",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/app",
      "path": "plauna/reference/core/app.md",
      "source": "plauna/core/app.js",
      "import": "/plauna/core/app.js",
      "sourceHash": "fa1cd3d492de7123a87031e63713b644c41679296bf419788ad9487612582134",
      "summary": "============================================================================ PlaunaApp - Main Plauna Application Class ============================================================================ PlaunaApp is the main application class that integrates Plauna UI with the Particle Engine. It manages the visual tree, rendering, events, and development tools. CORE COMPONENTS: - VisualTree: Retained-mode UI tree (UINode hierarchy) - DOMRenderer: Renders visual tree to DOM elements - PlaunaEventSystem: Event handling and dispatching - ThemeManager: Theme management and CSS variable application - TransitionEngine: Animation and transition system - PlaunaTextService: Text internationalization (pretext) - PlaunaSurfaceManager: Surface/layer management - PlaunaGPUBridge: GPU integration bridge - PlaunaRegistry: Component registry DEVELOPMENT TOOLS: - TreeInspector: Visual tree inspector for debugging - StyleInspector: Style inspector for debugging - HotReload: Hot module replacement for development - PlaunaModuleTester: Module testing framework - PlaunaSmartContextMenu: Context-aware right-click menu INTEGRATION WITH PARTICLE ENGINE: - Uses ECS World from engine/ecs/world/World.js - Integrates with GPU via PlaunaGPUBridge - Uses PlaunaSurfaceManager for surface management - Text engine integration (pretext or custom) INITIALIZATION FLOW: 1. createPlaunaApp(options) - Factory function 2. PlaunaApp constructor - Sets up core components 3. initialize() - Initializes all subsystems 4. mount() - Mounts to root DOM element OPTIONS: - root: Required DOM element to mount to - getVGPU: Function to get VGPU instance - engine: Particle engine instance - editor: Editor instance (optional) - useCSS: Enable CSS injection (default: true) - textEngine: Text engine to use ('pretext' or custom) - enableModuleTester: Enable module tester (default: true) - enableSmartContextMenu: Enable smart context menu (default: true) PUBLIC API: - mount(): Mount app to root element - destroy(): Cleanup and destroy app - addComponent(): Add component to registry - getComponent(): Get component from registry - visualTree: Access visual tree instance - renderer: Access DOM renderer instance - eventSystem: Access event system instance - themeManager: Access theme manager instance LIFECYCLE: - Created via createPlaunaApp() factory - Must call mount() to display UI - Call destroy() to cleanup USAGE: const app = await createPlaunaApp({ root: document.body, getVGPU: () => vgpuInstance, engine: particleEngine }); await app.mount(); // ... use app app.destroy();",
      "exports": [
        {
          "name": "PlaunaApp",
          "kind": "class",
          "signature": "class PlaunaApp",
          "summary": "PlaunaApp - Main Plauna application class. Application architecture: - Integrates Plauna UI with Particle Engine - Manages visual tree, rendering, events, and development tools - Provides public API for component registration and access Core systems: - uiWorld: ECS World for UI entities - textService: Internationalization service - surfaceManager: Surface/layer management - gpuBridge: GPU integration bridge - registry: Component registry - events: Event system Retained-mode systems: - visualTree: UINode hierarchy - domRenderer: DOM renderer - themeManager: Theme management - transitionEngine: Animation system Development tools: - treeInspector: Visual tree inspector - styleInspector: Style inspector - hotReload: Hot module replacement - moduleTester: Module testing framework - smartContextMenu: Context-aware menu"
        },
        {
          "name": "createPlaunaApp",
          "kind": "function",
          "signature": "async createPlaunaApp(options = {})",
          "summary": "PlaunaApp factory function. Application factory pattern: - Creates PlaunaApp instance with provided options - Initializes core components (visual tree, renderer, events) - Sets up development tools if enabled - Returns ready-to-use app instance"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/events",
      "path": "plauna/reference/core/events.md",
      "source": "plauna/core/events.js",
      "import": "/plauna/core/events.js",
      "sourceHash": "75143ae4ff97520c4e94170d5d0ade390fac3be45053d9a9305e62891a88754c",
      "summary": "PlaunaEventSystem - Event system for Plauna. Event bus pattern: - Simple publish-subscribe event system - Follows existing engine/ editor patterns - Supports multiple listeners per event - Returns unsubscribe function for cleanup - Error handling for faulty event handlers Features: - on(): Subscribe to event with callback - off(): Unsubscribe from event - emit(): Dispatch event to all listeners - once(): Subscribe for single event occurrence - removeAllListeners(): Clean up listeners",
      "exports": [
        {
          "name": "PlaunaEventSystem",
          "kind": "class",
          "signature": "class PlaunaEventSystem",
          "summary": "PlaunaEventSystem - Event system for Plauna. Event bus pattern: - Simple publish-subscribe event system - Follows existing engine/ editor patterns - Supports multiple listeners per event - Returns unsubscribe function for cleanup - Error handling for faulty event handlers Features: - on(): Subscribe to event with callback - off(): Unsubscribe from event - emit(): Dispatch event to all listeners - once(): Subscribe for single event occurrence - removeAllListeners(): Clean up listeners"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "core/registry",
      "path": "plauna/reference/core/registry.md",
      "source": "plauna/core/registry.js",
      "import": "/plauna/core/registry.js",
      "sourceHash": "faf0559658c98b905f93f3a4305ef28d04d456c05dcb8f57a18c60fa01d82b92",
      "summary": "PlaunaRegistry - Registry for views, surfaces, and templates. Registry pattern: - Centralized registration system for UI components - Follows existing engine registry patterns - Supports views, surfaces, templates, and factories - Warns on duplicate registrations (overwrites) - Provides getters for retrieving registered items Registry types: - views: UI view configurations with render mode, size, closability - surfaces: Surface definitions for GPU rendering (viewport, texture) - templates: Reusable template configurations - factories: Factory functions for component instantiation",
      "exports": [
        {
          "name": "PlaunaRegistry",
          "kind": "class",
          "signature": "class PlaunaRegistry",
          "summary": "PlaunaRegistry - Registry for views, surfaces, and templates. Registry pattern: - Centralized registration system for UI components - Follows existing engine registry patterns - Supports views, surfaces, templates, and factories - Warns on duplicate registrations (overwrites) - Provides getters for retrieving registered items Registry types: - views: UI view configurations with render mode, size, closability - surfaces: Surface definitions for GPU rendering (viewport, texture) - templates: Reusable template configurations - factories: Factory functions for component instantiation"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "ecs/components",
      "path": "plauna/reference/ecs/components.md",
      "source": "plauna/ecs/components.js",
      "import": "/plauna/ecs/components.js",
      "sourceHash": "bf7d44078da0290a44c0d714514657ccca31fa082475beb4ad80150a96a4e6fb",
      "summary": "Plauna ECS Components Follow existing engine component registration patterns.",
      "exports": [
        {
          "name": "UIRoot",
          "kind": "constant",
          "signature": "UIRoot",
          "summary": ""
        },
        {
          "name": "UIWorkspace",
          "kind": "constant",
          "signature": "UIWorkspace",
          "summary": ""
        },
        {
          "name": "UIZone",
          "kind": "constant",
          "signature": "UIZone",
          "summary": ""
        },
        {
          "name": "UIGroup",
          "kind": "constant",
          "signature": "UIGroup",
          "summary": ""
        },
        {
          "name": "UIView",
          "kind": "constant",
          "signature": "UIView",
          "summary": ""
        },
        {
          "name": "UILayout",
          "kind": "constant",
          "signature": "UILayout",
          "summary": ""
        },
        {
          "name": "UIAnchor",
          "kind": "constant",
          "signature": "UIAnchor",
          "summary": ""
        },
        {
          "name": "UISurface",
          "kind": "constant",
          "signature": "UISurface",
          "summary": ""
        },
        {
          "name": "UIShape",
          "kind": "constant",
          "signature": "UIShape",
          "summary": ""
        },
        {
          "name": "UIWarp",
          "kind": "constant",
          "signature": "UIWarp",
          "summary": ""
        },
        {
          "name": "UIBinding",
          "kind": "constant",
          "signature": "UIBinding",
          "summary": ""
        },
        {
          "name": "UIState",
          "kind": "constant",
          "signature": "UIState",
          "summary": ""
        },
        {
          "name": "UIInput",
          "kind": "constant",
          "signature": "UIInput",
          "summary": ""
        },
        {
          "name": "UIText",
          "kind": "constant",
          "signature": "UIText",
          "summary": ""
        },
        {
          "name": "UITextLayout",
          "kind": "constant",
          "signature": "UITextLayout",
          "summary": ""
        },
        {
          "name": "UIPanel",
          "kind": "constant",
          "signature": "UIPanel",
          "summary": ""
        },
        {
          "name": "UITab",
          "kind": "constant",
          "signature": "UITab",
          "summary": ""
        },
        {
          "name": "UISplit",
          "kind": "constant",
          "signature": "UISplit",
          "summary": ""
        },
        {
          "name": "UINest",
          "kind": "constant",
          "signature": "UINest",
          "summary": ""
        },
        {
          "name": "UIFoodSource",
          "kind": "constant",
          "signature": "UIFoodSource",
          "summary": ""
        },
        {
          "name": "UIGPUResource",
          "kind": "constant",
          "signature": "UIGPUResource",
          "summary": ""
        },
        {
          "name": "UIAtlas",
          "kind": "constant",
          "signature": "UIAtlas",
          "summary": ""
        },
        {
          "name": "UIGlyph",
          "kind": "constant",
          "signature": "UIGlyph",
          "summary": ""
        },
        {
          "name": "UIDockLayout",
          "kind": "constant",
          "signature": "UIDockLayout",
          "summary": ""
        },
        {
          "name": "UIFloatingWindow",
          "kind": "constant",
          "signature": "UIFloatingWindow",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "editor/HotReload",
      "path": "plauna/reference/editor/HotReload.md",
      "source": "plauna/editor/HotReload.js",
      "import": "/plauna/editor/HotReload.js",
      "sourceHash": "393d78661c953cbf83d8c88d6f2bc685e26ac4f7960eaef38500dfffc68ab492",
      "summary": "HotReload - Live development tool for Plauna Provides hot module replacement and live style updates with robust validation",
      "exports": [
        {
          "name": "HotReload",
          "kind": "class",
          "signature": "class HotReload",
          "summary": ""
        },
        {
          "name": "plaunaHotReloadTextHash",
          "kind": "function",
          "signature": "plaunaHotReloadTextHash(text)",
          "summary": ""
        },
        {
          "name": "HotReloadUtils",
          "kind": "constant",
          "signature": "HotReloadUtils",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "editor/StyleInspector",
      "path": "plauna/reference/editor/StyleInspector.md",
      "source": "plauna/editor/StyleInspector.js",
      "import": "/plauna/editor/StyleInspector.js",
      "sourceHash": "75a8b3f32567678c8f74951062310a9d047c66cb54e6b171c45500c70ce923bb",
      "summary": "StyleInspector - Live style debugging tool for Plauna Provides real-time style inspection and editing capabilities",
      "exports": [
        {
          "name": "StyleInspector",
          "kind": "class",
          "signature": "class StyleInspector",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "editor/TreeInspector",
      "path": "plauna/reference/editor/TreeInspector.md",
      "source": "plauna/editor/TreeInspector.js",
      "import": "/plauna/editor/TreeInspector.js",
      "sourceHash": "8fcd8150e36600245e13fb15e6bfce1b6fc46cf3d8666ff17eec4bbad4d730eb",
      "summary": "TreeInspector - Visual tree inspector for Plauna Provides debugging and inspection of the UI visual tree",
      "exports": [
        {
          "name": "TreeInspector",
          "kind": "class",
          "signature": "class TreeInspector",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "index",
      "path": "plauna/reference/index.md",
      "source": "plauna/index.js",
      "import": "/plauna/index.js",
      "sourceHash": "353156a52d0d71b18737eda0e86d82bb5376c4e5dc78e6ad4865c988c838f609",
      "summary": "Plauna - Advanced UI System for Particle Engine Browser-first UI runtime with hybrid DOM/GPU rendering ============================================================================ MODULE STRUCTURE ============================================================================ This is the main entry point for the Plauna UI system. It re-exports all public APIs in a structured, organized manner. Export Categories: Core System: - createPlaunaApp: Main application entry point - PlaunaModuleTester: Module testing utilities - UINode, DIRTY, NODE_STATE: Core retained-mode UI tree - VisualTree: Visual tree management UI Components: - PlaunaSmartContextMenu: Type-aware context menu for debugging - PlaunaTextService: Internationalization service (Pretext) - PlaunaSurfaceManager: Surface/layer management - PlaunaGPUBridge: WebGPU integration bridge Widget System: - Layout widgets: Grid, Divider, Spacer - Primitive widgets: Button, Panel, Text, Modal, Tooltip, Badge, Avatar, Progress, Skeleton - Form widgets: Input, Checkbox, Radio, Switch, Select, Textarea, Slider, Rating - Navigation widgets: Tabs, Dropdown, Breadcrumb, Pagination - Data view widgets: ListView, Card Utilities: - Style system: Design tokens, theme management - Console system: PlaunaConsole for debugging - Notification system: Toast, Notify - Showcase system: WidgetShowcase for widget gallery - Particle controller: ParticleController for particle integration Lab/Development: - mountPlaunaWorkbenchLab: Workbench development environment - mountShowcaseApp: Widget showcase application",
      "exports": [
        {
          "name": "Avatar",
          "kind": "re-export",
          "signature": "Avatar",
          "summary": ""
        },
        {
          "name": "BUILD_TAG",
          "kind": "re-export",
          "signature": "BUILD_TAG",
          "summary": ""
        },
        {
          "name": "Badge",
          "kind": "re-export",
          "signature": "Badge",
          "summary": ""
        },
        {
          "name": "BindingEngine",
          "kind": "re-export",
          "signature": "BindingEngine",
          "summary": ""
        },
        {
          "name": "BindingUtils",
          "kind": "re-export",
          "signature": "BindingUtils",
          "summary": ""
        },
        {
          "name": "Breadcrumb",
          "kind": "re-export",
          "signature": "Breadcrumb",
          "summary": ""
        },
        {
          "name": "Button",
          "kind": "re-export",
          "signature": "Button",
          "summary": ""
        },
        {
          "name": "Card",
          "kind": "re-export",
          "signature": "Card",
          "summary": ""
        },
        {
          "name": "Checkbox",
          "kind": "re-export",
          "signature": "Checkbox",
          "summary": ""
        },
        {
          "name": "DIRTY",
          "kind": "re-export",
          "signature": "DIRTY",
          "summary": ""
        },
        {
          "name": "Divider",
          "kind": "re-export",
          "signature": "Divider",
          "summary": ""
        },
        {
          "name": "Dropdown",
          "kind": "re-export",
          "signature": "Dropdown",
          "summary": ""
        },
        {
          "name": "Grid",
          "kind": "re-export",
          "signature": "Grid",
          "summary": ""
        },
        {
          "name": "INPUT_FLAGS",
          "kind": "re-export",
          "signature": "INPUT_FLAGS",
          "summary": ""
        },
        {
          "name": "Input",
          "kind": "re-export",
          "signature": "Input",
          "summary": ""
        },
        {
          "name": "ListView",
          "kind": "re-export",
          "signature": "ListView",
          "summary": ""
        },
        {
          "name": "Modal",
          "kind": "re-export",
          "signature": "Modal",
          "summary": ""
        },
        {
          "name": "NODE_STATE",
          "kind": "re-export",
          "signature": "NODE_STATE",
          "summary": ""
        },
        {
          "name": "NotificationSystem",
          "kind": "re-export",
          "signature": "NotificationSystem",
          "summary": ""
        },
        {
          "name": "Notify",
          "kind": "re-export",
          "signature": "Notify",
          "summary": ""
        },
        {
          "name": "PLAUNA_FULL",
          "kind": "re-export",
          "signature": "PLAUNA_FULL",
          "summary": ""
        },
        {
          "name": "PLAUNA_VERSION",
          "kind": "re-export",
          "signature": "PLAUNA_VERSION",
          "summary": ""
        },
        {
          "name": "PageTransition",
          "kind": "re-export",
          "signature": "PageTransition",
          "summary": ""
        },
        {
          "name": "Pagination",
          "kind": "re-export",
          "signature": "Pagination",
          "summary": ""
        },
        {
          "name": "Panel",
          "kind": "re-export",
          "signature": "Panel",
          "summary": ""
        },
        {
          "name": "ParticleController",
          "kind": "re-export",
          "signature": "ParticleController",
          "summary": ""
        },
        {
          "name": "PlaunaConsole",
          "kind": "re-export",
          "signature": "PlaunaConsole",
          "summary": ""
        },
        {
          "name": "PlaunaGPUBridge",
          "kind": "re-export",
          "signature": "PlaunaGPUBridge",
          "summary": ""
        },
        {
          "name": "PlaunaModuleTester",
          "kind": "re-export",
          "signature": "PlaunaModuleTester",
          "summary": ""
        },
        {
          "name": "PlaunaSmartContextMenu",
          "kind": "re-export",
          "signature": "PlaunaSmartContextMenu",
          "summary": ""
        },
        {
          "name": "PlaunaSurfaceManager",
          "kind": "re-export",
          "signature": "PlaunaSurfaceManager",
          "summary": ""
        },
        {
          "name": "PlaunaTextService",
          "kind": "re-export",
          "signature": "PlaunaTextService",
          "summary": ""
        },
        {
          "name": "Progress",
          "kind": "re-export",
          "signature": "Progress",
          "summary": ""
        },
        {
          "name": "RENDER_FLAGS",
          "kind": "re-export",
          "signature": "RENDER_FLAGS",
          "summary": ""
        },
        {
          "name": "Radio",
          "kind": "re-export",
          "signature": "Radio",
          "summary": ""
        },
        {
          "name": "Rating",
          "kind": "re-export",
          "signature": "Rating",
          "summary": ""
        },
        {
          "name": "Select",
          "kind": "re-export",
          "signature": "Select",
          "summary": ""
        },
        {
          "name": "ShowcaseApp",
          "kind": "re-export",
          "signature": "ShowcaseApp",
          "summary": ""
        },
        {
          "name": "Skeleton",
          "kind": "re-export",
          "signature": "Skeleton",
          "summary": ""
        },
        {
          "name": "Slider",
          "kind": "re-export",
          "signature": "Slider",
          "summary": ""
        },
        {
          "name": "Spacer",
          "kind": "re-export",
          "signature": "Spacer",
          "summary": ""
        },
        {
          "name": "StateStore",
          "kind": "re-export",
          "signature": "StateStore",
          "summary": ""
        },
        {
          "name": "Switch",
          "kind": "re-export",
          "signature": "Switch",
          "summary": ""
        },
        {
          "name": "Tabs",
          "kind": "re-export",
          "signature": "Tabs",
          "summary": ""
        },
        {
          "name": "Text",
          "kind": "re-export",
          "signature": "Text",
          "summary": ""
        },
        {
          "name": "Textarea",
          "kind": "re-export",
          "signature": "Textarea",
          "summary": ""
        },
        {
          "name": "Toast",
          "kind": "re-export",
          "signature": "Toast",
          "summary": ""
        },
        {
          "name": "ToastManager",
          "kind": "re-export",
          "signature": "ToastManager",
          "summary": ""
        },
        {
          "name": "Tooltip",
          "kind": "re-export",
          "signature": "Tooltip",
          "summary": ""
        },
        {
          "name": "TransitionEngine",
          "kind": "re-export",
          "signature": "TransitionEngine",
          "summary": ""
        },
        {
          "name": "TransitionUtils",
          "kind": "re-export",
          "signature": "TransitionUtils",
          "summary": ""
        },
        {
          "name": "UINode",
          "kind": "re-export",
          "signature": "UINode",
          "summary": ""
        },
        {
          "name": "VisualTree",
          "kind": "re-export",
          "signature": "VisualTree",
          "summary": ""
        },
        {
          "name": "WidgetShowcase",
          "kind": "re-export",
          "signature": "WidgetShowcase",
          "summary": ""
        },
        {
          "name": "createPlaunaApp",
          "kind": "re-export",
          "signature": "createPlaunaApp",
          "summary": ""
        },
        {
          "name": "createPlaunaConsole",
          "kind": "re-export",
          "signature": "createPlaunaConsole",
          "summary": ""
        },
        {
          "name": "createStore",
          "kind": "re-export",
          "signature": "createStore",
          "summary": ""
        },
        {
          "name": "getPlaunaConsole",
          "kind": "re-export",
          "signature": "getPlaunaConsole",
          "summary": ""
        },
        {
          "name": "mountPlaunaWorkbenchLab",
          "kind": "re-export",
          "signature": "mountPlaunaWorkbenchLab",
          "summary": ""
        },
        {
          "name": "mountShowcaseApp",
          "kind": "re-export",
          "signature": "mountShowcaseApp",
          "summary": ""
        },
        {
          "name": "startPageTransition",
          "kind": "re-export",
          "signature": "startPageTransition",
          "summary": ""
        },
        {
          "name": "useStore",
          "kind": "re-export",
          "signature": "useStore",
          "summary": ""
        },
        {
          "name": "widgetShowcase",
          "kind": "re-export",
          "signature": "widgetShowcase",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "input/EventRouter",
      "path": "plauna/reference/input/EventRouter.md",
      "source": "plauna/input/EventRouter.js",
      "import": "/plauna/input/EventRouter.js",
      "sourceHash": "5d140a84a527e5ee503f5d3e6a0da2c97968b00afa2ac11d1348c81f04c67ccc",
      "summary": "EventRouter - Event capture/target/bubble routing system for Plauna Handles DOM-style event propagation with capture and bubble phases",
      "exports": [
        {
          "name": "EventRouter",
          "kind": "class",
          "signature": "class EventRouter",
          "summary": "EventRouter - Event capture/target/bubble routing system for Plauna Handles DOM-style event propagation with capture and bubble phases"
        },
        {
          "name": "EVENT_TYPES",
          "kind": "constant",
          "signature": "EVENT_TYPES",
          "summary": ""
        },
        {
          "name": "EventUtils",
          "kind": "constant",
          "signature": "EventUtils",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "lab/showcase-app",
      "path": "plauna/reference/lab/showcase-app.md",
      "source": "plauna/lab/showcase-app.js",
      "import": "/plauna/lab/showcase-app.js",
      "sourceHash": "3d0aaa4412de4eb644f15db4c2228a9804a027b329150d3f20dba3121928d25a",
      "summary": "ShowcaseApp - Thin shell that boots the Plauna engine and mounts WidgetGallery",
      "exports": [
        {
          "name": "ShowcaseApp",
          "kind": "class",
          "signature": "class ShowcaseApp",
          "summary": ""
        },
        {
          "name": "mountShowcaseApp",
          "kind": "function",
          "signature": "mountShowcaseApp(options = {})",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "lab/workbench-lab",
      "path": "plauna/reference/lab/workbench-lab.md",
      "source": "plauna/lab/workbench-lab.js",
      "import": "/plauna/lab/workbench-lab.js",
      "sourceHash": "847d177ee08e71cad0cf82443b72049e80e049565c3be59ee3673dc6bbe1c877",
      "summary": "",
      "exports": [
        {
          "name": "mountPlaunaWorkbenchLab",
          "kind": "function",
          "signature": "mountPlaunaWorkbenchLab(options)",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "layout/Constraints",
      "path": "plauna/reference/layout/Constraints.md",
      "source": "plauna/layout/Constraints.js",
      "import": "/plauna/layout/Constraints.js",
      "sourceHash": "19dbb80de106679ba9026f4b0d6cf5d216282427c9e20cb5c28f088b14033bc5",
      "summary": "Constraints - Size constraint system for Plauna layout Handles min/max/preferred sizes and constraint resolution",
      "exports": [
        {
          "name": "Constraints",
          "kind": "class",
          "signature": "class Constraints",
          "summary": ""
        },
        {
          "name": "BoxConstraints",
          "kind": "class",
          "signature": "class BoxConstraints",
          "summary": ""
        },
        {
          "name": "LayoutConstraints",
          "kind": "class",
          "signature": "class LayoutConstraints",
          "summary": ""
        },
        {
          "name": "ConstraintResolver",
          "kind": "class",
          "signature": "class ConstraintResolver",
          "summary": ""
        },
        {
          "name": "LayoutConstraintType",
          "kind": "constant",
          "signature": "LayoutConstraintType",
          "summary": ""
        },
        {
          "name": "ConstraintUtils",
          "kind": "constant",
          "signature": "ConstraintUtils",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "layout/FlexLayout",
      "path": "plauna/reference/layout/FlexLayout.md",
      "source": "plauna/layout/FlexLayout.js",
      "import": "/plauna/layout/FlexLayout.js",
      "sourceHash": "1d9e55008175304780755fc48a5d92c13ed9553d87d2d711c51b834b9b9a289a",
      "summary": "FlexLayout - Flexbox-inspired layout engine for Plauna Provides CSS Flexbox-like layout functionality with constrained feature set",
      "exports": [
        {
          "name": "FlexLayout",
          "kind": "class",
          "signature": "class FlexLayout",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "layout/LayoutSizing",
      "path": "plauna/reference/layout/LayoutSizing.md",
      "source": "plauna/layout/LayoutSizing.js",
      "import": "/plauna/layout/LayoutSizing.js",
      "sourceHash": "f26ba138196ed2ce36db7ce2a4a063919021bdb94331f9debfdc4b9b56ea66de",
      "summary": "",
      "exports": [
        {
          "name": "resolvePlaunaLayoutSize",
          "kind": "function",
          "signature": "resolvePlaunaLayoutSize(value, containerSize, options = {})",
          "summary": ""
        },
        {
          "name": "resolvePlaunaLayoutConstraints",
          "kind": "function",
          "signature": "resolvePlaunaLayoutConstraints(style = {}, containerSize = 0)",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "motion/MPAFallback",
      "path": "plauna/reference/motion/MPAFallback.md",
      "source": "plauna/motion/MPAFallback.js",
      "import": "/plauna/motion/MPAFallback.js",
      "sourceHash": "7264440845b6a050ab30b62b56b303f8b14bc31423f2421e99f902bb97ee314f",
      "summary": "MPAFallback - Cross-document view transition fallback for mobile/legacy browsers. Browsers that don't support the CSS @view-transition at-rule for MPA navigation get a minimal fade-in of the new page instead of a hard cut. This is a graceful degradation, not a full polyfill; the real cross-document transition only works in browsers that support the View Transitions API Level 2. Usage: include synchronously in the <head> of any landing page: <script src=\"/plauna/motion/MPAFallback.js\"></script>",
      "exports": [],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "motion/PageTransition",
      "path": "plauna/reference/motion/PageTransition.md",
      "source": "plauna/motion/PageTransition.js",
      "import": "/plauna/motion/PageTransition.js",
      "sourceHash": "248eb96f969e8b54ed308b05830aca51ec3059ad2f7186dec698f084f8b2c871",
      "summary": "PageTransition - Modern page/view blending for Plauna. Wraps the native View Transitions API (Level 1/2) where available and falls back to CSS class/transition-based cross-fades for older browsers. Designed for SPA \"page\" swaps, tab changes, and content fades inside a Plauna app. Usage: const pt = new PageTransition({ type: 'slide-left', duration: 350 }); await pt.start(() => { // update the DOM here });",
      "exports": [
        {
          "name": "PageTransition",
          "kind": "class",
          "signature": "class PageTransition",
          "summary": ""
        },
        {
          "name": "startPageTransition",
          "kind": "function",
          "signature": "startPageTransition(update, options = {})",
          "summary": "Convenience function for one-off transitions."
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "motion/PageTransitionContracts",
      "path": "plauna/reference/motion/PageTransitionContracts.md",
      "source": "plauna/motion/PageTransitionContracts.js",
      "import": "/plauna/motion/PageTransitionContracts.js",
      "sourceHash": "324d899287c5421192e917aa514d5d42501ba440bd4b2effc720ab9781072d1e",
      "summary": "",
      "exports": [
        {
          "name": "UnsupportedPageTransitionVersionError",
          "kind": "class",
          "signature": "class UnsupportedPageTransitionVersionError extends Error",
          "summary": ""
        },
        {
          "name": "preparePageTransitionIntent",
          "kind": "function",
          "signature": "preparePageTransitionIntent(input)",
          "summary": ""
        },
        {
          "name": "preparePageTransitionResolved",
          "kind": "function",
          "signature": "preparePageTransitionResolved(input)",
          "summary": ""
        },
        {
          "name": "PAGE_TRANSITION_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "PAGE_TRANSITION_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "PAGE_TRANSITION_INTENT_SCHEMA",
          "kind": "constant",
          "signature": "PAGE_TRANSITION_INTENT_SCHEMA",
          "summary": ""
        },
        {
          "name": "PAGE_TRANSITION_RESOLVED_SCHEMA",
          "kind": "constant",
          "signature": "PAGE_TRANSITION_RESOLVED_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "motion/PageTransitionManager",
      "path": "plauna/reference/motion/PageTransitionManager.md",
      "source": "plauna/motion/PageTransitionManager.js",
      "import": "/plauna/motion/PageTransitionManager.js",
      "sourceHash": "dc658349f46e63e25b352f76401bda2471c823403445b02d485a1b3ec9033050",
      "summary": "PageTransitionManager - Cross-document (MPA) view transition orchestration. This module runs on every page that opts in. It injects a shared stylesheet containing the PageTransition presets and, on supported browsers, sets the active view transition type for cross-document navigations via the pageswap and pagereveal events. Pages can control their transition with a data attribute on the <html> element: <html data-transition-preset=\"etch\"> <html data-transition-preset=\"random\"> <html data-transition-preset=\"cycle\"> The default is the project's default preset (etch). If the attribute is absent or the value is unknown, the default is used.",
      "exports": [],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "motion/PageTransitionPresets",
      "path": "plauna/reference/motion/PageTransitionPresets.md",
      "source": "plauna/motion/PageTransitionPresets.js",
      "import": "/plauna/motion/PageTransitionPresets.js",
      "sourceHash": "5cb1546706b6d1e675de5151d34201b40cde06b8c28103be82c303179b285b0e",
      "summary": "PageTransitionPresets - Shared transition presets and stylesheet generation. This module is the single source of truth for the keyframes and CSS used by both the same-document PageTransition engine and the cross-document PageTransitionManager. Keeping the presets in one place means SPA demos and MPA page navigation can share the same effects and the same default.",
      "exports": [
        {
          "name": "directionToPreset",
          "kind": "function",
          "signature": "directionToPreset(direction)",
          "summary": ""
        },
        {
          "name": "resolvePreset",
          "kind": "function",
          "signature": "resolvePreset(name, state = { index: 0 })",
          "summary": ""
        },
        {
          "name": "keyframesForPreset",
          "kind": "function",
          "signature": "keyframesForPreset(name)",
          "summary": ""
        },
        {
          "name": "presetStyleSheet",
          "kind": "function",
          "signature": "presetStyleSheet(namespace)",
          "summary": ""
        },
        {
          "name": "ensureStyleSheet",
          "kind": "function",
          "signature": "ensureStyleSheet(namespace)",
          "summary": ""
        },
        {
          "name": "DEFAULT_PRESET",
          "kind": "constant",
          "signature": "DEFAULT_PRESET",
          "summary": ""
        },
        {
          "name": "DEFAULT_DURATION",
          "kind": "constant",
          "signature": "DEFAULT_DURATION",
          "summary": ""
        },
        {
          "name": "DEFAULT_EASING",
          "kind": "constant",
          "signature": "DEFAULT_EASING",
          "summary": ""
        },
        {
          "name": "DIRECTION_PRESETS",
          "kind": "constant",
          "signature": "DIRECTION_PRESETS",
          "summary": ""
        },
        {
          "name": "TYPES",
          "kind": "constant",
          "signature": "TYPES",
          "summary": ""
        },
        {
          "name": "SPECIAL_TYPES",
          "kind": "constant",
          "signature": "SPECIAL_TYPES",
          "summary": ""
        },
        {
          "name": "ALL_TYPES",
          "kind": "constant",
          "signature": "ALL_TYPES",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "motion/TransitionEngine",
      "path": "plauna/reference/motion/TransitionEngine.md",
      "source": "plauna/motion/TransitionEngine.js",
      "import": "/plauna/motion/TransitionEngine.js",
      "sourceHash": "33ca27d906e31a81b9701f5d3dcc232470cdc274738ea9bd264910b5d37b6542",
      "summary": "TransitionEngine - Property animation system for Plauna Provides smooth transitions and animations for UI properties",
      "exports": [
        {
          "name": "TransitionEngine",
          "kind": "class",
          "signature": "class TransitionEngine",
          "summary": ""
        },
        {
          "name": "TransitionUtils",
          "kind": "constant",
          "signature": "TransitionUtils",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "notifications/NotificationSystem",
      "path": "plauna/reference/notifications/NotificationSystem.md",
      "source": "plauna/notifications/NotificationSystem.js",
      "import": "/plauna/notifications/NotificationSystem.js",
      "sourceHash": "9748d96249cf48cd191fc19f6b6923451af31d0c727edd6d04cb0abb9de375c3",
      "summary": "============================================================================ NotificationSystem - Centralized Notification Management ============================================================================ NotificationSystem provides a unified API for user notifications, separating them from debug logging and integrating with ToastManager for UI feedback. NOTIFICATION CHANNELS: 1. Toasts: UI notifications via ToastManager (top-right corner) 2. Console: Browser console.log/error/warn for debugging 3. Sounds: Optional audio feedback using Web Audio API NOTIFICATION LEVELS (priority order): - debug (0): Development debugging information - info (1): General informational messages - success (2): Success confirmations - warning (3): Warning messages - error (4): Error messages - critical (5): Critical errors requiring immediate attention NOTIFICATION TYPES: - system: System-level notifications (startup, shutdown, etc.) - action: User action feedback (clicks, submissions, etc.) - validation: Form validation errors - performance: Performance metrics and warnings - security: Security-related alerts - network: Network request status GROUPING: - createGroup(name, options): Create a notification group - Groups collect related notifications and report summary - Useful for batch operations or multi-step processes CONVENIENCE METHODS: - debug(message, type, data): Debug-level notification - info(message, type, data): Info-level notification - success(message, type, data): Success-level notification - warning(message, type, data): Warning-level notification - error(message, type, data): Error-level notification - critical(message, type, data): Critical-level notification SOUND EFFECTS: - Uses Web Audio API to generate simple beep sounds - Different frequencies for different levels - Can be disabled via enableSounds option MIN LEVEL FILTERING: - minLevel option filters notifications below specified level - Useful for suppressing debug messages in production INTEGRATION: - Uses global Toast from ToastManager for UI toasts - Toast position defaults to top-right - Console output includes prefix (default: '[Plauna]') USAGE: const notify = new NotificationSystem({ minLevel: 'info' }); notify.success('File saved successfully', 'action'); notify.error('Failed to load data', 'network', { url: '/api/data' });",
      "exports": [
        {
          "name": "NotificationSystem",
          "kind": "class",
          "signature": "class NotificationSystem",
          "summary": ""
        },
        {
          "name": "Notify",
          "kind": "constant",
          "signature": "Notify",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "particle/ParticleController",
      "path": "plauna/reference/particle/ParticleController.md",
      "source": "plauna/particle/ParticleController.js",
      "import": "/plauna/particle/ParticleController.js",
      "sourceHash": "a3659aca55e1918c43a4c088234b744502d943c5feec307f308199d578fa8a78",
      "summary": "ParticleController - Manages particle effects and animations Handles particle system initialization and control for showcase",
      "exports": [
        {
          "name": "ParticleController",
          "kind": "class",
          "signature": "class ParticleController",
          "summary": "ParticleController - Manages particle effects and animations Handles particle system initialization and control for showcase"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "particle/bridge",
      "path": "plauna/reference/particle/bridge.md",
      "source": "plauna/particle/bridge.js",
      "import": "/plauna/particle/bridge.js",
      "sourceHash": "add11bd6169ac88b1bea8382cf8476905a40398090fd1e7f1f57f29db220740a",
      "summary": "PlaunaParticleBridge - Connects Plauna to Particle Engine's VGPU Follows existing VGPU patterns from ViewportPanel",
      "exports": [
        {
          "name": "PlaunaGPUBridge",
          "kind": "class",
          "signature": "class PlaunaGPUBridge",
          "summary": "PlaunaParticleBridge - Connects Plauna to Particle Engine's VGPU Follows existing VGPU patterns from ViewportPanel"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/AdaptiveThemeFactory",
      "path": "plauna/reference/style/AdaptiveThemeFactory.md",
      "source": "plauna/style/AdaptiveThemeFactory.js",
      "import": "/plauna/style/AdaptiveThemeFactory.js",
      "sourceHash": "1a563e32bd26835aa2d3c2ea732b1f57fcc7d3e962b3a287247865fb4debc37a",
      "summary": "",
      "exports": [
        {
          "name": "AdaptiveThemeFactory",
          "kind": "class",
          "signature": "class AdaptiveThemeFactory",
          "summary": ""
        },
        {
          "name": "adaptiveThemeFactory",
          "kind": "constant",
          "signature": "adaptiveThemeFactory",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/CSSGenerator",
      "path": "plauna/reference/style/CSSGenerator.md",
      "source": "plauna/style/CSSGenerator.js",
      "import": "/plauna/style/CSSGenerator.js",
      "sourceHash": "cf79013ff717a9e420f50c167d50838df282f1bae39bbb7519e186a5c10583b2",
      "summary": "CSSGenerator - Runtime CSS generation from DesignTokens and LayerManager. CSS generation pattern: - Generates CSS custom properties from design tokens - Supports theme-based variable sets (bright/night) - Caches generated CSS for performance - Injects CSS into document via style tags - Supports z-index layer variables Architecture: - tokens: DesignTokens instance for token resolution - layerValues: LayerManager z-index values - generatedCSS: Map of cached CSS strings - styleElement: DOM style element for CSS injection - themes: Pre-defined theme variable sets",
      "exports": [
        {
          "name": "CSSGenerator",
          "kind": "class",
          "signature": "class CSSGenerator",
          "summary": ""
        },
        {
          "name": "cssGenerator",
          "kind": "constant",
          "signature": "cssGenerator",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/ComputedStyle",
      "path": "plauna/reference/style/ComputedStyle.md",
      "source": "plauna/style/ComputedStyle.js",
      "import": "/plauna/style/ComputedStyle.js",
      "sourceHash": "5a93e204225ee79f36475509594685463211d0a7ac68a452d1406dc44609990f",
      "summary": "ComputedStyle - Style resolution and caching system for Plauna. Style resolution pattern: - Handles style inheritance from parent nodes - Resolves design token references - Computes final style values for rendering - Caches computed styles for performance - Tracks performance statistics Architecture: - cache: Map of computed style results - tokenCache: Map of resolved token values - styleCache: Map of style property resolutions - performanceStats: Metrics for cache hits/misses and timing Style categories: - Position and layout: position, display, flex properties - Sizing: width, height, min/max dimensions, flex basis/grow/shrink - Spacing: margin, padding - Visual: colors, borders, shadows, opacity - Typography: font family, size, weight, line height, alignment - Interaction: pointer events, cursor - Accessibility: visibility, z-index - Transform and animation",
      "exports": [
        {
          "name": "ComputedStyle",
          "kind": "class",
          "signature": "class ComputedStyle",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/DesignTokenContracts",
      "path": "plauna/reference/style/DesignTokenContracts.md",
      "source": "plauna/style/DesignTokenContracts.js",
      "import": "/plauna/style/DesignTokenContracts.js",
      "sourceHash": "c7a5cf3ed072856205d9ca341fddc0c7996b3914c6971aa183aca7ee53e978a2",
      "summary": "Accept legacy raw token maps and return a canonical, safely cloned v1 envelope.",
      "exports": [
        {
          "name": "UnsupportedDesignTokenVersionError",
          "kind": "class",
          "signature": "class UnsupportedDesignTokenVersionError extends Error",
          "summary": ""
        },
        {
          "name": "prepareDesignTokenDocument",
          "kind": "function",
          "signature": "prepareDesignTokenDocument(input)",
          "summary": "Accept legacy raw token maps and return a canonical, safely cloned v1 envelope."
        },
        {
          "name": "createDesignTokenExport",
          "kind": "function",
          "signature": "createDesignTokenExport(input)",
          "summary": "Emit metadata additively so legacy readers still see token categories at the root."
        },
        {
          "name": "DESIGN_TOKEN_SCHEMA",
          "kind": "constant",
          "signature": "DESIGN_TOKEN_SCHEMA",
          "summary": ""
        },
        {
          "name": "DESIGN_TOKEN_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "DESIGN_TOKEN_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/DesignTokens",
      "path": "plauna/reference/style/DesignTokens.md",
      "source": "plauna/style/DesignTokens.js",
      "import": "/plauna/style/DesignTokens.js",
      "sourceHash": "da420ccc14e4020f3462b8a6d92a5d10ae49b85d2c80af5016de49a65cb90cd1",
      "summary": "DesignTokens - Design system token management. Token management pattern: - Centralized token system for Plauna styling - Manages spacing, typography, color, motion, borderRadius, shadows, zIndex - Observer pattern for token change notifications - Caching for performance optimization - Deep merge strategy for token inheritance Architecture: - tokens: Merged token object (defaults + custom) - observers: Set of callback functions - cache: Map of cached token lookups",
      "exports": [
        {
          "name": "DesignTokens",
          "kind": "class",
          "signature": "class DesignTokens",
          "summary": "DesignTokens - Design system token management. Token management pattern: - Centralized token system for Plauna styling - Manages spacing, typography, color, motion, borderRadius, shadows, zIndex - Observer pattern for token change notifications - Caching for performance optimization - Deep merge strategy for token inheritance Architecture: - tokens: Merged token object (defaults + custom) - observers: Set of callback functions - cache: Map of cached token lookups"
        },
        {
          "name": "tokens",
          "kind": "constant",
          "signature": "tokens",
          "summary": ""
        },
        {
          "name": "TokenUtils",
          "kind": "constant",
          "signature": "TokenUtils",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/LayerManager",
      "path": "plauna/reference/style/LayerManager.md",
      "source": "plauna/style/LayerManager.js",
      "import": "/plauna/style/LayerManager.js",
      "sourceHash": "f2469425f3962220de13ef0f37b3bcfe6e8cd38c56448e0fb93f8f46c851b3ef",
      "summary": "LayerManager - Semantic z-index management system. Z-index management pattern: - Centralized z-index constants organized by stacking context - Arithmetic relationships for self-documenting code - Prevents z-index wars by providing semantic layer names - Uses isolation: isolate for stacking context isolation Stacking contexts (lowest to highest): - Layout: backdrop, surface, widget gallery - Modal: backdrop, panel - Dropdown: backdrop, dropdown - Tooltip - Notification: toast, alert Arithmetic pattern: - base = 0 - above = 1 - below = -1 - Each layer is defined relative to the previous layer",
      "exports": [
        {
          "name": "getStackingContextCSS",
          "kind": "function",
          "signature": "getStackingContextCSS(layerName)",
          "summary": "Create CSS for stacking context isolation. Stacking context pattern: - Uses isolation: isolate to create new stacking context - Prevents side effects from parent stacking contexts - Returns CSS object with isolation and z-index"
        },
        {
          "name": "getLayerZIndex",
          "kind": "function",
          "signature": "getLayerZIndex(layerName)",
          "summary": "Get z-index value for a layer"
        },
        {
          "name": "getLayerCSSVariables",
          "kind": "function",
          "signature": "getLayerCSSVariables()",
          "summary": "Get all layer values as CSS custom properties"
        },
        {
          "name": "zLayoutBackdrop",
          "kind": "constant",
          "signature": "zLayoutBackdrop",
          "summary": ""
        },
        {
          "name": "zLayoutSurface",
          "kind": "constant",
          "signature": "zLayoutSurface",
          "summary": ""
        },
        {
          "name": "zLayoutWidgetGallery",
          "kind": "constant",
          "signature": "zLayoutWidgetGallery",
          "summary": ""
        },
        {
          "name": "zModalBackdrop",
          "kind": "constant",
          "signature": "zModalBackdrop",
          "summary": ""
        },
        {
          "name": "zModalPanel",
          "kind": "constant",
          "signature": "zModalPanel",
          "summary": ""
        },
        {
          "name": "zDropdownBackdrop",
          "kind": "constant",
          "signature": "zDropdownBackdrop",
          "summary": ""
        },
        {
          "name": "zDropdown",
          "kind": "constant",
          "signature": "zDropdown",
          "summary": ""
        },
        {
          "name": "zTooltip",
          "kind": "constant",
          "signature": "zTooltip",
          "summary": ""
        },
        {
          "name": "zNotificationToast",
          "kind": "constant",
          "signature": "zNotificationToast",
          "summary": ""
        },
        {
          "name": "zNotificationAlert",
          "kind": "constant",
          "signature": "zNotificationAlert",
          "summary": ""
        },
        {
          "name": "layerValues",
          "kind": "constant",
          "signature": "layerValues",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/StyleSizing",
      "path": "plauna/reference/style/StyleSizing.md",
      "source": "plauna/style/StyleSizing.js",
      "import": "/plauna/style/StyleSizing.js",
      "sourceHash": "fc53654bce81be48fd296856034daa4dac86370600c341b920f3347115f242e6",
      "summary": "",
      "exports": [
        {
          "name": "resolvePlaunaStyleSize",
          "kind": "function",
          "signature": "resolvePlaunaStyleSize(value, options = {})",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/ThemeController",
      "path": "plauna/reference/style/ThemeController.md",
      "source": "plauna/style/ThemeController.js",
      "import": "/plauna/style/ThemeController.js",
      "sourceHash": "d2ad330c69dbed0f6e85d6482149cabac38894e22f56d7e432e6c51286ba5a6f",
      "summary": "ThemeController - Runtime theme management and switching. Theme switching pattern: - Manages bright/night theme switching with live CSS updates - Persists theme preference to localStorage - Listens to system theme preference (prefers-color-scheme) - Observer pattern for theme change notifications - Applies theme via data-theme attribute and CSS variables Features: - Auto-switch based on system preference - Manual theme switching with setTheme() - Theme persistence across sessions - Observer notifications for reactive updates",
      "exports": [
        {
          "name": "ThemeController",
          "kind": "class",
          "signature": "class ThemeController",
          "summary": ""
        },
        {
          "name": "themeController",
          "kind": "constant",
          "signature": "themeController",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/ThemeManager",
      "path": "plauna/reference/style/ThemeManager.md",
      "source": "plauna/style/ThemeManager.js",
      "import": "/plauna/style/ThemeManager.js",
      "sourceHash": "fdf9101d7853ef469a07369c2952cefe0d8651f3d633952f80a5b2cbe1772d03",
      "summary": "ThemeManager - Theme management system for Plauna. Theme management pattern: - Provides theme registration and switching - Supports custom token overrides - Observer pattern for theme change notifications - Deep merge strategy for token inheritance - Pre-registered themes (light, dark) Architecture: - themes: Map of registered theme definitions - observers: Set of callback functions for change notifications - customTokens: Map of custom token overrides - currentTheme: Currently active theme ID",
      "exports": [
        {
          "name": "ThemeManager",
          "kind": "class",
          "signature": "class ThemeManager",
          "summary": ""
        },
        {
          "name": "ThemeUtils",
          "kind": "constant",
          "signature": "ThemeUtils",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "style/index",
      "path": "plauna/reference/style/index.md",
      "source": "plauna/style/index.js",
      "import": "/plauna/style/index.js",
      "sourceHash": "8769ccaf5807e2dbc9f2c0aa71360b8f37fff546fec5a8e02edf5ed35498a23f",
      "summary": "Style Module Exports Central export point for all Plauna styling utilities and managers. Exported modules: - LayerManager: Semantic z-index management system - ThemeManager: Theme registration and management - DesignTokens: Design system token management - WidgetStyleManager: Theme-aware widget styling - CSSGenerator: Runtime CSS generation - ThemeController: Runtime theme switching Usage: import { tokens, ThemeManager, layerValues } from './style/index.js';",
      "exports": [],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "surface/surface-manager",
      "path": "plauna/reference/surface/surface-manager.md",
      "source": "plauna/surface/surface-manager.js",
      "import": "/plauna/surface/surface-manager.js",
      "sourceHash": "fe179792c3c283b3098014a32b4cba09edb988a2d54d6322b96903283f36cdcf",
      "summary": "PlaunaSurfaceManager - Manages GPU surfaces and rendering Integrates with existing VGPU patterns",
      "exports": [
        {
          "name": "PlaunaSurfaceManager",
          "kind": "class",
          "signature": "class PlaunaSurfaceManager",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "text/pretext-service",
      "path": "plauna/reference/text/pretext-service.md",
      "source": "plauna/text/pretext-service.js",
      "import": "/plauna/text/pretext-service.js",
      "sourceHash": "23ebfd88f83466a0b2ed50b29f0422e5f613f01b4661c00b5d7e5b5490efe0e8",
      "summary": "PlaunaTextService - DOM-free text measurement and layout Implements Pretext-style text measurement for Plauna",
      "exports": [
        {
          "name": "PlaunaTextService",
          "kind": "class",
          "signature": "class PlaunaTextService",
          "summary": "PlaunaTextService - DOM-free text measurement and layout Implements Pretext-style text measurement for Plauna"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "themes/ThemeContracts",
      "path": "plauna/reference/themes/ThemeContracts.md",
      "source": "plauna/themes/ThemeContracts.js",
      "import": "/plauna/themes/ThemeContracts.js",
      "sourceHash": "b2f168771b7085d0cb3432a526d7f7fec5a1305c16e2621069f832a0b53dce93",
      "summary": "",
      "exports": [
        {
          "name": "validateThemeId",
          "kind": "function",
          "signature": "validateThemeId(value, label = 'Theme id')",
          "summary": ""
        },
        {
          "name": "prepareThemeVariables",
          "kind": "function",
          "signature": "prepareThemeVariables(input, { allowNull = true } = {})",
          "summary": ""
        },
        {
          "name": "prepareThemeRegistry",
          "kind": "function",
          "signature": "prepareThemeRegistry(input)",
          "summary": ""
        },
        {
          "name": "prepareThemeManifest",
          "kind": "function",
          "signature": "prepareThemeManifest(input, requestedId)",
          "summary": ""
        },
        {
          "name": "THEME_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "THEME_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "themes/ThemeLoader",
      "path": "plauna/reference/themes/ThemeLoader.md",
      "source": "plauna/themes/ThemeLoader.js",
      "import": "/plauna/themes/ThemeLoader.js",
      "sourceHash": "14d9ab06a572b4b9c05d54fdc1a65d5542a8bc465ba0b07bfcfe8fc3214b8417",
      "summary": "============================================================================ ThemeLoader - File-Based Theme Discovery and Loading ============================================================================ ThemeLoader is a file-based theme system inspired by WordPress but modernized. It loads themes from plauna/themes/{id}/theme.json and applies CSS variables. THEME STRUCTURE: plauna/themes/ ├── _base/              # Base theme with all token defaults (required) │   └── theme.json      # Defines every possible CSS variable ├── dark/               # Dark theme (extends _base) │   └── theme.json      # Only overrides what's different from _base ├── light/              # Light theme (extends _base) │   └── theme.json ├── high-contrast/      # High contrast theme (extends dark) │   └── theme.json ├── custom/             # User starter template (extends dark) │   └── theme.json └── index.json          # Registry of discoverable themes THEME MANIFEST (theme.json): { \"name\": \"Theme Name\", \"description\": \"Theme description\", \"extends\": \"parent-theme-id\",  // Optional: parent theme to inherit from \"variables\": { \"color-primary\": \"#3b82f6\",  // CSS variable name → value \"spacing-md\": \"16px\", // null or omitted values inherit from parent } } THEME RESOLUTION CASCADE (highest priority wins): 1. _base theme defaults (all variables defined) 2. Parent theme variables (if extends is set) 3. Current theme variables (overrides parent) 4. Runtime overrides (applyOverrides() - per-session changes) CSS VARIABLE APPLICATION: - Variables are written to <style data-plauna-theme=\"1\"> tag on :root - Format: --variable-name: value; - Overrides use separate <style data-plauna-overrides=\"1\"> tag REGISTRY (themes/index.json): { \"themes\": [\"dark\", \"light\", \"high-contrast\", \"custom\"] } Add your theme folder name here to make it discoverable without code changes. METHODS: - discover(): Load themes/index.json and return available theme IDs - load(id): Load raw theme.json without resolving parent chain - resolve(id): Resolve full theme with parent chain merged - apply(id): Apply theme CSS variables to DOM - applyOverrides(vars): Apply per-session variable overrides - clearOverrides(): Remove runtime overrides - listThemes(): Return theme metadata for all discoverable themes",
      "exports": [
        {
          "name": "ThemeLoader",
          "kind": "class",
          "signature": "class ThemeLoader",
          "summary": "ThemeLoader - File-based theme discovery and loading. Theme loading pattern: - Loads themes from plauna/themes/{id}/theme.json - Supports theme extension via \"extends\" property - Resolves parent chain with cascading variable inheritance - Applies CSS variables to :root via style tags - Caches resolved themes for performance Architecture: - _cache: Resolved theme manifests (parent chain merged) - _rawCache: Raw theme.json files - _registry: Discoverable theme IDs from index.json - _styleEl: CSS variable style tag - _overrideEl: Runtime override style tag"
        },
        {
          "name": "themeLoader",
          "kind": "constant",
          "signature": "themeLoader",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "themes/ThemePreference",
      "path": "plauna/reference/themes/ThemePreference.md",
      "source": "plauna/themes/ThemePreference.js",
      "import": "/plauna/themes/ThemePreference.js",
      "sourceHash": "41083fbe07cba0b49571bdb89020fc5df9ec44e9b5e4f8e0075b0718a90873c8",
      "summary": "Expand legacy state into both namespaced keys without contracting the old key. Older tabs may still be reading it during a rolling browser rollout.",
      "exports": [
        {
          "name": "migrateLegacyThemePreference",
          "kind": "function",
          "signature": "migrateLegacyThemePreference(storage)",
          "summary": "Expand legacy state into both namespaced keys without contracting the old key. Older tabs may still be reading it during a rolling browser rollout."
        },
        {
          "name": "readFileThemePreference",
          "kind": "function",
          "signature": "readFileThemePreference(storage)",
          "summary": ""
        },
        {
          "name": "writeFileThemePreference",
          "kind": "function",
          "signature": "writeFileThemePreference(value, storage)",
          "summary": ""
        },
        {
          "name": "readColorModePreference",
          "kind": "function",
          "signature": "readColorModePreference(storage)",
          "summary": ""
        },
        {
          "name": "writeColorModePreference",
          "kind": "function",
          "signature": "writeColorModePreference(value, storage)",
          "summary": ""
        },
        {
          "name": "LEGACY_THEME_STORAGE_KEY",
          "kind": "constant",
          "signature": "LEGACY_THEME_STORAGE_KEY",
          "summary": ""
        },
        {
          "name": "FILE_THEME_STORAGE_KEY",
          "kind": "constant",
          "signature": "FILE_THEME_STORAGE_KEY",
          "summary": ""
        },
        {
          "name": "COLOR_MODE_STORAGE_KEY",
          "kind": "constant",
          "signature": "COLOR_MODE_STORAGE_KEY",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "ui/SmartContextMenu",
      "path": "plauna/reference/ui/SmartContextMenu.md",
      "source": "plauna/ui/SmartContextMenu.js",
      "import": "/plauna/ui/SmartContextMenu.js",
      "sourceHash": "4fd89875e01eb3064a19f5bac7fe051c7ec026723750f9d941e13c85a4cd7dfe",
      "summary": "============================================================================ PlaunaSmartContextMenu - Context-Aware Right-Click Menu ============================================================================ PlaunaSmartContextMenu provides a context-aware right-click menu that scans the visual tree near the cursor and builds a smart action panel based on nearby UI nodes. SCANNING ALGORITHM: 1. On right-click, collectNearbyNodes() scans the visual tree around cursor 2. Uses adaptive radius based on node density (shrinks when many nodes nearby) 3. Scores each node based on type, role, text content, and distance 4. Returns top N nodes within scan radius NODE SCORING: - Inside node: +1000 + inset depth (prioritizes deeper inside) - Has role: +22 - Has text content: +10 - Has className: +8 - Button type: +25 - Input type: +18 - Menu type: +15 - Small area: +6 (prefers compact elements) ADAPTIVE RADIUS: - Base radius: 140px (configurable) - Density >= 8: 48% of base (72px min) - Density >= 6: 55% of base (80px min) - Density >= 4: 65% of base (90px min) - Density >= 2: 80% of base (112px min) - Density < 2: 100% of base (140px) DOM FALLBACK: - If visualTree is unavailable (e.g., in showcase shell), falls back to DOM scanning - Uses element._plaunaNode back-reference set by WidgetRenderer - Scans all elements in root and collects associated UINodes ACTION GENERATION: - For each nearby node, generates contextual actions - Actions include: inspect, copy text, copy ID, copy styles, toggle visibility - Actions are sorted by relevance and displayed in a radial menu VISUAL FEEDBACK: - Draws a scan ring around cursor during scanning - Highlights nearby nodes with visual indicators - Shows tie nodes (nodes with similar scores) with special styling INTEGRATION: - Requires: app (PlaunaApp), root (DOM element), visualTree (optional) - Optional: domRenderer (WidgetRenderer instance), console (logger) - Configurable: radius, maxNearby, maxActions, enabled flag USAGE: const menu = new PlaunaSmartContextMenu({ app: plaunaApp, root: document.body, visualTree: app.visualTree, domRenderer: app.domRenderer, radius: 140, maxNearby: 6, maxActions: 6 }); menu.enable();",
      "exports": [
        {
          "name": "PlaunaSmartContextMenu",
          "kind": "class",
          "signature": "class PlaunaSmartContextMenu",
          "summary": "PlaunaSmartContextMenu - Context-aware right-click menu. Context menu pattern: - Scans visual tree near cursor on right-click - Builds smart action panel based on nearby UI nodes - Adaptive radius based on node density - Node scoring for relevance ranking - Visual feedback with scan ring and highlights Integration: - Requires: app (PlaunaApp), root (DOM element), visualTree (optional) - Optional: domRenderer (WidgetRenderer), console (logger) - Configurable: radius, maxNearby, maxActions, enabled flag"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "ui/ToastManager",
      "path": "plauna/reference/ui/ToastManager.md",
      "source": "plauna/ui/ToastManager.js",
      "import": "/plauna/ui/ToastManager.js",
      "sourceHash": "fbadb905c8ae3017f1d9de2c5a4e55a056a720265d9d2b55cba49ea3bedd9156",
      "summary": "============================================================================ ToastManager - Unified Toast Notification System ============================================================================ ToastManager provides a user-friendly toast notification system for Plauna. It separates UI notifications from debug logging and provides a clean API. TOAST POSITIONS: - top-right: Top-right corner (default) - top-left: Top-left corner - top-center: Top-center - bottom-right: Bottom-right corner - bottom-left: Bottom-left corner - bottom-center: Bottom-center TOAST TYPES: - success: Green checkmark, 3s duration - error: Red X, 5s duration - warning: Yellow warning, 4s duration - info: Blue info, 3s duration - loading: Gray spinner, indefinite (must be manually dismissed) TOAST LIFECYCLE: 1. show(options): Creates toast element and appends to container 2. Animate in: Slide-in animation based on position 3. Display: Shows for duration (or indefinite) 4. Animate out: Slide-out animation 5. Remove: Element removed from DOM TOAST STRUCTURE: - Container: Fixed-position div at specified position - Toast Element: Individual toast with type styling - Icon: Type-specific icon (✓, ✕, ⚠, ℹ, ⟳) - Content: Title and optional description - Close Button: X button to dismiss manually - Progress Bar: Optional countdown indicator AUTO-DISMISS: - maxToasts: Maximum concurrent toasts (default: 5) - defaultDuration: Default display time (default: 4000ms) - Oldest toasts are dismissed when limit is reached - Loading toasts have indefinite duration (duration: 0) ANIMATIONS: - Slide-in/out based on position - Fade effect for smooth transitions - CSS transitions defined in Toast.css CONVENIENCE METHODS: - success(message, options): Show success toast - error(message, options): Show error toast - warning(message, options): Show warning toast - info(message, options): Show info toast - loading(message, options): Show loading toast GLOBAL SINGLETON: - Toast.initialize() creates global singleton - Toast.show() uses global singleton - Used by NotificationSystem and widget gallery USAGE: const manager = new ToastManager({ position: 'top-right' }); manager.success('Operation completed'); manager.error('Failed to save', { duration: 6000 }); // Or use global singleton Toast.initialize(); Toast.show('Hello world', 'info');",
      "exports": [
        {
          "name": "ToastManager",
          "kind": "class",
          "signature": "class ToastManager",
          "summary": "ToastManager - Unified toast notification system. Toast pattern: - Fixed-position container at specified position - Type-specific styling (success, error, warning, info, loading) - Auto-dismiss with configurable duration - Slide-in/out animations based on position - Max concurrent toast limit with FIFO dismissal Lifecycle: 1. show(): Creates toast and appends to container 2. Animate in: Slide-in based on position 3. Display: Shows for duration (or indefinite for loading) 4. Animate out: Slide-out animation 5. Remove: Element removed from DOM"
        },
        {
          "name": "Toast",
          "kind": "constant",
          "signature": "Toast",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "ui/WidgetGallery",
      "path": "plauna/reference/ui/WidgetGallery.md",
      "source": "plauna/ui/WidgetGallery.js",
      "import": "/plauna/ui/WidgetGallery.js",
      "sourceHash": "a605fa68d6951ce53a71dfc99973a61e994022937b585f3e3af836aaa197bfe2",
      "summary": "============================================================================ WidgetGallery - Storybook-Style Widget Showcase ============================================================================ WidgetGallery is a Storybook-like gallery that renders real interactive widget instances from widget.stories() definitions. It's used for development and documentation of Plauna widgets. RENDERING STRATEGY: - Uses widgetRenderer.render() directly to bypass the broken require() in create() - Instantiates widgets with new WidgetClass(id, storyOptions) - Renders each widget to DOM in preview cells - Adds interactive state badges (on/off/animating/sending toast) - Wires click/change/input events to emit toast notifications GALLERY STRUCTURE: - Header: Title and theme selector dropdown - Tabs: Category navigation (Primitive, Input, Form, Layout, Navigation, etc.) - Content Area: Grid of widget story previews - Story Cell: Widget preview + label + state badges STORY PATTERN: Each widget defines static stories() returning named configurations: static stories() { return { 'Story Name': { variant: 'primary', size: 'md' }, 'Another Story': { disabled: true } }; } SPECIAL HANDLING: - Tooltips: Appended to document.body for correct overlay positioning - Toasts: Call show() immediately for visible demos - State Badges: Display on/off/animating/sending-toast indicators - Interactive Events: Click/change/input emit toast notifications DATA ATTRIBUTES: - data-widget: Widget ID (e.g., 'button', 'badge') - data-variant: Story variant name - data-size: Story size name - data-story: Story name TOAST INTEGRATION: - Uses global Toast from ToastManager - Emits toasts on widget interactions for immediate feedback - Toast position defaults to top-right THEME SELECTOR: - Async dropdown in header - Calls shell.setTheme() on change - Refreshes gallery on theme change",
      "exports": [
        {
          "name": "WidgetGallery",
          "kind": "class",
          "signature": "class WidgetGallery",
          "summary": "WidgetGallery - Interactive widget showcase. Gallery architecture: - Storybook-like interface for widget documentation - Renders real interactive widget instances - Category-based navigation with tabs - Interactive state badges (on/off/animating/sending toast) - Toast integration for immediate feedback"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "ui/WidgetShowcase",
      "path": "plauna/reference/ui/WidgetShowcase.md",
      "source": "plauna/ui/WidgetShowcase.js",
      "import": "/plauna/ui/WidgetShowcase.js",
      "sourceHash": "5efcd45d7bcf75ecdfdecee60dd5b6aaeacb7d888c51d8ea43ecc5e7a8e045c0",
      "summary": "WidgetShowcase - Display system for widget examples and variants. Architecture: - Renders individual widget examples with state variations - Creates structured showcase sections with title, description, and variants - Supports variant grids, state grids, size grids, and color grids - Uses PlaunaTextService for internationalization - Returns UINode trees for integration with Plauna rendering Showcase structure: - Container: Card-like container with title and description - Variants grid: Auto-fit grid for widget variants - States grid: Grid for different widget states (hover, active, disabled) - Size grid: Grid for different widget sizes - Color grid: Grid for different color variants",
      "exports": [
        {
          "name": "WidgetShowcase",
          "kind": "class",
          "signature": "class WidgetShowcase",
          "summary": "WidgetShowcase - Widget example renderer. Showcase pattern: - Creates structured sections for widget documentation - Renders variants, states, sizes, and colors in grids - Returns UINode trees for Plauna rendering - Supports optional interactive mode"
        },
        {
          "name": "widgetShowcase",
          "kind": "constant",
          "signature": "widgetShowcase",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/DataViews/Card",
      "path": "plauna/reference/widgets/DataViews/Card.md",
      "source": "plauna/widgets/DataViews/Card.js",
      "import": "/plauna/widgets/DataViews/Card.js",
      "sourceHash": "95df51e3fd53814969e3dbf5bedc6780593e54d542be8a932e8346d380c2f97b",
      "summary": "Card - Flexible content container widget for Plauna Provides header, body, and footer slots with variant system",
      "exports": [
        {
          "name": "Card",
          "kind": "class",
          "signature": "class Card extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/DataViews/List",
      "path": "plauna/reference/widgets/DataViews/List.md",
      "source": "plauna/widgets/DataViews/List.js",
      "import": "/plauna/widgets/DataViews/List.js",
      "sourceHash": "7179173832d04fc732f1a581ab1aeb1e266fc7d580795b24a54c676949296b75",
      "summary": "List - Basic list widget for Plauna Provides list functionality with multiple variants and states",
      "exports": [
        {
          "name": "List",
          "kind": "class",
          "signature": "class List extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/DataViews/ListView",
      "path": "plauna/reference/widgets/DataViews/ListView.md",
      "source": "plauna/widgets/DataViews/ListView.js",
      "import": "/plauna/widgets/DataViews/ListView.js",
      "sourceHash": "47c337861bcddd225ec68da2d12665a6b233247482179c6dcb275915da2ae5a6",
      "summary": "ListView - Data display widget for Plauna Provides virtualized list rendering with selection and sorting",
      "exports": [
        {
          "name": "ListView",
          "kind": "class",
          "signature": "class ListView extends UINode",
          "summary": ""
        },
        {
          "name": "ListViewFactory",
          "kind": "constant",
          "signature": "ListViewFactory",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/DataViews/Table",
      "path": "plauna/reference/widgets/DataViews/Table.md",
      "source": "plauna/widgets/DataViews/Table.js",
      "import": "/plauna/widgets/DataViews/Table.js",
      "sourceHash": "11472cb7df367c17615b052536649324adee2520ca32a74cbd7922783843e288",
      "summary": "Table - Data table widget for Plauna Provides table functionality with sorting, filtering, and pagination",
      "exports": [
        {
          "name": "Table",
          "kind": "class",
          "signature": "class Table extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/DataViews/Tree",
      "path": "plauna/reference/widgets/DataViews/Tree.md",
      "source": "plauna/widgets/DataViews/Tree.js",
      "import": "/plauna/widgets/DataViews/Tree.js",
      "sourceHash": "02b9d9721468a8d9491d03fed5e7750e3082094971d81742fbd5a405dd8689cc",
      "summary": "Tree - Hierarchical data display widget for Plauna Provides tree functionality with expand/collapse and navigation",
      "exports": [
        {
          "name": "Tree",
          "kind": "class",
          "signature": "class Tree extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/DataViews/index",
      "path": "plauna/reference/widgets/DataViews/index.md",
      "source": "plauna/widgets/DataViews/index.js",
      "import": "/plauna/widgets/DataViews/index.js",
      "sourceHash": "15766cbe52c54194b3e93b81837e7bf60580a77964b4890a970d9844a97dd6cd",
      "summary": "Data Views Widgets Category Data display and visualization widgets",
      "exports": [
        {
          "name": "getDataviewsWidget",
          "kind": "function",
          "signature": "getDataviewsWidget(id)",
          "summary": ""
        },
        {
          "name": "getAllDataviewsWidgets",
          "kind": "function",
          "signature": "getAllDataviewsWidgets()",
          "summary": ""
        },
        {
          "name": "dataviewsWidgets",
          "kind": "constant",
          "signature": "dataviewsWidgets",
          "summary": ""
        },
        {
          "name": "dataviewsWidgetRegistry",
          "kind": "constant",
          "signature": "dataviewsWidgetRegistry",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Feedback/Alert",
      "path": "plauna/reference/widgets/Feedback/Alert.md",
      "source": "plauna/widgets/Feedback/Alert.js",
      "import": "/plauna/widgets/Feedback/Alert.js",
      "sourceHash": "a965f4c964e3d7978e59239a6c52fcaf926bda2d2f7e92b571fad0cc8d43ef10",
      "summary": "Alert - Alert message widget for Plauna Provides alert functionality with multiple variants and dismissible options",
      "exports": [
        {
          "name": "Alert",
          "kind": "class",
          "signature": "class Alert extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Feedback/EmptyState",
      "path": "plauna/reference/widgets/Feedback/EmptyState.md",
      "source": "plauna/widgets/Feedback/EmptyState.js",
      "import": "/plauna/widgets/Feedback/EmptyState.js",
      "sourceHash": "95a9f99c3e6569694107181b6ec8fb499567c0ce0e9c6dad0152a5de8e03648b",
      "summary": "EmptyState - Empty state widget for Plauna Provides empty state functionality with multiple variants and content options",
      "exports": [
        {
          "name": "EmptyState",
          "kind": "class",
          "signature": "class EmptyState extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Feedback/Spinner",
      "path": "plauna/reference/widgets/Feedback/Spinner.md",
      "source": "plauna/widgets/Feedback/Spinner.js",
      "import": "/plauna/widgets/Feedback/Spinner.js",
      "sourceHash": "d35ec361c28127b9415875d3910d24822cdbbd990b570109473a2af2e8a322cd",
      "summary": "Spinner - Loading spinner widget for Plauna Provides spinner functionality with multiple variants and sizes",
      "exports": [
        {
          "name": "Spinner",
          "kind": "class",
          "signature": "class Spinner extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Feedback/Status",
      "path": "plauna/reference/widgets/Feedback/Status.md",
      "source": "plauna/widgets/Feedback/Status.js",
      "import": "/plauna/widgets/Feedback/Status.js",
      "sourceHash": "75b1b49fddcdb22a79933c4c32de4d14edd0efddc6a3c15f5a4254fcdd3805ab",
      "summary": "Status - Status indicator widget for Plauna Provides status functionality with multiple variants and sizes",
      "exports": [
        {
          "name": "Status",
          "kind": "class",
          "signature": "class Status extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Feedback/Toast",
      "path": "plauna/reference/widgets/Feedback/Toast.md",
      "source": "plauna/widgets/Feedback/Toast.js",
      "import": "/plauna/widgets/Feedback/Toast.js",
      "sourceHash": "c98a5a42372a973ce479854944e8907d144ff3b84c110f2e3620b951b6ace685",
      "summary": "Toast - Notification toast widget for Plauna Provides toast functionality with multiple variants and auto-dismiss",
      "exports": [
        {
          "name": "Toast",
          "kind": "class",
          "signature": "class Toast extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Feedback/index",
      "path": "plauna/reference/widgets/Feedback/index.md",
      "source": "plauna/widgets/Feedback/index.js",
      "import": "/plauna/widgets/Feedback/index.js",
      "sourceHash": "5432cd012c07fcce204741f64ae9d1592eec230fb57c8a05c49bf7acdd8f7095",
      "summary": "Feedback Widgets Category User feedback and notification widgets",
      "exports": [
        {
          "name": "getFeedbackWidget",
          "kind": "function",
          "signature": "getFeedbackWidget(id)",
          "summary": ""
        },
        {
          "name": "getAllFeedbackWidgets",
          "kind": "function",
          "signature": "getAllFeedbackWidgets()",
          "summary": ""
        },
        {
          "name": "feedbackWidgets",
          "kind": "constant",
          "signature": "feedbackWidgets",
          "summary": ""
        },
        {
          "name": "feedbackWidgetRegistry",
          "kind": "constant",
          "signature": "feedbackWidgetRegistry",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Checkbox",
      "path": "plauna/reference/widgets/Form/Checkbox.md",
      "source": "plauna/widgets/Form/Checkbox.js",
      "import": "/plauna/widgets/Form/Checkbox.js",
      "sourceHash": "819915f03a8eebe46dfd977356cb11225f0cdfa2370f9fc094fd4bb7b358e906",
      "summary": "Checkbox - Multi-select form control widget for Plauna Provides checkbox functionality with multiple states and variants",
      "exports": [
        {
          "name": "Checkbox",
          "kind": "class",
          "signature": "class Checkbox extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Input",
      "path": "plauna/reference/widgets/Form/Input.md",
      "source": "plauna/widgets/Form/Input.js",
      "import": "/plauna/widgets/Form/Input.js",
      "sourceHash": "0190046b22177822c18b1b9b9ef06356211902f370f1f250ec0ab69e07b3e720",
      "summary": "Input - Form input widget for Plauna Provides text input with validation and styling options",
      "exports": [
        {
          "name": "Input",
          "kind": "class",
          "signature": "class Input extends UINode",
          "summary": ""
        },
        {
          "name": "InputFactory",
          "kind": "constant",
          "signature": "InputFactory",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Radio",
      "path": "plauna/reference/widgets/Form/Radio.md",
      "source": "plauna/widgets/Form/Radio.js",
      "import": "/plauna/widgets/Form/Radio.js",
      "sourceHash": "cd7c6ebce5e5a7d56d1e853099a336f2000584169d9e7c40450230c52068366e",
      "summary": "Radio - Single-select form control widget for Plauna Provides radio button functionality with multiple states and variants",
      "exports": [
        {
          "name": "Radio",
          "kind": "class",
          "signature": "class Radio extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Rating",
      "path": "plauna/reference/widgets/Form/Rating.md",
      "source": "plauna/widgets/Form/Rating.js",
      "import": "/plauna/widgets/Form/Rating.js",
      "sourceHash": "d0e618dda344337e0d8da801dfd0e91af4431de890a256d6196ad91592c2ad83",
      "summary": "Rating - Star rating widget for Plauna Provides rating functionality with multiple states and variants",
      "exports": [
        {
          "name": "Rating",
          "kind": "class",
          "signature": "class Rating extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Select",
      "path": "plauna/reference/widgets/Form/Select.md",
      "source": "plauna/widgets/Form/Select.js",
      "import": "/plauna/widgets/Form/Select.js",
      "sourceHash": "6758951b44ac9478eb7cded71670b56ff7ce3cc61a1f6d5db5bfa0dc7d3ec4b9",
      "summary": "Select - Multi-option selection widget for Plauna Provides dropdown functionality with search and keyboard navigation",
      "exports": [
        {
          "name": "Select",
          "kind": "class",
          "signature": "class Select extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Slider",
      "path": "plauna/reference/widgets/Form/Slider.md",
      "source": "plauna/widgets/Form/Slider.js",
      "import": "/plauna/widgets/Form/Slider.js",
      "sourceHash": "006c32fca8ede1237bb0b3f4471ee4e76ddec4d93ef7755d2182ddbac3a7961d",
      "summary": "Slider - Range selection widget for Plauna Provides slider functionality with multiple states and variants",
      "exports": [
        {
          "name": "Slider",
          "kind": "class",
          "signature": "class Slider extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Switch",
      "path": "plauna/reference/widgets/Form/Switch.md",
      "source": "plauna/widgets/Form/Switch.js",
      "import": "/plauna/widgets/Form/Switch.js",
      "sourceHash": "fa900701f9e3cc04cefd9c1f925dc659cad0c0a991b9eca439aa172f77a162de",
      "summary": "Switch - Binary on/off form control widget for Plauna Provides toggle functionality with multiple states and variants",
      "exports": [
        {
          "name": "Switch",
          "kind": "class",
          "signature": "class Switch extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/Textarea",
      "path": "plauna/reference/widgets/Form/Textarea.md",
      "source": "plauna/widgets/Form/Textarea.js",
      "import": "/plauna/widgets/Form/Textarea.js",
      "sourceHash": "ca515ad55c5f048c6194308ec7fc493ace6a2390aa5a05ac2f68f5186f52cc39",
      "summary": "Textarea - Multi-line text input widget for Plauna Provides textarea functionality with multiple states and variants",
      "exports": [
        {
          "name": "Textarea",
          "kind": "class",
          "signature": "class Textarea extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Form/index",
      "path": "plauna/reference/widgets/Form/index.md",
      "source": "plauna/widgets/Form/index.js",
      "import": "/plauna/widgets/Form/index.js",
      "sourceHash": "9dc6d8f5bc41aa1ad794286d3cc5e57177a5dc663ccdd90512e5fa39167b5061",
      "summary": "Form Widgets Category Form elements and validation widgets",
      "exports": [
        {
          "name": "getFormWidget",
          "kind": "function",
          "signature": "getFormWidget(id)",
          "summary": ""
        },
        {
          "name": "getAllFormWidgets",
          "kind": "function",
          "signature": "getAllFormWidgets()",
          "summary": ""
        },
        {
          "name": "formWidgets",
          "kind": "constant",
          "signature": "formWidgets",
          "summary": ""
        },
        {
          "name": "formWidgetRegistry",
          "kind": "constant",
          "signature": "formWidgetRegistry",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Button",
      "path": "plauna/reference/widgets/Input/Button.md",
      "source": "plauna/widgets/Input/Button.js",
      "import": "/plauna/widgets/Input/Button.js",
      "sourceHash": "a40c11eaca8a62d7bc592edd40cac718e5f14caf0710b0e876c709779d48590a",
      "summary": "Button - Interactive button widget for Plauna Provides various button types, states, and accessibility",
      "exports": [
        {
          "name": "Button",
          "kind": "class",
          "signature": "class Button extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Color",
      "path": "plauna/reference/widgets/Input/Color.md",
      "source": "plauna/widgets/Input/Color.js",
      "import": "/plauna/widgets/Input/Color.js",
      "sourceHash": "0a4dd8695e09c9310926f9c422bafed65c2998f417e89e414a18ea8e43da8d1a",
      "summary": "Color - Color picker widget for Plauna Provides color selection with various input formats",
      "exports": [
        {
          "name": "Color",
          "kind": "class",
          "signature": "class Color extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Date",
      "path": "plauna/reference/widgets/Input/Date.md",
      "source": "plauna/widgets/Input/Date.js",
      "import": "/plauna/widgets/Input/Date.js",
      "sourceHash": "c772506febfc28914d32ad8da2b4c5dd47c398bc229abd4065da73983f020599",
      "summary": "Date - Date picker widget for Plauna Provides date selection with various formats and validation",
      "exports": [
        {
          "name": "Date",
          "kind": "class",
          "signature": "class Date extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/File",
      "path": "plauna/reference/widgets/Input/File.md",
      "source": "plauna/widgets/Input/File.js",
      "import": "/plauna/widgets/Input/File.js",
      "sourceHash": "51f0523ae0f9711d4453c9a9f6033f316c129900808481f915e7c8ee63f58082",
      "summary": "File - File input widget for Plauna Provides file upload functionality with drag-and-drop support",
      "exports": [
        {
          "name": "File",
          "kind": "class",
          "signature": "class File extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Input",
      "path": "plauna/reference/widgets/Input/Input.md",
      "source": "plauna/widgets/Input/Input.js",
      "import": "/plauna/widgets/Input/Input.js",
      "sourceHash": "04721512a09b1c84f10d129c05d8cff6144ea5cec841030f08a7bb6f2632e3ac",
      "summary": "Input - Text input widget for Plauna Provides various input types with validation, states, and accessibility",
      "exports": [
        {
          "name": "Input",
          "kind": "class",
          "signature": "class Input extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Number",
      "path": "plauna/reference/widgets/Input/Number.md",
      "source": "plauna/widgets/Input/Number.js",
      "import": "/plauna/widgets/Input/Number.js",
      "sourceHash": "33b06919cfde38c05d648e791b71a94e8ebd137e75952d4bdcb39093af4fa305",
      "summary": "Number - Number input widget for Plauna Provides numeric input with validation, controls, and formatting",
      "exports": [
        {
          "name": "Number",
          "kind": "class",
          "signature": "class Number extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Range",
      "path": "plauna/reference/widgets/Input/Range.md",
      "source": "plauna/widgets/Input/Range.js",
      "import": "/plauna/widgets/Input/Range.js",
      "sourceHash": "3b0fbe9c6b409487ffa7b30ed1efa750a4168e58cc1006c6d8318bede68b76bf",
      "summary": "Range - Range slider widget for Plauna Provides range selection with various configurations",
      "exports": [
        {
          "name": "Range",
          "kind": "class",
          "signature": "class Range extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Search",
      "path": "plauna/reference/widgets/Input/Search.md",
      "source": "plauna/widgets/Input/Search.js",
      "import": "/plauna/widgets/Input/Search.js",
      "sourceHash": "08dac219011fd432a1ce6ac1c540dfedf24c58c3d086b79bb2d1e2bffda2d9b8",
      "summary": "Search - Search input widget for Plauna Provides search functionality with suggestions and filters",
      "exports": [
        {
          "name": "Search",
          "kind": "class",
          "signature": "class Search extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Search.new",
      "path": "plauna/reference/widgets/Input/Search.new.md",
      "source": "plauna/widgets/Input/Search.new.js",
      "import": "/plauna/widgets/Input/Search.new.js",
      "sourceHash": "43517bc2fee56a549e7a1ca9c76e4db810fcd1c6d55469c62ebfc51b855d3107",
      "summary": "Search - Search input widget for Plauna Provides search functionality with suggestions and filters Refactored to follow the new WidgetItem pattern while maintaining UINode compatibility",
      "exports": [
        {
          "name": "Search",
          "kind": "class",
          "signature": "class Search extends WidgetItem",
          "summary": ""
        },
        {
          "name": "SearchUINode",
          "kind": "re-export",
          "signature": "SearchUINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Tag",
      "path": "plauna/reference/widgets/Input/Tag.md",
      "source": "plauna/widgets/Input/Tag.js",
      "import": "/plauna/widgets/Input/Tag.js",
      "sourceHash": "2eea9ade75d2aae231e36921c63487fe3192d5aac13a3dc35486b29427db13f8",
      "summary": "Tag - Tag input widget for Plauna Provides tag management with autocomplete and suggestions",
      "exports": [
        {
          "name": "Tag",
          "kind": "class",
          "signature": "class Tag extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Time",
      "path": "plauna/reference/widgets/Input/Time.md",
      "source": "plauna/widgets/Input/Time.js",
      "import": "/plauna/widgets/Input/Time.js",
      "sourceHash": "2bd5d54f9954aa1395c46078c31e61c5f4c4eeab7d2eb00ebd358debd4b6984b",
      "summary": "Time - Time picker widget for Plauna Provides time selection with various formats and validation",
      "exports": [
        {
          "name": "Time",
          "kind": "class",
          "signature": "class Time extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/Upload",
      "path": "plauna/reference/widgets/Input/Upload.md",
      "source": "plauna/widgets/Input/Upload.js",
      "import": "/plauna/widgets/Input/Upload.js",
      "sourceHash": "3f02ae8524884c5bd9bd39a6d4e76ec720909b8453dd1cd98d31d11769ecf0f3",
      "summary": "Upload - File upload widget for Plauna Provides advanced file upload with drag-and-drop, progress, and preview",
      "exports": [
        {
          "name": "Upload",
          "kind": "class",
          "signature": "class Upload extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Input/index",
      "path": "plauna/reference/widgets/Input/index.md",
      "source": "plauna/widgets/Input/index.js",
      "import": "/plauna/widgets/Input/index.js",
      "sourceHash": "eb86f67152f7609a10e8c93bd0c130ee71faca70443c7290fa288a15498d7fb5",
      "summary": "Input Widgets Category User input and data entry widgets",
      "exports": [
        {
          "name": "getInputWidget",
          "kind": "function",
          "signature": "getInputWidget(id)",
          "summary": ""
        },
        {
          "name": "getAllInputWidgets",
          "kind": "function",
          "signature": "getAllInputWidgets()",
          "summary": ""
        },
        {
          "name": "inputWidgets",
          "kind": "constant",
          "signature": "inputWidgets",
          "summary": ""
        },
        {
          "name": "inputWidgetRegistry",
          "kind": "constant",
          "signature": "inputWidgetRegistry",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/Collapse",
      "path": "plauna/reference/widgets/Layout/Collapse.md",
      "source": "plauna/widgets/Layout/Collapse.js",
      "import": "/plauna/widgets/Layout/Collapse.js",
      "sourceHash": "2ab08c73c8180bdd5e7c663fc463f41bdf07c9e3ffea8d2cd1b2658dfd7dba67",
      "summary": "Collapse - Collapsible content widget for Plauna Provides collapsible/expandable content areas with smooth animations",
      "exports": [
        {
          "name": "Collapse",
          "kind": "class",
          "signature": "class Collapse extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/Container",
      "path": "plauna/reference/widgets/Layout/Container.md",
      "source": "plauna/widgets/Layout/Container.js",
      "import": "/plauna/widgets/Layout/Container.js",
      "sourceHash": "c3b3a061522323f756f4713a26a62e455c1c5684c12a30d0cbfda57cd438c9f6",
      "summary": "Container - Layout container widget for Plauna Provides flexible container with multiple variants and layouts",
      "exports": [
        {
          "name": "Container",
          "kind": "class",
          "signature": "class Container extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/Divider",
      "path": "plauna/reference/widgets/Layout/Divider.md",
      "source": "plauna/widgets/Layout/Divider.js",
      "import": "/plauna/widgets/Layout/Divider.js",
      "sourceHash": "4de573bc862106b3554742a5ff9fb58ac6a70ffbfea3dad9f4f3e17d8dfd0a33",
      "summary": "Divider - Visual separation widget for Plauna Provides orientation variants with text label support",
      "exports": [
        {
          "name": "Divider",
          "kind": "class",
          "signature": "class Divider extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/Grid",
      "path": "plauna/reference/widgets/Layout/Grid.md",
      "source": "plauna/widgets/Layout/Grid.js",
      "import": "/plauna/widgets/Layout/Grid.js",
      "sourceHash": "2945ef0528976abf5267d267c97452ef6f090edfb718a4c177ab532c5ec8877d",
      "summary": "Grid - CSS Grid wrapper widget for Plauna Provides responsive breakpoints and template areas support",
      "exports": [
        {
          "name": "Grid",
          "kind": "class",
          "signature": "class Grid extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/HeaderFooter",
      "path": "plauna/reference/widgets/Layout/HeaderFooter.md",
      "source": "plauna/widgets/Layout/HeaderFooter.js",
      "import": "/plauna/widgets/Layout/HeaderFooter.js",
      "sourceHash": "4453cf7a8b1bfe32b4991e44f745240f85e8da481d4994e3ebc27ce233e9778d",
      "summary": "HeaderFooter - Header and Footer widget for Plauna Provides semantic header and footer containers with comprehensive styling options",
      "exports": [
        {
          "name": "HeaderFooter",
          "kind": "class",
          "signature": "class HeaderFooter extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/Panel",
      "path": "plauna/reference/widgets/Layout/Panel.md",
      "source": "plauna/widgets/Layout/Panel.js",
      "import": "/plauna/widgets/Layout/Panel.js",
      "sourceHash": "982c93f890232d7c3fba6a147be32a1d09428b568859e02acbc6a8df995705a8",
      "summary": "Panel - Content panel widget for Plauna Provides panel containers with various styles and configurations",
      "exports": [
        {
          "name": "Panel",
          "kind": "class",
          "signature": "class Panel extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/Section",
      "path": "plauna/reference/widgets/Layout/Section.md",
      "source": "plauna/widgets/Layout/Section.js",
      "import": "/plauna/widgets/Layout/Section.js",
      "sourceHash": "0726a046425d99acde614321181e56e2461fd63851dd6a42d7c23748a8ea7148",
      "summary": "Section - Content section widget for Plauna Provides semantic section containers with layout and styling options",
      "exports": [
        {
          "name": "Section",
          "kind": "class",
          "signature": "class Section extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/Spacer",
      "path": "plauna/reference/widgets/Layout/Spacer.md",
      "source": "plauna/widgets/Layout/Spacer.js",
      "import": "/plauna/widgets/Layout/Spacer.js",
      "sourceHash": "fba5b32f8d37f194ca3b8b1542b8aa1988fad048f0ded1f282c1728ff3420998",
      "summary": "Spacer - Flexible spacing utility widget for Plauna Provides flexible sizing with token integration",
      "exports": [
        {
          "name": "Spacer",
          "kind": "class",
          "signature": "class Spacer extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Layout/index",
      "path": "plauna/reference/widgets/Layout/index.md",
      "source": "plauna/widgets/Layout/index.js",
      "import": "/plauna/widgets/Layout/index.js",
      "sourceHash": "dab3d5c8c1ca62ca8efb6133b758b8309cacf082b0ec6f5d5757d10f9a7d4ae2",
      "summary": "Layout Widgets Category Layout and container widgets",
      "exports": [
        {
          "name": "getLayoutWidget",
          "kind": "function",
          "signature": "getLayoutWidget(id)",
          "summary": ""
        },
        {
          "name": "getAllLayoutWidgets",
          "kind": "function",
          "signature": "getAllLayoutWidgets()",
          "summary": ""
        },
        {
          "name": "layoutWidgets",
          "kind": "constant",
          "signature": "layoutWidgets",
          "summary": ""
        },
        {
          "name": "layoutWidgetRegistry",
          "kind": "constant",
          "signature": "layoutWidgetRegistry",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Breadcrumb",
      "path": "plauna/reference/widgets/Navigation/Breadcrumb.md",
      "source": "plauna/widgets/Navigation/Breadcrumb.js",
      "import": "/plauna/widgets/Navigation/Breadcrumb.js",
      "sourceHash": "1c50d63c3dc917e32c38b1f7bca1cdc1ec0816d16521a834294fda2683845c7a",
      "summary": "Breadcrumb - Navigation hierarchy widget for Plauna Provides breadcrumb navigation with customizable separators",
      "exports": [
        {
          "name": "Breadcrumb",
          "kind": "class",
          "signature": "class Breadcrumb extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Dropdown",
      "path": "plauna/reference/widgets/Navigation/Dropdown.md",
      "source": "plauna/widgets/Navigation/Dropdown.js",
      "import": "/plauna/widgets/Navigation/Dropdown.js",
      "sourceHash": "eab9709e664227ce58a808476fe3d0ead818bcbdcdf779010a30c0841a2e17c3",
      "summary": "Dropdown - Context menu widget for Plauna Provides dropdown menus with keyboard navigation and accessibility",
      "exports": [
        {
          "name": "Dropdown",
          "kind": "class",
          "signature": "class Dropdown extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Menu",
      "path": "plauna/reference/widgets/Navigation/Menu.md",
      "source": "plauna/widgets/Navigation/Menu.js",
      "import": "/plauna/widgets/Navigation/Menu.js",
      "sourceHash": "1ae886fcbae9f5da7ca9f434b53212ee3401f8fafdf33731e181f80bff33b405",
      "summary": "Menu - Navigation menu widget for Plauna Provides menu functionality with multiple variants and states",
      "exports": [
        {
          "name": "Menu",
          "kind": "class",
          "signature": "class Menu extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Navbar",
      "path": "plauna/reference/widgets/Navigation/Navbar.md",
      "source": "plauna/widgets/Navigation/Navbar.js",
      "import": "/plauna/widgets/Navigation/Navbar.js",
      "sourceHash": "f514d8024ad40a509b4933f93f62e012be3e5cb5d9b20ea741e45a5bcaf99b90",
      "summary": "Navbar - Navigation bar widget for Plauna Provides navbar functionality with multiple variants and layouts",
      "exports": [
        {
          "name": "Navbar",
          "kind": "class",
          "signature": "class Navbar extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Pagination",
      "path": "plauna/reference/widgets/Navigation/Pagination.md",
      "source": "plauna/widgets/Navigation/Pagination.js",
      "import": "/plauna/widgets/Navigation/Pagination.js",
      "sourceHash": "19afcb13f30c70edd85a96a17f59ad9100df46ea5e547560690b9a51ba41f99c",
      "summary": "Pagination - Data navigation widget for Plauna Provides page controls with ellipsis and keyboard navigation",
      "exports": [
        {
          "name": "Pagination",
          "kind": "class",
          "signature": "class Pagination extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Sidebar",
      "path": "plauna/reference/widgets/Navigation/Sidebar.md",
      "source": "plauna/widgets/Navigation/Sidebar.js",
      "import": "/plauna/widgets/Navigation/Sidebar.js",
      "sourceHash": "51c4dd1d8012380e96e21f055b15643745e52abb3c67e12b9891b6ef73982d06",
      "summary": "Sidebar - Sidebar navigation widget for Plauna Provides sidebar functionality with multiple variants and states",
      "exports": [
        {
          "name": "Sidebar",
          "kind": "class",
          "signature": "class Sidebar extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Stepper",
      "path": "plauna/reference/widgets/Navigation/Stepper.md",
      "source": "plauna/widgets/Navigation/Stepper.js",
      "import": "/plauna/widgets/Navigation/Stepper.js",
      "sourceHash": "28b19486329eb5fc23f6c7663b2f74217f2a6483a6791b07f088b00bbf480125",
      "summary": "Stepper - Step indicator widget for Plauna Provides stepper functionality with multiple variants and states",
      "exports": [
        {
          "name": "Stepper",
          "kind": "class",
          "signature": "class Stepper extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/Tabs",
      "path": "plauna/reference/widgets/Navigation/Tabs.md",
      "source": "plauna/widgets/Navigation/Tabs.js",
      "import": "/plauna/widgets/Navigation/Tabs.js",
      "sourceHash": "c5d6441f13c343fefdec3fbe8c4c442c5ebc8383c7e4a4cacf4bd8ca03a73894",
      "summary": "Tabs - Tab navigation widget for Plauna Provides tabbed interface with keyboard navigation and styling",
      "exports": [
        {
          "name": "Tabs",
          "kind": "class",
          "signature": "class Tabs extends UINode",
          "summary": ""
        },
        {
          "name": "TabsFactory",
          "kind": "constant",
          "signature": "TabsFactory",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Navigation/index",
      "path": "plauna/reference/widgets/Navigation/index.md",
      "source": "plauna/widgets/Navigation/index.js",
      "import": "/plauna/widgets/Navigation/index.js",
      "sourceHash": "28393120f06dc354de21fd15e935d717405e97b3e07b7dd407e5ce453e3de290",
      "summary": "Navigation Widgets Category Navigation and menu widgets",
      "exports": [
        {
          "name": "getNavigationWidget",
          "kind": "function",
          "signature": "getNavigationWidget(id)",
          "summary": ""
        },
        {
          "name": "getAllNavigationWidgets",
          "kind": "function",
          "signature": "getAllNavigationWidgets()",
          "summary": ""
        },
        {
          "name": "navigationWidgets",
          "kind": "constant",
          "signature": "navigationWidgets",
          "summary": ""
        },
        {
          "name": "navigationWidgetRegistry",
          "kind": "constant",
          "signature": "navigationWidgetRegistry",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Avatar",
      "path": "plauna/reference/widgets/Primitive/Avatar.md",
      "source": "plauna/widgets/Primitive/Avatar.js",
      "import": "/plauna/widgets/Primitive/Avatar.js",
      "sourceHash": "ef405346036184033d4d26029934550a068870ef98663b382b6db2e5c8e2f658",
      "summary": "Avatar - User representation widget for Plauna Provides image, icon, and text fallback with status indicators",
      "exports": [
        {
          "name": "Avatar",
          "kind": "class",
          "signature": "class Avatar extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Badge",
      "path": "plauna/reference/widgets/Primitive/Badge.md",
      "source": "plauna/widgets/Primitive/Badge.js",
      "import": "/plauna/widgets/Primitive/Badge.js",
      "sourceHash": "c04645c5bb48a3dce981bc68f9e2db633a57176985d2632dfd5dcc826804a0a2",
      "summary": "Badge - Status indicator widget for Plauna Provides status indicators, counts, and labels with variants",
      "exports": [
        {
          "name": "Badge",
          "kind": "class",
          "signature": "class Badge extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Button",
      "path": "plauna/reference/widgets/Primitive/Button.md",
      "source": "plauna/widgets/Primitive/Button.js",
      "import": "/plauna/widgets/Primitive/Button.js",
      "sourceHash": "f9c92aa84595242316c83155015a9415b32a7060ad166d887bc27698e1038406",
      "summary": "Button - Interactive button widget for Plauna Provides clickable button with styling, states, and event handling",
      "exports": [
        {
          "name": "Button",
          "kind": "class",
          "signature": "class Button extends UINode",
          "summary": ""
        },
        {
          "name": "ButtonFactory",
          "kind": "constant",
          "signature": "ButtonFactory",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Chip",
      "path": "plauna/reference/widgets/Primitive/Chip.md",
      "source": "plauna/widgets/Primitive/Chip.js",
      "import": "/plauna/widgets/Primitive/Chip.js",
      "sourceHash": "df938286c5ba7039573e9735d161be8aa57e92c8b01525db8cd74bb2a949f6bb",
      "summary": "Chip/Tag - Removable tag widget for Plauna Provides chip functionality with multiple variants and states",
      "exports": [
        {
          "name": "Chip",
          "kind": "class",
          "signature": "class Chip extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Modal",
      "path": "plauna/reference/widgets/Primitive/Modal.md",
      "source": "plauna/widgets/Primitive/Modal.js",
      "import": "/plauna/widgets/Primitive/Modal.js",
      "sourceHash": "4d78ac8ebd653538391dfa54b71742978ed51355c888a9306dded5868991a227",
      "summary": "Modal - Overlay dialog widget for Plauna Provides modal dialogs with focus trapping, accessibility, and backdrop",
      "exports": [
        {
          "name": "Modal",
          "kind": "class",
          "signature": "class Modal extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Panel",
      "path": "plauna/reference/widgets/Primitive/Panel.md",
      "source": "plauna/widgets/Primitive/Panel.js",
      "import": "/plauna/widgets/Primitive/Panel.js",
      "sourceHash": "948eaeb3897d7faf0e4f86fa15b6ca43fb00ed1379833dc2fcb8381d38ce4bd6",
      "summary": "Panel - Basic container widget for Plauna Provides a container for other UI elements with styling and layout options",
      "exports": [
        {
          "name": "Panel",
          "kind": "class",
          "signature": "class Panel extends UINode",
          "summary": ""
        },
        {
          "name": "PanelFactory",
          "kind": "constant",
          "signature": "PanelFactory",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Progress",
      "path": "plauna/reference/widgets/Primitive/Progress.md",
      "source": "plauna/widgets/Primitive/Progress.js",
      "import": "/plauna/widgets/Primitive/Progress.js",
      "sourceHash": "8a23205004a48e09cbea3f125b6b287843711b3b4768687027e61c95d21a39fd",
      "summary": "Progress - Task completion indicator widget for Plauna Provides linear and circular progress indicators with multiple states",
      "exports": [
        {
          "name": "Progress",
          "kind": "class",
          "signature": "class Progress extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Skeleton",
      "path": "plauna/reference/widgets/Primitive/Skeleton.md",
      "source": "plauna/widgets/Primitive/Skeleton.js",
      "import": "/plauna/widgets/Primitive/Skeleton.js",
      "sourceHash": "238888bdd1e9a8a6eab57e03b657f5f636b7d850fb3468350654a8972b196243",
      "summary": "Skeleton - Content loading placeholder widget for Plauna Provides loading placeholders with realistic shapes and shimmer animation",
      "exports": [
        {
          "name": "Skeleton",
          "kind": "class",
          "signature": "class Skeleton extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Text",
      "path": "plauna/reference/widgets/Primitive/Text.md",
      "source": "plauna/widgets/Primitive/Text.js",
      "import": "/plauna/widgets/Primitive/Text.js",
      "sourceHash": "a9f00b2fd28138f74eea4a16308aa1f7b288c908be19c65c604a2270a42b3e20",
      "summary": "Text - Basic text widget for Plauna Provides text rendering with styling and layout options",
      "exports": [
        {
          "name": "Text",
          "kind": "class",
          "signature": "class Text extends UINode",
          "summary": ""
        },
        {
          "name": "TextFactory",
          "kind": "constant",
          "signature": "TextFactory",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/Primitive/Tooltip",
      "path": "plauna/reference/widgets/Primitive/Tooltip.md",
      "source": "plauna/widgets/Primitive/Tooltip.js",
      "import": "/plauna/widgets/Primitive/Tooltip.js",
      "sourceHash": "6bdddaaaa0031e8cabdab46ded999aa7a65c092a9b4af7900a8f2b1c067180c9",
      "summary": "Tooltip - Contextual help widget for Plauna Provides positioning engine with arrow support and accessibility",
      "exports": [
        {
          "name": "Tooltip",
          "kind": "class",
          "signature": "class Tooltip extends UINode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/WidgetConfig",
      "path": "plauna/reference/widgets/WidgetConfig.md",
      "source": "plauna/widgets/WidgetConfig.js",
      "import": "/plauna/widgets/WidgetConfig.js",
      "sourceHash": "f9c1a6f7df17f4a9c9181b19a46915c1417bfeb10c910ddc10a9b020aa9af289",
      "summary": "Widget Configuration System Manages widget configurations, presets, and user preferences Following the same pattern as the editor's theme system",
      "exports": [
        {
          "name": "UnsupportedWidgetConfigVersionError",
          "kind": "class",
          "signature": "class UnsupportedWidgetConfigVersionError extends Error",
          "summary": ""
        },
        {
          "name": "prepareWidgetConfigImport",
          "kind": "function",
          "signature": "prepareWidgetConfigImport(input)",
          "summary": ""
        },
        {
          "name": "WIDGET_CONFIG_SCHEMA",
          "kind": "constant",
          "signature": "WIDGET_CONFIG_SCHEMA",
          "summary": ""
        },
        {
          "name": "WIDGET_CONFIG_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "WIDGET_CONFIG_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "widgetConfigManager",
          "kind": "constant",
          "signature": "widgetConfigManager",
          "summary": "Singleton export for WidgetConfigManager. Ensures a single instance is used throughout the application: - Consistent configuration state across all components - Single storage persistence point - Centralized event notification system"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/WidgetItem",
      "path": "plauna/reference/widgets/WidgetItem.md",
      "source": "plauna/widgets/WidgetItem.js",
      "import": "/plauna/widgets/WidgetItem.js",
      "sourceHash": "1918051dc66ee29bb7d8cc01201319858cfd4fb07cfb1d822aa86281b66d3da0",
      "summary": "WidgetItem - Base class for all Plauna widgets. Follows the same pattern as SpawnableItem from the editor: - Static properties for metadata - Static methods for configuration - Registry-based discovery - Category-based organization ```js export class MyWidget extends WidgetItem { static id = 'my-widget'; static name = 'My Widget'; static icon = '🔧'; static category = 'custom'; static description = 'A custom widget for specific use case'; static create(container, options = {}) { return new MyWidget(container, options); } } ```",
      "exports": [
        {
          "name": "MyWidget",
          "kind": "class",
          "signature": "class MyWidget extends WidgetItem",
          "summary": ""
        },
        {
          "name": "WidgetItem",
          "kind": "class",
          "signature": "class WidgetItem",
          "summary": "WidgetItem - Base class for all Plauna widgets. Follows the same pattern as SpawnableItem from the editor: - Static properties for metadata - Static methods for configuration - Registry-based discovery - Category-based organization ```js export class MyWidget extends WidgetItem { static id = 'my-widget'; static name = 'My Widget'; static icon = '🔧'; static category = 'custom'; static description = 'A custom widget for specific use case'; static create(container, options = {}) { return new MyWidget(container, options); } } ```"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/WidgetRenderer",
      "path": "plauna/reference/widgets/WidgetRenderer.md",
      "source": "plauna/widgets/WidgetRenderer.js",
      "import": "/plauna/widgets/WidgetRenderer.js",
      "sourceHash": "7e4953a611b3cd2e2850cb6dd8020ee6af448395dd0c23249718b7fbd41bf52e",
      "summary": "============================================================================ WidgetRenderer - UINode to DOM Converter ============================================================================ WidgetRenderer is the bridge between Plauna's retained UINode tree and the actual browser DOM. It converts UINode instances into DOM elements recursively. RENDERING PIPELINE: 1. render(node) - Entry point, converts UINode tree to DOM tree 2. createDOMElement(node) - Creates appropriate DOM element for UINode type 3. Applies styles, classes, IDs, text content, and attributes 4. Recursively renders children and appends to parent 5. Returns root DOM element ready for insertion into document MAPPING TABLES: - nodeToDOM: Map<UINode, HTMLElement> - UINode → DOM element - domToNode: Map<HTMLElement, UINode> - DOM element → UINode (reverse lookup) ELEMENT TYPE MAPPING: - SVG elements: svg, circle, path, etc. → created with createElementNS - Text nodes: type='text' → rendered as <span> - Form elements: button, input, textarea, select, label, form, img → native elements - HTML elements: h1-h6, p, div, header, footer, nav, etc. → native elements - Unknown types: fallback to <div> SPECIAL HANDLING: - Raw HTMLElements: If node is already an HTMLElement, return it directly - Pre-existing DOM: If node.element exists (created by widget), use it - Back-reference: Sets element._plaunaNode for reverse lookup (used by SmartContextMenu) STYLE APPLICATION: 1. node.style: Direct inline styles (highest priority) 2. node.computedStyle: Computed styles from layout engine 3. node.className: CSS class names 4. node.id: Element ID TEXT CONTENT: - node.textContent: Plain text content - node.innerHTML: HTML string content - If node has children, text content is ignored",
      "exports": [
        {
          "name": "WidgetRenderer",
          "kind": "class",
          "signature": "class WidgetRenderer",
          "summary": "============================================================================ WidgetRenderer - UINode to DOM Converter ============================================================================ WidgetRenderer is the bridge between Plauna's retained UINode tree and the actual browser DOM. It converts UINode instances into DOM elements recursively. RENDERING PIPELINE: 1. render(node) - Entry point, converts UINode tree to DOM tree 2. createDOMElement(node) - Creates appropriate DOM element for UINode type 3. Applies styles, classes, IDs, text content, and attributes 4. Recursively renders children and appends to parent 5. Returns root DOM element ready for insertion into document MAPPING TABLES: - nodeToDOM: Map<UINode, HTMLElement> - UINode → DOM element - domToNode: Map<HTMLElement, UINode> - DOM element → UINode (reverse lookup) ELEMENT TYPE MAPPING: - SVG elements: svg, circle, path, etc. → created with createElementNS - Text nodes: type='text' → rendered as <span> - Form elements: button, input, textarea, select, label, form, img → native elements - HTML elements: h1-h6, p, div, header, footer, nav, etc. → native elements - Unknown types: fallback to <div> SPECIAL HANDLING: - Raw HTMLElements: If node is already an HTMLElement, return it directly - Pre-existing DOM: If node.element exists (created by widget), use it - Back-reference: Sets element._plaunaNode for reverse lookup (used by SmartContextMenu) STYLE APPLICATION: 1. node.style: Direct inline styles (highest priority) 2. node.computedStyle: Computed styles from layout engine 3. node.className: CSS class names 4. node.id: Element ID TEXT CONTENT: - node.textContent: Plain text content - node.innerHTML: HTML string content - If node has children, text content is ignored"
        },
        {
          "name": "widgetRenderer",
          "kind": "constant",
          "signature": "widgetRenderer",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/WidgetStyleManager",
      "path": "plauna/reference/widgets/WidgetStyleManager.md",
      "source": "plauna/widgets/WidgetStyleManager.js",
      "import": "/plauna/widgets/WidgetStyleManager.js",
      "sourceHash": "0b987b2917e1ca1696ecef1c30771858289ee706e295818534898675ccf53cc2",
      "summary": "WidgetStyleManager - Widget-specific styling system Provides theme-based styling utilities for widgets and UI components",
      "exports": [
        {
          "name": "WidgetStyleManager",
          "kind": "class",
          "signature": "class WidgetStyleManager",
          "summary": "WidgetStyleManager - Theme-aware widget styling system. Architecture pattern: - Singleton pattern for consistent styling across the application - Style caching for performance (memoization by widgetType:variant:theme) - Theme integration with ThemeManager for dynamic theme switching - Observer pattern for reactive style updates on theme changes - Base token fallback for graceful degradation Features: - Generates CSS styles based on theme tokens - Supports multiple widget types (modal, tooltip, dropdown, etc.) - Automatic cache invalidation on theme changes - Token-based styling for consistency"
        },
        {
          "name": "widgetStyleManager",
          "kind": "constant",
          "signature": "widgetStyleManager",
          "summary": "Singleton export for WidgetStyleManager. Ensures a single instance is used throughout the application: - Consistent style caching across all components - Single theme subscription point - Centralized style generation"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "widgets/index",
      "path": "plauna/reference/widgets/index.md",
      "source": "plauna/widgets/index.js",
      "import": "/plauna/widgets/index.js",
      "sourceHash": "355b3371ad6f128442508471d3edd74138396e936ab9dbc823cac2f51b5f1923",
      "summary": "============================================================================ PLAUNA WIDGET REGISTRY ============================================================================ This file serves as the central registry for all Plauna widgets. It imports widgets from their category folders and provides: 1. widgets array - Flat array of all widget classes 2. widgetRegistry - Map of widget.id → widget class for O(1) lookup 3. categories - Map of category name → array of widgets in that category 4. Helper functions for querying and filtering widgets WIDGET CATEGORIES: - Primitive: Basic building blocks (Button, Badge, Avatar, Chip, etc.) - Input: Form input controls (Search, Color, Date, File, etc.) - Form: Form elements (Checkbox, Radio, Switch, Select, etc.) - Layout: Layout containers (Card, Grid, Panel, Divider, etc.) - Navigation: Navigation components (Menu, Tabs, Sidebar, etc.) - DataViews: Data presentation (List, Table, Tree, etc.) - Feedback: User feedback (Alert, Toast, Spinner, etc.) WIDGET PATTERN: Each widget class MUST have: - static id: Unique string identifier (e.g., 'button') - static name: Display name (e.g., 'Button') - static category: Category name (e.g., 'primitive') - static icon: Emoji or icon for UI display - static description: Short description of widget purpose - static tags: Array of searchable tags - static dependencies: Array of required widget IDs - static getDefaultOptions(): Returns default configuration object - static stories(): Returns named story configurations for showcase - constructor(id, options): Initializes widget instance IMPORTANT: - Do NOT use widget.create() - it has require() that breaks in ESM - Instead, instantiate directly: new WidgetClass(id, options) - Use widgetRegistry.get(id) to find widget class by ID",
      "exports": [
        {
          "name": "getWidget",
          "kind": "function",
          "signature": "getWidget(id)",
          "summary": ""
        },
        {
          "name": "getWidgetsByCategory",
          "kind": "function",
          "signature": "getWidgetsByCategory(category)",
          "summary": ""
        },
        {
          "name": "getAllCategories",
          "kind": "function",
          "signature": "getAllCategories()",
          "summary": ""
        },
        {
          "name": "getAllWidgets",
          "kind": "function",
          "signature": "getAllWidgets()",
          "summary": ""
        },
        {
          "name": "searchWidgets",
          "kind": "function",
          "signature": "searchWidgets(query)",
          "summary": ""
        },
        {
          "name": "getWidgetsByTag",
          "kind": "function",
          "signature": "getWidgetsByTag(tag)",
          "summary": ""
        },
        {
          "name": "getWidgetDependencies",
          "kind": "function",
          "signature": "getWidgetDependencies(widgetId)",
          "summary": ""
        },
        {
          "name": "validateWidgetDependencies",
          "kind": "function",
          "signature": "validateWidgetDependencies(widgetId)",
          "summary": ""
        },
        {
          "name": "createWidget",
          "kind": "function",
          "signature": "createWidget(widgetId, container, options = {})",
          "summary": ""
        },
        {
          "name": "createWidgetWithTheme",
          "kind": "function",
          "signature": "createWidgetWithTheme(widgetId, container, theme, options = {})",
          "summary": ""
        },
        {
          "name": "getWidgetMetadata",
          "kind": "function",
          "signature": "getWidgetMetadata(widgetId)",
          "summary": ""
        },
        {
          "name": "getAllWidgetMetadata",
          "kind": "function",
          "signature": "getAllWidgetMetadata()",
          "summary": ""
        },
        {
          "name": "getWidgetDocumentation",
          "kind": "function",
          "signature": "getWidgetDocumentation(widgetId)",
          "summary": ""
        },
        {
          "name": "getWidgetStats",
          "kind": "function",
          "signature": "getWidgetStats()",
          "summary": ""
        },
        {
          "name": "widgets",
          "kind": "constant",
          "signature": "widgets",
          "summary": ""
        },
        {
          "name": "widgetRegistry",
          "kind": "constant",
          "signature": "widgetRegistry",
          "summary": ""
        },
        {
          "name": "categories",
          "kind": "constant",
          "signature": "categories",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "workspace/Panel",
      "path": "plauna/reference/workspace/Panel.md",
      "source": "plauna/workspace/Panel.js",
      "import": "/plauna/workspace/Panel.js",
      "sourceHash": "446ee2b5ba46e12325d64a6c911cb51ba07011f691783d4b0e1cbd0e762d0fee",
      "summary": "Panel.js — Base panel and two concrete flavours: DOMPanel  — a positioned <div> container for Plauna widgets / HTML content GPUPanel  — owns a GPUTexture render target; blitted to canvas by WorkspaceCompositor Lifecycle:  create → mount(container) → [resize / focus / show / hide] → destroy()",
      "exports": [
        {
          "name": "Panel",
          "kind": "class",
          "signature": "class Panel",
          "summary": "Panel - Base class for workspace panels. Architecture pattern: - Abstract base class for DOMPanel and GPUPanel - Lifecycle: create → mount → [resize/focus/show/hide] → destroy - Observer pattern for event emission (move, resize, visibility, focus, blur) - Position/size constraints with min-size enforcement - Z-index management for panel stacking Panel types: - DOMPanel: Renders Plauna widgets in DOM elements - GPUPanel: Renders to WebGPU textures, composited by WorkspaceCompositor"
        },
        {
          "name": "DOMPanel",
          "kind": "class",
          "signature": "class DOMPanel extends Panel",
          "summary": ""
        },
        {
          "name": "GPUPanel",
          "kind": "class",
          "signature": "class GPUPanel extends Panel",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "workspace/PanelLayout",
      "path": "plauna/reference/workspace/PanelLayout.md",
      "source": "plauna/workspace/PanelLayout.js",
      "import": "/plauna/workspace/PanelLayout.js",
      "sourceHash": "3ef1a8ab88ee47e21a177a38ae49dd2b506a4986ceb57cf2414ea98e73bab9bb",
      "summary": "PanelLayout.js — Layout engine for arranging panels in a workspace. Modes: fullscreen — one panel fills the entire workspace float      — panels are free-position windows (drag/resize) split      — tmux/VS Code-style binary split tree (horizontal | vertical) tile       — auto-arranged fixed grid",
      "exports": [
        {
          "name": "LayoutEngine",
          "kind": "class",
          "signature": "class LayoutEngine",
          "summary": "LayoutEngine - Panel layout orchestration. Layout modes: - fullscreen: First visible panel fills entire workspace - float: Panels are free-position windows with drag/resize - split: Binary tree layout (like tmux/VS Code) with recursive splits - tile: Auto-arranged grid layout Architecture: - Mode-based layout dispatch (apply() switches between modes) - Split tree cached for efficiency (reused if panels unchanged) - Z-index management for float mode (focused panel on top) - Observer pattern for mode change notifications"
        },
        {
          "name": "LayoutMode",
          "kind": "constant",
          "signature": "LayoutMode",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "workspace/Workspace",
      "path": "plauna/reference/workspace/Workspace.md",
      "source": "plauna/workspace/Workspace.js",
      "import": "/plauna/workspace/Workspace.js",
      "sourceHash": "a372a172593f511cbc501ad336a8aeb8fa8f5a02c524f0b77c778f7fd801fc70",
      "summary": "Workspace.js — Virtual desktop for panels. Architecture: - Virtual desktop that holds an ordered list of panels - DOM layer that sits over WebGPU canvas - LayoutEngine for panel arrangement (fullscreen/float/split/tile) - WorkspaceManager handles switching between workspaces via CSS transitions Lifecycle: - mount(container): Creates DOM layer and mounts panels - activate(): Shows workspace (opacity 1, pointer-events auto) - deactivate(): Hides workspace (opacity 0, pointer-events none) - CSS transitions for smooth workspace switching Panel management: - addPanel(): Adds panel to workspace and mounts it - removePanel(): Removes panel from workspace - Layout applied automatically on mount and resize",
      "exports": [
        {
          "name": "Workspace",
          "kind": "class",
          "signature": "class Workspace",
          "summary": "Workspace - Virtual desktop container. Virtual desktop pattern: - Each workspace is a separate DOM layer - Workspaces are stacked with CSS z-index - Only one workspace active/visible at a time - CSS opacity transitions for smooth switching - Panels are mounted into workspace DOM layer"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "workspace/WorkspaceCompositor",
      "path": "plauna/reference/workspace/WorkspaceCompositor.md",
      "source": "plauna/workspace/WorkspaceCompositor.js",
      "import": "/plauna/workspace/WorkspaceCompositor.js",
      "sourceHash": "dd866bb5cb51eab623ee06fcb4ce4eb3d02298ddeb7e302ab846793435f8d705",
      "summary": "WorkspaceCompositor.js — WebGPU blit pipeline for GPU panels. Architecture: - Each GPUPanel owns a GPUTexture render target - Compositor blits all visible GPU panels onto canvas swap chain each frame - DOM panels are rendered directly by browser (compositor only handles WebGPU) - Simple blit shader: just copies texture to canvas Pipeline components: - Sampler: Linear filtering for panel textures - Bind group layout: Single texture binding (binding 0) - Shader: Simple vertex + fragment shader for texture copy - Blend state: Alpha blending for layered panels Render loop: - Called by WorkspaceManager each frame - Iterates visible GPU panels in z-order - Creates bind group per panel - Issues draw call (6 vertices for quad)",
      "exports": [
        {
          "name": "WorkspaceCompositor",
          "kind": "class",
          "signature": "class WorkspaceCompositor",
          "summary": "WorkspaceCompositor - WebGPU texture compositor. Compositor pattern: - Blits GPU panel textures to canvas swap chain - Handles only WebGPU panels (DOM panels rendered by browser) - Simple texture copy pipeline (no post-processing) - Alpha blending for layered panel support"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "workspace/WorkspaceManager",
      "path": "plauna/reference/workspace/WorkspaceManager.md",
      "source": "plauna/workspace/WorkspaceManager.js",
      "import": "/plauna/workspace/WorkspaceManager.js",
      "sourceHash": "78c3807db65f3c9e3f4da472cfd9e368b1ef3bee0291f08878e7587bd42eeb01",
      "summary": "============================================================================ WorkspaceManager - Virtual Desktop Management ============================================================================ WorkspaceManager provides a virtual desktop system for Plauna, allowing multiple workspaces with different layouts and panel configurations. WORKSPACE CONCEPT: - A Workspace is a virtual desktop that holds panels - Each workspace can have its own layout mode (fullscreen, float, split, tile) - Workspaces are DOM layers stacked over the canvas - Only one workspace is active/visible at a time PANEL TYPES: - DOMPanel: Wrapper for Plauna widgets (div-based) - GPUPanel: WebGPU texture panel (for GPU-accelerated content) LAYOUT MODES: - fullscreen: One panel fills the entire workspace - float: Draggable, resizable windows with z-order - split: Recursive binary tree layout (like tmux/VS Code) - tile: Auto-arranged grid layout COMPOSITOR: - WorkspaceCompositor blits GPU panel textures to canvas swap chain - Iterates visible GPU panels in z-order - Required for GPU panel support SWITCHER: - WorkspaceSwitcher provides HUD overlay (Ctrl+`) - Shows thumbnails of all workspaces - Keyboard navigation with arrow keys - Enter to switch workspace SINGLE CONSTRAINT: - Only one WebGPU canvas context allowed per page - Only one GPUDevice instance shared across all workspaces - GPU panels share the same device and canvas PUBLIC API: - createWorkspace({ name, layout }): Create new workspace - switchTo(id): Switch active workspace - createPanel(type, options): Create panel in active workspace - list(): List all workspaces - activeWorkspace: Get currently active workspace INITIALIZATION: - Requires: container (DOM element), device (WebGPU), canvas - Optional: format (texture format), logger - Must call initialize() before using KEYBOARD SHORTCUTS: - Ctrl+`: Open workspace switcher - Arrow keys: Navigate switcher - Enter: Switch to selected workspace - Escape: Close switcher USAGE: const manager = new WorkspaceManager({ container: document.body, device: gpuDevice, canvas: canvasElement, format: 'bgra8unorm' }); await manager.initialize(); const ws = manager.createWorkspace({ name: 'Main', layout: 'float' }); manager.switchTo(ws.id); manager.createPanel('dom', { title: 'Panel 1' });",
      "exports": [
        {
          "name": "WorkspaceManager",
          "kind": "class",
          "signature": "class WorkspaceManager",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "workspace/WorkspaceSwitcher",
      "path": "plauna/reference/workspace/WorkspaceSwitcher.md",
      "source": "plauna/workspace/WorkspaceSwitcher.js",
      "import": "/plauna/workspace/WorkspaceSwitcher.js",
      "sourceHash": "32f2aba085789625842a75f602521d4c097b2fd46392ba68878a5322c072af94",
      "summary": "WorkspaceSwitcher.js — HUD overlay for workspace switching. Architecture: - Triggered by Ctrl+` (managed by WorkspaceManager) - Shows thumbnails of all workspaces in grid layout - Keyboard navigation with arrow keys - Enter to switch to selected workspace - Escape to close switcher UI pattern: - Full-screen overlay with backdrop blur - Centered card with workspace thumbnails - Highlighted selection indicator - CSS transitions for smooth show/hide Keyboard handling: - Arrow keys: Navigate between workspaces - Enter: Switch to selected workspace - Escape: Close switcher without switching",
      "exports": [
        {
          "name": "WorkspaceSwitcher",
          "kind": "class",
          "signature": "class WorkspaceSwitcher",
          "summary": "WorkspaceSwitcher - HUD overlay for workspace navigation. HUD pattern: - Full-screen overlay with backdrop blur - Grid layout of workspace thumbnails - Keyboard navigation support - Smooth CSS transitions for show/hide"
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "workspace/index",
      "path": "plauna/reference/workspace/index.md",
      "source": "plauna/workspace/index.js",
      "import": "/plauna/workspace/index.js",
      "sourceHash": "e51e6ddcf93355d22a0c078f3f540def56ecf82469e29107643f5371f560ac6e",
      "summary": "plauna/workspace — Virtual desktop / multi-panel system for Plauna. Exported classes: - Panel, DOMPanel, GPUPanel - Workspace - WorkspaceManager - WorkspaceCompositor - WorkspaceSwitcher - LayoutEngine, LayoutMode",
      "exports": [
        {
          "name": "DOMPanel",
          "kind": "re-export",
          "signature": "DOMPanel",
          "summary": ""
        },
        {
          "name": "GPUPanel",
          "kind": "re-export",
          "signature": "GPUPanel",
          "summary": ""
        },
        {
          "name": "LayoutEngine",
          "kind": "re-export",
          "signature": "LayoutEngine",
          "summary": ""
        },
        {
          "name": "LayoutMode",
          "kind": "re-export",
          "signature": "LayoutMode",
          "summary": ""
        },
        {
          "name": "Panel",
          "kind": "re-export",
          "signature": "Panel",
          "summary": ""
        },
        {
          "name": "Workspace",
          "kind": "re-export",
          "signature": "Workspace",
          "summary": ""
        },
        {
          "name": "WorkspaceCompositor",
          "kind": "re-export",
          "signature": "WorkspaceCompositor",
          "summary": ""
        },
        {
          "name": "WorkspaceManager",
          "kind": "re-export",
          "signature": "WorkspaceManager",
          "summary": ""
        },
        {
          "name": "WorkspaceSwitcher",
          "kind": "re-export",
          "signature": "WorkspaceSwitcher",
          "summary": ""
        }
      ],
      "subsystem": "plauna"
    },
    {
      "schemaVersion": 1,
      "title": "browser-bridge/BrowserBridgeClient",
      "path": "webgpu-os/reference/browser-bridge/BrowserBridgeClient.md",
      "source": "webgpu-os/browser-bridge/BrowserBridgeClient.js",
      "import": "/webgpu-os/browser-bridge/BrowserBridgeClient.js",
      "sourceHash": "3837e6e9994f0df05acff68e3db8c8af195039b06756b957fc127f7259f20b6d",
      "summary": "Singleton — shared by all syscall consumers.",
      "exports": [
        {
          "name": "BrowserBridgeClient",
          "kind": "class",
          "signature": "class BrowserBridgeClient",
          "summary": ""
        },
        {
          "name": "validateBridgeArgs",
          "kind": "function",
          "signature": "validateBridgeArgs(args, service = '', method = '')",
          "summary": ""
        },
        {
          "name": "browserBridge",
          "kind": "constant",
          "signature": "browserBridge",
          "summary": "Singleton — shared by all syscall consumers."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-bridge/BrowserBridgeDriver",
      "path": "webgpu-os/reference/browser-bridge/BrowserBridgeDriver.md",
      "source": "webgpu-os/browser-bridge/BrowserBridgeDriver.js",
      "import": "/webgpu-os/browser-bridge/BrowserBridgeDriver.js",
      "sourceHash": "3bffb1f70c6751306138ad6525721637ffcc8beb1be9607daac77df990297b30",
      "summary": "BrowserBridgeDriver.js — kernel-level wrapper around BrowserBridgeClient. Held at kernel.browserBridge. Manages availability probing on boot, event relay to the kernel event bus, and exposes the full typed client for syscalls.",
      "exports": [
        {
          "name": "BrowserBridgeDriver",
          "kind": "class",
          "signature": "class BrowserBridgeDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/adblock-content",
      "path": "webgpu-os/reference/browser-extension/adblock-content.md",
      "source": "webgpu-os/browser-extension/adblock-content.js",
      "import": "/webgpu-os/browser-extension/adblock-content.js",
      "sourceHash": "b10423dabc02135398a71a2a235f535de677929a9e233c190ced0786c0ac3b7c",
      "summary": "adblock-content.js — in-frame cosmetic ad filtering (Layer 2). Runs in the DEFAULT (ISOLATED) world, in ALL frames, at document_start. ISOLATED world is required so chrome.runtime / chrome.storage are available (the MAIN-world content.js cannot reach them). Cosmetic hiding and DOM node removal only need access to the SHARED DOM, which the isolated world has. Responsibilities: - Inject cosmetic CSS hiding known ad containers. - Watch the DOM and remove ad/tracker <iframe>/<script>/<img> nodes whose src targets a blocked domain (defence-in-depth alongside the DNR rule). - Report removals to the background counter. Strictly scoped: only activates inside frames that belong to the WebGPU OS browser (top page is an OS host, or the outermost ancestor is an OS host), and only while ad-blocking is enabled. Stays completely inert during the user's normal browsing.",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/adblock-list",
      "path": "webgpu-os/reference/browser-extension/adblock-list.md",
      "source": "webgpu-os/browser-extension/adblock-list.js",
      "import": "/webgpu-os/browser-extension/adblock-list.js",
      "sourceHash": "4f4bafec0d29d829d2d694320ab13a30017794f519db3c30cf22e5af52479e3e",
      "summary": "adblock-list.js — shared ad/tracker blocklist for the WebGPU OS browser. SINGLE SOURCE OF TRUTH, consumed by three enforcement layers: 1. background.js        → declarativeNetRequest BLOCK rules (network layer, scoped to OS tabs only — never the user's normal browsing) 2. adblock-content.js   → cosmetic hiding + DOM ad-node removal inside OS-embedded frames 3. _extProxyFetch       → ad-tag stripping for proxied (srcdoc) pages Ported and expanded from the Playwright stealth blocker (C:\\Coding\\fail\\server\\tools\\stealth.py — ADBLOCK_DOMAINS / ADBLOCK_URL_KEYWORDS). This is an ES module: background.js imports it directly; the content script loads it via dynamic import(chrome.runtime.getURL('adblock-list.js')), which is why it is also listed under web_accessible_resources in the manifest. The hand-curated CORE list below is augmented at runtime by an optional, build-generated list (adblock-domains.generated.js) produced from EasyList / EasyPrivacy via build_adblock_rules.py. The generated file ships empty until you run that script, so the extension always loads.",
      "exports": [
        {
          "name": "hostnameOf",
          "kind": "function",
          "signature": "hostnameOf(url)",
          "summary": "Lowercased hostname from a URL, or '' if unparseable."
        },
        {
          "name": "isAdDomain",
          "kind": "function",
          "signature": "isAdDomain(url)",
          "summary": "True if the URL targets a known ad/tracker domain (or a subdomain of one)."
        },
        {
          "name": "looksLikeAd",
          "kind": "function",
          "signature": "looksLikeAd(url)",
          "summary": "Broader match incl. keyword patterns — for the cosmetic/proxy layers only."
        },
        {
          "name": "cosmeticCss",
          "kind": "function",
          "signature": "cosmeticCss()",
          "summary": "A single <style> string that hides all cosmetic selectors."
        },
        {
          "name": "ADBLOCK_DOMAINS",
          "kind": "constant",
          "signature": "ADBLOCK_DOMAINS",
          "summary": ""
        },
        {
          "name": "ADBLOCK_URL_KEYWORDS",
          "kind": "constant",
          "signature": "ADBLOCK_URL_KEYWORDS",
          "summary": ""
        },
        {
          "name": "ADBLOCK_COSMETIC",
          "kind": "constant",
          "signature": "ADBLOCK_COSMETIC",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/ai-settings",
      "path": "webgpu-os/reference/browser-extension/ai-settings.md",
      "source": "webgpu-os/browser-extension/ai-settings.js",
      "import": "/webgpu-os/browser-extension/ai-settings.js",
      "sourceHash": "196889bb11ed4c4596e159493e04a1edaf00cfb619eeeb5c0b3345684f311c5f",
      "summary": "",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/background",
      "path": "webgpu-os/reference/browser-extension/background.md",
      "source": "webgpu-os/browser-extension/background.js",
      "import": "/webgpu-os/browser-extension/background.js",
      "sourceHash": "936cb328efff59f153877bdf93a803716f5ae8e594e5bd641f2ef1e44293a780",
      "summary": "background.js — WebGPU OS Frame Unblocker + Browser Bridge service worker. Static rules (rules.json) are the primary mechanism. Dynamic rules (updateDynamicRules) are registered as a fallback on every startup in case Chrome silently rejected the static ruleset. Browser Bridge: handles __os_bridge_request__ messages routed from relay.js, delegating to the four service modules (Tabs, Injection, Navigation, Rules).",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/content",
      "path": "webgpu-os/reference/browser-extension/content.md",
      "source": "webgpu-os/browser-extension/content.js",
      "import": "/webgpu-os/browser-extension/content.js",
      "sourceHash": "4a80cbb8840755a6efe0786d2f4b70e2876b785eeb1040241bbe4396526d90e0",
      "summary": "content.js — runs in the page's MAIN world at document_start. 1. Sets window.__frameUnblockerActive so the OS browser app can detect the extension. 2. In sub-frames (iframes): overrides window.top / window.parent / window.frameElement so frame-busting scripts (e.g. DuckDuckGo: \"if (top !== self) top.location = ...\") think they are the top-level page and do not navigate away. Must run in world: \"MAIN\" and all_frames: true to take effect before site JS.",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/offscreen",
      "path": "webgpu-os/reference/browser-extension/offscreen.md",
      "source": "webgpu-os/browser-extension/offscreen.js",
      "import": "/webgpu-os/browser-extension/offscreen.js",
      "sourceHash": "4ffefad9dc2fdb349aeeaf4757f081478250c15ddce6660f67a3b81b902c6973",
      "summary": "",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/options",
      "path": "webgpu-os/reference/browser-extension/options.md",
      "source": "webgpu-os/browser-extension/options.js",
      "import": "/webgpu-os/browser-extension/options.js",
      "sourceHash": "f9c422dbfd5abf947f387ebab735bd5eca1f9ea4a9c9f52c67eedc84455b3e42",
      "summary": "",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/popup",
      "path": "webgpu-os/reference/browser-extension/popup.md",
      "source": "webgpu-os/browser-extension/popup.js",
      "import": "/webgpu-os/browser-extension/popup.js",
      "sourceHash": "ec32a08d29c857e1dbd9ea658202eca76e5574901a97987c8a6c202952f19d53",
      "summary": "",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/popup-ai",
      "path": "webgpu-os/reference/browser-extension/popup-ai.md",
      "source": "webgpu-os/browser-extension/popup-ai.js",
      "import": "/webgpu-os/browser-extension/popup-ai.js",
      "sourceHash": "a4298c8fa17c5a5f23b10dc0ea516a3f270a74ddb0bba97bb58818059c4c9df2",
      "summary": "",
      "exports": [
        {
          "name": "runtimeMessageSender",
          "kind": "function",
          "signature": "runtimeMessageSender(message)",
          "summary": ""
        },
        {
          "name": "mountSecureProviderList",
          "kind": "function",
          "signature": "mountSecureProviderList({ root, summary, manageButton, refreshButton, send = runtimeMessageSender, onChange = ()",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/popup-size",
      "path": "webgpu-os/reference/browser-extension/popup-size.md",
      "source": "webgpu-os/browser-extension/popup-size.js",
      "import": "/webgpu-os/browser-extension/popup-size.js",
      "sourceHash": "9de15ca0597e594e8aef1d3835a5b739b4d89936ce7c3df6272543e411b1aee2",
      "summary": "",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/relay",
      "path": "webgpu-os/reference/browser-extension/relay.md",
      "source": "webgpu-os/browser-extension/relay.js",
      "import": "/webgpu-os/browser-extension/relay.js",
      "sourceHash": "21ebb620c8897c758bcb97dc265a1f956db2ff875ba85a656cf46fdbcf9059aa",
      "summary": "relay.js — runs in the ISOLATED content script world (default). chrome.runtime IS available here (unlike world: \"MAIN\"). Acts as a bridge between the OS page (MAIN world) and the extension background. Two-way channels: 1. Proxy fetch (legacy): page →__os_proxy_request__→ relay → background → __os_proxy_response__→ page 2. Browser Bridge requests: page →__os_bridge_request__→ relay → background → __os_bridge_response__→ page 3. Push events from background (nav/tab changes): background →sendMessage→ relay →__os_bridge_event__→ page",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/AIProviderCatalog",
      "path": "webgpu-os/reference/browser-extension/services/AIProviderCatalog.md",
      "source": "webgpu-os/browser-extension/services/AIProviderCatalog.js",
      "import": "/webgpu-os/browser-extension/services/AIProviderCatalog.js",
      "sourceHash": "cbd7bcba1ec8a62e13cc450edcd05cd910992b0d3cd96e1eda7d3a3894569569",
      "summary": "Shared provider metadata and OpenAI-compatible endpoint normalization. Keep this module free of chrome.* calls so the service worker and tests can use the exact same routing and capability rules.",
      "exports": [
        {
          "name": "resolveProviderDataPolicy",
          "kind": "function",
          "signature": "resolveProviderDataPolicy(providerId, route = {}, { authority = 'catalog' } = {})",
          "summary": ""
        },
        {
          "name": "classifyModelFamily",
          "kind": "function",
          "signature": "classifyModelFamily(providerId, modelId)",
          "summary": ""
        },
        {
          "name": "resolveModelAccess",
          "kind": "function",
          "signature": "resolveModelAccess(providerId, model = {}, { authority = 'catalog' } = {})",
          "summary": ""
        },
        {
          "name": "listProviderDefinitions",
          "kind": "function",
          "signature": "listProviderDefinitions()",
          "summary": ""
        },
        {
          "name": "isProviderId",
          "kind": "function",
          "signature": "isProviderId(value)",
          "summary": ""
        },
        {
          "name": "detectProvider",
          "kind": "function",
          "signature": "detectProvider({ key = '', endpoint = '' } = {})",
          "summary": ""
        },
        {
          "name": "planCredentialStorage",
          "kind": "function",
          "signature": "planCredentialStorage(providerId, key)",
          "summary": "Decide whether an entered credential can be stored for the explicitly selected provider. Prefix detection is advisory only; it must never move a secret to another provider slot behind the user's back."
        },
        {
          "name": "normalizeEndpoint",
          "kind": "function",
          "signature": "normalizeEndpoint(value, { defaultBase = '' } = {})",
          "summary": ""
        },
        {
          "name": "endpointFor",
          "kind": "function",
          "signature": "endpointFor(providerId, customBase = '')",
          "summary": ""
        },
        {
          "name": "isChatModel",
          "kind": "function",
          "signature": "isChatModel(model)",
          "summary": ""
        },
        {
          "name": "inferModelTaskAffinities",
          "kind": "function",
          "signature": "inferModelTaskAffinities(providerId, model = {})",
          "summary": "Infer preference-only task affinities from bounded catalog evidence. These hints may improve ranking, but must never authorize tools, strict output, private disclosure, or any other compatibility or security decision."
        },
        {
          "name": "inferModelCapabilities",
          "kind": "function",
          "signature": "inferModelCapabilities(providerId, model = {})",
          "summary": ""
        },
        {
          "name": "normalizeReasoningControl",
          "kind": "function",
          "signature": "normalizeReasoningControl(model = {}, modelId = '')",
          "summary": "Preserve the endpoint's own reasoning control surface. A single `reasoning` boolean cannot answer the questions a caller has to ask before touching reasoning: whether the endpoint rejects a disable (`mandatory`), whether it reasons unless told otherwise (`defaultEnabled`), and which gateway knobs are real for it. OpenRouter reports effort levels and token budgets per model, and both are honoured for only a few families, so a caller that guesses either sends a parameter that silently does nothing or one that fails the request. `softSwitch` is inferred from the model family because it is a training-time prompt convention that no catalog reports."
        },
        {
          "name": "normalizeSupportedParameters",
          "kind": "function",
          "signature": "normalizeSupportedParameters(model = {})",
          "summary": "Preserve exact provider compatibility evidence in one deterministic shape. Some provider APIs use supported_parameters while saved OS routes use supportedParameters, so merge both aliases instead of allowing one to hide the other. Values are bounded before they can enter extension storage."
        },
        {
          "name": "normalizeModel",
          "kind": "function",
          "signature": "normalizeModel(providerId, raw)",
          "summary": ""
        },
        {
          "name": "PROVIDER_DATA_POLICY_FORMAT",
          "kind": "constant",
          "signature": "PROVIDER_DATA_POLICY_FORMAT",
          "summary": ""
        },
        {
          "name": "MODEL_ACCESS_CLASSES",
          "kind": "constant",
          "signature": "MODEL_ACCESS_CLASSES",
          "summary": ""
        },
        {
          "name": "MODEL_TASK_AFFINITIES",
          "kind": "constant",
          "signature": "MODEL_TASK_AFFINITIES",
          "summary": ""
        },
        {
          "name": "PROVIDER_CATALOG",
          "kind": "constant",
          "signature": "PROVIDER_CATALOG",
          "summary": ""
        },
        {
          "name": "PROVIDER_IDS",
          "kind": "constant",
          "signature": "PROVIDER_IDS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/AIProviderService",
      "path": "webgpu-os/reference/browser-extension/services/AIProviderService.md",
      "source": "webgpu-os/browser-extension/services/AIProviderService.js",
      "import": "/webgpu-os/browser-extension/services/AIProviderService.js",
      "sourceHash": "e1853c47da604f04c64fb905c24093ed414b7a47d3acd28498a401425324ce6a",
      "summary": "AIProviderService.js — remote LLM provider bridge for the OS AI Hub. Runs in the extension background service worker context (privileged fetch, no CORS; host_permissions already grant <all_urls> for this extension, so no additional host_permissions are needed for the built-in providers). The OS page NEVER sees provider URLs, headers, or API keys — it only sends {provider, model, messages, params} and gets back {message, usage}. Keys are read via KeyVaultService.getRawKeyInternal(), which is not reachable through the bridge router (see KeyVaultService.js for why). Allowlists: - providerAllowlist/pathAllowlist: AIProviderCatalog is the only set of provider ids + exact endpoint URLs ever fetched for non-custom requests. - originAllowlist (custom provider): CUSTOM_ENDPOINTS is a user-approved https-only allowlist, persisted in chrome.storage.local, populated only via allowCustomEndpoint().",
      "exports": [
        {
          "name": "AIProviderService",
          "kind": "constant",
          "signature": "AIProviderService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/AudioService",
      "path": "webgpu-os/reference/browser-extension/services/AudioService.md",
      "source": "webgpu-os/browser-extension/services/AudioService.js",
      "import": "/webgpu-os/browser-extension/services/AudioService.js",
      "sourceHash": "37b4534fb3e7535bb7508e36860e8d90d4b88b9ac443a02bc5c12e07406d05ec",
      "summary": "AudioService.js — privileged tab-audio bridge for WebGPU OS. Browser page audio inside the OS tab (YouTube, video sites, embedded frames) does not pass through the OS AudioDriver. Chrome extensions can control that audio by capturing the tab stream, replaying it through an offscreen AudioContext, and applying a GainNode. The OS mixer sends the effective gain here; the service worker owns tabCapture permission and the offscreen document owns Web Audio playback.",
      "exports": [
        {
          "name": "AudioService",
          "kind": "constant",
          "signature": "AudioService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/BridgeSessionPolicy",
      "path": "webgpu-os/reference/browser-extension/services/BridgeSessionPolicy.md",
      "source": "webgpu-os/browser-extension/services/BridgeSessionPolicy.js",
      "import": "/webgpu-os/browser-extension/services/BridgeSessionPolicy.js",
      "sourceHash": "78a6297777c71d3f7add6ff48657e36911e7ca31fd2726d227ee015317113317",
      "summary": "Memory-only session boundary between the isolated relay and background worker. Secrets never cross window.postMessage. A service-worker restart invalidates every session and forces the still-isolated relay to open a fresh one.",
      "exports": [
        {
          "name": "BridgeSessionPolicy",
          "kind": "class",
          "signature": "class BridgeSessionPolicy",
          "summary": "Memory-only session boundary between the isolated relay and background worker. Secrets never cross window.postMessage. A service-worker restart invalidates every session and forces the still-isolated relay to open a fresh one."
        },
        {
          "name": "BRIDGE_SESSION_PROTOCOL",
          "kind": "constant",
          "signature": "BRIDGE_SESSION_PROTOCOL",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/CorsService",
      "path": "webgpu-os/reference/browser-extension/services/CorsService.md",
      "source": "webgpu-os/browser-extension/services/CorsService.js",
      "import": "/webgpu-os/browser-extension/services/CorsService.js",
      "sourceHash": "ae8b2545babf01a4c8a2d9db48550aa6526879f5a1faef445c753ff9f952b456",
      "summary": "CorsService.js — per-site opt-in CORS/API unblocking for the OS bridge. Runs in the extension background service worker context. The blanket rule 9005 only injects `Access-Control-Allow-Origin: *` on NON-credentialed static assets (scripts/fonts/etc.), deliberately leaving a framed site's own credentialed `fetch`/XHR/API calls untouched — a wildcard ACAO is illegal for credentialed requests and would break logins. This service lets the user OPT IN, per trusted site, to also unblock those credentialed API calls. For each enabled origin O (host H) we add session rules (tab-scoped to OS tabs) that, for requests INITIATED BY that site's frames (initiatorDomains: [H]), set on the response: Access-Control-Allow-Origin:      O        (echoes the page origin, not *) Access-Control-Allow-Credentials: true Access-Control-Allow-Methods:     GET,POST,PUT,PATCH,DELETE,OPTIONS Access-Control-Allow-Headers:     * Scoping by initiatorDomains keeps this correct with multiple sites open and never affects the user's normal browsing (session rules are tab-scoped).",
      "exports": [
        {
          "name": "CORS_RULE_BASE",
          "kind": "constant",
          "signature": "CORS_RULE_BASE",
          "summary": ""
        },
        {
          "name": "CorsService",
          "kind": "constant",
          "signature": "CorsService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/ExtensionSenderPolicy",
      "path": "webgpu-os/reference/browser-extension/services/ExtensionSenderPolicy.md",
      "source": "webgpu-os/browser-extension/services/ExtensionSenderPolicy.js",
      "import": "/webgpu-os/browser-extension/services/ExtensionSenderPolicy.js",
      "sourceHash": "3dcfb8a1ab4e083cedd5069458af1182ea9b67db1c7b0c6341aadb0fc172d720",
      "summary": "Authenticate privileged runtime messages from this extension's own pages. Extension pages opened in a popup window can have sender.tab; content scripts also have sender.tab, so ownership must be decided from the sender URL/origin rather than from tab presence alone.",
      "exports": [
        {
          "name": "isExtensionPageSender",
          "kind": "function",
          "signature": "isExtensionPageSender(sender, runtimeId)",
          "summary": "Authenticate privileged runtime messages from this extension's own pages. Extension pages opened in a popup window can have sender.tab; content scripts also have sender.tab, so ownership must be decided from the sender URL/origin rather than from tab presence alone."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/InjectionService",
      "path": "webgpu-os/reference/browser-extension/services/InjectionService.md",
      "source": "webgpu-os/browser-extension/services/InjectionService.js",
      "import": "/webgpu-os/browser-extension/services/InjectionService.js",
      "sourceHash": "dd77d88ec72cad704d13bb5812710913b49b8c9ed24ef55dbdab0b8fb33890dc",
      "summary": "",
      "exports": [
        {
          "name": "INJECTION_BRIDGE_AUTHORIZATION_PROTOCOL",
          "kind": "constant",
          "signature": "INJECTION_BRIDGE_AUTHORIZATION_PROTOCOL",
          "summary": ""
        },
        {
          "name": "INJECTION_ONE_USE_AUTHORITY_STATUS_FORMAT",
          "kind": "constant",
          "signature": "INJECTION_ONE_USE_AUTHORITY_STATUS_FORMAT",
          "summary": ""
        },
        {
          "name": "InjectionService",
          "kind": "constant",
          "signature": "InjectionService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/KeyVaultService",
      "path": "webgpu-os/reference/browser-extension/services/KeyVaultService.md",
      "source": "webgpu-os/browser-extension/services/KeyVaultService.js",
      "import": "/webgpu-os/browser-extension/services/KeyVaultService.js",
      "sourceHash": "8cbd8da8e4046f9c86d095aea00e870f7dee1b62034c59b792aa305ea0d446e6",
      "summary": "KeyVaultService.js — provider API key storage for the AI Bridge. Runs in the extension background service worker context. Keys are NEVER exposed to the OS page/bridge caller — only status booleans cross the bridge. getRawKeyInternal() remains a module-only worker export. V2 binds provider and generation into AES-GCM additional authenticated data. V1 encrypted envelopes and bounded legacy plaintext remain read-only inputs and migrate on first use. A durable generation tombstone prevents an older persistent credential from reappearing after a session-only switch or an interrupted clear.",
      "exports": [
        {
          "name": "KeyVaultContractError",
          "kind": "class",
          "signature": "class KeyVaultContractError extends Error",
          "summary": ""
        },
        {
          "name": "normalizeKeyVaultEnvelope",
          "kind": "function",
          "signature": "normalizeKeyVaultEnvelope(provider, raw, { persisted = false, label = 'AI key record' } = {})",
          "summary": ""
        },
        {
          "name": "normalizeKeyVaultState",
          "kind": "function",
          "signature": "normalizeKeyVaultState(provider, raw, label = 'AI key state')",
          "summary": ""
        },
        {
          "name": "getRawKeyInternal",
          "kind": "function",
          "signature": "async getRawKeyInternal(provider)",
          "summary": "Internal-only accessor; deliberately absent from KeyVaultService dispatch."
        },
        {
          "name": "KEY_VAULT_CONTRACTS",
          "kind": "constant",
          "signature": "KEY_VAULT_CONTRACTS",
          "summary": ""
        },
        {
          "name": "KeyVaultService",
          "kind": "constant",
          "signature": "KeyVaultService",
          "summary": "Page/bridge-facing surface — status only, never the raw key."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/LivePatchRuntime",
      "path": "webgpu-os/reference/browser-extension/services/LivePatchRuntime.md",
      "source": "webgpu-os/browser-extension/services/LivePatchRuntime.js",
      "import": "/webgpu-os/browser-extension/services/LivePatchRuntime.js",
      "sourceHash": "86a27c2e393abe5751522c8ec7be162c1d7d69ed39ef5321b08229d0293fdd6d",
      "summary": "Clean-room declarative browser surface editor. This module deliberately accepts data, never JavaScript source. The exported page function is self-contained so chrome.scripting can serialize it into the extension's ISOLATED world without eval, Function, or page-owned callbacks.",
      "exports": [
        {
          "name": "normalizeBrowserLivePatch",
          "kind": "function",
          "signature": "normalizeBrowserLivePatch(patch, tabId)",
          "summary": "Validate and reduce a kernel patch before it crosses the 64 KiB bridge."
        },
        {
          "name": "normalizeLiveInspectOptions",
          "kind": "function",
          "signature": "normalizeLiveInspectOptions(opts = {})",
          "summary": ""
        },
        {
          "name": "normalizeLiveApplyOptions",
          "kind": "function",
          "signature": "normalizeLiveApplyOptions(opts = {})",
          "summary": ""
        },
        {
          "name": "normalizeLiveHistoryOptions",
          "kind": "function",
          "signature": "normalizeLiveHistoryOptions(opts = {})",
          "summary": ""
        },
        {
          "name": "normalizeBrowserPatchId",
          "kind": "function",
          "signature": "normalizeBrowserPatchId(value)",
          "summary": ""
        },
        {
          "name": "runBrowserLivePatch",
          "kind": "function",
          "signature": "runBrowserLivePatch(command, payload = {})",
          "summary": "Self-contained function executed by chrome.scripting in the ISOLATED world. Do not introduce references to module-scope bindings here."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/NaviFacultyStatusService",
      "path": "webgpu-os/reference/browser-extension/services/NaviFacultyStatusService.md",
      "source": "webgpu-os/browser-extension/services/NaviFacultyStatusService.js",
      "import": "/webgpu-os/browser-extension/services/NaviFacultyStatusService.js",
      "sourceHash": "1f0772eb23f4ce14313ec6140336670a72784d12c290a567aa232c8bc7f6d94d",
      "summary": "Memory-only projection of kernel-owned Browser Semantic Faculty readiness. The Companion does not sign, verify, install, enable, or approve Faculties. It accepts a content-free status only through an authenticated OS bridge session so extension-owned UI can show which exact kernel package revision the OS reports as verified. A service-worker restart or bridge revocation clears the projection.",
      "exports": [
        {
          "name": "NaviFacultyStatusRegistry",
          "kind": "class",
          "signature": "class NaviFacultyStatusRegistry",
          "summary": ""
        },
        {
          "name": "NAVI_BROWSER_FACULTY_STATUS_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BROWSER_FACULTY_STATUS_FORMAT",
          "summary": "Memory-only projection of kernel-owned Browser Semantic Faculty readiness. The Companion does not sign, verify, install, enable, or approve Faculties. It accepts a content-free status only through an authenticated OS bridge session so extension-owned UI can show which exact kernel package revision the OS reports as verified. A service-worker restart or bridge revocation clears the projection."
        },
        {
          "name": "NAVI_BROWSER_FACULTY_ID",
          "kind": "constant",
          "signature": "NAVI_BROWSER_FACULTY_ID",
          "summary": ""
        },
        {
          "name": "NAVI_BROWSER_FACULTY_PACKAGE_ID",
          "kind": "constant",
          "signature": "NAVI_BROWSER_FACULTY_PACKAGE_ID",
          "summary": ""
        },
        {
          "name": "NaviFacultyStatusService",
          "kind": "constant",
          "signature": "NaviFacultyStatusService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/NavigationService",
      "path": "webgpu-os/reference/browser-extension/services/NavigationService.md",
      "source": "webgpu-os/browser-extension/services/NavigationService.js",
      "import": "/webgpu-os/browser-extension/services/NavigationService.js",
      "sourceHash": "688873ad43be5aeb4e96b86cacf4fbb5ecd9a5ca92e8a9d13f6fdb4ea92a84a4",
      "summary": "NavigationService.js — webNavigation history + OS push events. Runs in the extension background service worker context. The background registers webNavigation listeners that call NavigationService.addEvent(). The OS can poll history() or receive live push events via the __os_bridge_event__ channel.",
      "exports": [
        {
          "name": "NavigationService",
          "kind": "constant",
          "signature": "NavigationService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/OpenRouterAuthService",
      "path": "webgpu-os/reference/browser-extension/services/OpenRouterAuthService.md",
      "source": "webgpu-os/browser-extension/services/OpenRouterAuthService.js",
      "import": "/webgpu-os/browser-extension/services/OpenRouterAuthService.js",
      "sourceHash": "30b39140cdae6a0a4ee6a50eb661008fafdab3fbd8a21ad972cd2bb707d960d9",
      "summary": "OpenRouterAuthService.js — extension-owned OAuth PKCE sign-in. The authorization code and generated API key never cross the page bridge. Only the extension credential window can start this flow, and the resulting key is immediately encrypted through KeyVaultService.",
      "exports": [
        {
          "name": "OpenRouterAuthService",
          "kind": "constant",
          "signature": "OpenRouterAuthService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/ProviderProtocol",
      "path": "webgpu-os/reference/browser-extension/services/ProviderProtocol.md",
      "source": "webgpu-os/browser-extension/services/ProviderProtocol.js",
      "import": "/webgpu-os/browser-extension/services/ProviderProtocol.js",
      "sourceHash": "23f75c2f6b35865e93ee73ce03d8210ed7b24d00338247cbd466f56a46f7078c",
      "summary": "Pure OpenAI-compatible request/response helpers shared by the privileged extension transport and the browser-direct mobile fallback. This module performs no storage, network, DOM, or chrome.* work.",
      "exports": [
        {
          "name": "providerErrorNumber",
          "kind": "function",
          "signature": "providerErrorNumber(value = {})",
          "summary": "Stable public diagnosis family; never contains provider-controlled text."
        },
        {
          "name": "createProviderIncidentId",
          "kind": "function",
          "signature": "createProviderIncidentId()",
          "summary": ""
        },
        {
          "name": "applyProviderErrorContext",
          "kind": "function",
          "signature": "applyProviderErrorContext(error, context = {})",
          "summary": "Attach only bounded, structured-clone-safe diagnostic correlation fields."
        },
        {
          "name": "validateProviderMessages",
          "kind": "function",
          "signature": "validateProviderMessages(messages)",
          "summary": ""
        },
        {
          "name": "normalizeReasoningConfig",
          "kind": "function",
          "signature": "normalizeReasoningConfig(value)",
          "summary": ""
        },
        {
          "name": "providerResponseModel",
          "kind": "function",
          "signature": "providerResponseModel(value, fallback = '')",
          "summary": "Normalize a provider model identifier without trusting arbitrary text."
        },
        {
          "name": "providerModelAttribution",
          "kind": "function",
          "signature": "providerModelAttribution({ provider = '', requestedModel = '', responseModel = '' } = {})",
          "summary": "Keep the requested route separate from provider-reported attribution. `model` remains backward-compatible, but modelEvidence makes an omitted or dynamic alias explicitly non-concrete so callers cannot mistake a request fallback for observed provider output."
        },
        {
          "name": "normalizeProviderTools",
          "kind": "function",
          "signature": "normalizeProviderTools(value)",
          "summary": "Normalize the provider-facing projection of locally authoritative OS tools. These definitions help a model form typed calls; they never grant execution authority, which remains with the descriptor hash, graph validator, and ToolRouter after the provider response returns."
        },
        {
          "name": "openAIProviderToolDefinitions",
          "kind": "function",
          "signature": "openAIProviderToolDefinitions(value)",
          "summary": ""
        },
        {
          "name": "anthropicProviderToolDefinitions",
          "kind": "function",
          "signature": "anthropicProviderToolDefinitions(value)",
          "summary": ""
        },
        {
          "name": "canonicalProviderToolCalls",
          "kind": "function",
          "signature": "canonicalProviderToolCalls(payload, providerTools = [], transport = 'provider-native')",
          "summary": "Convert completed native provider calls into one provider-neutral batch."
        },
        {
          "name": "createProviderToolStreamAccumulator",
          "kind": "function",
          "signature": "createProviderToolStreamAccumulator(providerTools = [], transport = 'provider-native-stream')",
          "summary": "Accumulate provider tool-call stream fragments without executing partial arguments. ID/name conflicts and malformed mixed batches fail atomically."
        },
        {
          "name": "buildOpenAICompatibleBody",
          "kind": "function",
          "signature": "buildOpenAICompatibleBody(spec, providerDefinition = null)",
          "summary": ""
        },
        {
          "name": "normalizeProviderRequirements",
          "kind": "function",
          "signature": "normalizeProviderRequirements(value)",
          "summary": ""
        },
        {
          "name": "normalizeOutputSchema",
          "kind": "function",
          "signature": "normalizeOutputSchema(value)",
          "summary": ""
        },
        {
          "name": "providerError",
          "kind": "function",
          "signature": "providerError(json, status)",
          "summary": ""
        },
        {
          "name": "providerHttpError",
          "kind": "function",
          "signature": "providerHttpError(json, status, provider = '', responseMetadata = null)",
          "summary": "Construct the only provider-originated Error shape allowed to cross the AI bridge. Endpoint URLs, headers, response bodies, request content, and keys are deliberately excluded. Retryability is asserted only for unambiguous transient HTTP classes; every other status remains unclassified so the Navi broker can apply its own fail-closed policy."
        },
        {
          "name": "providerOutputError",
          "kind": "function",
          "signature": "providerOutputError(code, provider, message, retryable = true, responseMetadata = null)",
          "summary": ""
        },
        {
          "name": "providerChoiceError",
          "kind": "function",
          "signature": "providerChoiceError(json, status, provider = '', responseMetadata = null)",
          "summary": ""
        },
        {
          "name": "providerResponseMetadata",
          "kind": "function",
          "signature": "providerResponseMetadata(response)",
          "summary": ""
        },
        {
          "name": "assertUsableProviderOutput",
          "kind": "function",
          "signature": "assertUsableProviderOutput({ message = '', reasoning = '', toolCalls = [], provider = '', strictOutput = false } = {})",
          "summary": ""
        },
        {
          "name": "providerFailureProjection",
          "kind": "function",
          "signature": "providerFailureProjection(error)",
          "summary": "Return a bounded structured-clone-safe view of an AI provider failure."
        },
        {
          "name": "visibleReasoningText",
          "kind": "function",
          "signature": "visibleReasoningText(value)",
          "summary": ""
        },
        {
          "name": "openAICompatibleReasoning",
          "kind": "function",
          "signature": "openAICompatibleReasoning(message = {})",
          "summary": ""
        },
        {
          "name": "visibleMessageText",
          "kind": "function",
          "signature": "visibleMessageText(value)",
          "summary": ""
        },
        {
          "name": "safeAttachmentData",
          "kind": "function",
          "signature": "safeAttachmentData(value)",
          "summary": ""
        },
        {
          "name": "PROVIDER_ERROR_CONTRACT_VERSION",
          "kind": "constant",
          "signature": "PROVIDER_ERROR_CONTRACT_VERSION",
          "summary": "Pure OpenAI-compatible request/response helpers shared by the privileged extension transport and the browser-direct mobile fallback. This module performs no storage, network, DOM, or chrome.* work."
        },
        {
          "name": "PROVIDER_STATUS_EVIDENCE_VERSION",
          "kind": "constant",
          "signature": "PROVIDER_STATUS_EVIDENCE_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/ResidentService",
      "path": "webgpu-os/reference/browser-extension/services/ResidentService.md",
      "source": "webgpu-os/browser-extension/services/ResidentService.js",
      "import": "/webgpu-os/browser-extension/services/ResidentService.js",
      "sourceHash": "76898333d5c83e21d132ff3547c0e3e7612ca3b84f24f782ed2fb627f441f3c2",
      "summary": "ResidentService.js — manages the resident SecureMesh node (offscreen document). Exposed via the bridge router (service name `resident`) so the trusted OS page can query/toggle it, and via dedicated messages for the popup. Keeps an offscreen document alive (MV3's persistent WebRTC-capable context) using a chrome.alarms keep-alive that respawns the service worker to re-ensure the doc exists. Privacy: this only ever stores the PUBLIC cert bundle the OS page pushes (pub key, name, room) — never the identity private key. It is OFF by default and fully user-controlled. Real background mesh reachability is NOT attempted here (keep an OS tab open for that); this is a lightweight cert vault + keepalive responder.",
      "exports": [
        {
          "name": "ResidentService",
          "kind": "constant",
          "signature": "ResidentService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/RuleService",
      "path": "webgpu-os/reference/browser-extension/services/RuleService.md",
      "source": "webgpu-os/browser-extension/services/RuleService.js",
      "import": "/webgpu-os/browser-extension/services/RuleService.js",
      "sourceHash": "3bf657a047b8c2e04e23fabbc49b257ec1ec28b939ded1a872c59ee330b89de4",
      "summary": "RuleService.js — declarativeNetRequest dynamic rule manager for the OS bridge. Runs in the extension background service worker context. User-added rules use IDs >= 50000 to avoid colliding with the built-in frame-unblock rules (IDs 100-102).",
      "exports": [
        {
          "name": "RuleService",
          "kind": "constant",
          "signature": "RuleService",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/SemanticAutomationRuntime",
      "path": "webgpu-os/reference/browser-extension/services/SemanticAutomationRuntime.md",
      "source": "webgpu-os/browser-extension/services/SemanticAutomationRuntime.js",
      "import": "/webgpu-os/browser-extension/services/SemanticAutomationRuntime.js",
      "sourceHash": "afe26c64aca27862d852aee505c3ec2bbdaa3e25f2b055cd333cd4978a4a0cc9",
      "summary": "Validate and compact one AI Echo browser-semantic request before it crosses the extension boundary. Unknown fields fail closed so the protocol cannot silently grow into a generic page-execution channel.",
      "exports": [
        {
          "name": "normalizeBrowserSemanticRequest",
          "kind": "function",
          "signature": "normalizeBrowserSemanticRequest(request = {})",
          "summary": "Validate and compact one AI Echo browser-semantic request before it crosses the extension boundary. Unknown fields fail closed so the protocol cannot silently grow into a generic page-execution channel."
        },
        {
          "name": "runBrowserSemanticAction",
          "kind": "function",
          "signature": "runBrowserSemanticAction(request)",
          "summary": "Packaged Chrome scripting entry point. This function is intentionally self-contained because chrome.scripting serializes the function body into the target tab; it cannot close over extension service-worker state."
        },
        {
          "name": "BROWSER_SEMANTIC_PROTOCOL",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_PROTOCOL",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/TabService",
      "path": "webgpu-os/reference/browser-extension/services/TabService.md",
      "source": "webgpu-os/browser-extension/services/TabService.js",
      "import": "/webgpu-os/browser-extension/services/TabService.js",
      "sourceHash": "2f9ddcd793f3aab6ebde7db1d3492674dc0dcc1df88e4c7526bb572dbd2f38d9",
      "summary": "TabService.js — chrome.tabs wrapper for the OS bridge. Runs in the extension background service worker context.",
      "exports": [
        {
          "name": "TabService",
          "kind": "constant",
          "signature": "TabService",
          "summary": "TabService.js — chrome.tabs wrapper for the OS bridge. Runs in the extension background service worker context."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/TrustedOsOriginPolicy",
      "path": "webgpu-os/reference/browser-extension/services/TrustedOsOriginPolicy.md",
      "source": "webgpu-os/browser-extension/services/TrustedOsOriginPolicy.js",
      "import": "/webgpu-os/browser-extension/services/TrustedOsOriginPolicy.js",
      "sourceHash": "5f5dd15dca83e246750ae15743550eada9f61bcd90a19b82b056fd6870289533",
      "summary": "Exact OS origins trusted with privileged browser bridge authority.",
      "exports": [
        {
          "name": "isTrustedOsOrigin",
          "kind": "function",
          "signature": "isTrustedOsOrigin(value)",
          "summary": ""
        },
        {
          "name": "TRUSTED_OS_ORIGINS",
          "kind": "constant",
          "signature": "TRUSTED_OS_ORIGINS",
          "summary": "Exact OS origins trusted with privileged browser bridge authority."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "browser-extension/services/WebMCPBridgeRuntime",
      "path": "webgpu-os/reference/browser-extension/services/WebMCPBridgeRuntime.md",
      "source": "webgpu-os/browser-extension/services/WebMCPBridgeRuntime.js",
      "import": "/webgpu-os/browser-extension/services/WebMCPBridgeRuntime.js",
      "sourceHash": "51cbfa7bc337d387972f684acccff4ec98f811cc381ac30fd06e2335865c6f50",
      "summary": "WebMCPBridgeRuntime.js - clean-room, versioned adapter between AI Echo and the browser's evolving WebMCP surface. Page-owned metadata and results are always untrusted. The extension never exposes callbacks, Window objects, or credentials across the OS bridge.",
      "exports": [
        {
          "name": "normalizeBrowserWebMCPRequest",
          "kind": "function",
          "signature": "normalizeBrowserWebMCPRequest(request = {})",
          "summary": "Validate one bridge request before any page script is dispatched."
        },
        {
          "name": "runBrowserWebMCPAction",
          "kind": "function",
          "signature": "async runBrowserWebMCPAction(request)",
          "summary": "Packaged Chrome scripting entry point. It deliberately feature-detects the origin-trial API, because WebMCP is still a Community Group draft and the browser execution helper is not yet part of the portable specification."
        },
        {
          "name": "BROWSER_WEBMCP_PROTOCOL",
          "kind": "constant",
          "signature": "BROWSER_WEBMCP_PROTOCOL",
          "summary": "WebMCPBridgeRuntime.js - clean-room, versioned adapter between AI Echo and the browser's evolving WebMCP surface. Page-owned metadata and results are always untrusted. The extension never exposes callbacks, Window objects, or credentials across the OS bridge."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/AudioDriver",
      "path": "webgpu-os/reference/drivers/AudioDriver.md",
      "source": "webgpu-os/drivers/AudioDriver.js",
      "import": "/webgpu-os/drivers/AudioDriver.js",
      "sourceHash": "f313b42ca6886ab3671b9dde19a440cfe943c9a7883d0f496eb3a15c8c3b6619",
      "summary": "AudioDriver.js — the OS audio server (kernel service). Provides system-wide audio output routing, a per-app volume mixer, output-device switching, OS-level media transport (navigator.mediaSession), and opt-in spatial (window-position) panning. Mirrors the kernel-service pattern of AmbientEngine / ThemeEngine: created in KernelBootstrap, exposed via createAudioSyscalls() in Syscalls.js, guarded per-app in guardSyscalls(). ── Two routing models ────────────────────────────────────────────────────────── 1. Shared-context routing (true central mix): apps hand the driver an <audio>/<video> element (attachElement) or an AudioNode built in the OS context (context() + attachNode). The driver builds: source → sessionGain → analyser → stereoPanner → masterGain → destination(setSinkId) 2. Cooperative sessions: apps that keep their own AudioContext register with an onVolume(effective, muted) / onPan(pan) callback. The driver cannot touch their nodes, so it calls the callback whenever the user changes master/app volume, mute, or pan, and the app applies it to its own graph. Everything no-ops safely before the first user gesture (autoplay policy) and on browsers without setSinkId / mediaSession. ── Events ────────────────────────────────────────────────────────────────────── kernel.events.emit('os:audio-change', { type })   // 'sessions' | 'master' | 'devices' | 'spatial'",
      "exports": [
        {
          "name": "AudioDriver",
          "kind": "class",
          "signature": "class AudioDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/CryptoDriver",
      "path": "webgpu-os/reference/drivers/CryptoDriver.md",
      "source": "webgpu-os/drivers/CryptoDriver.js",
      "import": "/webgpu-os/drivers/CryptoDriver.js",
      "sourceHash": "755a998072e36a7a520a06ca5f8aaca992b7598877b6d0a9915a1290ec88727e",
      "summary": "CryptoDriver.js — OS-level cryptographic identity driver. Wraps CollabIdentity (ECDSA P-256) and exposes a simple API: - Persistent key pair stored in IndexedDB (survives page reload) - Same fingerprint = same user across sessions - sign(data)                  → ECDSA signature bytes - verify(pubKeyRaw, data, sig) → boolean - publicKeyRaw / fingerprint   → identity Used by: - kernel/Syscalls.js  → syscalls.crypto.* - chat room           → signed messages (tamper-evident + authenticated) - future game systems → anti-cheat signed receipts, session proofs",
      "exports": [
        {
          "name": "CryptoDriver",
          "kind": "class",
          "signature": "class CryptoDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/EmbeddedParticleNode",
      "path": "webgpu-os/reference/drivers/EmbeddedParticleNode.md",
      "source": "webgpu-os/drivers/EmbeddedParticleNode.js",
      "import": "/webgpu-os/drivers/EmbeddedParticleNode.js",
      "sourceHash": "7c49eb8e94b6bc3308a52a423758839bcdffebaeda53aabf10b981a72697ee59",
      "summary": "One embedded Particle node per browser profile. Resident availability and temporary supernode/witness roles are facets of this same node identity.",
      "exports": [
        {
          "name": "EmbeddedParticleNode",
          "kind": "class",
          "signature": "class EmbeddedParticleNode",
          "summary": "One embedded Particle node per browser profile. Resident availability and temporary supernode/witness roles are facets of this same node identity."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/NetDriver",
      "path": "webgpu-os/reference/drivers/NetDriver.md",
      "source": "webgpu-os/drivers/NetDriver.js",
      "import": "/webgpu-os/drivers/NetDriver.js",
      "sourceHash": "4b6787f9f2ca94701560056f5aa90d0cf3c5e89ef262737f4c6a5c24fe5e41fd",
      "summary": "NetDriver.js — Phase 5 network driver for WebGPU OS. Tiered transport (fastest-wins): Tier 1 — BroadcastChannel (same-origin tabs, <1ms, always available) Tier 2 — WebRTC full-mesh via CollabCore + pinned Particle V2 signaling (cross-machine). BitTorrent remains an explicit, off-by-default hard fallback. Public API (mirrored by kernel/Syscalls.js net namespace): connect(roomId, opts)          — join a named room disconnect()                   — leave current room send(channel, data)            — broadcast to all peers sendTo(peerId, channel, data)  — unicast to specific peer on(channel, cb)                — subscribe to incoming channel messages off(channel, cb)               — unsubscribe peers()                        — list connected peers { id, transport } isConnected()                  — true if at least one peer stats()                        — transport statistics selfId                         — this peer's UUID",
      "exports": [
        {
          "name": "NetDriver",
          "kind": "class",
          "signature": "class NetDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/NetworkDriver",
      "path": "webgpu-os/reference/drivers/NetworkDriver.md",
      "source": "webgpu-os/drivers/NetworkDriver.js",
      "import": "/webgpu-os/drivers/NetworkDriver.js",
      "sourceHash": "bcbdfcceb281ffac8d10856e1bb6f3dd3b9628730f0f42bcfcc02001869d94ee",
      "summary": "drivers/NetworkDriver.js — kernel driver backing `syscalls.network.*` / `syscalls.sync.*` / `syscalls.workstation.*` (network plan Phase 6 webgpu-os wiring, previously deferred — see C:\\Users\\btspa\\.windsurf\\plans\\particle-network-layer-2bf6f0.md). Thin glue only: delegates to engine/network's already-complete client-side modules (identity, routes/MasterServerList, the shared pinned ParticleNetworkDaemon, syncManager, workstation) and reads/writes the SAME localStorage-backed config `factory/apps/network-manager/NetworkManagerApp.js` already uses (`os.network.masterServers` / `os.network.syncRules`), so any app calling these syscalls sees the exact same state the Control Panel shows — one source of truth, not a second copy. Security model (see kernel/RuleGraph.js): `network.read`/`sync.read` are low-risk status/config visibility; `network.connect` actually opens a Masterserver session and can attach/signal on routes (declaration-gated, high risk); `sync.manage` changes what syncs where (medium risk). Every live-session method requires `connect()` to have been called first for that url — apps cannot attach/signal/discover on a session they never opened, even though the underlying WebSocket may be SHARED with other OS features via the V2 daemon registry (or the V1 registry only for explicit compatibility endpoints).",
      "exports": [
        {
          "name": "NetworkDriver",
          "kind": "class",
          "signature": "class NetworkDriver",
          "summary": ""
        },
        {
          "name": "PARTICLE_BACKBONE_ROUTE_ID",
          "kind": "constant",
          "signature": "PARTICLE_BACKBONE_ROUTE_ID",
          "summary": ""
        },
        {
          "name": "RESIDENT_NODE_ROUTE_ID",
          "kind": "constant",
          "signature": "RESIDENT_NODE_ROUTE_ID",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/NetworkPersistence",
      "path": "webgpu-os/reference/drivers/NetworkPersistence.md",
      "source": "webgpu-os/drivers/NetworkPersistence.js",
      "import": "/webgpu-os/drivers/NetworkPersistence.js",
      "sourceHash": "5b362b082ba6aa1ef36c5ad557a241ed51c6ab1cb3605e4218b55406e58ba9c7",
      "summary": "drivers/NetworkPersistence.js — OS-integration persistence for engine/network's intentionally storage-agnostic modules (network plan §15/§38 persistence gap: \"EventLog is in-memory only\" / \"PeerTicketStore is in-memory only... callers are responsible for persisting\"). engine/network never imports webgpu-os/storage/AppSandbox.js (same layering rule as drivers/ResidentBootstrapSource.js) — this file is the glue that reads/writes an AppSandbox instance using the snapshot/hydrate/ replay functions those modules already expose: - engine/network/groupLedger/GroupLedger.js: replayGroupLedger() - engine/network/peerTickets/PeerTicketStore.js: snapshotPeerTicketStore()/hydratePeerTicketStore() AppSandbox encrypts everything at rest (AES-256-GCM, device+app-bound key) and is isolated per appId (webgpu-os/storage/AppSandbox.js) — callers should pass the sandbox of THE APP THAT OWNS THIS DATA (e.g. a future groups/chat app), not some shared \"network\" pseudo-app, so the sandbox's per-app isolation guarantee stays meaningful.",
      "exports": [
        {
          "name": "saveGroupLedger",
          "kind": "function",
          "signature": "async saveGroupLedger(sandbox, ledger)",
          "summary": "Persist a group ledger's full replayable state: its static config (groupId/founders/mode/threshold) plus `eventLog.entries()`. Cheap to call after every `proposeGroupEvent`/`genesisGroup` — it's a full snapshot, not an incremental diff, so there's nothing to get out of sync."
        },
        {
          "name": "loadGroupLedger",
          "kind": "function",
          "signature": "async loadGroupLedger(sandbox, groupId)",
          "summary": "Load and replay a previously-saved group ledger."
        },
        {
          "name": "listSavedGroupIds",
          "kind": "function",
          "signature": "async listSavedGroupIds(sandbox)",
          "summary": "groupIds this sandbox currently has a saved ledger for."
        },
        {
          "name": "deleteGroupLedger",
          "kind": "function",
          "signature": "async deleteGroupLedger(sandbox, groupId)",
          "summary": "Forget a saved group ledger. Does not affect any already-live in-memory ledger object."
        },
        {
          "name": "savePeerTickets",
          "kind": "function",
          "signature": "async savePeerTickets(sandbox, store)",
          "summary": "Persist a peer ticket store (full snapshot — see PeerTicketStore.js's snapshotPeerTicketStore)."
        },
        {
          "name": "loadPeerTickets",
          "kind": "function",
          "signature": "async loadPeerTickets(sandbox)",
          "summary": "Load a previously-saved peer ticket store, or a fresh empty one if none is saved."
        },
        {
          "name": "saveStateChannelCheckpoint",
          "kind": "function",
          "signature": "async saveStateChannelCheckpoint(sandbox, channelId, checkpoint)",
          "summary": "Persist one complete, fenced State Channel authority checkpoint."
        },
        {
          "name": "loadStateChannelCheckpoint",
          "kind": "function",
          "signature": "async loadStateChannelCheckpoint(sandbox, channelId)",
          "summary": ""
        },
        {
          "name": "listSavedStateChannelIds",
          "kind": "function",
          "signature": "async listSavedStateChannelIds(sandbox)",
          "summary": ""
        },
        {
          "name": "deleteStateChannelCheckpoint",
          "kind": "function",
          "signature": "async deleteStateChannelCheckpoint(sandbox, channelId)",
          "summary": ""
        },
        {
          "name": "saveStateChannelOutbox",
          "kind": "function",
          "signature": "async saveStateChannelOutbox(sandbox, channelId, intents, maxEntries = 512)",
          "summary": "Bounded pending intents survive tab reload until a receipt is observed."
        },
        {
          "name": "loadStateChannelOutbox",
          "kind": "function",
          "signature": "async loadStateChannelOutbox(sandbox, channelId)",
          "summary": ""
        },
        {
          "name": "createStateChannelCheckpointStore",
          "kind": "function",
          "signature": "createStateChannelCheckpointStore(sandbox)",
          "summary": "Adapter consumed by StateChannelAuthorityCoordinator."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/ProfileDriver",
      "path": "webgpu-os/reference/drivers/ProfileDriver.md",
      "source": "webgpu-os/drivers/ProfileDriver.js",
      "import": "/webgpu-os/drivers/ProfileDriver.js",
      "sourceHash": "7d3e94222579aaa037c7957318a19c59c4edc9a0a9bcea0083be441dc85baeef",
      "summary": "ProfileDriver.js — OS-level multi-user profile + per-profile identity. SecureMesh Phase 1. Lawful, user-owned identity: profile = OS-created account + per-profile ECDSA P-256 keypair + random (hashed) install id + user-held recovery code. Privacy rules baked in: - NO hardware/browser fingerprinting feeds identity. `localDeviceIdHash` is a SHA-256 of a RANDOM, user-resettable install id (never the raw id, never any device characteristics). - The private key is NEVER stored raw. The working signing key is held as a NON-EXTRACTABLE WebCrypto key (cannot be exfiltrated). A separate copy is stored encrypted (AES-GCM, PBKDF2-from-recovery-code) purely for user-triggered export / portability. Storage: IndexedDB `profiles` store (CryptoKey objects are structured-cloneable); active profile id + random install id live in the generic `kv` store. This driver is additive — the legacy global CryptoDriver identity is left untouched. Apps opt into per-user identity via `syscalls.profile.*`.",
      "exports": [
        {
          "name": "ProfileSchemaVersionError",
          "kind": "class",
          "signature": "class ProfileSchemaVersionError extends Error",
          "summary": ""
        },
        {
          "name": "ProfileDriver",
          "kind": "class",
          "signature": "class ProfileDriver",
          "summary": ""
        },
        {
          "name": "assertSupportedProfileSchemaVersion",
          "kind": "function",
          "signature": "assertSupportedProfileSchemaVersion(value, { allowMissing = true, label = 'profile record' } = {})",
          "summary": "Reject records from a newer writer before normalization can discard fields. Missing versions are accepted as the legacy v1 shape and migrated explicitly."
        },
        {
          "name": "PROFILE_RECORD_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "PROFILE_RECORD_SCHEMA_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/RealmNetworkFeatureFlags",
      "path": "webgpu-os/reference/drivers/RealmNetworkFeatureFlags.md",
      "source": "webgpu-os/drivers/RealmNetworkFeatureFlags.js",
      "import": "/webgpu-os/drivers/RealmNetworkFeatureFlags.js",
      "sourceHash": "26e48354db138ba6a2c871ad6ef7d968aede9956516a99ce29bbac28175b0563",
      "summary": "Persisted rollout gates for the additive Realm Network upgrade. Realm Network Alpha ships with every completed slice active. Version 2 stores only explicit user overrides, so later default changes cannot erase a deliberate opt-out. Callers may inject a storage-compatible object in tests; the driver uses localStorage in the OS.",
      "exports": [
        {
          "name": "RealmNetworkFeatureFlags",
          "kind": "class",
          "signature": "class RealmNetworkFeatureFlags",
          "summary": ""
        },
        {
          "name": "createRealmNetworkFeatureFlags",
          "kind": "function",
          "signature": "createRealmNetworkFeatureFlags(options)",
          "summary": ""
        },
        {
          "name": "REALM_NETWORK_FEATURE_FLAG_VERSION",
          "kind": "constant",
          "signature": "REALM_NETWORK_FEATURE_FLAG_VERSION",
          "summary": "Persisted rollout gates for the additive Realm Network upgrade. Realm Network Alpha ships with every completed slice active. Version 2 stores only explicit user overrides, so later default changes cannot erase a deliberate opt-out. Callers may inject a storage-compatible object in tests; the driver uses localStorage in the OS."
        },
        {
          "name": "REALM_NETWORK_FEATURE_FLAG_KEY",
          "kind": "constant",
          "signature": "REALM_NETWORK_FEATURE_FLAG_KEY",
          "summary": ""
        },
        {
          "name": "REALM_NETWORK_LEGACY_FEATURE_FLAG_KEY",
          "kind": "constant",
          "signature": "REALM_NETWORK_LEGACY_FEATURE_FLAG_KEY",
          "summary": ""
        },
        {
          "name": "REALM_NETWORK_FEATURE_DEFAULTS",
          "kind": "constant",
          "signature": "REALM_NETWORK_FEATURE_DEFAULTS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/ResidentBootstrapSource",
      "path": "webgpu-os/reference/drivers/ResidentBootstrapSource.md",
      "source": "webgpu-os/drivers/ResidentBootstrapSource.js",
      "import": "/webgpu-os/drivers/ResidentBootstrapSource.js",
      "sourceHash": "43cc93bf26c2d258a0089b5f4d0e2847e8349bbab57aea97fc56259942d48fad",
      "summary": "drivers/ResidentBootstrapSource.js — OS-integration adapter wiring the browser extension's resident cert vault (browser-extension/services/ ResidentService.js) into engine/network/dht/BootstrapSource.js's `{ id, scan, advertise }` interface (network plan §37/§47/§48). `engine/network` intentionally has no `webgpu-os` dependency (same layering rule as the deferred `kernel/Syscalls.js` wiring — see BootstrapSource.js's header comment) — this file is the OS-side glue the plan called out as the natural adapter, kept honest about what the resident node actually does today: - The resident node is a lightweight, OFF-BY-DEFAULT cert vault + a chrome.alarms keepalive heartbeat living in an MV3 offscreen document. It does NOT run a real WebRTC/Masterserver client and does NOT answer DISCOVER while no OS tab is open (see ResidentService.js's own header comment). Do not oversell this as \"background reachability\" anywhere in the UI (network plan §42's \"never overstate privacy/reachability\"). - What it DOES give a bootstrap attempt: a small piece of persisted memory that survives an OS tab closing — \"the last identity this browser saved for room X\" — which is a legitimate (if modest) bootstrap hint once a new tab reopens, and a place to advertise our current identity so it's still there next time.",
      "exports": [
        {
          "name": "createResidentBootstrapSource",
          "kind": "function",
          "signature": "createResidentBootstrapSource({ browserBridge } = {})",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "drivers/WebSurfaceDriver",
      "path": "webgpu-os/reference/drivers/WebSurfaceDriver.md",
      "source": "webgpu-os/drivers/WebSurfaceDriver.js",
      "import": "/webgpu-os/drivers/WebSurfaceDriver.js",
      "sourceHash": "fcf674329d159f472ae93b245aa36a8230f8a4a5019e2e7253c333f3ec71c9bb",
      "summary": "WebSurfaceDriver.js — Render any cross-origin website as a live WebGPU texture. ── How it works ───────────────────────────────────────────────────────────── 1. Creates an <iframe> that loads the target URL (browser renders it normally) 2. User clicks \"Share Tab\" once via getDisplayMedia({ preferCurrentTab: true }) 3. Element Capture API restricts the stream to just the iframe's pixels 4. HTMLVideoElement.srcObject = stream  →  live video feed of the website 5. device.importExternalTexture({ source: videoEl }) → WebGPU texture every frame Result: any cross-origin URL renders as a live GPU texture surface inside the OS. ── Browser support ─────────────────────────────────────────────────────────── getDisplayMedia:   all major browsers Element Capture:   Chrome 116+  (RestrictionTarget.fromElement) importExternalTexture: Chrome/Edge (WebGPU) ── Security model ──────────────────────────────────────────────────────────── - User must approve screen share once (one-time gesture, can be re-used) - iframe is sandboxed; cross-origin website cannot access our JS - We only get pixels, not DOM of the foreign page - Mouse/keyboard relay is optional (events forwarded to iframe element)",
      "exports": [
        {
          "name": "WebSurfaceDriver",
          "kind": "class",
          "signature": "class WebSurfaceDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/AmbientEngine",
      "path": "webgpu-os/reference/kernel/AmbientEngine.md",
      "source": "webgpu-os/kernel/AmbientEngine.js",
      "import": "/webgpu-os/kernel/AmbientEngine.js",
      "sourceHash": "bb8460358fb4e12bdbd96ac78e16d50815d07f75735aa1a6a85d18ca83fd0f9b",
      "summary": "AmbientEngine.js — Desktop background rendering service. Owns a fixed full-screen DOM layer (z-index: -10) that sits permanently behind every panel and shell element.  Supports CSS gradients, solid colors, static images, video, and extensible driver plug-ins registered by mods.  Exposes the same before/after hook middleware pattern as ThemeEngine so mods can intercept and customize background changes. ThemeEngine drives this automatically via setFromTheme() when the accent or wallpaper preset changes.  Mods (or the user) can bypass ThemeEngine entirely with apply() for fully custom backgrounds. ── Modder API ──────────────────────────────────────────────────────────── const amb = syscalls.ambient; // Register a totally custom renderer (canvas, WebGPU, Three.js …) amb.registerDriver('webgpu-scene', { apply(layer, config) { layer.innerHTML = ''; const canvas = document.createElement('canvas'); canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;'; layer.appendChild(canvas); // … render into canvas … }, destroy(layer) { layer.innerHTML = ''; } }); // Before hook — middleware: modify config before the layer receives it amb.before('my-mod', (cfg, next) => next({ ...cfg, opacity: 0.7 }), 'Dim'); // After hook — react after background is applied amb.after('my-mod', (cfg) => console.log('Ambient applied:', cfg)); // Apply custom backgrounds amb.apply({ type: 'css',   value: 'linear-gradient(135deg,#ff0080,#7928ca)' }); amb.apply({ type: 'color', value: '#1a0533' }); amb.apply({ type: 'image', src: '/bg.jpg', size: 'cover', position: 'center' }); amb.apply({ type: 'video', src: '/bg.mp4', bg: '#000' }); amb.apply({ type: 'webgpu-scene', ... }); // custom driver // Set opacity of the ambient layer (0–1) amb.setOpacity(0.85); // Export / import config JSON const json = amb.export(); amb.import(json); // Subscribe to changes kernel.events.on('os:ambient-change', ({ config }) => { … });",
      "exports": [
        {
          "name": "AmbientEngine",
          "kind": "class",
          "signature": "class AmbientEngine",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/AppRegistrationScope",
      "path": "webgpu-os/reference/kernel/AppRegistrationScope.md",
      "source": "webgpu-os/kernel/AppRegistrationScope.js",
      "import": "/webgpu-os/kernel/AppRegistrationScope.js",
      "sourceHash": "db2433a1daa6f11a18be3d052bc2b1483ad7734ce58ccd5901e9d8aeb98779fc",
      "summary": "Authenticated app wrappers for registration-bearing syscall namespaces. Identity binding is independent of permission-enforcement mode: developer mode may relax capability checks, but it never relaxes ownership.",
      "exports": [
        {
          "name": "scopeToolSyscalls",
          "kind": "function",
          "signature": "scopeToolSyscalls(kernel, appId, raw = kernel?.syscalls?.tools)",
          "summary": ""
        },
        {
          "name": "scopeProtocolSyscalls",
          "kind": "function",
          "signature": "scopeProtocolSyscalls(kernel, appId, raw = kernel?.syscalls?.protocol)",
          "summary": ""
        },
        {
          "name": "scopeCommandSyscalls",
          "kind": "function",
          "signature": "scopeCommandSyscalls(kernel, appId, raw = kernel?.syscalls?.cmd)",
          "summary": ""
        },
        {
          "name": "cleanupAppRegistrations",
          "kind": "function",
          "signature": "cleanupAppRegistrations(kernel, appId, { logger = console } = {})",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/AppRegistry",
      "path": "webgpu-os/reference/kernel/AppRegistry.md",
      "source": "webgpu-os/kernel/AppRegistry.js",
      "import": "/webgpu-os/kernel/AppRegistry.js",
      "sourceHash": "29bf5250b5ede279d9bcd164cba9ccac442fc0751f3f73ba9f86d27ea1756788",
      "summary": "AppRegistry.js — fully dynamic, fetch-based app discovery. NO apps are hardcoded here. Discovery works as follows: 1. Fetch  apps/index.json  → array of folder names, e.g. [\"calculator\",\"notepad\",…] 2. For each folder, fetch  apps/<folder>/manifest.json 3. Resolve manifest.entry against the manifest URL (absolute URL) 4. Register and emit 'change' so the shell re-renders live To add a new app: create  apps/<name>/manifest.json  +  apps/<name>/YourApp.js, then add \"<name>\" to  apps/index.json.  No JS edits required. Manifest shape (see docs/APP_MANIFEST_SPEC.md): appId, name, entry, icon, category, surface, defaultWidth, defaultHeight, permissions, description, version, settings[]",
      "exports": [
        {
          "name": "AppManifestValidationError",
          "kind": "class",
          "signature": "class AppManifestValidationError extends Error",
          "summary": ""
        },
        {
          "name": "AppRegistry",
          "kind": "class",
          "signature": "class AppRegistry",
          "summary": ""
        },
        {
          "name": "validateAppManifest",
          "kind": "function",
          "signature": "validateAppManifest(manifest, { mode = APP_MANIFEST_VALIDATION.STRICT, registry = schemaRegistry, logger = console, } = {})",
          "summary": "Validate an authority-bearing manifest after removing registry-only fields."
        },
        {
          "name": "APP_MANIFEST_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "APP_MANIFEST_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "APP_MANIFEST_VALIDATION",
          "kind": "constant",
          "signature": "APP_MANIFEST_VALIDATION",
          "summary": ""
        },
        {
          "name": "appRegistry",
          "kind": "constant",
          "signature": "appRegistry",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/CommandBus",
      "path": "webgpu-os/reference/kernel/CommandBus.md",
      "source": "webgpu-os/kernel/CommandBus.js",
      "import": "/webgpu-os/kernel/CommandBus.js",
      "sourceHash": "0d1d19f829f8b01d4fad3182ad2ad41b252be5b8db72d0c114e232d41ab078e1",
      "summary": "CommandBus.js — OS-wide addressable command registry. Every syscall namespace, app, and service can register handlers for dot-namespaced command strings: pkg.install    patch.apply    gpu.profile.start    browser.tabs.list Dispatch flow: caller → cmd.dispatch('pkg.install', { url }) → handler → result All dispatches are logged to /os/logs/commands.log (async, non-blocking). Usage: kernel.cmd.register('pkg.install', async ({ url }, ctx) => { ... }); const result = await kernel.cmd.dispatch('pkg.install', { url: '...' });",
      "exports": [
        {
          "name": "CommandBus",
          "kind": "class",
          "signature": "class CommandBus",
          "summary": "CommandBus.js — OS-wide addressable command registry. Every syscall namespace, app, and service can register handlers for dot-namespaced command strings: pkg.install    patch.apply    gpu.profile.start    browser.tabs.list Dispatch flow: caller → cmd.dispatch('pkg.install', { url }) → handler → result All dispatches are logged to /os/logs/commands.log (async, non-blocking). Usage: kernel.cmd.register('pkg.install', async ({ url }, ctx) => { ... }); const result = await kernel.cmd.dispatch('pkg.install', { url: '...' });"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/FxBus",
      "path": "webgpu-os/reference/kernel/FxBus.md",
      "source": "webgpu-os/kernel/FxBus.js",
      "import": "/webgpu-os/kernel/FxBus.js",
      "sourceHash": "c3bccea31af288fa7f594fc46eb8fdd5b253ab641551e422a12724dfae4bd1ba",
      "summary": "FxBus.js — the OS \"FX Bridge\". A normalized pipeline that lets apps (and the OS itself) publish a lightweight \"vibe\" — a dominant accent color, optional palette, an energy level, and an optional beat/mood — which the desktop reacts to (ambient tint/pulse, accent glow) and which external sinks (WLED / Home Assistant / Hue via a relay) can later subscribe to. Producers: - Explicit: an app calls `syscalls.fx.publish(frame)` (capability `fx.emit`). Sandboxed iframe guests call `window.os.fx.publish(frame)`, routed over the existing postMessage RPC bridge. - Automatic: `startAutoSample()` samples a provided surface (canvas/img/video) and extracts the dominant color, so an app can drive effects with no code. Consumers subscribe to the kernel event `os:fx-frame`. The built-in consumer is AmbientEngine.fxTint(); more sinks can be added without touching producers. Frames are normalized and rate-limited (coalesced to ~one emit per minInterval) so a chatty producer cannot flood the desktop or thrash the compositor.",
      "exports": [
        {
          "name": "FxBus",
          "kind": "class",
          "signature": "class FxBus",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/GpuDeviceBroker",
      "path": "webgpu-os/reference/kernel/GpuDeviceBroker.md",
      "source": "webgpu-os/kernel/GpuDeviceBroker.js",
      "import": "/webgpu-os/kernel/GpuDeviceBroker.js",
      "sourceHash": "f3f1f5f1f6ecd9acea8e7ffa50af44d74e4aa4296b155772be0b77ee6639c1f3",
      "summary": "GpuDeviceBroker.js — per-app GPU device facades, quotas, and adapter redaction. WHY a facade and not a Proxy of the real GPUDevice? Host objects with internal slots (GPUDevice/GPUQueue) fail brand checks when a Proxy is handed back to other WebGPU APIs (notably `GPUCanvasContext .configure({ device })`). So we hand apps a *forwarding facade*: a plain object that forwards to the real device and ALWAYS returns real host objects (real GPUBuffer/GPUTexture/encoder/queue). The only host API that consumes the device object itself is `context.configure` — untrusted apps should get their canvas via `gpu.acquireSurface` (configured by the OS with the REAL device), so they never need to pass the facade anywhere. If an untrusted app does configure a canvas itself with the facade it fails closed (safe). POLICY: trusted / built-in apps receive the RAW device (zero compatibility risk). Untrusted (unverified) apps receive a facade that: - tracks + quota-checks every createBuffer / createTexture (via VRAMTracker), - counts pipelines / shader modules / queue submits per app, - enforces a command-submit budget (anti-runaway), - partitions the shader-module cache per app (no cross-app cache sharing), - fails closed after device loss until the broker re-issues a fresh facade.",
      "exports": [
        {
          "name": "GpuDeviceBroker",
          "kind": "class",
          "signature": "class GpuDeviceBroker",
          "summary": ""
        },
        {
          "name": "bucketLimits",
          "kind": "function",
          "signature": "bucketLimits(limits)",
          "summary": "Bucket GPUSupportedLimits into a coarse, plain object. Reduces fingerprint entropy (exact limits vary per GPU/driver) while keeping values usable. Returns a plain object with the same keys apps read."
        },
        {
          "name": "bucketAdapterInfo",
          "kind": "function",
          "signature": "bucketAdapterInfo(info)",
          "summary": "Redact a rich adapter-info report down to a coarse, low-entropy summary for untrusted apps. Keeps the vendor *bucket* and capability booleans; drops the precise renderer string, driver version, device id, and exact limits."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/GpuInfo",
      "path": "webgpu-os/reference/kernel/GpuInfo.md",
      "source": "webgpu-os/kernel/GpuInfo.js",
      "import": "/webgpu-os/kernel/GpuInfo.js",
      "sourceHash": "47a9a3500997dcbcb38a8a7fc94985b52ad814b0521c727de77964254644ba7d",
      "summary": "GpuInfo.js — rich, consolidated GPU adapter reporting for the OS. Browsers expose the GPU through several uneven channels; the most accurate picture comes from combining them (this mirrors what the engine's VGPUMemoryTracker / GPU Profiler do, minus the heavy VRAM probe): 1. WebGPU `adapter.info`            → vendor / architecture / device / description 2. `adapter.requestAdapterInfo()`   → same, legacy async fallback 3. `device.adapterInfo`             → some implementations expose it here 4. WebGL `WEBGL_debug_renderer_info`→ the UNMASKED renderer string is usually the only place the real model name (e.g. \"AMD Radeon RX 6700 XT\") appears, since Chrome hides it from adapter.info. 5. `adapter.features` / `.limits`   → capability flags + key device limits `gatherGpuInfo()` returns ONE structured report plus best-effort adapter preference probes. Everything is best-effort and never throws — missing channels just leave their fields empty.",
      "exports": [
        {
          "name": "vendorBucket",
          "kind": "function",
          "signature": "vendorBucket(info)",
          "summary": "Coarse vendor label from any descriptive string."
        },
        {
          "name": "friendlyAdapterName",
          "kind": "function",
          "signature": "friendlyAdapterName(info)",
          "summary": "Best human-readable adapter name from the combined channels."
        },
        {
          "name": "gatherGpuInfo",
          "kind": "function",
          "signature": "async gatherGpuInfo(adapter, device = null, options = {})",
          "summary": "Gather a full GPU report from a WebGPU adapter (+ optional device)."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/KernelBootstrap",
      "path": "webgpu-os/reference/kernel/KernelBootstrap.md",
      "source": "webgpu-os/kernel/KernelBootstrap.js",
      "import": "/webgpu-os/kernel/KernelBootstrap.js",
      "sourceHash": "450df00e29c9578d127d42542d6f43ea61a0cf7a7d7cc68553381ad115ee81e6",
      "summary": "KernelBootstrap — the OS kernel layer. Owns: - The single shared WebGPU device (if available). - The central task scheduler (kernel-owned RAF). - The event bus. - GPU device-lost fan-out to all registered apps. - The syscall surface exposed to apps. Tier-2 note: In Tier 2 this becomes a Rust native-host service; the kernel.syscalls shape must remain stable across tiers.",
      "exports": [
        {
          "name": "KernelBootstrap",
          "kind": "class",
          "signature": "class KernelBootstrap",
          "summary": "KernelBootstrap — the OS kernel layer. Owns: - The single shared WebGPU device (if available). - The central task scheduler (kernel-owned RAF). - The event bus. - GPU device-lost fan-out to all registered apps. - The syscall surface exposed to apps. Tier-2 note: In Tier 2 this becomes a Rust native-host service; the kernel.syscalls shape must remain stable across tiers."
        },
        {
          "name": "KernelEventBus",
          "kind": "class",
          "signature": "class KernelEventBus",
          "summary": "Minimal synchronous event bus for kernel-internal use. Apps should use kernel.syscalls.ipc for cross-app messaging."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/LaunchCoordinator",
      "path": "webgpu-os/reference/kernel/LaunchCoordinator.md",
      "source": "webgpu-os/kernel/LaunchCoordinator.js",
      "import": "/webgpu-os/kernel/LaunchCoordinator.js",
      "sourceHash": "3d32e5413fd7eb74af7a821015b656c3a9cb843d683d69f175823a4b6d3d21fe",
      "summary": "Route validated launch intents through the existing desktop and subsurface services.",
      "exports": [
        {
          "name": "LaunchCoordinator",
          "kind": "class",
          "signature": "class LaunchCoordinator",
          "summary": "Route validated launch intents through the existing desktop and subsurface services."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/LaunchIntent",
      "path": "webgpu-os/reference/kernel/LaunchIntent.md",
      "source": "webgpu-os/kernel/LaunchIntent.js",
      "import": "/webgpu-os/kernel/LaunchIntent.js",
      "sourceHash": "935b8e4e1bf86c5482d82039688e368069fbb760b9c80161b6b92c349415b04c",
      "summary": "Canonical, untrusted-input boundary for browser and operating-system launches.",
      "exports": [
        {
          "name": "LaunchIntentError",
          "kind": "class",
          "signature": "class LaunchIntentError extends Error",
          "summary": ""
        },
        {
          "name": "parseLaunchUrl",
          "kind": "function",
          "signature": "parseLaunchUrl(input, { baseUrl = globalThis.location?.href ?? 'https://localhost/webgpu-os/', scopePath = DEFAULT_LAUNCH_SCOPE, } = {})",
          "summary": "Parse a canonical launch URL. Non-launch URLs inside the shell return null; malformed URLs under /open/ throw so callers can log a security rejection."
        },
        {
          "name": "LAUNCH_CONTRACT_VERSION",
          "kind": "constant",
          "signature": "LAUNCH_CONTRACT_VERSION",
          "summary": "Canonical, untrusted-input boundary for browser and operating-system launches."
        },
        {
          "name": "DEFAULT_LAUNCH_SCOPE",
          "kind": "constant",
          "signature": "DEFAULT_LAUNCH_SCOPE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ModRegistry",
      "path": "webgpu-os/reference/kernel/ModRegistry.md",
      "source": "webgpu-os/kernel/ModRegistry.js",
      "import": "/webgpu-os/kernel/ModRegistry.js",
      "sourceHash": "88be212f6c5d36b350106f004bdd9372e72efa751409865395b49ce99d743987",
      "summary": "ModRegistry.js — dynamic mod discovery, mirroring AppRegistry. Scans  mods/index.json  → per-mod  mods/<folder>/manifest.json Imports the mod entry and registers its hooks into PatchBus. Mod manifest shape: modId        — unique reverse-domain id, e.g. \"com.example.dark-plus\" name         — display name version      — semver string author       — author name description  — one-line description targets      — array of appIds to patch, or [\"*\"] for all apps entry        — relative path to mod JS module (default export = mod object) entryOverride — boolean, if true this mod completely replaces the app entry enabled      — boolean (default true), false to disable without removing Adding a new mod: 1. Create  mods/<name>/manifest.json 2. Create  mods/<name>/YourMod.js  (default export: mod object) 3. Add \"<name>\" to  mods/index.json No kernel or app code changes required.",
      "exports": [
        {
          "name": "ModRegistry",
          "kind": "class",
          "signature": "class ModRegistry",
          "summary": ""
        },
        {
          "name": "modRegistry",
          "kind": "constant",
          "signature": "modRegistry",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/OsLogger",
      "path": "webgpu-os/reference/kernel/OsLogger.md",
      "source": "webgpu-os/kernel/OsLogger.js",
      "import": "/webgpu-os/kernel/OsLogger.js",
      "sourceHash": "b052b52ba13aa5e4067cf1b194e60ab9efe2833559edfe93023c888a0153ffd7",
      "summary": "OsLogger.js — in-memory ring-buffer logger for the OS kernel and apps. Levels: debug < info < warn < error Keeps the last MAX_ENTRIES entries in memory. Listeners (e.g. Log Viewer) are notified on each write. Optionally flushes to /os/logs/os.log via StorageManager (non-blocking).",
      "exports": [
        {
          "name": "OsLogger",
          "kind": "class",
          "signature": "class OsLogger",
          "summary": ""
        },
        {
          "name": "projectLogMetadata",
          "kind": "function",
          "signature": "projectLogMetadata(value)",
          "summary": "Produce an accessor-free, bounded, closed projection for a log entry. Unknown fields and nested objects are omitted instead of serialized."
        },
        {
          "name": "OS_LOG_CAPACITY",
          "kind": "constant",
          "signature": "OS_LOG_CAPACITY",
          "summary": ""
        },
        {
          "name": "OS_LOG_CAPACITY_BYTES",
          "kind": "constant",
          "signature": "OS_LOG_CAPACITY_BYTES",
          "summary": ""
        },
        {
          "name": "osLogger",
          "kind": "constant",
          "signature": "osLogger",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/PatchBus",
      "path": "webgpu-os/reference/kernel/PatchBus.md",
      "source": "webgpu-os/kernel/PatchBus.js",
      "import": "/webgpu-os/kernel/PatchBus.js",
      "sourceHash": "b06cc91475eccca92e4bb0c50eefdf2c8a345d9c393aa9ad646b27585981d7d5",
      "summary": "PatchBus.js — Android-style mod / patch bus for WebGPU OS. Provides: beforeMount / afterMount / beforeUnmount / afterUnmount hooks UI injection    — mods append DOM into any app panel CSS injection   — scoped to the app's panel element automatically Manifest patch  — mods can widen panels, add permissions, change defaults Entry override  — a mod can fully replace an app's module Syscall intercept — middleware chain on any syscall namespace.method Hook execution order: mods registered first run first (FIFO per phase). Syscall interceptors are chained: each calls next() to delegate down. ── Mod object API (default export from mod entry file) ───────────────────── beforeMount(container, syscalls, manifest)           → void | Promise afterMount(container, syscalls, appInstance, manifest) → void | Promise beforeUnmount(appInstance, manifest)                 → void | Promise afterUnmount(manifest)                               → void | Promise injectUI(container, manifest)                        → HTMLElement | null injectCSS(manifest)                                  → string | null patchManifest(manifest)                              → Partial<Manifest> interceptSyscall(syscallPath, args, next)            → any None of these are required — implement only what you need.",
      "exports": [
        {
          "name": "PatchBus",
          "kind": "class",
          "signature": "class PatchBus",
          "summary": "PatchBus.js — Android-style mod / patch bus for WebGPU OS. Provides: beforeMount / afterMount / beforeUnmount / afterUnmount hooks UI injection    — mods append DOM into any app panel CSS injection   — scoped to the app's panel element automatically Manifest patch  — mods can widen panels, add permissions, change defaults Entry override  — a mod can fully replace an app's module Syscall intercept — middleware chain on any syscall namespace.method Hook execution order: mods registered first run first (FIFO per phase). Syscall interceptors are chained: each calls next() to delegate down. ── Mod object API (default export from mod entry file) ───────────────────── beforeMount(container, syscalls, manifest)           → void | Promise afterMount(container, syscalls, appInstance, manifest) → void | Promise beforeUnmount(appInstance, manifest)                 → void | Promise afterUnmount(manifest)                               → void | Promise injectUI(container, manifest)                        → HTMLElement | null injectCSS(manifest)                                  → string | null patchManifest(manifest)                              → Partial<Manifest> interceptSyscall(syscallPath, args, next)            → any None of these are required — implement only what you need."
        },
        {
          "name": "patchBus",
          "kind": "constant",
          "signature": "patchBus",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/PermissionPortal",
      "path": "webgpu-os/reference/kernel/PermissionPortal.md",
      "source": "webgpu-os/kernel/PermissionPortal.js",
      "import": "/webgpu-os/kernel/PermissionPortal.js",
      "sourceHash": "f8633ebfb07acff9fd989d4eb929bbd2c422e64210a2f2b01d0fe2e788580f7e",
      "summary": "PermissionPortal.js — user-facing permission prompt. Appears as a stacked card above the taskbar whenever an app requests a capability that is not yet decided. Multiple requests queue and show one at a time (FIFO). Each card: ┌──────────────────────────────────────┐ │ 🔒  os.my-app wants permission       │ │     Access camera                    │ │     Risk: ● High                     │ │  [Deny]  [Allow Once]  [Allow Always] │ └──────────────────────────────────────┘ Usage (kernel internal — apps call syscalls.permissions.request()): const portal = new PermissionPortal(); portal.mount(document.body); const granted = await portal.ask(appId, capability, manifest);",
      "exports": [
        {
          "name": "PermissionPortal",
          "kind": "class",
          "signature": "class PermissionPortal",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/PermissionStore",
      "path": "webgpu-os/reference/kernel/PermissionStore.md",
      "source": "webgpu-os/kernel/PermissionStore.js",
      "import": "/webgpu-os/kernel/PermissionStore.js",
      "sourceHash": "f40217dcfdab726e7eb5218fc78b34c0a762c165e8e7ef7346f43585bc5b6aab",
      "summary": "PermissionStore.js — IDB-backed persistence of user permission decisions. Decisions are keyed as `{appId}::{capability}` in the 'permissions' IDB store. Each record: { appId, capability, decision: 'allow'|'deny', scope: 'once'|'always', ts } 'once' decisions are in-memory only (not persisted). 'always' decisions are stored and reloaded on next boot.",
      "exports": [
        {
          "name": "PermissionStore",
          "kind": "class",
          "signature": "class PermissionStore",
          "summary": "PermissionStore.js — IDB-backed persistence of user permission decisions. Decisions are keyed as `{appId}::{capability}` in the 'permissions' IDB store. Each record: { appId, capability, decision: 'allow'|'deny', scope: 'once'|'always', ts } 'once' decisions are in-memory only (not persisted). 'always' decisions are stored and reloaded on next boot."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/Permissions",
      "path": "webgpu-os/reference/kernel/Permissions.md",
      "source": "webgpu-os/kernel/Permissions.js",
      "import": "/webgpu-os/kernel/Permissions.js",
      "sourceHash": "b35e182e3b63a183a8cfdabc3fbd7e4537224e421ef3320467d131ae0cea66f1",
      "summary": "Permissions.js — capability gating backed by RuleGraph. Phase 4: enforces manifest-declared permissions via a declarative RuleGraph. Phase 1 mode: audit-only (log violations, never block) — set enforcing=false. Tier 2: delegates to WASI capability broker (same check() interface). Usage: kernel.permissions.registerApp(appId, manifest) kernel.permissions.check(appId, 'gpu.compute')  → { granted, reason } kernel.permissions.require(appId, 'gpu.compute') → throws if denied + enforcing",
      "exports": [
        {
          "name": "Permissions",
          "kind": "class",
          "signature": "class Permissions",
          "summary": ""
        },
        {
          "name": "PermissionDeniedError",
          "kind": "class",
          "signature": "class PermissionDeniedError extends Error",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ProcessTable",
      "path": "webgpu-os/reference/kernel/ProcessTable.md",
      "source": "webgpu-os/kernel/ProcessTable.js",
      "import": "/webgpu-os/kernel/ProcessTable.js",
      "sourceHash": "903a1371476bee032dbf10b9b2c60f0eec9c3a84516d8ff86c69f989dd2e1117",
      "summary": "ProcessTable.js — tracks all running app panel instances. Each entry maps an appId to its runtime handle: { appId, panelId, manifestPath, panel, resources, startedAt, parentAppId, cpuMs, memoryBytes, networkBytes, diskBytes, lastSampleAt } Phase 4 extends this with per-app VRAM quotas, capability sets, and \"destroy on policy breach\" enforcement. Phase 5 adds full system monitoring (CPU%, memory, network I/O, disk I/O).",
      "exports": [
        {
          "name": "ProcessTable",
          "kind": "class",
          "signature": "class ProcessTable",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ProvenanceChecker",
      "path": "webgpu-os/reference/kernel/ProvenanceChecker.md",
      "source": "webgpu-os/kernel/ProvenanceChecker.js",
      "import": "/webgpu-os/kernel/ProvenanceChecker.js",
      "sourceHash": "8e583663803989ca8c3bce6d502dc2a7067a0fd02248d9665cd63d58ceb0162c",
      "summary": "ProvenanceChecker.js — SLSA-inspired build provenance validation. Signatures prove WHO built a package; provenance proves HOW. The 2026 TanStack attack shipped packages with valid signatures from a hijacked builder, so we validate a provenance block and (critically) that the declared source materials actually match the packaged files. Provenance block shape (in the envelope): { sourceRef:  'git@…#<commit>' | 'webgpu-os/devtools', builderId:  'webgpu-os/devtools' | 'ci/github', builtAt:    ISO timestamp, buildParams:{ … }, materials:  [ { path: 'files/app.js', sha256: '…' }, … ] } Returns a verdict { ok, level, builderId, warnings[] }: level 0 — no provenance (allowed, but lowers trust → risk badge) level 1 — provenance present + materials match packaged files level 2 — level 1 AND builder is a recognized trusted builder",
      "exports": [
        {
          "name": "ProvenanceChecker",
          "kind": "class",
          "signature": "class ProvenanceChecker",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/RuleGraph",
      "path": "webgpu-os/reference/kernel/RuleGraph.md",
      "source": "webgpu-os/kernel/RuleGraph.js",
      "import": "/webgpu-os/kernel/RuleGraph.js",
      "sourceHash": "19749b4a686d1dff1d8237985a02ec3ed78c2290a73e14ce7e3263e2dd97786f",
      "summary": "RuleGraph.js — declarative capability-based permissions engine. Rules are evaluated in registration order; the LAST matching rule wins (CSS-like specificity — more specific rules override general ones). Capabilities follow a dot-namespace convention: fs.read, fs.write, gpu.compute, gpu.acquireSurface, net.send, net.on, ai.infer, ui.notify, ipc.emit, … Wildcard matching: 'fs.*'  matches any capability starting with 'fs.' '*'     matches everything Condition functions receive (appId, capability, manifest) and return bool. A rule with a condition is only applied when the condition is true. Usage: const graph = new RuleGraph() .allow('fs.*') .deny('net.*') .allowIf('gpu.compute', (id, cap, mf) => mf.permissions?.includes('gpu.compute')); const { granted, reason } = graph.check('os.calculator', 'fs.read', manifest);",
      "exports": [
        {
          "name": "RuleGraph",
          "kind": "class",
          "signature": "class RuleGraph",
          "summary": "RuleGraph.js — declarative capability-based permissions engine. Rules are evaluated in registration order; the LAST matching rule wins (CSS-like specificity — more specific rules override general ones). Capabilities follow a dot-namespace convention: fs.read, fs.write, gpu.compute, gpu.acquireSurface, net.send, net.on, ai.infer, ui.notify, ipc.emit, … Wildcard matching: 'fs.*'  matches any capability starting with 'fs.' '*'     matches everything Condition functions receive (appId, capability, manifest) and return bool. A rule with a condition is only applied when the condition is true. Usage: const graph = new RuleGraph() .allow('fs.*') .deny('net.*') .allowIf('gpu.compute', (id, cap, mf) => mf.permissions?.includes('gpu.compute')); const { granted, reason } = graph.check('os.calculator', 'fs.read', manifest);"
        },
        {
          "name": "buildDefaultRuleGraph",
          "kind": "function",
          "signature": "buildDefaultRuleGraph()",
          "summary": "Build the default OS-wide RuleGraph. Apps with explicit manifest.permissions entries unlock restricted capabilities."
        },
        {
          "name": "KNOWN_CAPABILITIES",
          "kind": "constant",
          "signature": "KNOWN_CAPABILITIES",
          "summary": ""
        },
        {
          "name": "CAPABILITY_LABELS",
          "kind": "constant",
          "signature": "CAPABILITY_LABELS",
          "summary": "Human-readable label for each capability (used by PermissionPortal)."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/RuntimeModeManager",
      "path": "webgpu-os/reference/kernel/RuntimeModeManager.md",
      "source": "webgpu-os/kernel/RuntimeModeManager.js",
      "import": "/webgpu-os/kernel/RuntimeModeManager.js",
      "sourceHash": "8eebf325ae626b3f5579417c7dab268ff1eb6f57eec3afa314eae601283fe317",
      "summary": "RuntimeModeManager.js — Runtime ↔ Developer mode switch. Modes: 'runtime'   — enforcing permissions, no debug surface, production-like 'developer' — enforcing permissions, bounded diagnostics, hot-reload enabled Effects applied on mode change: runtime    → permissions.setEnforcing(true), window.__DEV__ = false developer  → permissions.setEnforcing(true), window.__DEV__ = true Developer mode is never an authority bypass. Entering it requires a trusted system principal and a live browser user activation; the kernel object and private services are never projected onto `window`. Persisted in IDB kv store under key 'os.runtimeMode'. Emits kernel event 'os:mode-change' with { mode, prev }.",
      "exports": [
        {
          "name": "RuntimeModeManager",
          "kind": "class",
          "signature": "class RuntimeModeManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/SearchManager",
      "path": "webgpu-os/reference/kernel/SearchManager.md",
      "source": "webgpu-os/kernel/SearchManager.js",
      "import": "/webgpu-os/kernel/SearchManager.js",
      "sourceHash": "ac5cbaec4cbea85c49ca5c08f5a2d93feff3bba231823b4e73ede0149a69737e",
      "summary": "SearchManager.js — unified OS search backend for the command palette. Aggregates \"app elements\" from three kinds of sources, on top of the apps / subsurfaces / deep-links the palette already indexes: 1. Quick Actions (static)  — declared in a manifest's `actions` array. Each is a runnable item. If it carries a `command`, the palette dispatches it on the CommandBus; otherwise it is delivered to the app as an app-action (the app is opened/focused first, then receives ui:app-action / reads pendingActions). 2. Live content providers  — a running app registers a query callback via ui.registerSearchProvider(id, { label, query }). `query(q)` returns result items { id, label, sublabel?, icon?, run } where run() performs the action. Providers are same-realm closures, so run() can call straight back into the app. 3. Commands (opt-in)        — CommandBus commands registered with meta.search:true become searchable; selecting dispatches them (no-arg). Opt-in keeps destructive commands out of search by default. Events: ui:app-action { appId, actionId, args } — a manifest app-action was invoked.",
      "exports": [
        {
          "name": "SearchManager",
          "kind": "class",
          "signature": "class SearchManager",
          "summary": "SearchManager.js — unified OS search backend for the command palette. Aggregates \"app elements\" from three kinds of sources, on top of the apps / subsurfaces / deep-links the palette already indexes: 1. Quick Actions (static)  — declared in a manifest's `actions` array. Each is a runnable item. If it carries a `command`, the palette dispatches it on the CommandBus; otherwise it is delivered to the app as an app-action (the app is opened/focused first, then receives ui:app-action / reads pendingActions). 2. Live content providers  — a running app registers a query callback via ui.registerSearchProvider(id, { label, query }). `query(q)` returns result items { id, label, sublabel?, icon?, run } where run() performs the action. Providers are same-realm closures, so run() can call straight back into the app. 3. Commands (opt-in)        — CommandBus commands registered with meta.search:true become searchable; selecting dispatches them (no-arg). Opt-in keeps destructive commands out of search by default. Events: ui:app-action { appId, actionId, args } — a manifest app-action was invoked."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/SecurityDoctor",
      "path": "webgpu-os/reference/kernel/SecurityDoctor.md",
      "source": "webgpu-os/kernel/SecurityDoctor.js",
      "import": "/webgpu-os/kernel/SecurityDoctor.js",
      "sourceHash": "67001167766ed98e8d0407c51f341ef8052f6a4be029d5dc1c4f1088fc3bcc49",
      "summary": "SecurityDoctor.js — in-browser security posture report (no Node required). Aggregates the OS's runtime security signals into a single graded report: - syscall guard coverage (reuses auditSyscallGuards) - complete capability-policy coverage (reuses auditCapabilityMap) - permission enforcement state - package trust posture (quarantined / untrusted installed packages) - update supply-chain policy (signed + trusted-for-auto) - GPU containment (per-app broker + VRAM quotas) - shell CSP delivery (Report-Only vs enforcing, inline-script regressions) - browser-extension presence Each finding has a severity ('critical'|'high'|'medium'|'low'|'info') and a pass flag. `runSecurityDoctor(kernel)` returns a structured report suitable for logging or rendering in a Security Doctor panel.",
      "exports": [
        {
          "name": "scoreSecurityFindings",
          "kind": "function",
          "signature": "scoreSecurityFindings(findings)",
          "summary": ""
        },
        {
          "name": "runSecurityDoctor",
          "kind": "function",
          "signature": "async runSecurityDoctor(kernel)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/SessionStore",
      "path": "webgpu-os/reference/kernel/SessionStore.md",
      "source": "webgpu-os/kernel/SessionStore.js",
      "import": "/webgpu-os/kernel/SessionStore.js",
      "sourceHash": "a7dd3a70dca2f4ab8779039597620bbaf4f8c600b28a6cc9ec96e0bcbe236c3e",
      "summary": "SessionStore.js — OS-wide, encrypted per-origin session + credential store. One machine-bound, AES-256-GCM encrypted IndexedDB store (via AppSandbox, db `os.sandbox.os.sessions`) shared by every app and the compat layer. It replaces the Browser app's localStorage-local vault/cookie stores so logins and per-site policy are managed OS-wide and consistently encrypted. Record kinds (one IDB key each): policy:<origin>  → 'persist' | 'isolated'      per-site session policy sess:<origin>    → { cookies:{k:v}, local:{k:v}, t }   agent-captured data vault            → the Browser vault blob (itself master-password encrypted; stored here so all apps share one OS-wide vault) IMPORTANT — what this can and cannot do: We CANNOT read a cross-origin live frame's real cookies (browser isolation), and Set-Cookie is a forbidden header. So \"persistence\" is policy-driven: • 'isolated' (default) → frame loads `credentialless` (ephemeral, sessionless) • 'persist'            → frame drops `credentialless` so the browser keeps its cookies natively across reloads + restarts Captured `sess:<origin>` data only comes from surfaces we CONTROL (proxied / srcdoc / compat-sandbox documents) via an injected agent — never scraped from a live cross-origin frame.",
      "exports": [
        {
          "name": "SessionStore",
          "kind": "class",
          "signature": "class SessionStore",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/SigningLineage",
      "path": "webgpu-os/reference/kernel/SigningLineage.md",
      "source": "webgpu-os/kernel/SigningLineage.js",
      "import": "/webgpu-os/kernel/SigningLineage.js",
      "sourceHash": "c9cb2590691cb4d249fcf891f8a9f2c5af15b737c2894c835391ccd5580713b9",
      "summary": "SigningLineage.js — publisher signing-key rotation lineage (proof-of-rotation). Models the Android APK Signature Scheme v3 \"proof-of-rotation\" idea in our ECDSA P-256 world: a singly-linked list of publisher keys, ordered oldest → newest, where EACH ancestor key signs the NEXT key's payload. This proves that a new key is endorsed by the previous one, so an app update signed by a fresh key is provably the same publisher identity as the version a user already pinned — \"reuse the same identity with new keys, still isolated per update.\" Two independent guarantees (kept separate, exactly like APK v3): 1. File integrity / self-verification — the CURRENT key signs the version's Merkle root (PackageBuilder.buildV2). That is unchanged and lives outside this module: a package always verifies against its own files. 2. Identity continuity — THIS module. The lineage is carried inside the signed package envelope (so it is covered by the current key's signature and cannot be stripped/swapped in transit), and proves the head key descends from the previously-pinned key. Lineage shape (`prlineage-v1`): { format: 'prlineage-v1', appId:  'community.my-app', nodes:  [ { pubKey:<b64>, fingerprint:<hex>, flags:<uint>, rotatedAt:<iso> }, ... ],  // oldest → newest links:  [ <b64 sig>, ... ]   // links[i] = nodes[i] signing canonical(nodes[i+1]); length = nodes.length - 1 } Node flags (self-trusted-old-certs, bitfield): FLAG_INSTALL  (1) — this (old) key may still authorize fresh installs FLAG_UPDATE   (2) — this (old) key may still sign updates Default for new rotations is 0 (strict): only the head key installs/updates; ancestors are accepted ONLY to prove continuity to a pinned fingerprint. SECURITY: this verifier is FAIL-CLOSED. Any malformed structure, fingerprint mismatch, or broken link signature ⇒ { valid:false }. Callers fall back to the existing publisher-change quarantine path on invalid/absent lineage. fingerprintOf:(pubRaw:Uint8Array)=>Promise<string>, sign?:(data:string)=>Promise<Uint8Array|null> }} CryptoLike",
      "exports": [
        {
          "name": "lineageNodePayload",
          "kind": "function",
          "signature": "lineageNodePayload(appId, prevFingerprint, node)",
          "summary": "Canonical signed payload for a lineage node — the bytes an ancestor key signs to endorse this successor node. Binds the successor's key, fingerprint, flags, the appId, and the PREVIOUS node's fingerprint, so a link cannot be replayed onto a different app or spliced into a different chain."
        },
        {
          "name": "verifyLineage",
          "kind": "function",
          "signature": "async verifyLineage(lineage, crypto)",
          "summary": "Verify a lineage end-to-end. FAIL-CLOSED."
        },
        {
          "name": "authorizeRotation",
          "kind": "function",
          "signature": "async authorizeRotation(lineage, signerFingerprint, pinnedFingerprint, crypto)",
          "summary": "Decide whether an update may proceed via key rotation. FAIL-CLOSED. Accepts iff the lineage is valid, its head equals the package's current signer fingerprint, and the previously-pinned fingerprint appears in the chain (i.e. the head provably descends from the key the user already trusts)."
        },
        {
          "name": "createGenesisLineage",
          "kind": "function",
          "signature": "async createGenesisLineage(appId, pubKeyRaw, crypto, flags = 0)",
          "summary": "Build the genesis (single-node) lineage for a brand-new publisher key."
        },
        {
          "name": "appendRotation",
          "kind": "function",
          "signature": "async appendRotation(lineage, newPubKeyRaw, signWithCurrent, crypto, opts = {})",
          "summary": "Append a rotation: the CURRENT head key signs the NEW key's node, proving the new key inherits the identity. The caller supplies a `signWithCurrent(data)` bound to the OLD/head private key (the dev's safely-kept key), so private keys never enter this module."
        },
        {
          "name": "LINEAGE_FORMAT",
          "kind": "constant",
          "signature": "LINEAGE_FORMAT",
          "summary": "SigningLineage.js — publisher signing-key rotation lineage (proof-of-rotation). Models the Android APK Signature Scheme v3 \"proof-of-rotation\" idea in our ECDSA P-256 world: a singly-linked list of publisher keys, ordered oldest → newest, where EACH ancestor key signs the NEXT key's payload. This proves that a new key is endorsed by the previous one, so an app update signed by a fresh key is provably the same publisher identity as the version a user already pinned — \"reuse the same identity with new keys, still isolated per update.\" Two independent guarantees (kept separate, exactly like APK v3): 1. File integrity / self-verification — the CURRENT key signs the version's Merkle root (PackageBuilder.buildV2). That is unchanged and lives outside this module: a package always verifies against its own files. 2. Identity continuity — THIS module. The lineage is carried inside the signed package envelope (so it is covered by the current key's signature and cannot be stripped/swapped in transit), and proves the head key descends from the previously-pinned key. Lineage shape (`prlineage-v1`): { format: 'prlineage-v1', appId:  'community.my-app', nodes:  [ { pubKey:<b64>, fingerprint:<hex>, flags:<uint>, rotatedAt:<iso> }, ... ],  // oldest → newest links:  [ <b64 sig>, ... ]   // links[i] = nodes[i] signing canonical(nodes[i+1]); length = nodes.length - 1 } Node flags (self-trusted-old-certs, bitfield): FLAG_INSTALL  (1) — this (old) key may still authorize fresh installs FLAG_UPDATE   (2) — this (old) key may still sign updates Default for new rotations is 0 (strict): only the head key installs/updates; ancestors are accepted ONLY to prove continuity to a pinned fingerprint. SECURITY: this verifier is FAIL-CLOSED. Any malformed structure, fingerprint mismatch, or broken link signature ⇒ { valid:false }. Callers fall back to the existing publisher-change quarantine path on invalid/absent lineage. fingerprintOf:(pubRaw:Uint8Array)=>Promise<string>, sign?:(data:string)=>Promise<Uint8Array|null> }} CryptoLike"
        },
        {
          "name": "LINEAGE_FLAG",
          "kind": "constant",
          "signature": "LINEAGE_FLAG",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/SubsurfaceManager",
      "path": "webgpu-os/reference/kernel/SubsurfaceManager.md",
      "source": "webgpu-os/kernel/SubsurfaceManager.js",
      "import": "/webgpu-os/kernel/SubsurfaceManager.js",
      "sourceHash": "d747047ff86b3ef92c05b98ba712c7cee32ffd8db7b64654b1104960576953f7",
      "summary": "SubsurfaceManager.js — kernel navigation service for app SUBSURFACES. A \"surface\" is an app's top-level display mode (window / overlay / tray — see manifest.surface). A \"subsurface\" is a navigable sub-location *inside* an app (a tab, section, or view), declared in the manifest as: \"subsurfaces\": [ { \"id\": \"mixer\", \"label\": \"Volume Mixer\", \"icon\": \"🎚\", \"keywords\": [\"volume\"] }, ... ] This service is the OS-level registry/tracker for deep-linking into those: - Active tracking: which subsurface each running app currently shows. - Pending nav:     a deep-link target stashed for an app that is still launching (the app reads it on mount via ui.pendingNavigate). - Recents + Pins:  persisted deep-link shortcuts (the \"small UI shortcuts\"), surfaced in the command palette / Start Menu. NOTE: This is distinct from SurfaceManager.js, which allocates WebGPU canvases. Events emitted on kernel.events: ui:navigate-subsurface  { appId, subsurfaceId, args }  — a deep-link was requested ui:subsurface-change    { appId, subsurfaceId }         — an app reported its active sub os:deeplinks-change     {}                              — pins/recents changed",
      "exports": [
        {
          "name": "SubsurfaceManager",
          "kind": "class",
          "signature": "class SubsurfaceManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/SurfaceManager",
      "path": "webgpu-os/reference/kernel/SurfaceManager.md",
      "source": "webgpu-os/kernel/SurfaceManager.js",
      "import": "/webgpu-os/kernel/SurfaceManager.js",
      "sourceHash": "6dfa2afae1cd8e51ae7c14d8bf846d35b9ad822e40cec7a38029968920570e92",
      "summary": "SurfaceManager.js — allocates and manages one WebGPU canvas surface per panel. Checks permissions (gpu.acquireSurface) and VRAM quotas before allocating.",
      "exports": [
        {
          "name": "SurfaceManager",
          "kind": "class",
          "signature": "class SurfaceManager",
          "summary": "Each `gpu-panel` app gets an exclusive <canvas> + GPUCanvasContext bound to the kernel's GPU device. The SurfaceManager handles: - Canvas creation and insertion into the panel body - GPUCanvasContext.configure() with the preferred format - ResizeObserver wiring so the canvas tracks panel resize - Clean release (unconfigure + canvas removal) on panel close Quota admission happens before GPUCanvasContext creation/configuration."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/Syscalls",
      "path": "webgpu-os/reference/kernel/Syscalls.md",
      "source": "webgpu-os/kernel/Syscalls.js",
      "import": "/webgpu-os/kernel/Syscalls.js",
      "sourceHash": "f61e95422a378284bffc6e00969428b22abe2a9ce64e8e27812e7c3e1774754e",
      "summary": "Syscalls.js — the stable Tier 1 ↔ Tier 2 contract boundary. Every app sees ONLY this surface. In Tier 1 (browser) each method delegates to the corresponding engine module. In Tier 2 (Rust + Wasmtime) each method becomes a WASI capability-table entry. ⚠  Never expose engine internals directly to apps. If an app needs a new capability, add a method here first; never let apps import from ../../engine/. Syscall namespaces: kernel.fs   — virtual filesystem (IndexedDB + ProjectManager) kernel.gpu  — GPU stats, resource budgets, device info kernel.ipc  — cross-app event bus kernel.ai   — inference handle (AGI driver, Phase 6) kernel.net    — networking (collab driver, Phase 5) kernel.crypto — ECDSA P-256 identity, sign/verify (CryptoDriver) kernel.ui     — notifications, modals, panels",
      "exports": [
        {
          "name": "createSyscalls",
          "kind": "function",
          "signature": "createSyscalls(kernel)",
          "summary": ""
        },
        {
          "name": "guardSyscalls",
          "kind": "function",
          "signature": "guardSyscalls(kernel, appId, syscalls)",
          "summary": "Wrap a syscalls object with per-app permission enforcement. Only restricted capabilities are guarded — universally-open ones (fs.*, ipc.*, ui.*) are skipped since they are always granted and the overhead is unnecessary."
        },
        {
          "name": "auditSyscallGuards",
          "kind": "function",
          "signature": "auditSyscallGuards(kernel)",
          "summary": "Inventory every syscall method and classify it as guarded / open / unguarded. Build-only: no syscall is invoked. Use at boot (dev mode) or in tests to catch privileged methods added without a capability guard."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ThemeEngine",
      "path": "webgpu-os/reference/kernel/ThemeEngine.md",
      "source": "webgpu-os/kernel/ThemeEngine.js",
      "import": "/webgpu-os/kernel/ThemeEngine.js",
      "sourceHash": "9e963185d0530936101fe623cda8013d3273414a93fdbc11c157a0e38efbbf25",
      "summary": "ThemeEngine.js — Kernel-level theme orchestration service. Single source of truth for all OS appearance state. Exposes a middleware-chain hook system so mods can intercept theme changes before or after they are applied to the DOM. ── Modder API ──────────────────────────────────────────────────────────── const tm = syscalls.theme; // Before hook — middleware: receive appear + next(modified) tm.before('my-mod', (appear, next) => next({ ...appear, chromeStyle: 'metal' }), 'Force metal chrome'); // After hook — react to a completed theme change tm.after('my-mod', (appear) => console.log('Theme applied:', appear)); // Remove hooks tm.removeHook('my-mod'); // Reorder tm.moveHook('my-mod', 'before', 1);           // move to index 1 in before list // Preview (no save, no events) tm.preview({ ...tm.current(), chromeStyle: 'metal' }); // Apply (save + emit os:theme-change) tm.apply({ ...tm.current(), themeId: 'crimson' }); // Export / import theme JSON const json = tm.export(); tm.import(json); // List registered hooks tm.hookList(); // → [{ id, phase, description, enabled, order }]",
      "exports": [
        {
          "name": "ThemeEngine",
          "kind": "class",
          "signature": "class ThemeEngine",
          "summary": ""
        },
        {
          "name": "normalizeAppearance",
          "kind": "function",
          "signature": "normalizeAppearance(input = {})",
          "summary": "Normalize untrusted or legacy appearance data into the supported schema."
        },
        {
          "name": "readAppearanceRecord",
          "kind": "function",
          "signature": "readAppearanceRecord()",
          "summary": ""
        },
        {
          "name": "writeAppearanceRecord",
          "kind": "function",
          "signature": "writeAppearanceRecord(input)",
          "summary": "Publish one canonical appearance record after guarding the existing version."
        },
        {
          "name": "removeAppearanceRecord",
          "kind": "function",
          "signature": "removeAppearanceRecord()",
          "summary": "Remove the current record only when this runtime can understand it."
        },
        {
          "name": "THEMES",
          "kind": "constant",
          "signature": "THEMES",
          "summary": ""
        },
        {
          "name": "WALLPAPERS",
          "kind": "constant",
          "signature": "WALLPAPERS",
          "summary": ""
        },
        {
          "name": "APPEARANCE_VERSION",
          "kind": "constant",
          "signature": "APPEARANCE_VERSION",
          "summary": ""
        },
        {
          "name": "APPEARANCE_DEFAULTS",
          "kind": "constant",
          "signature": "APPEARANCE_DEFAULTS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ToolDriver",
      "path": "webgpu-os/reference/kernel/ToolDriver.md",
      "source": "webgpu-os/kernel/ToolDriver.js",
      "import": "/webgpu-os/kernel/ToolDriver.js",
      "sourceHash": "94b40f20959878cf1a20912877425347bfda32813ccbdeb9a397e0a107e2f4e0",
      "summary": "ToolDriver — small OS-native tool registry for LLM/tool callers. This mirrors the useful parts of Augment's tool registry in browser-native form: schema listing, guarded execution, history, read-only batching, and a narrow terminal bridge that never exposes the interactive terminal's eval path.",
      "exports": [
        {
          "name": "ToolDriver",
          "kind": "class",
          "signature": "class ToolDriver",
          "summary": ""
        },
        {
          "name": "evaluateCalculatorExpression",
          "kind": "function",
          "signature": "evaluateCalculatorExpression(expression)",
          "summary": ""
        },
        {
          "name": "normalizeCalculatorExpression",
          "kind": "function",
          "signature": "normalizeCalculatorExpression(expression)",
          "summary": ""
        },
        {
          "name": "projectContentFreeToolFailure",
          "kind": "function",
          "signature": "async projectContentFreeToolFailure(error, { toolName = 'unknown', errorCode = null, } = {})",
          "summary": "Project an arbitrary handler failure without retaining its message. Handler messages are untrusted and may quote complete tool inputs, credentials, or provider content. The digest preserves deterministic incident correlation."
        },
        {
          "name": "TOOL_ARGUMENT_HASH_OPTIONS",
          "kind": "constant",
          "signature": "TOOL_ARGUMENT_HASH_OPTIONS",
          "summary": ""
        },
        {
          "name": "TOOL_HISTORY_MAX_ENTRIES",
          "kind": "constant",
          "signature": "TOOL_HISTORY_MAX_ENTRIES",
          "summary": ""
        },
        {
          "name": "TOOL_HISTORY_MAX_BYTES",
          "kind": "constant",
          "signature": "TOOL_HISTORY_MAX_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/TrayManager",
      "path": "webgpu-os/reference/kernel/TrayManager.md",
      "source": "webgpu-os/kernel/TrayManager.js",
      "import": "/webgpu-os/kernel/TrayManager.js",
      "sourceHash": "9ae7575d922475dac5c4ad6491f563db97365afce0fd106ad25e13100ae011ca",
      "summary": "TrayManager.js — system notification area (status icons). Background/utility apps register a small status icon next to the clock, the same model used by Windows' notification area, macOS' menu-bar extras, and the FreeDesktop StatusNotifier spec. Apps register via syscalls.ui.registerTrayIcon(spec) and the StatusTray renders them, with an overflow popup for icons beyond the visible limit. Icon spec: { id, appId?, icon, tooltip?, onClick?, menu?, priority? } - icon:    emoji/glyph string (or short text) - onClick: fn() invoked on left click (shared-realm apps only) - menu:    [{ label, onClick }] optional right-click menu - priority: higher sorts first (default 0)",
      "exports": [
        {
          "name": "TrayManager",
          "kind": "class",
          "signature": "class TrayManager",
          "summary": "TrayManager.js — system notification area (status icons). Background/utility apps register a small status icon next to the clock, the same model used by Windows' notification area, macOS' menu-bar extras, and the FreeDesktop StatusNotifier spec. Apps register via syscalls.ui.registerTrayIcon(spec) and the StatusTray renders them, with an overflow popup for icons beyond the visible limit. Icon spec: { id, appId?, icon, tooltip?, onClick?, menu?, priority? } - icon:    emoji/glyph string (or short text) - onClick: fn() invoked on left click (shared-realm apps only) - menu:    [{ label, onClick }] optional right-click menu - priority: higher sorts first (default 0)"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/TrustStore",
      "path": "webgpu-os/reference/kernel/TrustStore.md",
      "source": "webgpu-os/kernel/TrustStore.js",
      "import": "/webgpu-os/kernel/TrustStore.js",
      "sourceHash": "4f6a1b21b64f78714a73fa895394201b0e8413875aa4ce96f03c2489641dd97c",
      "summary": "TrustStore.js — ring-0 trust anchors + publisher pinning for the package system. Two tiers of trust: 1. ROOTS  — public keys baked into the OS bundle (kernel/trust/roots.json). A publisher certificate that chains to a root is fully trusted. 2. PINS   — publishers the user accepted on first install (trust-on-first-use). Persisted in IndexedDB (kv store, key `trust.pin.<fingerprint>`). Anti-takeover: a pinned publisher is bound to a specific key fingerprint. If a later package for the same publisher presents a *different* fingerprint, the caller (PackageManager.verifyAndAuthorize) treats it as an identity change and blocks pending explicit re-consent — defending event-stream/durabletask-style account takeovers. SECURITY NOTE: signatures prove *who* built a package, not that the build was clean. Trust here is combined with provenance + static scan + egress controls.",
      "exports": [
        {
          "name": "TrustStore",
          "kind": "class",
          "signature": "class TrustStore",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/UiSounds",
      "path": "webgpu-os/reference/kernel/UiSounds.md",
      "source": "webgpu-os/kernel/UiSounds.js",
      "import": "/webgpu-os/kernel/UiSounds.js",
      "sourceHash": "a1eb998e98b83f7733585114aca4127903234ce6dc3ae300c3b6ae0ad2995821",
      "summary": "UiSounds.js — OS-wide UI sound engine (kernel service). Procedurally synthesizes short UI sounds (click, open, close, notify, error, …) through the OS AudioDriver's shared context, so every cue is mixed and volume- controlled centrally (it appears in the Sound mixer as a \"System sounds\" session). Sounds are auto-triggered from OS-wide kernel events (panel open/close/minimize/ restore, notifications, theme toggle) and from a global click listener, so the whole desktop gets feedback without each app wiring anything. Apps can also play a cue explicitly via syscalls.ui.sound('click'). ── Future customization ────────────────────────────────────────────────────────── Every cue is a named entry in a registry. A mod / sound pack can override or add cues at runtime: kernel.uiSounds.register('click', (ctx, out, t0) => { ... custom synth ... }); kernel.uiSounds.register('coin', (ctx, out, t0) => { ... new cue ... }); Per-cue enable flags, global enable, and volume persist in localStorage, ready for a settings UI (the Sound app exposes the global toggle + volume today).",
      "exports": [
        {
          "name": "UiSounds",
          "kind": "class",
          "signature": "class UiSounds",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/VRAMTracker",
      "path": "webgpu-os/reference/kernel/VRAMTracker.md",
      "source": "webgpu-os/kernel/VRAMTracker.js",
      "import": "/webgpu-os/kernel/VRAMTracker.js",
      "sourceHash": "0ef7f62132d39dc7ac8374e83f6e819f89e23a317e4ebeda838aee40c84cf3a4",
      "summary": "VRAMTracker.js — per-app GPU memory budget tracking. WebGPU does not expose actual VRAM usage. We track *requested* allocations: Surfaces  — estimated from canvas dimensions × bytes-per-pixel Buffers   — exact size passed to createBuffer (when routed via syscalls) Textures  — estimated from width × height × format bytes-per-pixel Admission is checked before allocations. Canvas surfaces receive a small, bounded reserve so buffer/texture workloads cannot consume the final UI capacity and make an app impossible to close or recover. Phase 5+ upgrade path: hook device.createBuffer/createTexture via a GPUDevice proxy to track all allocations, not just syscall-routed ones.",
      "exports": [
        {
          "name": "VRAMTracker",
          "kind": "class",
          "signature": "class VRAMTracker",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/VirtualFS",
      "path": "webgpu-os/reference/kernel/VirtualFS.md",
      "source": "webgpu-os/kernel/VirtualFS.js",
      "import": "/webgpu-os/kernel/VirtualFS.js",
      "sourceHash": "c7ee3f68da55aef3dd5e2fc429698fa16640adb5ddfef743c54f1d07664ae467",
      "summary": "VirtualFS.js — path-tree virtual filesystem. Features: POSIX-like paths   — /user/notepad/file.txt Directories        — implicit from file paths; explicit mkdir supported Persistence        — OPFS-backed via StorageManager (falls back to localStorage) Events             — on('write'|'delete'|'*', cb) for live watchers (e.g. Notepad tabs) JSON helpers       — readJSON / writeJSON All public methods are synchronous (reads from in-memory cache). Writes flush to OPFS asynchronously in the background. Call `await virtualFS.hydrate()` once at OS boot to preload OPFS → memory.",
      "exports": [
        {
          "name": "VirtualFS",
          "kind": "class",
          "signature": "class VirtualFS",
          "summary": ""
        },
        {
          "name": "virtualFS",
          "kind": "constant",
          "signature": "virtualFS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/agent/JavaScriptProjectFacts",
      "path": "webgpu-os/reference/kernel/agent/JavaScriptProjectFacts.md",
      "source": "webgpu-os/kernel/agent/JavaScriptProjectFacts.js",
      "import": "/webgpu-os/kernel/agent/JavaScriptProjectFacts.js",
      "sourceHash": "38fb71e87ad0106cfdc4d0964f39a0fa991dab901267b967bb40be55115548fb",
      "summary": "Bounded lexical facts shared by project indexing and source verification. This module deliberately does not claim to parse JavaScript, TypeScript, or JSX. It identifies inspectable declarations and import specifiers while keeping lexical evidence distinct from parser evidence.",
      "exports": [
        {
          "name": "javascriptLanguageForPath",
          "kind": "function",
          "signature": "javascriptLanguageForPath(path = '')",
          "summary": ""
        },
        {
          "name": "inspectJavaScriptProjectFacts",
          "kind": "function",
          "signature": "inspectJavaScriptProjectFacts({ path = '', content = '', maxTokens = MAX_TOKENS, maxSymbols = MAX_SYMBOLS, maxImports = MAX_IMPORTS, } = {})",
          "summary": ""
        },
        {
          "name": "resolveJavaScriptImport",
          "kind": "function",
          "signature": "resolveJavaScriptImport({ sourcePath = '', specifier = '', knownFiles = null } = {})",
          "summary": ""
        },
        {
          "name": "dependencyName",
          "kind": "function",
          "signature": "dependencyName(specifier = '')",
          "summary": ""
        },
        {
          "name": "JAVASCRIPT_PROJECT_FACTS_FORMAT",
          "kind": "constant",
          "signature": "JAVASCRIPT_PROJECT_FACTS_FORMAT",
          "summary": "Bounded lexical facts shared by project indexing and source verification. This module deliberately does not claim to parse JavaScript, TypeScript, or JSX. It identifies inspectable declarations and import specifiers while keeping lexical evidence distinct from parser evidence."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/agent/MountedProjectIntelligenceIndex",
      "path": "webgpu-os/reference/kernel/agent/MountedProjectIntelligenceIndex.md",
      "source": "webgpu-os/kernel/agent/MountedProjectIntelligenceIndex.js",
      "import": "/webgpu-os/kernel/agent/MountedProjectIntelligenceIndex.js",
      "sourceHash": "dd6135481af41fba3618c8df6eebc58afc7bf00ec05e7cff5f4eb2d050d15fad",
      "summary": "Deterministic, authority-free project intelligence for a mounted workspace. The builder can see a workspace only through AI Echo's existing bounded storage.list and storage.read tool contracts. It returns source-backed facts separately from advisory suggestions and never exposes complete source text.",
      "exports": [
        {
          "name": "buildMountedProjectIntelligence",
          "kind": "function",
          "signature": "async buildMountedProjectIntelligence({ invokeTool, rootPath, workspaceRevision = '', maxEntries = DEFAULT_MAX_ENTRIES, maxDepth = DEFAULT_MAX_DEPTH, maxReadFiles = DEFAULT_MAX_READ_FILES, maxReadChars = DEFAULT_MAX_READ_CHARS, maxTotalReadChars = DEFAULT_MAX_TOTAL_READ_CHARS, } = {})",
          "summary": ""
        },
        {
          "name": "MOUNTED_PROJECT_INTELLIGENCE_FORMAT",
          "kind": "constant",
          "signature": "MOUNTED_PROJECT_INTELLIGENCE_FORMAT",
          "summary": ""
        },
        {
          "name": "AGENT_STORAGE_LIST_TOOL",
          "kind": "constant",
          "signature": "AGENT_STORAGE_LIST_TOOL",
          "summary": ""
        },
        {
          "name": "AGENT_STORAGE_READ_TOOL",
          "kind": "constant",
          "signature": "AGENT_STORAGE_READ_TOOL",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/AIDispatchScheduler",
      "path": "webgpu-os/reference/kernel/ai-hub/AIDispatchScheduler.md",
      "source": "webgpu-os/kernel/ai-hub/AIDispatchScheduler.js",
      "import": "/webgpu-os/kernel/ai-hub/AIDispatchScheduler.js",
      "sourceHash": "0af1053b8db32a9ee7c2eb4745b3c313134c38c5da903b33d70ea175b9891302",
      "summary": "AIDispatchScheduler.js — bounded, in-memory admission for live model calls. Prompts stay inside the caller's run closure and are never serialized or persisted by this scheduler. Owners are serviced round-robin while each owner's jobs retain FIFO start order. Provider and exact-route limits keep a burst of Navi work from crushing one remote endpoint.",
      "exports": [
        {
          "name": "AIDispatchError",
          "kind": "class",
          "signature": "class AIDispatchError extends Error",
          "summary": ""
        },
        {
          "name": "AIDispatchScheduler",
          "kind": "class",
          "signature": "class AIDispatchScheduler",
          "summary": ""
        },
        {
          "name": "AI_DISPATCH_DEFAULTS",
          "kind": "constant",
          "signature": "AI_DISPATCH_DEFAULTS",
          "summary": "AIDispatchScheduler.js — bounded, in-memory admission for live model calls. Prompts stay inside the caller's run closure and are never serialized or persisted by this scheduler. Owners are serviced round-robin while each owner's jobs retain FIFO start order. Provider and exact-route limits keep a burst of Navi work from crushing one remote endpoint."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/AIService",
      "path": "webgpu-os/reference/kernel/ai-hub/AIService.md",
      "source": "webgpu-os/kernel/ai-hub/AIService.js",
      "import": "/webgpu-os/kernel/ai-hub/AIService.js",
      "sourceHash": "8a956bcc0c2a49c6d70ee1011ad52b4af38b7d6e5cf9ceb7f80f790778480c3f",
      "summary": "AIService.js — the OS.ai() entrypoint (Phase 1 skeleton). Remote-provider based through an adaptive credential boundary. It prefers the isolated AI Bridge extension and falls back on phones to browser-direct OpenRouter or an approved user-controlled HTTPS proxy. Fully separate from `syscalls.ai.*` (the local on-device GGUF runtime). Exposed at kernel.aiHub and wrapped by syscalls.aiHub (capability-gated).",
      "exports": [
        {
          "name": "AIHub",
          "kind": "class",
          "signature": "class AIHub",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/AdaptiveProviderBridge",
      "path": "webgpu-os/reference/kernel/ai-hub/AdaptiveProviderBridge.md",
      "source": "webgpu-os/kernel/ai-hub/AdaptiveProviderBridge.js",
      "import": "/webgpu-os/kernel/ai-hub/AdaptiveProviderBridge.js",
      "sourceHash": "c9470aec531a8748dbadf1b2c5bfa75d137c2f19dc3b1aa01b640c29a58b6aee",
      "summary": "Chooses one credential/transport boundary per operation. The extension is always preferred because its origin isolates secrets from the OS page. Browser-direct is selected only when the extension remains unavailable after a bridge reprobe. Provider requests are never replayed across the two backends, preventing duplicate billing and duplicate tool/model effects.",
      "exports": [
        {
          "name": "AdaptiveProviderBridge",
          "kind": "class",
          "signature": "class AdaptiveProviderBridge",
          "summary": "Chooses one credential/transport boundary per operation. The extension is always preferred because its origin isolates secrets from the OS page. Browser-direct is selected only when the extension remains unavailable after a bridge reprobe. Provider requests are never replayed across the two backends, preventing duplicate billing and duplicate tool/model effects."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/DirectProviderBridge",
      "path": "webgpu-os/reference/kernel/ai-hub/DirectProviderBridge.md",
      "source": "webgpu-os/kernel/ai-hub/DirectProviderBridge.js",
      "import": "/webgpu-os/kernel/ai-hub/DirectProviderBridge.js",
      "sourceHash": "505af2c9b70ba79cc430bf22218496fa3d283f40cc892d0abb03eb28b7637261",
      "summary": "Browser-direct AI transport for phones and other browsers without extension support. The allowlist is deliberately narrow: - OpenRouter, whose official OAuth/PKCE flow supports browser clients. - A user-approved HTTPS OpenAI-compatible proxy controlled by the user. OpenAI, Anthropic, and other long-lived provider keys stay extension/server only. Their presence in the shared provider catalog does not grant this transport permission to call them.",
      "exports": [
        {
          "name": "DirectProviderBridge",
          "kind": "class",
          "signature": "class DirectProviderBridge",
          "summary": ""
        },
        {
          "name": "readCustomEndpointAllowlist",
          "kind": "function",
          "signature": "readCustomEndpointAllowlist(storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "writeCustomEndpointAllowlist",
          "kind": "function",
          "signature": "writeCustomEndpointAllowlist(endpoints, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "readDirectModelCache",
          "kind": "function",
          "signature": "readDirectModelCache(storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "writeDirectModelCache",
          "kind": "function",
          "signature": "writeDirectModelCache(records, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "CUSTOM_ENDPOINTS_KEY",
          "kind": "constant",
          "signature": "CUSTOM_ENDPOINTS_KEY",
          "summary": ""
        },
        {
          "name": "CUSTOM_ENDPOINTS_LEGACY_KEY",
          "kind": "constant",
          "signature": "CUSTOM_ENDPOINTS_LEGACY_KEY",
          "summary": ""
        },
        {
          "name": "CUSTOM_ENDPOINTS_FORMAT",
          "kind": "constant",
          "signature": "CUSTOM_ENDPOINTS_FORMAT",
          "summary": ""
        },
        {
          "name": "MODEL_CACHE_KEY",
          "kind": "constant",
          "signature": "MODEL_CACHE_KEY",
          "summary": ""
        },
        {
          "name": "MODEL_CACHE_FORMAT",
          "kind": "constant",
          "signature": "MODEL_CACHE_FORMAT",
          "summary": ""
        },
        {
          "name": "AI_DIRECT_PREFERENCE_VERSION",
          "kind": "constant",
          "signature": "AI_DIRECT_PREFERENCE_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/ExtensionBridge",
      "path": "webgpu-os/reference/kernel/ai-hub/ExtensionBridge.md",
      "source": "webgpu-os/kernel/ai-hub/ExtensionBridge.js",
      "import": "/webgpu-os/kernel/ai-hub/ExtensionBridge.js",
      "sourceHash": "e52cd757fc8260971ea444ee0f5e2baf7ac339d097285726fe5e62430b9dba8c",
      "summary": "ExtensionBridge.js — the AI Hub's preferred isolated path to a remote provider. Talks to WebGPU OS Companion via kernel.browserBridge (relay.js's message contract). Never called with a page-supplied header; built-in routes accept only provider/model/messages/ params while custom endpoints remain explicitly approved by the user.",
      "exports": [
        {
          "name": "ExtensionBridge",
          "kind": "class",
          "signature": "class ExtensionBridge",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/LocalCredentialVault",
      "path": "webgpu-os/reference/kernel/ai-hub/LocalCredentialVault.md",
      "source": "webgpu-os/kernel/ai-hub/LocalCredentialVault.js",
      "import": "/webgpu-os/kernel/ai-hub/LocalCredentialVault.js",
      "sourceHash": "228dba9adbd835afa5ee3324712f1798133f30651975e09f0664eeaadae7092f",
      "summary": "Same-origin credential vault for browsers that cannot install extensions. Session credentials remain ephemeral. Opt-in persistent credentials use a non-extractable IndexedDB CryptoKey and a versioned, encrypted readback. V2 commits the Files-visible readback first and the matching IndexedDB slot second. Readers compare monotonically increasing generations and repair an interrupted second step. V1 envelopes/readbacks remain read-only inputs.",
      "exports": [
        {
          "name": "LocalCredentialContractError",
          "kind": "class",
          "signature": "class LocalCredentialContractError extends Error",
          "summary": ""
        },
        {
          "name": "LocalCredentialVault",
          "kind": "class",
          "signature": "class LocalCredentialVault",
          "summary": ""
        },
        {
          "name": "LOCAL_CREDENTIAL_CONTRACTS",
          "kind": "constant",
          "signature": "LOCAL_CREDENTIAL_CONTRACTS",
          "summary": ""
        },
        {
          "name": "LOCAL_CREDENTIAL_READBACK_PATH",
          "kind": "constant",
          "signature": "LOCAL_CREDENTIAL_READBACK_PATH",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/LocalRuntimeProvider",
      "path": "webgpu-os/reference/kernel/ai-hub/LocalRuntimeProvider.md",
      "source": "webgpu-os/kernel/ai-hub/LocalRuntimeProvider.js",
      "import": "/webgpu-os/kernel/ai-hub/LocalRuntimeProvider.js",
      "sourceHash": "8c0e901cb4f7939db8b874d29dbdc6435a61fdcbd346e736f0d507f71470a18f",
      "summary": "AI Hub adapter for the kernel-owned, on-device GGUF runtime. Installed models and generation defaults stay authoritative in LLMDriver; this class only translates that state into the provider-neutral AI Hub contract.",
      "exports": [
        {
          "name": "LocalRuntimeProvider",
          "kind": "class",
          "signature": "class LocalRuntimeProvider",
          "summary": ""
        },
        {
          "name": "automaticRoutingReadiness",
          "kind": "function",
          "signature": "automaticRoutingReadiness(model, runtimeStatus = {})",
          "summary": "Automatic Navi routing is stricter than catalog presence. A saved handle can identify a model without proving that this tab can read it, and an initialized driver can exist without a usable WebGPU device. Manual LLM Runtime flows may still ask the operator to reconnect a handle; unattended routing may not."
        },
        {
          "name": "LOCAL_RUNTIME_PROVIDER_ID",
          "kind": "constant",
          "signature": "LOCAL_RUNTIME_PROVIDER_ID",
          "summary": "AI Hub adapter for the kernel-owned, on-device GGUF runtime. Installed models and generation defaults stay authoritative in LLMDriver; this class only translates that state into the provider-neutral AI Hub contract."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/ModelCapabilityRegistry",
      "path": "webgpu-os/reference/kernel/ai-hub/ModelCapabilityRegistry.md",
      "source": "webgpu-os/kernel/ai-hub/ModelCapabilityRegistry.js",
      "import": "/webgpu-os/kernel/ai-hub/ModelCapabilityRegistry.js",
      "sourceHash": "f2576f10dcbd81140313a92307a76e4db92c821b20ae00c9ee558a7a95d109f7",
      "summary": "ModelCapabilityRegistry.js — maps an abstract `modelTier` to a concrete { provider, model } pair for the OS AI Hub. Apps ask for a tier ('fast', 'balanced', 'reasoning'), not a specific vendor model, so the default can change without touching every app's request payload.",
      "exports": [
        {
          "name": "ModelCapabilityRegistry",
          "kind": "class",
          "signature": "class ModelCapabilityRegistry",
          "summary": ""
        },
        {
          "name": "readModelCapabilityRouting",
          "kind": "function",
          "signature": "readModelCapabilityRouting(storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "writeModelCapabilityRouting",
          "kind": "function",
          "signature": "writeModelCapabilityRouting(tiers, storage = globalThis.localStorage)",
          "summary": ""
        },
        {
          "name": "MODEL_CAPABILITY_STORAGE_KEY",
          "kind": "constant",
          "signature": "MODEL_CAPABILITY_STORAGE_KEY",
          "summary": ""
        },
        {
          "name": "MODEL_CAPABILITY_LEGACY_STORAGE_KEY",
          "kind": "constant",
          "signature": "MODEL_CAPABILITY_LEGACY_STORAGE_KEY",
          "summary": ""
        },
        {
          "name": "MODEL_CAPABILITY_STORAGE_FORMAT",
          "kind": "constant",
          "signature": "MODEL_CAPABILITY_STORAGE_FORMAT",
          "summary": ""
        },
        {
          "name": "MODEL_CAPABILITY_STORAGE_VERSION",
          "kind": "constant",
          "signature": "MODEL_CAPABILITY_STORAGE_VERSION",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/ProviderRouter",
      "path": "webgpu-os/reference/kernel/ai-hub/ProviderRouter.md",
      "source": "webgpu-os/kernel/ai-hub/ProviderRouter.js",
      "import": "/webgpu-os/kernel/ai-hub/ProviderRouter.js",
      "sourceHash": "81af30ca33aed9ff56a947fb6f1fdc08ba4ea969c7c7a9ab21bcb1ff935d321f",
      "summary": "ProviderRouter.js — picks the concrete { provider, model } for a normalized OS.ai() request: an explicit provider/model on the request always wins, otherwise it resolves the request's modelTier via ModelCapabilityRegistry.",
      "exports": [
        {
          "name": "ProviderRouter",
          "kind": "class",
          "signature": "class ProviderRouter",
          "summary": "ProviderRouter.js — picks the concrete { provider, model } for a normalized OS.ai() request: an explicit provider/model on the request always wins, otherwise it resolves the request's modelTier via ModelCapabilityRegistry."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/RequestNormalizer",
      "path": "webgpu-os/reference/kernel/ai-hub/RequestNormalizer.md",
      "source": "webgpu-os/kernel/ai-hub/RequestNormalizer.js",
      "import": "/webgpu-os/kernel/ai-hub/RequestNormalizer.js",
      "sourceHash": "33f8ac4aeda6c4f3df06379f6098e51498e05c3808d7d775c911f038255f506a",
      "summary": "RequestNormalizer.js — validates and normalizes an OS.ai(request) payload into the canonical shape the rest of the AI Hub pipeline consumes.",
      "exports": [
        {
          "name": "RequestNormalizer",
          "kind": "class",
          "signature": "class RequestNormalizer",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/ResultBroker",
      "path": "webgpu-os/reference/kernel/ai-hub/ResultBroker.md",
      "source": "webgpu-os/kernel/ai-hub/ResultBroker.js",
      "import": "/webgpu-os/kernel/ai-hub/ResultBroker.js",
      "sourceHash": "d8c3106ebff654f1c3fd7c2afab37c7499be7bd8bf336fce751432e799fb70a1",
      "summary": "ResultBroker.js — wraps a raw provider chat result into the OS.ai() response envelope and stamps it with CSE provenance (engine/state). Model output is always MODEL_PREDICTED/untrusted-for-authority — it becomes canonical only if/when Phase 9's finalizer + CommitCoordinator commit it.",
      "exports": [
        {
          "name": "ResultBroker",
          "kind": "class",
          "signature": "class ResultBroker",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ai-hub/SmartModelPolicy",
      "path": "webgpu-os/reference/kernel/ai-hub/SmartModelPolicy.md",
      "source": "webgpu-os/kernel/ai-hub/SmartModelPolicy.js",
      "import": "/webgpu-os/kernel/ai-hub/SmartModelPolicy.js",
      "sourceHash": "3c031eedec366c56f918b942c59fb81a9dd64f03abdebea9efddd641bf2d00fa",
      "summary": "SmartModelPolicy.js - deterministic policy and catalog ranking for AI Hub. This module performs no provider calls, stores no credentials, and grants no authority. It projects provider catalog records into an inspectable ranking that Navi cognition can compile into its existing signed route contract.",
      "exports": [
        {
          "name": "classifySmartModelRouterAlias",
          "kind": "function",
          "signature": "classifySmartModelRouterAlias(provider, model)",
          "summary": "Classify provider-side router aliases separately from concrete model IDs. Dynamic aliases may resolve to a different model on every request, so their catalog capabilities cannot safely authorize strict or effectful tasks."
        },
        {
          "name": "defaultSmartModelPolicy",
          "kind": "function",
          "signature": "defaultSmartModelPolicy()",
          "summary": "Return a detached, immutable basic policy suitable for persisted settings."
        },
        {
          "name": "normalizeSmartModelPolicy",
          "kind": "function",
          "signature": "normalizeSmartModelPolicy(raw = null)",
          "summary": "Normalize persisted policy. Missing fields migrate to v1 defaults, while an unknown field or version is rejected so misspelled safety controls never silently disappear."
        },
        {
          "name": "inferSmartModelWorkloadProfile",
          "kind": "function",
          "signature": "inferSmartModelWorkloadProfile(raw = {})",
          "summary": "Infer preference-only workload affinities from one provider catalog row. The result improves ranking and model-picker explanations. It is never an authorization claim: privacy, modality, tool transport, context, endpoint health, and budget remain separate hard eligibility checks."
        },
        {
          "name": "classifySmartModelTask",
          "kind": "function",
          "signature": "classifySmartModelTask(raw = {})",
          "summary": "Classify a task without consulting a model. Explicit purpose wins; otherwise bounded, ordered rules use declared modality/privacy/background state before keyword signals. Raw user text is never copied into the returned evidence."
        },
        {
          "name": "normalizeSmartModelCandidate",
          "kind": "function",
          "signature": "normalizeSmartModelCandidate(raw)",
          "summary": "Project one provider-catalog record into the policy's provider-neutral form."
        },
        {
          "name": "estimateSmartModelCostMicrounits",
          "kind": "function",
          "signature": "estimateSmartModelCostMicrounits(candidate, estimatedTokens)",
          "summary": "Conservative projected cost for a normalized candidate and token estimate."
        },
        {
          "name": "rankSmartModelPool",
          "kind": "function",
          "signature": "rankSmartModelPool({ policy: rawPolicy = null, models = [], task = {}, usage = null } = {})",
          "summary": "Rank a catalog and return a deterministic, inspectable decision. The caller still owns provider authentication, canonical resource reservations, and final execution authority."
        },
        {
          "name": "selectSmartModelPool",
          "kind": "function",
          "signature": "selectSmartModelPool(options = {})",
          "summary": "Semantic alias for callers that consume the selected route and fallbacks."
        },
        {
          "name": "SMART_MODEL_POLICY_FORMAT",
          "kind": "constant",
          "signature": "SMART_MODEL_POLICY_FORMAT",
          "summary": "SmartModelPolicy.js - deterministic policy and catalog ranking for AI Hub. This module performs no provider calls, stores no credentials, and grants no authority. It projects provider catalog records into an inspectable ranking that Navi cognition can compile into its existing signed route contract."
        },
        {
          "name": "SMART_MODEL_TASK_CLASSIFICATION_FORMAT",
          "kind": "constant",
          "signature": "SMART_MODEL_TASK_CLASSIFICATION_FORMAT",
          "summary": ""
        },
        {
          "name": "SMART_MODEL_DECISION_FORMAT",
          "kind": "constant",
          "signature": "SMART_MODEL_DECISION_FORMAT",
          "summary": ""
        },
        {
          "name": "SMART_MODEL_PROFILES",
          "kind": "constant",
          "signature": "SMART_MODEL_PROFILES",
          "summary": ""
        },
        {
          "name": "SMART_MODEL_ACCESS_MODES",
          "kind": "constant",
          "signature": "SMART_MODEL_ACCESS_MODES",
          "summary": ""
        },
        {
          "name": "SMART_MODEL_ACCESS_CLASSES",
          "kind": "constant",
          "signature": "SMART_MODEL_ACCESS_CLASSES",
          "summary": ""
        },
        {
          "name": "SMART_MODEL_ROUTER_KINDS",
          "kind": "constant",
          "signature": "SMART_MODEL_ROUTER_KINDS",
          "summary": ""
        },
        {
          "name": "SMART_MODEL_PURPOSES",
          "kind": "constant",
          "signature": "SMART_MODEL_PURPOSES",
          "summary": ""
        },
        {
          "name": "SMART_MODEL_WORKLOAD_ROLES",
          "kind": "constant",
          "signature": "SMART_MODEL_WORKLOAD_ROLES",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/attestation/CapabilityAttestation",
      "path": "webgpu-os/reference/kernel/attestation/CapabilityAttestation.md",
      "source": "webgpu-os/kernel/attestation/CapabilityAttestation.js",
      "import": "/webgpu-os/kernel/attestation/CapabilityAttestation.js",
      "sourceHash": "243d1759a4b385b46d7c59d0f236dd4eea9375e17384161be66051337e92220d",
      "summary": "CapabilityAttestation.js — gates capability minting on descriptor attestation. Wraps engine/state's CapabilityRegistry/Capability.js (via the Phase 4 CapabilityNegotiator, kernel.protocol.capabilities — no parallel capability logic) and layers DescriptorHashStore on top so a capability is only minted for a tool whose descriptor hash matches the approved hash. The always-on Navi runtime requires explicit package or operator approval for every first-seen descriptor.",
      "exports": [
        {
          "name": "CapabilityAttestation",
          "kind": "class",
          "signature": "class CapabilityAttestation",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/attestation/DescriptorHashStore",
      "path": "webgpu-os/reference/kernel/attestation/DescriptorHashStore.md",
      "source": "webgpu-os/kernel/attestation/DescriptorHashStore.js",
      "import": "/webgpu-os/kernel/attestation/DescriptorHashStore.js",
      "sourceHash": "0e6178d444593cfc84b101deeb348a77a68118b4e87bc961b74b1ae1ca99b9d9",
      "summary": "DescriptorHashStore.js — persists approved tool/resource/prompt descriptor hashes IDB-side, so a \"rug pull\" (descriptor silently changing after the user approved it) is detected across sessions, not just within one runtime (that in-memory check is webgpu-os/kernel/tools/MetadataRugPullDetector.js). Hashing reuses the same SHA-256 primitive as packages/PackageVerifier.js (contentHashHex from engine/core/math/ChecksumMath.js) rather than a new hashing routine. Storage reuses the generic 'kv' IndexedDB store (see storage/IndexedDBDriver.js) instead of adding a new object store/migration.",
      "exports": [
        {
          "name": "DescriptorHashStore",
          "kind": "class",
          "signature": "class DescriptorHashStore",
          "summary": ""
        },
        {
          "name": "descriptorMeaningSnapshot",
          "kind": "function",
          "signature": "descriptorMeaningSnapshot(descriptor)",
          "summary": "Complete approval identity for a callable descriptor. This intentionally includes authority, mutability, effect, provenance, timeout, and executable source fields so retaining the same JSON input schema cannot conceal a more dangerous implementation after approval."
        },
        {
          "name": "portableDescriptorMeaningSnapshot",
          "kind": "function",
          "signature": "portableDescriptorMeaningSnapshot(descriptor)",
          "summary": "Package-portable descriptor identity for signed Faculty manifests only."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/attestation/DescriptorSanitizer",
      "path": "webgpu-os/reference/kernel/attestation/DescriptorSanitizer.md",
      "source": "webgpu-os/kernel/attestation/DescriptorSanitizer.js",
      "import": "/webgpu-os/kernel/attestation/DescriptorSanitizer.js",
      "sourceHash": "dc7ff7de2f2d9d5e6a488e9b990a7377c1a9859204e4810bb66c03a41f3416ef",
      "summary": "DescriptorSanitizer.js — static scanner for tool/resource/prompt descriptors: flags prompt-injection strings in description/schema text, reuses HiddenParameterDetector (Phase 3) for undeclared/suspicious parameters instead of a parallel implementation, and flags a mismatch between a tool's self-declared risk and its AffordanceRegistry-declared risk.",
      "exports": [
        {
          "name": "DescriptorSanitizer",
          "kind": "class",
          "signature": "class DescriptorSanitizer",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/attestation/DryRunManager",
      "path": "webgpu-os/reference/kernel/attestation/DryRunManager.md",
      "source": "webgpu-os/kernel/attestation/DryRunManager.js",
      "import": "/webgpu-os/kernel/attestation/DryRunManager.js",
      "sourceHash": "286c32fd609e6dca79350c0ca16350937e3dcc323166f9d839266d2a1a8d4123",
      "summary": "DryRunManager.js — thin wrapper over engine/state/worldmodel/PredictionSandbox.js (rollout/plan, confidence-decay) — no new dry-run engine. Lets a tool call's declared predictedEffects (AffordanceRegistry, Phase 3) be previewed against a state snapshot WITHOUT ever touching canonical state.",
      "exports": [
        {
          "name": "DryRunManager",
          "kind": "class",
          "signature": "class DryRunManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/attestation/ParameterPreviewer",
      "path": "webgpu-os/reference/kernel/attestation/ParameterPreviewer.md",
      "source": "webgpu-os/kernel/attestation/ParameterPreviewer.js",
      "import": "/webgpu-os/kernel/attestation/ParameterPreviewer.js",
      "sourceHash": "853ae05ab39db953f7c0706bc39f106b655c81b912d4db3161c037c68729bdd4",
      "summary": "ParameterPreviewer.js — resolves a tool-call args object into a human-safe preview: sensitive-looking values (key/secret/token/password/ credential) are masked and long strings are truncated, so an approval UI (Phase 8's ApprovalCard) can show \"what will actually be sent\" without ever rendering raw secrets to the screen.",
      "exports": [
        {
          "name": "ParameterPreviewer",
          "kind": "class",
          "signature": "class ParameterPreviewer",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/drivers/LLMDriver",
      "path": "webgpu-os/reference/kernel/drivers/LLMDriver.md",
      "source": "webgpu-os/kernel/drivers/LLMDriver.js",
      "import": "/webgpu-os/kernel/drivers/LLMDriver.js",
      "sourceHash": "704f17ae723bc1d478883f6676be29099d2c6c70764d1026438e0da70fce1e46",
      "summary": "",
      "exports": [
        {
          "name": "LLMDriver",
          "kind": "class",
          "signature": "class LLMDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/drivers/WebGPUAmbientDriver",
      "path": "webgpu-os/reference/kernel/drivers/WebGPUAmbientDriver.md",
      "source": "webgpu-os/kernel/drivers/WebGPUAmbientDriver.js",
      "import": "/webgpu-os/kernel/drivers/WebGPUAmbientDriver.js",
      "sourceHash": "8d5dd74134bcd9c7fe26704dcf13caa726b5c11d4ded781273aef25b6a3f0837",
      "summary": "Factory: returns an AmbientEngine driver object { apply, destroy }. Internal simulation state is held in a closure and fully reset between mounts.",
      "exports": [
        {
          "name": "createWebGPUParticleDriver",
          "kind": "function",
          "signature": "createWebGPUParticleDriver()",
          "summary": "Factory: returns an AmbientEngine driver object { apply, destroy }. Internal simulation state is held in a closure and fully reset between mounts."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/ActiveTurnCoordinator",
      "path": "webgpu-os/reference/kernel/execution/ActiveTurnCoordinator.md",
      "source": "webgpu-os/kernel/execution/ActiveTurnCoordinator.js",
      "import": "/webgpu-os/kernel/execution/ActiveTurnCoordinator.js",
      "sourceHash": "cd502dc730750400680ecbf6c5ac0c1f9734a1a866a370ec98c55dd256ed99fc",
      "summary": "ActiveTurnCoordinator.js — bounded, provider-neutral user steering for one active AI executor request. It owns ordering and deduplication only; kernel policy, tool approval, persistence, and model dispatch remain elsewhere.",
      "exports": [
        {
          "name": "ActiveTurnCoordinator",
          "kind": "class",
          "signature": "class ActiveTurnCoordinator",
          "summary": ""
        },
        {
          "name": "classifySteeringMessage",
          "kind": "function",
          "signature": "classifySteeringMessage(value)",
          "summary": ""
        },
        {
          "name": "classifySteeringImpact",
          "kind": "function",
          "signature": "classifySteeringImpact(kind, value = '')",
          "summary": "Describe which cached work a steering message invalidates. This is a data decision only; it never widens authority or silently approves a new target."
        },
        {
          "name": "classifySteeringDelivery",
          "kind": "function",
          "signature": "classifySteeringDelivery(kind, value = '', { progressEstimate = null } = {})",
          "summary": "Select when one operator instruction should affect an active task. This is deliberately a score of the instruction/task relationship, never a score of the person. It is deterministic, local, content-free in diagnostics, and grants no authority. The task Storylet consumes the resulting delivery mode at its next transition."
        },
        {
          "name": "createTaskCheckpointEnvelope",
          "kind": "function",
          "signature": "createTaskCheckpointEnvelope(raw = {})",
          "summary": ""
        },
        {
          "name": "ACTIVE_TURN_LIMITS",
          "kind": "constant",
          "signature": "ACTIVE_TURN_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/AuditLog",
      "path": "webgpu-os/reference/kernel/execution/AuditLog.md",
      "source": "webgpu-os/kernel/execution/AuditLog.js",
      "import": "/webgpu-os/kernel/execution/AuditLog.js",
      "sourceHash": "60e652ca9658cff867ae041cf2d0d3d2a317a6eb3bcfda8e92fef360a71b3cd8",
      "summary": "AuditLog.js — thin audit VIEW over the same shared EventLog used by the Phase 7 Time Engine (one log, not two): filters to commit/receipt/ledger events via the existing TimelineExporter, with chain verification attached.",
      "exports": [
        {
          "name": "AuditLog",
          "kind": "class",
          "signature": "class AuditLog",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/BrowserNativeJavaScriptVerifier",
      "path": "webgpu-os/reference/kernel/execution/BrowserNativeJavaScriptVerifier.md",
      "source": "webgpu-os/kernel/execution/BrowserNativeJavaScriptVerifier.js",
      "import": "/webgpu-os/kernel/execution/BrowserNativeJavaScriptVerifier.js",
      "sourceHash": "b40339a4a4966379d29bb79828e16337d42818742c41571a774add113a621c24",
      "summary": "Non-executing browser verifier for JavaScript, TypeScript, JSX, and TSX. Browser engines expose a non-executing parser only for classic JavaScript through Function construction. Module, TypeScript, and JSX verification must therefore use an explicitly supplied parser adapter or remain inconclusive. Lexical balance is always reported separately and is never promoted to parse evidence.",
      "exports": [
        {
          "name": "verifyBrowserNativeJavaScript",
          "kind": "function",
          "signature": "async verifyBrowserNativeJavaScript({ path = '', content = '', sourceRevision = '', rulesHash = '', knownFiles = null, knownDependencies = null, parserAdapters = {}, } = {})",
          "summary": ""
        },
        {
          "name": "BROWSER_NATIVE_JAVASCRIPT_VERIFIER_FORMAT",
          "kind": "constant",
          "signature": "BROWSER_NATIVE_JAVASCRIPT_VERIFIER_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/BudgetLimiter",
      "path": "webgpu-os/reference/kernel/execution/BudgetLimiter.md",
      "source": "webgpu-os/kernel/execution/BudgetLimiter.js",
      "import": "/webgpu-os/kernel/execution/BudgetLimiter.js",
      "sourceHash": "838f787166109859401d4a7a17c674da13f76fdd2a52c2278be1e7f0d7cde440",
      "summary": "BudgetLimiter.js — wraps engine/state/authority/PolicyEngine.js (ordered rules, deny-overrides-allow, risk classification, approval-required) for AI request/tool-call/commit policy, plus per-request step budgets via the Phase 7 CooldownManager's BoundedCounterEscrow.",
      "exports": [
        {
          "name": "BudgetLimiter",
          "kind": "class",
          "signature": "class BudgetLimiter",
          "summary": ""
        },
        {
          "name": "DECISION",
          "kind": "re-export",
          "signature": "DECISION",
          "summary": ""
        },
        {
          "name": "RISK_LEVEL",
          "kind": "re-export",
          "signature": "RISK_LEVEL",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/CommitGate",
      "path": "webgpu-os/reference/kernel/execution/CommitGate.md",
      "source": "webgpu-os/kernel/execution/CommitGate.js",
      "import": "/webgpu-os/kernel/execution/CommitGate.js",
      "sourceHash": "5451246c7529e0d1a41e25cb8dfe7db48c6a96082c250924539228e9db14400c",
      "summary": "CommitGate.js — the OS's ONE commit path: wraps engine/state's createCommitCoordinator (the 14-step atomic protocol) and createCommitGate (lightweight fact-only commits) over the SHARED Phase 7 stores — the same FactStore, EventLog, USORegistry (CooldownManager's), IdempotencyRegistry, and the Phase 4 CapabilityRegistry. Nothing AI-produced becomes canonical except through here.",
      "exports": [
        {
          "name": "OSCommitGate",
          "kind": "class",
          "signature": "class OSCommitGate",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/ContextBroker",
      "path": "webgpu-os/reference/kernel/execution/ContextBroker.md",
      "source": "webgpu-os/kernel/execution/ContextBroker.js",
      "import": "/webgpu-os/kernel/execution/ContextBroker.js",
      "sourceHash": "0fab25331ba6d1439b2f5f018c106894d8a8a5498227312635551cf1140e5560",
      "summary": "ContextBroker.js — wraps engine/state/worldmodel/BeliefStore.js: one BeliefStore per AI request keeping the five worlds strictly separated (CANONICAL/OBSERVED/BELIEF/PREDICTED/PROPOSED). A belief or prediction can NEVER become canonical here — syncCanonical() is only called by the execution loop AFTER a witnessed commit.",
      "exports": [
        {
          "name": "ContextBroker",
          "kind": "class",
          "signature": "class ContextBroker",
          "summary": ""
        },
        {
          "name": "WORLD",
          "kind": "re-export",
          "signature": "WORLD",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/DodadForge",
      "path": "webgpu-os/reference/kernel/execution/DodadForge.md",
      "source": "webgpu-os/kernel/execution/DodadForge.js",
      "import": "/webgpu-os/kernel/execution/DodadForge.js",
      "sourceHash": "1f6df36fb7618a23341618045c73115a1d86c3bb2a1da0899bf2d8552df5cff9",
      "summary": "DodadForge.js — OS-owned project contracts for interactive AI Echo outputs. Provider text is never executed directly. The forge accepts one explicit four-file envelope, validates it as data, and runs declared behavior only in an opaque, network-blocked iframe before the existing signed Dodad Faculty is allowed to persist the project.",
      "exports": [
        {
          "name": "classifyDodadForgeRecipe",
          "kind": "function",
          "signature": "classifyDodadForgeRecipe(prompt = '')",
          "summary": ""
        },
        {
          "name": "buildDodadForgeBlueprint",
          "kind": "function",
          "signature": "buildDodadForgeBlueprint(prompt = '', { decision = null } = {})",
          "summary": "Build a deterministic specialist handoff for one Dodad request. Roles are responsibility slices inside one bounded episode, not agents and not authority. Only patterns whose trigger evidence is present are loaded."
        },
        {
          "name": "buildDodadForgeAuthoringPrompt",
          "kind": "function",
          "signature": "buildDodadForgeAuthoringPrompt(prompt = '', { failures = [] } = {})",
          "summary": ""
        },
        {
          "name": "parseDodadForgeProject",
          "kind": "function",
          "signature": "parseDodadForgeProject(value, { prompt = '', blueprint = null } = {})",
          "summary": ""
        },
        {
          "name": "validateDodadForgeProject",
          "kind": "function",
          "signature": "validateDodadForgeProject(input = {}, { prompt = '', blueprint = null } = {})",
          "summary": ""
        },
        {
          "name": "verifyDodadForgeProjectRuntime",
          "kind": "function",
          "signature": "async verifyDodadForgeProjectRuntime(project, { timeoutMs = RUNTIME_TIMEOUT_MS } = {})",
          "summary": ""
        },
        {
          "name": "scoreDodadForgeProject",
          "kind": "function",
          "signature": "scoreDodadForgeProject({ html = '', css = '', javascript = '', manifest = null, recipe: selectedRecipe = null, blueprint = null } = {})",
          "summary": "Deterministic quality projection; blockers cover recipe-defining behavior only."
        },
        {
          "name": "verifyDodadJavaScriptWorker",
          "kind": "function",
          "signature": "async verifyDodadJavaScriptWorker(source, { timeoutMs = WORKER_TIMEOUT_MS } = {})",
          "summary": "Compile and execute only the Dodad's top-level JavaScript inside a killable Worker with inert DOM shims. Runtime deltas are never executed. A hung or syntactically invalid script is terminated before the DOM sandbox opens."
        },
        {
          "name": "DODAD_FORGE_FORMAT",
          "kind": "constant",
          "signature": "DODAD_FORGE_FORMAT",
          "summary": "DodadForge.js — OS-owned project contracts for interactive AI Echo outputs. Provider text is never executed directly. The forge accepts one explicit four-file envelope, validates it as data, and runs declared behavior only in an opaque, network-blocked iframe before the existing signed Dodad Faculty is allowed to persist the project."
        },
        {
          "name": "DODAD_BEHAVIOR_FORMAT",
          "kind": "constant",
          "signature": "DODAD_BEHAVIOR_FORMAT",
          "summary": ""
        },
        {
          "name": "DODAD_FORGE_RECIPE_CATALOG_URI",
          "kind": "constant",
          "signature": "DODAD_FORGE_RECIPE_CATALOG_URI",
          "summary": ""
        },
        {
          "name": "DODAD_FORGE_PATTERN_CATALOG_URI",
          "kind": "constant",
          "signature": "DODAD_FORGE_PATTERN_CATALOG_URI",
          "summary": ""
        },
        {
          "name": "DODAD_FORGE_QUALITY_GUIDE_URI",
          "kind": "constant",
          "signature": "DODAD_FORGE_QUALITY_GUIDE_URI",
          "summary": ""
        },
        {
          "name": "DODAD_FORGE_BLUEPRINT_FORMAT",
          "kind": "constant",
          "signature": "DODAD_FORGE_BLUEPRINT_FORMAT",
          "summary": ""
        },
        {
          "name": "DODAD_FORGE_QUALITY_FORMAT",
          "kind": "constant",
          "signature": "DODAD_FORGE_QUALITY_FORMAT",
          "summary": ""
        },
        {
          "name": "DODAD_FORGE_RECIPES",
          "kind": "constant",
          "signature": "DODAD_FORGE_RECIPES",
          "summary": ""
        },
        {
          "name": "DODAD_FORGE_PATTERNS",
          "kind": "constant",
          "signature": "DODAD_FORGE_PATTERNS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/ExecutionApprovalMode",
      "path": "webgpu-os/reference/kernel/execution/ExecutionApprovalMode.md",
      "source": "webgpu-os/kernel/execution/ExecutionApprovalMode.js",
      "import": "/webgpu-os/kernel/execution/ExecutionApprovalMode.js",
      "sourceHash": "03cb04c428b94aa40d04b4d767c67ebabd711f5b8dc4a7b3840d477866a5ce11",
      "summary": "Deterministic execution-approval modes. This module decides whether an already-reviewed tool action still needs an operator prompt. It never grants authority: ToolActionReview, ToolRouter, Navi Faculty capability leases, workspace roots, and mounted-folder scopes remain authoritative for every call.",
      "exports": [
        {
          "name": "normalizeExecutionApprovalMode",
          "kind": "function",
          "signature": "normalizeExecutionApprovalMode(value)",
          "summary": ""
        },
        {
          "name": "executionApprovalRepeatProfile",
          "kind": "function",
          "signature": "executionApprovalRepeatProfile(review, { appId = '', naviId = '' } = {})",
          "summary": "Content-free identity for a repeatable approval scope. Arguments are intentionally omitted: changed values may repeat only when the tool, descriptor, authority, data classes, and exact target scope are unchanged."
        },
        {
          "name": "decideExecutionApproval",
          "kind": "function",
          "signature": "decideExecutionApproval({ mode, review, priorReceipt = null } = {})",
          "summary": "Decide only the prompt behavior for an action that has already passed the OS review. `priorReceipt` must be an OS-recorded successful call for the same repeat profile; model recommendations never substitute for it."
        },
        {
          "name": "eligibleForVerifiedRepeat",
          "kind": "function",
          "signature": "eligibleForVerifiedRepeat(review)",
          "summary": ""
        },
        {
          "name": "EXECUTION_APPROVAL_MODE",
          "kind": "constant",
          "signature": "EXECUTION_APPROVAL_MODE",
          "summary": "Deterministic execution-approval modes. This module decides whether an already-reviewed tool action still needs an operator prompt. It never grants authority: ToolActionReview, ToolRouter, Navi Faculty capability leases, workspace roots, and mounted-folder scopes remain authoritative for every call."
        },
        {
          "name": "EXECUTION_APPROVAL_DECISION",
          "kind": "constant",
          "signature": "EXECUTION_APPROVAL_DECISION",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/ExecutionHorizonPolicy",
      "path": "webgpu-os/reference/kernel/execution/ExecutionHorizonPolicy.md",
      "source": "webgpu-os/kernel/execution/ExecutionHorizonPolicy.js",
      "import": "/webgpu-os/kernel/execution/ExecutionHorizonPolicy.js",
      "sourceHash": "a65e8a735e098289cda7a4d10624580331fdc02ac0cb823d617685fd7530ff1d",
      "summary": "Pure adaptive execution-window policy. It has no authority vocabulary and can only reduce caller-supplied action/concurrency ceilings. Descriptor risk and reversibility dominate calibration: confidence never changes approval, capability, tool selection, or the static execution ceiling. Callers must enforce the returned action and mutation limits as hard dispatch boundaries.",
      "exports": [
        {
          "name": "ExecutionHorizonPolicy",
          "kind": "class",
          "signature": "class ExecutionHorizonPolicy",
          "summary": ""
        },
        {
          "name": "NAVI_EXECUTION_HORIZON_FORMAT",
          "kind": "constant",
          "signature": "NAVI_EXECUTION_HORIZON_FORMAT",
          "summary": "Pure adaptive execution-window policy. It has no authority vocabulary and can only reduce caller-supplied action/concurrency ceilings. Descriptor risk and reversibility dominate calibration: confidence never changes approval, capability, tool selection, or the static execution ceiling. Callers must enforce the returned action and mutation limits as hard dispatch boundaries."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/JavaScriptExecutionGrant",
      "path": "webgpu-os/reference/kernel/execution/JavaScriptExecutionGrant.md",
      "source": "webgpu-os/kernel/execution/JavaScriptExecutionGrant.js",
      "import": "/webgpu-os/kernel/execution/JavaScriptExecutionGrant.js",
      "sourceHash": "d0066b5bafe524b0cfacac3de6f991c5819d293b05a5016e29e36cd1ed1ebed1",
      "summary": "JavaScriptExecutionGrant.js — exact-source, short-lived execution binding. This contract narrows an already-authorized raw JavaScript tool call. It is not an authority source: ToolRouter, the Faculty capability grant, OS policy, developer mode, and the browser extension approval boundary still decide whether execution is allowed.",
      "exports": [
        {
          "name": "JavaScriptExecutionGrantError",
          "kind": "class",
          "signature": "class JavaScriptExecutionGrantError extends Error",
          "summary": ""
        },
        {
          "name": "inspectJavaScriptApiUsage",
          "kind": "function",
          "signature": "inspectJavaScriptApiUsage(source)",
          "summary": "Return the conservative, inspectable API categories visible in source."
        },
        {
          "name": "resolveJavaScriptPermittedApis",
          "kind": "function",
          "signature": "resolveJavaScriptPermittedApis(source, permittedApis = null)",
          "summary": "Normalize a caller-declared API allowance and ensure it covers every API category the conservative source scan can observe. Omission selects the observed set, keeping existing developer-only calls compatible."
        },
        {
          "name": "hashJavaScriptSource",
          "kind": "function",
          "signature": "async hashJavaScriptSource(source)",
          "summary": ""
        },
        {
          "name": "hashJavaScriptNavigationGeneration",
          "kind": "function",
          "signature": "async hashJavaScriptNavigationGeneration({ tabId, url, pendingUrl = '', status = '' } = {})",
          "summary": "Hash the observable browser navigation identity without publishing its URL."
        },
        {
          "name": "createJavaScriptApprovalBinding",
          "kind": "function",
          "signature": "async createJavaScriptApprovalBinding({ source, permittedApis = null, surface = 'browser-page', world = surface === 'os-worker' ? 'WORKER' : 'USER_SCRIPT', tabId = null, naviId = '', facultyId = '', taskId = '', requestId = '', } = {})",
          "summary": "Build the exact source/API projection embedded in ToolActionReview."
        },
        {
          "name": "createJavaScriptExecutionGrant",
          "kind": "function",
          "signature": "async createJavaScriptExecutionGrant({ source, permittedApis = null, surface = 'browser-page', world = surface === 'os-worker' ? 'WORKER' : 'USER_SCRIPT', target = null, naviId = '', facultyId = '', taskId = '', requestId = '', issuedAt = Date.now()",
          "summary": "Create one exact, bounded runtime grant after the target has been observed."
        },
        {
          "name": "verifyJavaScriptExecutionGrant",
          "kind": "function",
          "signature": "async verifyJavaScriptExecutionGrant(grant, { source, permittedApis = null, surface = 'browser-page', world = surface === 'os-worker' ? 'WORKER' : 'USER_SCRIPT', target = null, naviId = '', facultyId = '', taskId = '', requestId = '', now = Date.now()",
          "summary": "Recompute every meaning-bearing field and reject expired or altered grants."
        },
        {
          "name": "JAVASCRIPT_EXECUTION_GRANT_FORMAT",
          "kind": "constant",
          "signature": "JAVASCRIPT_EXECUTION_GRANT_FORMAT",
          "summary": ""
        },
        {
          "name": "JAVASCRIPT_EXECUTION_SURFACES",
          "kind": "constant",
          "signature": "JAVASCRIPT_EXECUTION_SURFACES",
          "summary": ""
        },
        {
          "name": "JAVASCRIPT_EXECUTION_WORLDS",
          "kind": "constant",
          "signature": "JAVASCRIPT_EXECUTION_WORLDS",
          "summary": ""
        },
        {
          "name": "JAVASCRIPT_EXECUTION_PERMITTED_APIS",
          "kind": "constant",
          "signature": "JAVASCRIPT_EXECUTION_PERMITTED_APIS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/NaviContextRollover",
      "path": "webgpu-os/reference/kernel/execution/NaviContextRollover.md",
      "source": "webgpu-os/kernel/execution/NaviContextRollover.js",
      "import": "/webgpu-os/kernel/execution/NaviContextRollover.js",
      "sourceHash": "72d196b5be50a72552dfeac96a0f1ed80f5efb3066100e19c00a1447b6229734",
      "summary": "Compact, derived task context for rollover between bounded execution turns. The projection contains identifiers, hashes, classifications, and counts only. It has no persistence and rejects raw content, tool arguments, or reasoning.",
      "exports": [
        {
          "name": "NaviContextRolloverError",
          "kind": "class",
          "signature": "class NaviContextRolloverError extends Error",
          "summary": ""
        },
        {
          "name": "NaviContextRollover",
          "kind": "class",
          "signature": "class NaviContextRollover",
          "summary": ""
        },
        {
          "name": "createNaviContextRollover",
          "kind": "function",
          "signature": "async createNaviContextRollover(raw = {}, options = {})",
          "summary": ""
        },
        {
          "name": "validateNaviContextRollover",
          "kind": "function",
          "signature": "async validateNaviContextRollover(value)",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_ROLLOVER_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_ROLLOVER_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/NaviExplainabilityProjection",
      "path": "webgpu-os/reference/kernel/execution/NaviExplainabilityProjection.md",
      "source": "webgpu-os/kernel/execution/NaviExplainabilityProjection.js",
      "import": "/webgpu-os/kernel/execution/NaviExplainabilityProjection.js",
      "sourceHash": "e6da89cdac33cf096e9d57792a231fa097bbc1c06d99642885bd7801e7dcaee0",
      "summary": "NaviExplainabilityProjection.js — compact, authority-free explanations derived from records the OS already owns. This module has no persistence and never accepts provider reasoning. It projects task state, steering, routing, tool outcomes, verification, and receipts into inspectable local evidence.",
      "exports": [
        {
          "name": "projectNaviWhy",
          "kind": "function",
          "signature": "projectNaviWhy(raw = {})",
          "summary": "Explain one active or completed Navi task from its existing projections and ledgers. `report` is the TaskLedger FinalReport (or its durable compact form), and `steering` is ActiveTurnCoordinator.snapshot(). No record is written."
        },
        {
          "name": "projectNaviResourceSelectionExplanation",
          "kind": "function",
          "signature": "projectNaviResourceSelectionExplanation(rawSelection)",
          "summary": "Project one signed/validated resource-selection receipt without re-ranking."
        },
        {
          "name": "projectNaviSmartRoutingExplanation",
          "kind": "function",
          "signature": "async projectNaviSmartRoutingExplanation(raw = {})",
          "summary": "Explain an exact NaviModelBroker decision, including excluded routes and the smallest policy/settings change that could make each route eligible. The explanation is derived after routing and cannot alter the decision."
        },
        {
          "name": "NAVI_WHY_PROJECTION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_WHY_PROJECTION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_SMART_ROUTING_EXPLANATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_SMART_ROUTING_EXPLANATION_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/NaviProposalEnvelope",
      "path": "webgpu-os/reference/kernel/execution/NaviProposalEnvelope.md",
      "source": "webgpu-os/kernel/execution/NaviProposalEnvelope.js",
      "import": "/webgpu-os/kernel/execution/NaviProposalEnvelope.js",
      "sourceHash": "be208689907c41cefe1e87d2c8d964e602b0c5ac7a8d29c63efe6ae88ebb412a",
      "summary": "NaviProposalEnvelope.js — binds a proposed change to observed evidence, explicit inferences, unresolved questions, an exact target revision, and deterministic verification/compensation. A proposal has no authority by itself and must still pass the normal review and capability path.",
      "exports": [
        {
          "name": "createEvidenceBoundProposal",
          "kind": "function",
          "signature": "async createEvidenceBoundProposal(value = {})",
          "summary": ""
        },
        {
          "name": "validateEvidenceBoundProposal",
          "kind": "function",
          "signature": "async validateEvidenceBoundProposal(proposal)",
          "summary": ""
        },
        {
          "name": "NAVI_PROPOSAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PROPOSAL_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/NaviTaskGraphCheckpoint",
      "path": "webgpu-os/reference/kernel/execution/NaviTaskGraphCheckpoint.md",
      "source": "webgpu-os/kernel/execution/NaviTaskGraphCheckpoint.js",
      "import": "/webgpu-os/kernel/execution/NaviTaskGraphCheckpoint.js",
      "sourceHash": "669fe040fcf676e5bf0ea2bab2711a885138320a0acaf52c54527e84571362bb",
      "summary": "Durable, content-free checkpoints for compiled Navi task graphs. This module neither executes nor replays graph nodes. Persistence is supplied by an exact-key adapter with one read and one compare-and-swap operation.",
      "exports": [
        {
          "name": "NaviTaskGraphCheckpointError",
          "kind": "class",
          "signature": "class NaviTaskGraphCheckpointError extends Error",
          "summary": ""
        },
        {
          "name": "NaviTaskGraphCheckpointStore",
          "kind": "class",
          "signature": "class NaviTaskGraphCheckpointStore",
          "summary": ""
        },
        {
          "name": "createNaviTaskGraphCheckpoint",
          "kind": "function",
          "signature": "async createNaviTaskGraphCheckpoint(raw = {})",
          "summary": ""
        },
        {
          "name": "validateNaviTaskGraphCheckpoint",
          "kind": "function",
          "signature": "async validateNaviTaskGraphCheckpoint(value)",
          "summary": ""
        },
        {
          "name": "validateNaviTaskGraphCheckpointTransition",
          "kind": "function",
          "signature": "async validateNaviTaskGraphCheckpointTransition(raw = {})",
          "summary": "Enforce task-lifetime monotonicity for the mutation ledger. Completed tombstones are immutable. Outcome-unknown tombstones may resolve to a completed tombstone, or be removed by an exact current mutation node whose failed outcome is explicitly verifier-bound. Generic failures never evict."
        },
        {
          "name": "classifyNaviTaskGraphResume",
          "kind": "function",
          "signature": "async classifyNaviTaskGraphResume(raw = {})",
          "summary": ""
        },
        {
          "name": "checkpointKeyForTask",
          "kind": "function",
          "signature": "checkpointKeyForTask(taskId)",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_GRAPH_CHECKPOINT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_TASK_GRAPH_CHECKPOINT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_GRAPH_RESUME_FORMAT",
          "kind": "constant",
          "signature": "NAVI_TASK_GRAPH_RESUME_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/NaviTaskGraphCompiler",
      "path": "webgpu-os/reference/kernel/execution/NaviTaskGraphCompiler.md",
      "source": "webgpu-os/kernel/execution/NaviTaskGraphCompiler.js",
      "import": "/webgpu-os/kernel/execution/NaviTaskGraphCompiler.js",
      "sourceHash": "d64183ab59c8a5437a1586ff75f640a14d8a08d74c95221309b9c38229e5ac74",
      "summary": "NaviTaskGraphCompiler.js — deterministic compiler for model-proposed tool plans. A compiled graph is evidence, never authority: every node still enters ToolActionReview, ToolRouter, and the Faculty membrane before it can execute.",
      "exports": [
        {
          "name": "NaviTaskGraphCompilerError",
          "kind": "class",
          "signature": "class NaviTaskGraphCompilerError extends Error",
          "summary": ""
        },
        {
          "name": "NaviTaskGraphCompiler",
          "kind": "class",
          "signature": "class NaviTaskGraphCompiler",
          "summary": ""
        },
        {
          "name": "validateCompiledTaskGraph",
          "kind": "function",
          "signature": "async validateCompiledTaskGraph(graph)",
          "summary": ""
        },
        {
          "name": "classifyTaskGraphChange",
          "kind": "function",
          "signature": "classifyTaskGraphChange(previousGraph, nextGraph)",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_GRAPH_ID_MAX_LENGTH",
          "kind": "constant",
          "signature": "NAVI_TASK_GRAPH_ID_MAX_LENGTH",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_GRAPH_ID_PATTERN",
          "kind": "constant",
          "signature": "NAVI_TASK_GRAPH_ID_PATTERN",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_GRAPH_FORMAT",
          "kind": "constant",
          "signature": "NAVI_TASK_GRAPH_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_GRAPH_LEGACY_FORMAT",
          "kind": "constant",
          "signature": "NAVI_TASK_GRAPH_LEGACY_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/NaviTaskStateProjection",
      "path": "webgpu-os/reference/kernel/execution/NaviTaskStateProjection.md",
      "source": "webgpu-os/kernel/execution/NaviTaskStateProjection.js",
      "import": "/webgpu-os/kernel/execution/NaviTaskStateProjection.js",
      "sourceHash": "3570b0d926f14bfb4a580f58d6d8419196a735791abc5ba25dbfe120411b2f4c",
      "summary": "NaviTaskStateProjection.js — immutable, schema-validated runtime projection for one active Navi task. Canonical task persistence remains NaviCognition; this module projects inspectable live state for streams and in-flight views.",
      "exports": [
        {
          "name": "createNaviTaskStateProjection",
          "kind": "function",
          "signature": "createNaviTaskStateProjection(raw = {})",
          "summary": ""
        },
        {
          "name": "evolveNaviTaskStateProjection",
          "kind": "function",
          "signature": "evolveNaviTaskStateProjection(current, patch = {}, { now = Date.now()",
          "summary": ""
        },
        {
          "name": "acceptNaviTaskSteering",
          "kind": "function",
          "signature": "acceptNaviTaskSteering(current, event, options = {})",
          "summary": ""
        },
        {
          "name": "setNaviTaskCurrentAction",
          "kind": "function",
          "signature": "setNaviTaskCurrentAction(current, action, options = {})",
          "summary": ""
        },
        {
          "name": "completeNaviTaskWork",
          "kind": "function",
          "signature": "completeNaviTaskWork(current, work, options = {})",
          "summary": ""
        },
        {
          "name": "setNaviTaskPendingApproval",
          "kind": "function",
          "signature": "setNaviTaskPendingApproval(current, approval, options = {})",
          "summary": ""
        },
        {
          "name": "clearNaviTaskApproval",
          "kind": "function",
          "signature": "clearNaviTaskApproval(current, approvalId, options = {})",
          "summary": ""
        },
        {
          "name": "syncNaviTaskRuntime",
          "kind": "function",
          "signature": "syncNaviTaskRuntime(current, { executorPhase, status = null, remainingBudget = null, artifacts = null, planRef = undefined, contextManifestRef = undefined, resourceSelectionRef = undefined, investigationCaseRef = undefined, goalProgress = null, } = {}, options = {})",
          "summary": ""
        },
        {
          "name": "naviTaskPhaseForExecutor",
          "kind": "function",
          "signature": "naviTaskPhaseForExecutor(value)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/PrivacyGuard",
      "path": "webgpu-os/reference/kernel/execution/PrivacyGuard.md",
      "source": "webgpu-os/kernel/execution/PrivacyGuard.js",
      "import": "/webgpu-os/kernel/execution/PrivacyGuard.js",
      "sourceHash": "071d5ac5e5b0a77d2f66bd6a9054429c0ff652b12c77c80bd81ba949b85d7e77",
      "summary": "PrivacyGuard.js — scrubs context before it leaves the OS toward a remote model provider: sensitive-looking values are masked (reuses Phase 5's ParameterPreviewer — one masking implementation), obvious credential literals in free text are redacted, and payload size is capped.",
      "exports": [
        {
          "name": "PrivacyGuard",
          "kind": "class",
          "signature": "class PrivacyGuard",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/RepairLoop",
      "path": "webgpu-os/reference/kernel/execution/RepairLoop.md",
      "source": "webgpu-os/kernel/execution/RepairLoop.js",
      "import": "/webgpu-os/kernel/execution/RepairLoop.js",
      "sourceHash": "e9d4765fae9510c70e5a9af42be77dfebca425651e889ee6c5f11e01d618a6b9",
      "summary": "RepairLoop.js — malformed-model-output repair: first a local structural extraction (strip code fences, isolate the outermost JSON object/array), then target-shape validation and at most one model-assisted repair pass on the selected route's fast tier. Repair duration is operator-controlled: steering may supersede it and Stop aborts it. The route/attempt policy stays bounded, and wrong-schema JSON is never accepted merely because it parses.",
      "exports": [
        {
          "name": "RepairLoop",
          "kind": "class",
          "signature": "class RepairLoop",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/RunEventStreamRegistry",
      "path": "webgpu-os/reference/kernel/execution/RunEventStreamRegistry.md",
      "source": "webgpu-os/kernel/execution/RunEventStreamRegistry.js",
      "import": "/webgpu-os/kernel/execution/RunEventStreamRegistry.js",
      "sourceHash": "e5ac684682f9bf774a72c4e7c15b29b2a71302fcb7b1e1d29528018d25a891e7",
      "summary": "Kernel-owned resumable event streams for AI executions. App callbacks are only a live view. This registry assigns monotonic sequence numbers, buffers bounded events, and supports same-owner replay after an app remount or transient UI failure. Durable history remains in FinalReport.",
      "exports": [
        {
          "name": "RunEventStreamRegistry",
          "kind": "class",
          "signature": "class RunEventStreamRegistry",
          "summary": "Kernel-owned resumable event streams for AI executions. App callbacks are only a live view. This registry assigns monotonic sequence numbers, buffers bounded events, and supports same-owner replay after an app remount or transient UI failure. Durable history remains in FinalReport."
        },
        {
          "name": "RunEventStreamGapError",
          "kind": "class",
          "signature": "class RunEventStreamGapError extends Error",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/SemanticEffectContract",
      "path": "webgpu-os/reference/kernel/execution/SemanticEffectContract.md",
      "source": "webgpu-os/kernel/execution/SemanticEffectContract.js",
      "import": "/webgpu-os/kernel/execution/SemanticEffectContract.js",
      "sourceHash": "49ab522cb868f5b52b20968f68706cb0ace89ecdcf977f78d2081ce1d658fb96",
      "summary": "SemanticEffectContract.js Pure, authority-free compilation and comparison for descriptor-authored postconditions. The model never supplies these contracts. Exact contracts are declared by trusted tool descriptors and are bound to the descriptor, arguments, graph prestate, and verified Faculty receipt before comparison. Durable projections contain hashes and bounded counts, never tool arguments or effect values.",
      "exports": [
        {
          "name": "SemanticEffectContractError",
          "kind": "class",
          "signature": "class SemanticEffectContractError extends Error",
          "summary": ""
        },
        {
          "name": "compileDescriptorPostcondition",
          "kind": "function",
          "signature": "async compileDescriptorPostcondition({ descriptor, descriptorHash, args = {}, } = {})",
          "summary": "Compile a trusted descriptor's effect declaration into a value-free graph postcondition. Legacy descriptors remain receipt/success-bound; only the explicit closed contract enables exact semantic comparison."
        },
        {
          "name": "validateSemanticPostcondition",
          "kind": "function",
          "signature": "async validateSemanticPostcondition(value)",
          "summary": ""
        },
        {
          "name": "validateSemanticInvocation",
          "kind": "function",
          "signature": "async validateSemanticInvocation(postcondition, { descriptorHash, args = {} } = {})",
          "summary": "Bind a live invocation to the graph-authored descriptor and argument hashes."
        },
        {
          "name": "createExecutionPrestate",
          "kind": "function",
          "signature": "async createExecutionPrestate({ graphHash, sourceHash, nodeId, dependencies = [], } = {})",
          "summary": "Bind a node's comparison to the graph and exact terminal evidence of each dependency. No provider-visible text or raw values enter this projection."
        },
        {
          "name": "validateExecutionPrestate",
          "kind": "function",
          "signature": "async validateExecutionPrestate(value)",
          "summary": ""
        },
        {
          "name": "compareSemanticEffects",
          "kind": "function",
          "signature": "async compareSemanticEffects({ postcondition, prestate, receiptEvidence = null, observedEffects = null, resultOk = false, } = {})",
          "summary": "Compare trusted readback effects with descriptor-authored expectations. `receiptEvidence` must be the kernel-created verified Faculty projection for exact and mutation comparisons; caller-supplied receipt-shaped data cannot acquire authority through this pure function."
        },
        {
          "name": "projectSemanticNodeOutcome",
          "kind": "function",
          "signature": "projectSemanticNodeOutcome({ nodeId, graphHash, sourceHash, comparison, } = {})",
          "summary": "Compact semantic node outcome consumed by checkpoint/episode projections."
        },
        {
          "name": "NAVI_EFFECT_CONTRACT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_EFFECT_CONTRACT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_SEMANTIC_POSTCONDITION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_SEMANTIC_POSTCONDITION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_EXECUTION_PRESTATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_EXECUTION_PRESTATE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_EFFECT_COMPARISON_FORMAT",
          "kind": "constant",
          "signature": "NAVI_EFFECT_COMPARISON_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_SEMANTIC_NODE_OUTCOME_FORMAT",
          "kind": "constant",
          "signature": "NAVI_SEMANTIC_NODE_OUTCOME_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/SemanticTransaction",
      "path": "webgpu-os/reference/kernel/execution/SemanticTransaction.md",
      "source": "webgpu-os/kernel/execution/SemanticTransaction.js",
      "import": "/webgpu-os/kernel/execution/SemanticTransaction.js",
      "sourceHash": "984b2ac6a7b9d97b6050f78adf3540dfd02f675c772074be5a007b1581c60bb7",
      "summary": "SemanticTransaction.js — deterministic multi-target preview/commit contract. The coordinator never writes storage itself. Callers provide one atomic commit callback that must recheck every expected revision/hash in the same critical section as its writes. This module validates that exact request, emits explicit conflict choices, and creates a hash-bound undo record.",
      "exports": [
        {
          "name": "SemanticTransactionError",
          "kind": "class",
          "signature": "class SemanticTransactionError extends Error",
          "summary": ""
        },
        {
          "name": "SemanticTransactionCoordinator",
          "kind": "class",
          "signature": "class SemanticTransactionCoordinator",
          "summary": ""
        },
        {
          "name": "hashSemanticTransactionValue",
          "kind": "function",
          "signature": "async hashSemanticTransactionValue(value)",
          "summary": ""
        },
        {
          "name": "chooseSemanticTransactionConflict",
          "kind": "function",
          "signature": "async chooseSemanticTransactionConflict(conflict, choice)",
          "summary": "Bind one explicit UI choice to the exact conflict record."
        },
        {
          "name": "SEMANTIC_TRANSACTION_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_TRANSACTION_FORMAT",
          "summary": ""
        },
        {
          "name": "SEMANTIC_TRANSACTION_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_TRANSACTION_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "SEMANTIC_TRANSACTION_UNDO_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_TRANSACTION_UNDO_FORMAT",
          "summary": ""
        },
        {
          "name": "SEMANTIC_TRANSACTION_CONFLICT_FORMAT",
          "kind": "constant",
          "signature": "SEMANTIC_TRANSACTION_CONFLICT_FORMAT",
          "summary": ""
        },
        {
          "name": "SEMANTIC_TRANSACTION_CONFLICT_CHOICES",
          "kind": "constant",
          "signature": "SEMANTIC_TRANSACTION_CONFLICT_CHOICES",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/TaskProgressEstimator",
      "path": "webgpu-os/reference/kernel/execution/TaskProgressEstimator.md",
      "source": "webgpu-os/kernel/execution/TaskProgressEstimator.js",
      "import": "/webgpu-os/kernel/execution/TaskProgressEstimator.js",
      "sourceHash": "2837ba36807932e8a5a65f856fc8e50f61f77f12287f047c536967cc020e25bf",
      "summary": "TaskProgressEstimator.js — deterministic, content-free duration and progress estimates for an active Navi task. Estimates are ranges, never deadlines. They consume local prompt signals, historical route timing, and OS events; they do not call a model and never grant authority.",
      "exports": [
        {
          "name": "classifyTaskEstimateProfile",
          "kind": "function",
          "signature": "classifyTaskEstimateProfile(prompt = '', taskKind = '')",
          "summary": ""
        },
        {
          "name": "createTaskProgressEstimate",
          "kind": "function",
          "signature": "createTaskProgressEstimate({ prompt = '', taskKind = '', estimatedInputTokens = null, routeAverageMs = null, routeSampleCount = 0, now = Date.now()",
          "summary": ""
        },
        {
          "name": "updateTaskProgressEstimate",
          "kind": "function",
          "signature": "updateTaskProgressEstimate(current, event = {}, now = Date.now()",
          "summary": ""
        },
        {
          "name": "taskProgressEstimateLabel",
          "kind": "function",
          "signature": "taskProgressEstimateLabel(value)",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_PROGRESS_ESTIMATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_TASK_PROGRESS_ESTIMATE_FORMAT",
          "summary": "TaskProgressEstimator.js — deterministic, content-free duration and progress estimates for an active Navi task. Estimates are ranges, never deadlines. They consume local prompt signals, historical route timing, and OS events; they do not call a model and never grant authority."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/TaskProgressGuard",
      "path": "webgpu-os/reference/kernel/execution/TaskProgressGuard.md",
      "source": "webgpu-os/kernel/execution/TaskProgressGuard.js",
      "import": "/webgpu-os/kernel/execution/TaskProgressGuard.js",
      "sourceHash": "23f3f4e3550b714e04f6374fb155311d05cd91ae4124d230a8aae3f81335a3b3",
      "summary": "TaskProgressGuard.js — bounded semantic-progress detection for iterative AI work. The guard observes fingerprints only; it never executes tools, grants authority, persists state, or decides that unverified provider prose is work.",
      "exports": [
        {
          "name": "TaskProgressGuard",
          "kind": "class",
          "signature": "class TaskProgressGuard",
          "summary": ""
        },
        {
          "name": "verifiedToolProgressFingerprint",
          "kind": "function",
          "signature": "verifiedToolProgressFingerprint(results, toolDriver = null)",
          "summary": "Return a stable fingerprint only for successful, locally observed progress."
        },
        {
          "name": "statusToolFingerprint",
          "kind": "function",
          "signature": "statusToolFingerprint(results)",
          "summary": "Fingerprint a round made entirely from status/polling tools."
        },
        {
          "name": "semanticToolRoundFingerprint",
          "kind": "function",
          "signature": "semanticToolRoundFingerprint(results)",
          "summary": ""
        },
        {
          "name": "TASK_PROGRESS_LIMITS",
          "kind": "constant",
          "signature": "TASK_PROGRESS_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/ToolActionReview",
      "path": "webgpu-os/reference/kernel/execution/ToolActionReview.md",
      "source": "webgpu-os/kernel/execution/ToolActionReview.js",
      "import": "/webgpu-os/kernel/execution/ToolActionReview.js",
      "sourceHash": "549d15adc55d3e1a3dea5f78ad9f15756bceeb92eb69e7125b816f2839ff24d6",
      "summary": "ToolActionReview.js — deterministic pre-approval inspection for one exact AI tool call. This is an explanatory safety layer, not an authority source: BudgetLimiter policy and the ToolRouter capability boundary remain final.",
      "exports": [
        {
          "name": "ToolActionReview",
          "kind": "class",
          "signature": "class ToolActionReview",
          "summary": ""
        },
        {
          "name": "reviewToolAction",
          "kind": "function",
          "signature": "async reviewToolAction({ tool, args = {}, policy = null, appId = '', requestId = '', naviId = '', facultyId = '', taskId = '', proposal = null, } = {})",
          "summary": "Review one exact tool descriptor and argument object before approval."
        },
        {
          "name": "TOOL_ACTION_REVIEW_FORMAT",
          "kind": "constant",
          "signature": "TOOL_ACTION_REVIEW_FORMAT",
          "summary": ""
        },
        {
          "name": "TOOL_ACTION_REVIEW_DECISION",
          "kind": "constant",
          "signature": "TOOL_ACTION_REVIEW_DECISION",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/TransactionManager",
      "path": "webgpu-os/reference/kernel/execution/TransactionManager.md",
      "source": "webgpu-os/kernel/execution/TransactionManager.js",
      "import": "/webgpu-os/kernel/execution/TransactionManager.js",
      "sourceHash": "79adb6d1c4b6ce4d5664a649657346235be9d6f716898ebf8b2a3c63f186eb4c",
      "summary": "TransactionManager.js — wraps engine/state/transaction/Transaction.js (makeTransaction/sealTransaction) for the OS.ai() request/commit envelope, and engine/state/transaction/ProposalPool.js for candidate-proposal management (competing proposals over the same exclusive inputs pick a deterministic winner; losers re-observe and re-plan — never silently overwritten).",
      "exports": [
        {
          "name": "TransactionManager",
          "kind": "class",
          "signature": "class TransactionManager",
          "summary": ""
        },
        {
          "name": "PROPOSAL_STATUS",
          "kind": "re-export",
          "signature": "PROPOSAL_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/execution/TwoPassPlannerFinalizer",
      "path": "webgpu-os/reference/kernel/execution/TwoPassPlannerFinalizer.md",
      "source": "webgpu-os/kernel/execution/TwoPassPlannerFinalizer.js",
      "import": "/webgpu-os/kernel/execution/TwoPassPlannerFinalizer.js",
      "sourceHash": "5325426c7210278648a1690b3daa5a3b50de8bfe0b3707356ec8db9dcec8d11f",
      "summary": "TwoPassPlannerFinalizer.js — the Phase 9 execution loop (kernel.aiExecutor). Full flow per OS.ai() task: prompt → goal classify → gather context (roots-checked resource reads, PrivacyGuard-scrubbed) → capability negotiation (Ph4/Ph5 attestation) → model-tier choice → PASS 1 planner (JSON plan; tools executed through the AI Tool Firewall with idempotency keys, policy gating and approval elicitations) → PASS 2 finalizer (strict schema, NO tools) → validator → repair-if-needed (bounded RepairLoop) → CommitCoordinator commit → Witness receipt → Task Ledger record. The pipeline is driven as Phase 6 storylets over worldState.phase; every fired storylet returns `{ pending }` (see AIStoryletFactory) which this loop awaits, then applies `{ phase, wsPatch, facts, observations }` via StoryletEffectsApplier.",
      "exports": [
        {
          "name": "TwoPassPlannerFinalizer",
          "kind": "class",
          "signature": "class TwoPassPlannerFinalizer",
          "summary": ""
        },
        {
          "name": "normalizeActiveGuidanceProjection",
          "kind": "function",
          "signature": "normalizeActiveGuidanceProjection(value)",
          "summary": ""
        },
        {
          "name": "normalizeAIExecutorAppContextCandidates",
          "kind": "function",
          "signature": "normalizeAIExecutorAppContextCandidates(value)",
          "summary": "Normalize app-owned context before it crosses into the Navi task envelope. Applications may contribute only an identifier, a descriptive kind, and bounded text. Classification, authority, ranking, provenance, disclosure, and source hashes are deliberately absent because the kernel owns them."
        },
        {
          "name": "selectActiveGuidanceForTool",
          "kind": "function",
          "signature": "selectActiveGuidanceForTool(activeGuidance, toolName)",
          "summary": ""
        },
        {
          "name": "taskGraphRuntimeInvalidation",
          "kind": "function",
          "signature": "taskGraphRuntimeInvalidation(previousGraph, nextGraph, { approvalCount = 0, toolResults = [], } = {})",
          "summary": ""
        },
        {
          "name": "taskScopeInvalidatesApprovals",
          "kind": "function",
          "signature": "taskScopeInvalidatesApprovals(impact)",
          "summary": ""
        },
        {
          "name": "classifyToolRoundReplanning",
          "kind": "function",
          "signature": "classifyToolRoundReplanning(results = [])",
          "summary": ""
        },
        {
          "name": "naviModelRoutePreflightError",
          "kind": "function",
          "signature": "naviModelRoutePreflightError(decision, requirements = {}, route = {})",
          "summary": "Convert a content-free kernel route decision into one stable, actionable blocker. Eligibility remains owned by NaviModelBroker; this projection only explains why a zero-route decision stopped before disclosure or dispatch."
        },
        {
          "name": "providerToolTransportFallbackEligible",
          "kind": "function",
          "signature": "providerToolTransportFallbackEligible(error, request = {})",
          "summary": "Native provider tool envelopes are an optimization, not an execution authority. If preflight proves that the approved route set cannot carry them, the planner may fall back before disclosure or dispatch to its exact JSON transport. Privacy, policy, and other route failures remain terminal."
        },
        {
          "name": "compileNaviModelCompatibilityRequirements",
          "kind": "function",
          "signature": "compileNaviModelCompatibilityRequirements(rawRequest = {}, base = {})",
          "summary": "Compile hard model-route requirements from the actual model protocol. Provider tools are an optional typed generation transport; local descriptor, graph, authority, and receipt validation remain the execution boundary. Prompt-mediated exact JSON remains available when no native tools are sent."
        },
        {
          "name": "applyNaviModelProviderContract",
          "kind": "function",
          "signature": "applyNaviModelProviderContract(rawRequest = {}, purpose = 'chat')",
          "summary": "Bind strict schemas to provider parameter enforcement without mutating the caller request."
        },
        {
          "name": "strictOutputSchemaPortabilityErrors",
          "kind": "function",
          "signature": "strictOutputSchemaPortabilityErrors(rawSchema)",
          "summary": "Validate the conservative JSON Schema subset accepted by AI Echo's strict remote-model contract. This is intentionally narrower than JSON Schema: provider endpoints commonly require closed objects and every declared property to be listed in `required`. Dynamic tool payloads must cross the model boundary as JSON strings and are parsed and tool-schema-validated by the OS after generation."
        },
        {
          "name": "canonicalInvestigationArgumentHash",
          "kind": "function",
          "signature": "canonicalInvestigationArgumentHash(args)",
          "summary": ""
        },
        {
          "name": "isStrictInvestigationReadDescriptor",
          "kind": "function",
          "signature": "isStrictInvestigationReadDescriptor(descriptor)",
          "summary": ""
        },
        {
          "name": "selectInvestigationForPrompt",
          "kind": "function",
          "signature": "selectInvestigationForPrompt({ objective, taskKind = '', goalType = '' } = {})",
          "summary": ""
        },
        {
          "name": "normalizeInvestigationFrameResponse",
          "kind": "function",
          "signature": "normalizeInvestigationFrameResponse(value)",
          "summary": ""
        },
        {
          "name": "normalizeInvestigationObservationPlan",
          "kind": "function",
          "signature": "normalizeInvestigationObservationPlan(value)",
          "summary": ""
        },
        {
          "name": "normalizeInvestigationAssessmentResponse",
          "kind": "function",
          "signature": "normalizeInvestigationAssessmentResponse(value, observationIds, caseRecord)",
          "summary": ""
        },
        {
          "name": "validateInvestigationReadReceipt",
          "kind": "function",
          "signature": "async validateInvestigationReadReceipt({ kernel, ws, result, descriptorHash, argumentHash, dataClassification, caseId = null, } = {})",
          "summary": ""
        },
        {
          "name": "investigationEvidenceProjection",
          "kind": "function",
          "signature": "investigationEvidenceProjection(evidence, cycle)",
          "summary": ""
        },
        {
          "name": "resolveInvestigationDataClassification",
          "kind": "function",
          "signature": "resolveInvestigationDataClassification(descriptor)",
          "summary": ""
        },
        {
          "name": "parseSteeringModelClassification",
          "kind": "function",
          "signature": "parseSteeringModelClassification(value)",
          "summary": "Parse the advisory free-lane steering classifier. This envelope cannot grant authority, and `cancel` is intentionally absent so an uncertain model can never stop operator work. Prose/fences are tolerated only when they contain one bounded JSON object, which keeps small free models useful without making their formatting part of the task-control boundary."
        },
        {
          "name": "validatePlannerTransportEnvelope",
          "kind": "function",
          "signature": "validatePlannerTransportEnvelope(value)",
          "summary": "Validate the canonical OS planner envelope. Provider-side schema enforcement is never required: provider-native exact JSON is projected into this closed transport before local graph, descriptor, authority, and receipt validation. This validator remains the authoritative canonical boundary. The returned diagnostics contain schema paths only and never echo tool arguments or provider text."
        },
        {
          "name": "validatePlannerTransportResponse",
          "kind": "function",
          "signature": "validatePlannerTransportResponse(value)",
          "summary": ""
        },
        {
          "name": "plannerResultTransportCandidate",
          "kind": "function",
          "signature": "plannerResultTransportCandidate(result)",
          "summary": "Prefer a completed typed provider tool batch over assistant prose."
        },
        {
          "name": "plannerTransportShapeEvidence",
          "kind": "function",
          "signature": "plannerTransportShapeEvidence(value)",
          "summary": "Return a content-free structural description of a planner response. Provider text is never copied. The evidence is safe for durable diagnostics and distinguishes common repair cases without guessing at model intent."
        },
        {
          "name": "plannerTransportRejection",
          "kind": "function",
          "signature": "plannerTransportRejection(error, retainedText)",
          "summary": "Recover a locally repairable planner envelope from a terminal broker error. The kernel broker converts a rejected `resultValidator` verdict into a route failure and discards the provider result. When the selected route is pinned (manual routing) or every approved compatible route is exhausted, that error reaches the executor and would end the run — even though the exact rejected text is still available and repairable. Only malformed-kind local admission rejections with retained text qualify; policy, authority, abort, outage, and truncation failures stay terminal under their normal rules."
        },
        {
          "name": "normalizePlannerOutput",
          "kind": "function",
          "signature": "normalizePlannerOutput(value)",
          "summary": ""
        },
        {
          "name": "normalizePlannerResponse",
          "kind": "function",
          "signature": "normalizePlannerResponse(text)",
          "summary": "Normalize a planner response while accepting one safe prose outcome: an explicit statement that no tool calls are needed. This lets smaller local models finish a no-op planning round without inventing a tool invocation."
        },
        {
          "name": "isDirectConversationPrompt",
          "kind": "function",
          "signature": "isDirectConversationPrompt(value)",
          "summary": "Bounded social turns should go straight to the answer pass. AI Echo advertises core tools on every turn, which must not force greetings, introductions, acknowledgements, or personal conversation through planner JSON. Explicit tool/OS action language always wins and stays on the planner."
        },
        {
          "name": "hasLivePatchMutationIntent",
          "kind": "function",
          "signature": "hasLivePatchMutationIntent(value)",
          "summary": ""
        },
        {
          "name": "hasExplicitLivePatchIntent",
          "kind": "function",
          "signature": "hasExplicitLivePatchIntent(value)",
          "summary": ""
        },
        {
          "name": "hasSavedArtifactIntent",
          "kind": "function",
          "signature": "hasSavedArtifactIntent(text)",
          "summary": "A saved work product is canonical VFS state, not a formatting style. The compatibility terms Artifact and gem, plus the preferred Dodad name, are weighted with actions and surrounding context so no single token can force a mutation and ordinary domain discussion remains answer-only."
        },
        {
          "name": "savedArtifactPreferredKind",
          "kind": "function",
          "signature": "savedArtifactPreferredKind(text)",
          "summary": "Resolve the saved-work storage kind requested by the operator. Web is the OS default because it preserves semantic structure, presentation, and optional interaction as independently editable files. Every kind competes through the same weighted evidence scorecard."
        },
        {
          "name": "savedArtifactIntentProfile",
          "kind": "function",
          "signature": "savedArtifactIntentProfile(text)",
          "summary": "Deterministic, content-local saved-work routing. Chat, web, document, code, table, chart, data, and declarative UI candidates all collect weighted positive, negative, and context signals. Explicit multi-word requests score strongly but never bypass comparison, ambiguity reporting, or negation. The scorecard is safe to expose in receipts and never grants tools, changes privacy classification, or replaces provider capability checks."
        },
        {
          "name": "savedArtifactPlannerFormatContract",
          "kind": "function",
          "signature": "savedArtifactPlannerFormatContract(text)",
          "summary": "Content-free planner instruction for the exact default Artifact shape."
        },
        {
          "name": "prioritizeRequiredPlannerTools",
          "kind": "function",
          "signature": "prioritizeRequiredPlannerTools(toolDescs, requiredNames = [])",
          "summary": "Present required tools first without changing the locally authoritative descriptor set. This is a provider-visibility projection only; it grants no capability and does not weaken descriptor or argument validation."
        },
        {
          "name": "classifySavedArtifactPlanSteps",
          "kind": "function",
          "signature": "classifySavedArtifactPlanSteps(steps, pending = false, { preferredKind = '' } = {})",
          "summary": "Content-free obligation check used before executing a planner round."
        },
        {
          "name": "buildSavedArtifactWebFiles",
          "kind": "function",
          "signature": "buildSavedArtifactWebFiles({ title = 'AI Echo Artifact', authoredHtml = '' } = {})",
          "summary": "Build the deterministic three-file web project used by the OS-owned Artifact fallback. The authored HTML remains the model's work product while the shell, visual system, and progressive enhancement are local and stable."
        },
        {
          "name": "savedArtifactFallbackTitle",
          "kind": "function",
          "signature": "savedArtifactFallbackTitle(text)",
          "summary": "Build a useful bounded title without trusting model-generated metadata."
        },
        {
          "name": "normalizeSavedArtifactFallbackContent",
          "kind": "function",
          "signature": "normalizeSavedArtifactFallbackContent(value, { kind = 'document' } = {})",
          "summary": "Admit plain authored content before the OS constructs a signed mutation."
        },
        {
          "name": "hasWorkspaceOutputLookupIntent",
          "kind": "function",
          "signature": "hasWorkspaceOutputLookupIntent(text)",
          "summary": "Detect a request to locate, verify, or explain the absence of saved output."
        },
        {
          "name": "workspaceOutputSearchAssessment",
          "kind": "function",
          "signature": "workspaceOutputSearchAssessment(toolResults)",
          "summary": "Project exact storage.search evidence into a bounded, content-free decision. A negative conclusion is complete only when VFS enumeration was untruncated and the same-task Workspace Output Index rebuild succeeded for /user."
        },
        {
          "name": "isWorkspaceOutputMissingClaim",
          "kind": "function",
          "signature": "isWorkspaceOutputMissingClaim(text)",
          "summary": ""
        },
        {
          "name": "unattemptedObligationEvidence",
          "kind": "function",
          "signature": "unattemptedObligationEvidence(obligation, toolDescription)",
          "summary": "Report a declared obligation that ended without a tool dispatch. The OS may only state what it observed. Recognizing refusal-shaped wording in planner prose is evidence that the round ended without an attempt, never evidence of *why*: the same words appear when a model merely discusses an earlier failure, and asserting a provider policy refusal from them puts a fabricated cause in front of the operator as OS evidence. The dispatch count is checkable, so that is what the finalizer is told."
        },
        {
          "name": "isExplicitSavedArtifactRefusal",
          "kind": "function",
          "signature": "isExplicitSavedArtifactRefusal(text)",
          "summary": "Recognize refusal-shaped planner prose tied to creating or saving a Dodad. This keeps that outcome off the JSON repair path, which cannot fix prose, while leaving arbitrary malformed planner output on the normal bounded repair path. It attests wording only — never a provider decision."
        },
        {
          "name": "currentUserPromptForRouting",
          "kind": "function",
          "signature": "currentUserPromptForRouting(value)",
          "summary": "AI Echo may wrap a short follow-up with bounded conversation history. Route on the explicit current-message section so old tool requests cannot turn a greeting or acknowledgement into a new planner round. The complete prompt remains untouched and is still supplied to the answer pass as context."
        },
        {
          "name": "livePatchRoutingText",
          "kind": "function",
          "signature": "livePatchRoutingText(value)",
          "summary": "Recover one narrow capability correction from AI Echo's managed follow-up wrapper without allowing arbitrary older turns to reactivate themselves."
        },
        {
          "name": "normalizeFinalizerOutput",
          "kind": "function",
          "signature": "normalizeFinalizerOutput(value, schema = DEFAULT_OUTPUT_SCHEMA, rawText = '')",
          "summary": "Normalize common provider answer envelopes without inventing answer content."
        },
        {
          "name": "readOnlyObservationSignature",
          "kind": "function",
          "signature": "readOnlyObservationSignature(results, toolDriver = null)",
          "summary": "Return a deterministic signature only when a round contains no mutation. Matching signatures mean both the calls and the resulting observations were unchanged, so another identical re-plan round cannot add evidence."
        },
        {
          "name": "toolRoundSignature",
          "kind": "function",
          "signature": "toolRoundSignature(results)",
          "summary": "A bounded deterministic fingerprint used to detect alternating planner cycles."
        },
        {
          "name": "detectFinalToolEnvelope",
          "kind": "function",
          "signature": "detectFinalToolEnvelope(answer, toolDriver = null, toolResults = [])",
          "summary": "Detect executable tool-call JSON leaked into final prose. A matching receipt proves the action ran, but it does not make a raw tool envelope a valid user answer. Fenced examples are ignored. The detector parses bounded complete objects and never evaluates model-authored content."
        },
        {
          "name": "resolveNegotiatedToolName",
          "kind": "function",
          "signature": "resolveNegotiatedToolName(requestedName, capabilities = [])",
          "summary": ""
        },
        {
          "name": "resolveNaviExecutionMode",
          "kind": "function",
          "signature": "resolveNaviExecutionMode(kernel)",
          "summary": ""
        },
        {
          "name": "plannerOutputParams",
          "kind": "function",
          "signature": "plannerOutputParams(params)",
          "summary": "Guarantee the planner enough output budget to emit a plan after reasoning. A reasoning model spends its output allowance on a thinking trace before it writes any content. With a chat-sized allowance the trace is truncated mid-stream, the content channel stays empty, and the transport reports \"invalid JSON\" for a response that never contained a plan at all — a failure no local repair can fix, because there is nothing to extract. Raise the floor only; a larger operator setting is always honoured."
        },
        {
          "name": "jsonOnlyReasoningDirective",
          "kind": "function",
          "signature": "jsonOnlyReasoningDirective(model)",
          "summary": "Return the model-native directive that suppresses a thinking trace, if the route documents one. NVIDIA Nemotron and hybrid Qwen3 were both trained on the same `/think` and `/no_think` soft switch, and both default to reasoning when no signal is present — which is why a JSON-only pass gets a monologue it never asked for. This is message text rather than an API parameter, so it needs no gateway support and a model that does not recognize it simply answers normally. The gateway alternatives do not cover this case: OpenRouter honours `reasoning.max_tokens` only for Gemini, Anthropic and some Qwen, `effort` only for OpenAI and Grok, and `exclude` still spends the budget on hidden thinking. Only JSON-only passes pass through here; prose answers keep their reasoning."
        },
        {
          "name": "isTransientNaviExecutionState",
          "kind": "function",
          "signature": "isTransientNaviExecutionState(value)",
          "summary": ""
        },
        {
          "name": "naviCognitionDenialMessage",
          "kind": "function",
          "signature": "naviCognitionDenialMessage(mode)",
          "summary": "Explain a cognition denial without hiding the exact kernel state or code. A still-transient state at the end of the startup budget is not the same condition as a terminal one: nothing is wrong with the operator's setup and the identical request usually succeeds once the bind settles. Saying only \"unavailable\" there sends operators looking for a fault that does not exist."
        },
        {
          "name": "waitForNaviExecutionMode",
          "kind": "function",
          "signature": "waitForNaviExecutionMode(kernel, { timeoutMs = NAVI_COGNITION_TRANSIENT_WAIT_MS, signal = null, } = {})",
          "summary": "Hold a newly accepted, still side-effect-free task across one short kernel authority rebind. The wait never bypasses Navi, never dispatches a provider, and resolves immediately when the state becomes ready or terminal."
        },
        {
          "name": "resolveNaviFacultyToolInvocation",
          "kind": "function",
          "signature": "resolveNaviFacultyToolInvocation(toolName, rawArgs = {})",
          "summary": ""
        },
        {
          "name": "projectVerifiedFacultyOutcomeAck",
          "kind": "function",
          "signature": "projectVerifiedFacultyOutcomeAck(receiptEvidence, replayed = false)",
          "summary": "Content-free learning projection from kernel-verified Faculty evidence. This carries no arguments, result payload, provider reasoning, capability, approval, or authority. Consumers may use it only as review evidence."
        },
        {
          "name": "projectArtifactFileActivity",
          "kind": "function",
          "signature": "projectArtifactFileActivity({ toolName = '', args = {}, result = null, phase = 'preparing', errorCode = null, error = null, } = {})",
          "summary": "Project one local-only Artifact file operation for Run Details. A bounded incoming-content preview lets the operator inspect the exact write while it is active; it is never added to provider-visible results, signed receipts, diagnostics, or Companion messages. Exact absolute paths, sizes, and hashes still appear only after the locally verified Artifact receipt."
        },
        {
          "name": "NAVI_TOOL_PLAN_OUTPUT_SCHEMA",
          "kind": "constant",
          "signature": "NAVI_TOOL_PLAN_OUTPUT_SCHEMA",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/AgentScratchpad",
      "path": "webgpu-os/reference/kernel/ledger/AgentScratchpad.md",
      "source": "webgpu-os/kernel/ledger/AgentScratchpad.js",
      "import": "/webgpu-os/kernel/ledger/AgentScratchpad.js",
      "sourceHash": "5af2418d13fe496e1ce160aba30236417409730613f9cd9f2cd0d762bcee64bc",
      "summary": "AgentScratchpad.js — bounded execution notes for AI requests. This records operational state (plans, actions, observations, failures and phase changes), not hidden model reasoning. Entries are safe to render in a task report and give the user a replayable account of what the agent did.",
      "exports": [
        {
          "name": "AgentScratchpad",
          "kind": "class",
          "signature": "class AgentScratchpad",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/BlockerList",
      "path": "webgpu-os/reference/kernel/ledger/BlockerList.md",
      "source": "webgpu-os/kernel/ledger/BlockerList.js",
      "import": "/webgpu-os/kernel/ledger/BlockerList.js",
      "sourceHash": "bdc3f1b7ce0deb526ccc67b4a81abe555086763386bdf88f37614be0b0b3b844",
      "summary": "BlockerList.js — active blockers for an AI request: pending approvals, unanswered elicitations, effects parked for reconciliation, denied capabilities. The overlay's Mini Bar badge count comes from here.",
      "exports": [
        {
          "name": "BlockerList",
          "kind": "class",
          "signature": "class BlockerList",
          "summary": ""
        },
        {
          "name": "BLOCKER_KIND",
          "kind": "re-export",
          "signature": "BLOCKER_KIND",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/BoundedTrace",
      "path": "webgpu-os/reference/kernel/ledger/BoundedTrace.md",
      "source": "webgpu-os/kernel/ledger/BoundedTrace.js",
      "import": "/webgpu-os/kernel/ledger/BoundedTrace.js",
      "sourceHash": "576a5b7e2f6ef92796431a5ad99dbbd36eea886cdf707f99b74f5740b9b5593d",
      "summary": "BoundedTrace.js — shared base for the ledger's simple per-request traces (resource reads, sampling, elicitations, storylet fires): bounded, timestamped, requestId-keyed append log. Type-specific traces extend this instead of quadruplicating the same buffer logic.",
      "exports": [
        {
          "name": "BoundedTrace",
          "kind": "class",
          "signature": "class BoundedTrace",
          "summary": "BoundedTrace.js — shared base for the ledger's simple per-request traces (resource reads, sampling, elicitations, storylet fires): bounded, timestamped, requestId-keyed append log. Type-specific traces extend this instead of quadruplicating the same buffer logic."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/ElicitationTrace",
      "path": "webgpu-os/reference/kernel/ledger/ElicitationTrace.md",
      "source": "webgpu-os/kernel/ledger/ElicitationTrace.js",
      "import": "/webgpu-os/kernel/ledger/ElicitationTrace.js",
      "sourceHash": "086ab6026f5d216e072403b4798ef0bfbde1cf5c28ab577bbe80212f93015c4b",
      "summary": "ElicitationTrace.js — ledger trace of mid-task user questions (Phase 4 ElicitationManager): what was asked, whether the user answered/declined/ timed out, and how long the task waited.",
      "exports": [
        {
          "name": "ElicitationTrace",
          "kind": "class",
          "signature": "class ElicitationTrace extends BoundedTrace",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/ExecutionGraph",
      "path": "webgpu-os/reference/kernel/ledger/ExecutionGraph.md",
      "source": "webgpu-os/kernel/ledger/ExecutionGraph.js",
      "import": "/webgpu-os/kernel/ledger/ExecutionGraph.js",
      "sourceHash": "be70a7ae8cfdc5c7e439dc99698cdccc84882359b1c07f3f6afaa67a795c58d6",
      "summary": "ExecutionGraph.js — the executed-steps DAG for an AI request: nodes are storylet fires / tool calls / model passes; edges are causal (\"B used A's output\"). Feeds the Timeline Panel's graph view.",
      "exports": [
        {
          "name": "ExecutionGraph",
          "kind": "class",
          "signature": "class ExecutionGraph",
          "summary": "ExecutionGraph.js — the executed-steps DAG for an AI request: nodes are storylet fires / tool calls / model passes; edges are causal (\"B used A's output\"). Feeds the Timeline Panel's graph view."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/FinalReport",
      "path": "webgpu-os/reference/kernel/ledger/FinalReport.md",
      "source": "webgpu-os/kernel/ledger/FinalReport.js",
      "import": "/webgpu-os/kernel/ledger/FinalReport.js",
      "sourceHash": "e7bf16cd137f29b591ec38af42044e15f612e78ee785e7cfe0dcbad32e4a6d73",
      "summary": "FinalReport.js — assembles the end-of-task report for one AI request from the ledger's parts: goal outcome, task summary, tool/resource/sampling/ elicitation activity, blockers hit, receipts issued. This is what the overlay shows when a task completes and what gets persisted with the request record.",
      "exports": [
        {
          "name": "FinalReport",
          "kind": "class",
          "signature": "class FinalReport",
          "summary": ""
        },
        {
          "name": "projectArtifactToolFailureDiagnostic",
          "kind": "function",
          "signature": "projectArtifactToolFailureDiagnostic(value = {})",
          "summary": "Convert an Artifact mutation failure into a fixed, content-free diagnostic. Raw handler text is used only to select a known category and is never returned, so prompts, file contents, tool arguments, and provider bodies cannot enter Run Details or copied diagnostics through this path."
        },
        {
          "name": "projectProviderFailureDiagnostic",
          "kind": "function",
          "signature": "projectProviderFailureDiagnostic(value)",
          "summary": "Keep only broker-authored, content-free failure evidence. Provider payloads, prompts, credentials, endpoints, and response bodies are deliberately absent."
        },
        {
          "name": "projectNaviModelRouteBlocker",
          "kind": "function",
          "signature": "projectNaviModelRouteBlocker(value)",
          "summary": "Preserve a content-free model compatibility decision when the kernel stops before provider dispatch. This is intentionally separate from `modelExecution`: zero attempts is evidence that no provider was called."
        },
        {
          "name": "projectModelExecutionDiagnostic",
          "kind": "function",
          "signature": "projectModelExecutionDiagnostic(value)",
          "summary": "Project a Navi broker execution into a bounded diagnostic receipt. Request hashes and partial-result hashes are intentionally excluded because they can fingerprint operator content without helping an operator diagnose routing."
        },
        {
          "name": "publicErrorNumberForFailure",
          "kind": "function",
          "signature": "publicErrorNumberForFailure({ errorCode = '', failure = null } = {})",
          "summary": ""
        },
        {
          "name": "createAIIncidentId",
          "kind": "function",
          "signature": "createAIIncidentId(requestId)",
          "summary": ""
        },
        {
          "name": "projectAIEchoPipelineTrace",
          "kind": "function",
          "signature": "projectAIEchoPipelineTrace(value, { requestId = '', incidentId = null, outcome = '', errorCode = null, errorNumber = null, openedAt = 0, closedAt = 0, } = {})",
          "summary": "Project the existing resumable run stream into one compact, durable, content-free diagnostic trace. This is deliberately a report projection, not a second event registry or ledger. Unknown fields are dropped rather than recursively scrubbed so prompts, provider bodies, credentials, raw tool arguments, and reasoning deltas cannot cross this boundary."
        },
        {
          "name": "AI_ECHO_ROUTE_ERROR_NUMBERS",
          "kind": "constant",
          "signature": "AI_ECHO_ROUTE_ERROR_NUMBERS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/GoalTree",
      "path": "webgpu-os/reference/kernel/ledger/GoalTree.md",
      "source": "webgpu-os/kernel/ledger/GoalTree.js",
      "import": "/webgpu-os/kernel/ledger/GoalTree.js",
      "sourceHash": "b383dcac5184ec7db80e28fd5ae4d13029dd8f882bac9a614ef23fcdb7841b55",
      "summary": "GoalTree.js — hierarchical goal decomposition for an AI request: the root goal (the user's prompt intent) breaks into subgoals; each node tracks its status so the Task Panel can render live progress.",
      "exports": [
        {
          "name": "GoalTree",
          "kind": "class",
          "signature": "class GoalTree",
          "summary": ""
        },
        {
          "name": "GOAL_STATUS",
          "kind": "re-export",
          "signature": "GOAL_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/ObservationLog",
      "path": "webgpu-os/reference/kernel/ledger/ObservationLog.md",
      "source": "webgpu-os/kernel/ledger/ObservationLog.js",
      "import": "/webgpu-os/kernel/ledger/ObservationLog.js",
      "sourceHash": "032c5634c689e326a3b72be7abd4073d3f1cee2abf184784f503004b7549cb95",
      "summary": "ObservationLog.js — wraps engine/state/entity/ProvenanceStore.js: every observation an AI task makes carries W3C-PROV-style provenance (observed/inferred/model-predicted/user-asserted/untrusted). Tool/model/ resource content is recorded as UNTRUSTED observation by default — never authority (the prompt-injection boundary).",
      "exports": [
        {
          "name": "ObservationLog",
          "kind": "class",
          "signature": "class ObservationLog",
          "summary": ""
        },
        {
          "name": "CERTAINTY",
          "kind": "re-export",
          "signature": "CERTAINTY",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/ResourceReadTrace",
      "path": "webgpu-os/reference/kernel/ledger/ResourceReadTrace.md",
      "source": "webgpu-os/kernel/ledger/ResourceReadTrace.js",
      "import": "/webgpu-os/kernel/ledger/ResourceReadTrace.js",
      "sourceHash": "ceb6516be8cd7e3780e2d00697786b9a440ce40c153c2b991f1864fee2ddd620",
      "summary": "ResourceReadTrace.js — ledger trace of every `<appId>://...` resource read an AI request performed (URI, byte size, roots check outcome), so the Task Panel can show exactly WHAT the AI looked at.",
      "exports": [
        {
          "name": "ResourceReadTrace",
          "kind": "class",
          "signature": "class ResourceReadTrace extends BoundedTrace",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/SamplingTrace",
      "path": "webgpu-os/reference/kernel/ledger/SamplingTrace.md",
      "source": "webgpu-os/kernel/ledger/SamplingTrace.js",
      "import": "/webgpu-os/kernel/ledger/SamplingTrace.js",
      "sourceHash": "665b3c0c9c186570d53eed8e05c255a1f2fef8c1fa8277e7c97b9bf66b4b6e2e",
      "summary": "SamplingTrace.js — ledger trace of nested LLM completions requested by tool handlers via the SamplingBroker (Phase 4): parent request, depth, model tier, token/cost accounting when available.",
      "exports": [
        {
          "name": "SamplingTrace",
          "kind": "class",
          "signature": "class SamplingTrace extends BoundedTrace",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/StoryletTrace",
      "path": "webgpu-os/reference/kernel/ledger/StoryletTrace.md",
      "source": "webgpu-os/kernel/ledger/StoryletTrace.js",
      "import": "/webgpu-os/kernel/ledger/StoryletTrace.js",
      "sourceHash": "7a6b3bad12ce1f3989164f9057585d39605212887072a153e1ee0c1c4b0e13c3",
      "summary": "StoryletTrace.js — ledger trace of storylet fires for an AI request (Phase 6 pipeline): which storylet fired, the phase transition it caused, and its result summary.",
      "exports": [
        {
          "name": "StoryletTrace",
          "kind": "class",
          "signature": "class StoryletTrace extends BoundedTrace",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/TaskLedger",
      "path": "webgpu-os/reference/kernel/ledger/TaskLedger.md",
      "source": "webgpu-os/kernel/ledger/TaskLedger.js",
      "import": "/webgpu-os/kernel/ledger/TaskLedger.js",
      "sourceHash": "f972e686974d06b712af24901183933e7ce484c9198b4457fb345ee25ac004a5",
      "summary": "TaskLedger.js — aggregation facade over the Phase 8 ledger parts, wired as kernel.taskLedger. One shared instance holds cross-request traces (observations, tool calls, resource reads, sampling, elicitations, storylet fires, blockers) plus per-request records (goal tree, task list, execution graph, receipts). Every recorded receipt/witness reuses engine/state/witness/Witness.js (makeWitness/makeReceipt) and every record lands in the SHARED Phase 7 event log via kernel.timeEngine.record().",
      "exports": [
        {
          "name": "TaskLedger",
          "kind": "class",
          "signature": "class TaskLedger",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/TaskList",
      "path": "webgpu-os/reference/kernel/ledger/TaskList.md",
      "source": "webgpu-os/kernel/ledger/TaskList.js",
      "import": "/webgpu-os/kernel/ledger/TaskList.js",
      "sourceHash": "03b92bc779e59a37f42ad3ce585b5bceb9d2672ea0a240cba4b9e63a146585fc",
      "summary": "TaskList.js — flat, ordered task list for an AI request (each task usually maps to a goal-tree leaf + a storylet/tool step). Drives the Task Panel's checklist view.",
      "exports": [
        {
          "name": "TaskList",
          "kind": "class",
          "signature": "class TaskList",
          "summary": ""
        },
        {
          "name": "TASK_STATUS",
          "kind": "re-export",
          "signature": "TASK_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/ledger/ToolCallTrace",
      "path": "webgpu-os/reference/kernel/ledger/ToolCallTrace.md",
      "source": "webgpu-os/kernel/ledger/ToolCallTrace.js",
      "import": "/webgpu-os/kernel/ledger/ToolCallTrace.js",
      "sourceHash": "b6c9d0a3cfbeb4641008cbf153a512e2dc60c57942cb46811079f2793c339f5b",
      "summary": "ToolCallTrace.js — wraps engine/state/workflow/Outbox.js + Reconciler.js: every AI-initiated tool call is recorded as a transactional effect INTENT (idempotent by stable effect id — commit retries never duplicate a call), delivered via drain(), with ambiguous outcomes parked as RECONCILE and resolved by EVIDENCE (a probe of the authoritative status), never guessed.",
      "exports": [
        {
          "name": "ToolCallTrace",
          "kind": "class",
          "signature": "class ToolCallTrace",
          "summary": ""
        },
        {
          "name": "EFFECT_STATUS",
          "kind": "re-export",
          "signature": "EFFECT_STATUS",
          "summary": ""
        },
        {
          "name": "RECONCILE_RESULT",
          "kind": "re-export",
          "signature": "RECONCILE_RESULT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/live-patch/LivePatchService",
      "path": "webgpu-os/reference/kernel/live-patch/LivePatchService.md",
      "source": "webgpu-os/kernel/live-patch/LivePatchService.js",
      "import": "/webgpu-os/kernel/live-patch/LivePatchService.js",
      "sourceHash": "31a8185cab353c20f357649c1718ed67f9ce4e3d526aa12ab6ed0bbb4e821eaa",
      "summary": "LivePatchService.js — kernel-owned, declarative live UI editing. Model output never becomes executable code. A caller can inspect registered surfaces and propose a small allow-listed operation list. The service applies that list as a reversible preview, verifies the resulting DOM, and only then persists a canonical patch + receipt beneath /user/live-patches.",
      "exports": [
        {
          "name": "LivePatchService",
          "kind": "class",
          "signature": "class LivePatchService",
          "summary": ""
        },
        {
          "name": "validateLivePatchDraft",
          "kind": "function",
          "signature": "validateLivePatchDraft(input = {})",
          "summary": ""
        },
        {
          "name": "sanitizeLivePatchMarkup",
          "kind": "function",
          "signature": "sanitizeLivePatchMarkup(markup, { patchId = 'live_preview' } = {})",
          "summary": ""
        },
        {
          "name": "sanitizeLivePatchStylesheet",
          "kind": "function",
          "signature": "sanitizeLivePatchStylesheet(css)",
          "summary": ""
        },
        {
          "name": "LIVE_PATCH_FORMAT",
          "kind": "constant",
          "signature": "LIVE_PATCH_FORMAT",
          "summary": ""
        },
        {
          "name": "LIVE_PATCH_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "LIVE_PATCH_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "LIVE_PATCH_HEAD_FORMAT",
          "kind": "constant",
          "signature": "LIVE_PATCH_HEAD_FORMAT",
          "summary": ""
        },
        {
          "name": "LIVE_PATCH_CANDIDATE_FORMAT",
          "kind": "constant",
          "signature": "LIVE_PATCH_CANDIDATE_FORMAT",
          "summary": ""
        },
        {
          "name": "LIVE_PATCH_ACTIVATION_FORMAT",
          "kind": "constant",
          "signature": "LIVE_PATCH_ACTIVATION_FORMAT",
          "summary": ""
        },
        {
          "name": "LIVE_PATCH_ROOT",
          "kind": "constant",
          "signature": "LIVE_PATCH_ROOT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviAutonomyService",
      "path": "webgpu-os/reference/kernel/navi/NaviAutonomyService.md",
      "source": "webgpu-os/kernel/navi/NaviAutonomyService.js",
      "import": "/webgpu-os/kernel/navi/NaviAutonomyService.js",
      "sourceHash": "5272442132cf43cec4a6ac19d05531cc7a5e78eca1f055cd3b2c11ab050dbec8",
      "summary": "Kernel-owned structured operational cognition for one or more Navis. Entries are Navi-authored conclusions, evidence, uncertainty, proposals, and budget accounting. They are never provider-hidden reasoning or raw model transcripts. The injected continuity cipher owns encryption; this service never receives or exposes a generic key or decryption API.",
      "exports": [
        {
          "name": "NaviAutonomyServiceError",
          "kind": "class",
          "signature": "class NaviAutonomyServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviAutonomyService",
          "kind": "class",
          "signature": "class NaviAutonomyService",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_JOURNAL_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_JOURNAL_RECORD_TYPE",
          "summary": "Kernel-owned structured operational cognition for one or more Navis. Entries are Navi-authored conclusions, evidence, uncertainty, proposals, and budget accounting. They are never provider-hidden reasoning or raw model transcripts. The injected continuity cipher owns encryption; this service never receives or exposes a generic key or decryption API."
        },
        {
          "name": "NAVI_OPERATIONAL_JOURNAL_INDEX_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_JOURNAL_INDEX_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_JOURNAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_JOURNAL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_JOURNAL_INDEX_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_JOURNAL_INDEX_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_JOURNAL_INDEX_MIGRATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_JOURNAL_INDEX_MIGRATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_COGNITION_BOUNDARY",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_COGNITION_BOUNDARY",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviBackgroundCoordinator",
      "path": "webgpu-os/reference/kernel/navi/NaviBackgroundCoordinator.md",
      "source": "webgpu-os/kernel/navi/NaviBackgroundCoordinator.js",
      "import": "/webgpu-os/kernel/navi/NaviBackgroundCoordinator.js",
      "sourceHash": "44a9657cef14790fd8ad7b8482a91f75bbd1e10f27900ab61f342ce96358488b",
      "summary": "Persistent, cross-tab coordinator for bounded Navi background cognition. Web Locks is the execution authority: one exclusive lock remains held across the durable reread, executor call, operational-journal append, and terminal job update. BroadcastChannel is observability and wake-up only; peer messages never grant authority or replace the durable encrypted job record.",
      "exports": [
        {
          "name": "NaviBackgroundCoordinatorError",
          "kind": "class",
          "signature": "class NaviBackgroundCoordinatorError extends Error",
          "summary": ""
        },
        {
          "name": "NaviBackgroundTransientExecutionError",
          "kind": "class",
          "signature": "class NaviBackgroundTransientExecutionError extends NaviBackgroundCoordinatorError",
          "summary": "Explicit retry signal accepted from the kernel-owned background executor. Arbitrary errors cannot opt into retries by attaching `retryable` or `kind` fields: the coordinator accepts only instances privately branded here, and this constructor admits only the closed outage/throttle transient set."
        },
        {
          "name": "NaviBackgroundCoordinator",
          "kind": "class",
          "signature": "class NaviBackgroundCoordinator",
          "summary": ""
        },
        {
          "name": "buildNaviBackgroundCognitionPrompt",
          "kind": "function",
          "signature": "buildNaviBackgroundCognitionPrompt({ operation = '', objective = '' } = {})",
          "summary": ""
        },
        {
          "name": "naviBackgroundTokenEnvelope",
          "kind": "function",
          "signature": "naviBackgroundTokenEnvelope({ operation = '', objective = '', outputTokens = 0, routeAttempts = 1, } = {})",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_JOB_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_JOB_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_JOB_INDEX_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_JOB_INDEX_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_JOB_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_JOB_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_JOB_INDEX_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_JOB_INDEX_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_JOB_INDEX_MIGRATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_JOB_INDEX_MIGRATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_CONTEXT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_CONTEXT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_CHANNEL",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_CHANNEL",
          "summary": ""
        },
        {
          "name": "NAVI_BACKGROUND_ROUTE_ATTEMPT_LIMIT",
          "kind": "constant",
          "signature": "NAVI_BACKGROUND_ROUTE_ATTEMPT_LIMIT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviBackupRecoveryService",
      "path": "webgpu-os/reference/kernel/navi/NaviBackupRecoveryService.md",
      "source": "webgpu-os/kernel/navi/NaviBackupRecoveryService.js",
      "import": "/webgpu-os/kernel/navi/NaviBackupRecoveryService.js",
      "sourceHash": "d79818b9ec04829ca5cfa5f3118cb74f7e2eb027eaf66875a24e1d2e469a2913",
      "summary": "Signed, encrypted Navi backups and recovery-branch reconciliation. This service never exports a credential, a private CryptoKey, raw provider output, a live capability, or a canonical write authority. Restore decrypts and validates into a durable non-canonical branch. Only an exact reviewed diff may reach an injected canonical merge applier.",
      "exports": [
        {
          "name": "NaviBackupRecoveryError",
          "kind": "class",
          "signature": "class NaviBackupRecoveryError extends Error",
          "summary": ""
        },
        {
          "name": "NaviBackupIntegrityError",
          "kind": "class",
          "signature": "class NaviBackupIntegrityError extends NaviBackupRecoveryError",
          "summary": ""
        },
        {
          "name": "NaviBackupRecoveryService",
          "kind": "class",
          "signature": "class NaviBackupRecoveryService",
          "summary": ""
        },
        {
          "name": "isDeterministicRecoveryBranchRegistrationFailure",
          "kind": "function",
          "signature": "isDeterministicRecoveryBranchRegistrationFailure(error)",
          "summary": ""
        },
        {
          "name": "createNaviBackupStateReader",
          "kind": "function",
          "signature": "createNaviBackupStateReader({ continuityStore, cognitionStore } = {})",
          "summary": "Build the production state reader over already initialized continuity and cognition Stores. The reader exports only the Phase 7 allow-list."
        },
        {
          "name": "NAVI_ENCRYPTED_BACKUP_BUNDLE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_ENCRYPTED_BACKUP_BUNDLE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_BACKUP_PAYLOAD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BACKUP_PAYLOAD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_BACKUP_FILE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BACKUP_FILE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECONCILIATION_DIFF_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECONCILIATION_DIFF_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_MERGE_APPROVAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_MERGE_APPROVAL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_IMPORT_APPROVAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_IMPORT_APPROVAL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_MERGE_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_MERGE_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_SETTLEMENT_JOURNAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_SETTLEMENT_JOURNAL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_SETTLEMENT_INTENT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_SETTLEMENT_INTENT_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviCognitionService",
      "path": "webgpu-os/reference/kernel/navi/NaviCognitionService.md",
      "source": "webgpu-os/kernel/navi/NaviCognitionService.js",
      "import": "/webgpu-os/kernel/navi/NaviCognitionService.js",
      "sourceHash": "e839b244d2c937406201840a6016164b1da44c7be6fd4cb210128cd64dd6fc16",
      "summary": "NaviCognitionService — kernel authority for model-neutral task continuity. Provider conversations are transports, never task storage. This service persists signed task envelopes, per-Navi routes, self-model state, disclosure receipts, and encrypted checkpoints before exposing immutable projections.",
      "exports": [
        {
          "name": "NaviCognitionServiceError",
          "kind": "class",
          "signature": "class NaviCognitionServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviCognitionService",
          "kind": "class",
          "signature": "class NaviCognitionService",
          "summary": ""
        },
        {
          "name": "NAVI_SELF_MODEL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_SELF_MODEL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_IDENTITY_PROFILE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_IDENTITY_PROFILE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_ROUTE_CONFIGURATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_ROUTE_CONFIGURATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_CHECKPOINT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_TASK_CHECKPOINT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_ROUTE_EVIDENCE_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_ROUTE_EVIDENCE_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_DISPATCH_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MODEL_DISPATCH_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_DISPATCH_RECOVERY_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DISPATCH_RECOVERY_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_DISPATCH_RECOVERY_STATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DISPATCH_RECOVERY_STATE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_ROUTE_AUTHORIZATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_ROUTE_AUTHORIZATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_SOURCE_BINDINGS_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_SOURCE_BINDINGS_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_GUIDANCE_OBSERVATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_GUIDANCE_OBSERVATION_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviCognitionStore",
      "path": "webgpu-os/reference/kernel/navi/NaviCognitionStore.md",
      "source": "webgpu-os/kernel/navi/NaviCognitionStore.js",
      "import": "/webgpu-os/kernel/navi/NaviCognitionStore.js",
      "sourceHash": "a5631c1fe2c9db2faf63094263086e353214a8188a8e30470bcb709f962d3478",
      "summary": "Durable ciphertext-only storage for the Navi Cognition Fabric. The Store deliberately knows nothing about task, context, or self-model plaintext. A kernel-only continuity cipher creates authenticated record envelopes before they reach this boundary. Invalid data is quarantined instead of becoming an empty task, route configuration, or self-model.",
      "exports": [
        {
          "name": "NaviCognitionStoreError",
          "kind": "class",
          "signature": "class NaviCognitionStoreError extends Error",
          "summary": ""
        },
        {
          "name": "NaviCognitionStoreConflictError",
          "kind": "class",
          "signature": "class NaviCognitionStoreConflictError extends NaviCognitionStoreError",
          "summary": ""
        },
        {
          "name": "NaviCognitionStoreQuarantineError",
          "kind": "class",
          "signature": "class NaviCognitionStoreQuarantineError extends NaviCognitionStoreError",
          "summary": ""
        },
        {
          "name": "IndexedDbCognitionBackend",
          "kind": "class",
          "signature": "class IndexedDbCognitionBackend",
          "summary": ""
        },
        {
          "name": "NaviCognitionStore",
          "kind": "class",
          "signature": "class NaviCognitionStore",
          "summary": ""
        },
        {
          "name": "validateNaviCognitionRecord",
          "kind": "function",
          "signature": "async validateNaviCognitionRecord(value, expected = {})",
          "summary": "Verify one portable encrypted cognition row without opening its Store. Recovery uses this exact validator before an authenticated backup row may enter a reconciliation branch. The function validates the same binding, envelope hash, and record integrity hash as the live Store read path."
        },
        {
          "name": "NAVI_COGNITION_DATABASE_NAME",
          "kind": "constant",
          "signature": "NAVI_COGNITION_DATABASE_NAME",
          "summary": ""
        },
        {
          "name": "NAVI_COGNITION_DATABASE_VERSION",
          "kind": "constant",
          "signature": "NAVI_COGNITION_DATABASE_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_COGNITION_RECORDS_STORE",
          "kind": "constant",
          "signature": "NAVI_COGNITION_RECORDS_STORE",
          "summary": ""
        },
        {
          "name": "NAVI_COGNITION_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_COGNITION_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_COGNITION_QUARANTINE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_COGNITION_QUARANTINE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviContextCompiler",
      "path": "webgpu-os/reference/kernel/navi/NaviContextCompiler.md",
      "source": "webgpu-os/kernel/navi/NaviContextCompiler.js",
      "import": "/webgpu-os/kernel/navi/NaviContextCompiler.js",
      "sourceHash": "7e37a5be3fb431b6013a091ac73c0d61e50207ef7d2f5e441545d14a25fc20c9",
      "summary": "NaviContextCompiler.js — deterministic, policy-filtered Navi model context. This module is deliberately provider-agnostic. It accepts a previously verified active Covenant, filters every classified context item before any provider call can be made, and emits a content-free disclosure receipt. Provider sessions and model output never become canonical state here.",
      "exports": [
        {
          "name": "NaviContextCompilerError",
          "kind": "class",
          "signature": "class NaviContextCompilerError extends Error",
          "summary": ""
        },
        {
          "name": "NaviContextCompiler",
          "kind": "class",
          "signature": "class NaviContextCompiler",
          "summary": ""
        },
        {
          "name": "diffNaviContextManifests",
          "kind": "function",
          "signature": "async diffNaviContextManifests(previous, current)",
          "summary": ""
        },
        {
          "name": "compileNaviContext",
          "kind": "function",
          "signature": "compileNaviContext(input, options = {})",
          "summary": ""
        },
        {
          "name": "normalizeNaviContextItems",
          "kind": "function",
          "signature": "normalizeNaviContextItems(items)",
          "summary": ""
        },
        {
          "name": "estimateNaviContextTokens",
          "kind": "function",
          "signature": "estimateNaviContextTokens(content)",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_COMPILER_VERSION",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_COMPILER_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_DISCLOSURE_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_DISCLOSURE_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_DIFF_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_DIFF_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_CLASSIFICATION_QUERY_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_CLASSIFICATION_QUERY_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_CLASSIFICATION_RESOLUTION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_CLASSIFICATION_RESOLUTION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTEXT_CONTENT_LIMITS",
          "kind": "constant",
          "signature": "NAVI_CONTEXT_CONTENT_LIMITS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviContinuityService",
      "path": "webgpu-os/reference/kernel/navi/NaviContinuityService.md",
      "source": "webgpu-os/kernel/navi/NaviContinuityService.js",
      "import": "/webgpu-os/kernel/navi/NaviContinuityService.js",
      "sourceHash": "3b7c42519da0a5f8789873d365282a1fbcd5e31fe3c297bc77382dd34c5333bd",
      "summary": "NaviContinuityService.js — kernel authority for model-independent Navi identity. AI Echo and other Manifestations receive immutable public projections only. Private keys, generic signing/decryption, raw Store records, recovery bundles, and non-extractable CryptoKey handles never cross this boundary.",
      "exports": [
        {
          "name": "NaviContinuityServiceError",
          "kind": "class",
          "signature": "class NaviContinuityServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviContinuityServiceDisabledError",
          "kind": "class",
          "signature": "class NaviContinuityServiceDisabledError extends NaviContinuityServiceError",
          "summary": ""
        },
        {
          "name": "NaviContinuityServiceIntegrityError",
          "kind": "class",
          "signature": "class NaviContinuityServiceIntegrityError extends NaviContinuityServiceError",
          "summary": ""
        },
        {
          "name": "NaviContinuityService",
          "kind": "class",
          "signature": "class NaviContinuityService",
          "summary": ""
        },
        {
          "name": "validateNaviContinuityRecord",
          "kind": "function",
          "signature": "validateNaviContinuityRecord(value, expected = {})",
          "summary": "Store-level strict validator. Cryptographic verification remains the service's responsibility after opaque KeyVault restoration."
        },
        {
          "name": "createNaviContinuityService",
          "kind": "function",
          "signature": "createNaviContinuityService(options)",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_HEAD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_HEAD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_LINEAGE_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_LINEAGE_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ATTEMPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ATTEMPT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_BACKUP_RECOVERY_KIT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_BACKUP_RECOVERY_KIT_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviContinuityStore",
      "path": "webgpu-os/reference/kernel/navi/NaviContinuityStore.md",
      "source": "webgpu-os/kernel/navi/NaviContinuityStore.js",
      "import": "/webgpu-os/kernel/navi/NaviContinuityStore.js",
      "sourceHash": "39f6b74f9d90694d3afad185f9b7decf1b118ff688bd8d4345fa580470587c6b",
      "summary": "",
      "exports": [
        {
          "name": "NaviContinuityError",
          "kind": "class",
          "signature": "class NaviContinuityError extends Error",
          "summary": ""
        },
        {
          "name": "NaviContinuityDisabledError",
          "kind": "class",
          "signature": "class NaviContinuityDisabledError extends NaviContinuityError",
          "summary": ""
        },
        {
          "name": "NaviContinuityUnavailableError",
          "kind": "class",
          "signature": "class NaviContinuityUnavailableError extends NaviContinuityError",
          "summary": ""
        },
        {
          "name": "NaviContinuityStorageError",
          "kind": "class",
          "signature": "class NaviContinuityStorageError extends NaviContinuityError",
          "summary": ""
        },
        {
          "name": "NaviContinuityValidationError",
          "kind": "class",
          "signature": "class NaviContinuityValidationError extends NaviContinuityError",
          "summary": ""
        },
        {
          "name": "NaviContinuityConflictError",
          "kind": "class",
          "signature": "class NaviContinuityConflictError extends NaviContinuityError",
          "summary": ""
        },
        {
          "name": "NaviContinuityRevisionExhaustedError",
          "kind": "class",
          "signature": "class NaviContinuityRevisionExhaustedError extends NaviContinuityError",
          "summary": ""
        },
        {
          "name": "NaviContinuityQuarantineError",
          "kind": "class",
          "signature": "class NaviContinuityQuarantineError extends NaviContinuityError",
          "summary": ""
        },
        {
          "name": "NaviContinuityStore",
          "kind": "class",
          "signature": "class NaviContinuityStore",
          "summary": ""
        },
        {
          "name": "createNaviContinuityStore",
          "kind": "function",
          "signature": "createNaviContinuityStore(options)",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_DATABASE_NAME",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_DATABASE_NAME",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_DATABASE_VERSION",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_DATABASE_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_RECORDS_STORE",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_RECORDS_STORE",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_KEY_MATERIAL_STORE",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_KEY_MATERIAL_STORE",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_QUARANTINE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_QUARANTINE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_KEY_MATERIAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_KEY_MATERIAL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_MISSING_KEY_EVIDENCE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_MISSING_KEY_EVIDENCE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviCovenantTemplates",
      "path": "webgpu-os/reference/kernel/navi/NaviCovenantTemplates.md",
      "source": "webgpu-os/kernel/navi/NaviCovenantTemplates.js",
      "import": "/webgpu-os/kernel/navi/NaviCovenantTemplates.js",
      "sourceHash": "b37b8f296208af72dec437b2e5a8a2c2970fe7e5f96537a6016da4e4af966a31",
      "summary": "NaviCovenantTemplates.js — selectable operator–Navi Covenants and lifecycle policy. A Covenant is not active merely because it is well formed. Proposals require the primary operator's signature; activation and supersession require both the operator and the Navi to sign the exact same canonical contract bytes. Emergency suspension and revocation remain operator-authorized fail-safe transitions. This module exposes lifecycle operations, never a generic sign or decrypt primitive.",
      "exports": [
        {
          "name": "NaviCovenantError",
          "kind": "class",
          "signature": "class NaviCovenantError extends Error",
          "summary": ""
        },
        {
          "name": "NaviCovenantTemplateBlockedError",
          "kind": "class",
          "signature": "class NaviCovenantTemplateBlockedError extends NaviCovenantError",
          "summary": ""
        },
        {
          "name": "NaviCovenantSignatureError",
          "kind": "class",
          "signature": "class NaviCovenantSignatureError extends NaviCovenantError",
          "summary": ""
        },
        {
          "name": "listNaviCovenantTemplates",
          "kind": "function",
          "signature": "listNaviCovenantTemplates({ separationRecoveryReady = false } = {})",
          "summary": "Return immutable template descriptions without exposing mutable policy source objects."
        },
        {
          "name": "getNaviCovenantTemplate",
          "kind": "function",
          "signature": "getNaviCovenantTemplate(template = DEFAULT_NAVI_COVENANT_TEMPLATE, { separationRecoveryReady = false, } = {})",
          "summary": ""
        },
        {
          "name": "proposeNaviCovenant",
          "kind": "function",
          "signature": "async proposeNaviCovenant({ covenantId, naviId, operator = null, operatorSigner, template = DEFAULT_NAVI_COVENANT_TEMPLATE, revision = 1, effectiveAt = new Date()",
          "summary": "Create and operator-sign a proposed Covenant from one exact template."
        },
        {
          "name": "verifyNaviCovenant",
          "kind": "function",
          "signature": "async verifyNaviCovenant(covenant, { operatorVerifier = null, naviVerifier = null, keyResolver = null, historical = false, logger = null, } = {})",
          "summary": "Verify signature bytes, signer roles, key windows, and lifecycle quorum."
        },
        {
          "name": "activateNaviCovenant",
          "kind": "function",
          "signature": "async activateNaviCovenant(proposal, { operatorSigner, naviSigner, signedAt = new Date()",
          "summary": "Re-sign an accepted proposal as active with operator + Navi acknowledgment."
        },
        {
          "name": "reviseNaviCovenant",
          "kind": "function",
          "signature": "async reviseNaviCovenant(activeCovenant, { covenantId, operatorSigner, naviVerifier, template = null, effectiveAt = new Date()",
          "summary": "Create a signed next-revision proposal without mutating the active Covenant."
        },
        {
          "name": "suspendNaviCovenant",
          "kind": "function",
          "signature": "suspendNaviCovenant(covenant, options = {})",
          "summary": "Emergency fail-safe: the primary operator may suspend an active Covenant."
        },
        {
          "name": "revokeNaviCovenant",
          "kind": "function",
          "signature": "revokeNaviCovenant(covenant, options = {})",
          "summary": "Revoke an active or suspended Covenant; the original signed record remains verifiable."
        },
        {
          "name": "supersedeNaviCovenant",
          "kind": "function",
          "signature": "async supersedeNaviCovenant(covenant, { operatorSigner, naviSigner, signedAt = new Date()",
          "summary": "Mark an old active Covenant superseded after its dual-signed replacement is active."
        },
        {
          "name": "projectNaviCovenant",
          "kind": "function",
          "signature": "projectNaviCovenant(covenant)",
          "summary": "Return a safe, immutable projection with signature values and policy conditions removed."
        },
        {
          "name": "resolveScopedDelegateDecision",
          "kind": "function",
          "signature": "resolveScopedDelegateDecision(decisions = [])",
          "summary": "Resolve already-authorized scoped delegate votes. Conflicting decisions at the highest equal priority always pause; array order never breaks a tie."
        },
        {
          "name": "NAVI_COVENANT_TEMPLATE_IDS",
          "kind": "constant",
          "signature": "NAVI_COVENANT_TEMPLATE_IDS",
          "summary": ""
        },
        {
          "name": "DEFAULT_NAVI_COVENANT_TEMPLATE",
          "kind": "constant",
          "signature": "DEFAULT_NAVI_COVENANT_TEMPLATE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviDelegationBranchKeyService",
      "path": "webgpu-os/reference/kernel/navi/NaviDelegationBranchKeyService.md",
      "source": "webgpu-os/kernel/navi/NaviDelegationBranchKeyService.js",
      "import": "/webgpu-os/kernel/navi/NaviDelegationBranchKeyService.js",
      "sourceHash": "f902ef86c93905605109ff1a4c36219d9a79559cb693907f7a5f2b959c5d66e2",
      "summary": "Kernel-only provisioning and one-shot consumption of persistent Branch keys. A generated P-256 private key is exported only long enough to import a non-extractable runtime handle and place its bytes inside a Continuity-sealed cognition record. No application-facing method returns a CryptoKey, private bytes, public key, or generic signing capability.",
      "exports": [
        {
          "name": "NaviDelegationBranchKeyServiceError",
          "kind": "class",
          "signature": "class NaviDelegationBranchKeyServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviDelegationBranchKeyService",
          "kind": "class",
          "signature": "class NaviDelegationBranchKeyService",
          "summary": ""
        },
        {
          "name": "NAVI_DELEGATION_BRANCH_KEY_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_DELEGATION_BRANCH_KEY_RECORD_TYPE",
          "summary": "Kernel-only provisioning and one-shot consumption of persistent Branch keys. A generated P-256 private key is exported only long enough to import a non-extractable runtime handle and place its bytes inside a Continuity-sealed cognition record. No application-facing method returns a CryptoKey, private bytes, public key, or generic signing capability."
        },
        {
          "name": "NAVI_DELEGATION_BRANCH_KEY_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DELEGATION_BRANCH_KEY_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_DELEGATION_BRANCH_KEY_PROOF_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DELEGATION_BRANCH_KEY_PROOF_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviDelegationService",
      "path": "webgpu-os/reference/kernel/navi/NaviDelegationService.md",
      "source": "webgpu-os/kernel/navi/NaviDelegationService.js",
      "import": "/webgpu-os/kernel/navi/NaviDelegationService.js",
      "sourceHash": "4bc8399280fce9ca397eaefda48194cba64d7c96a73a9811a87879008a4f67ce",
      "summary": "NaviDelegationService — bounded worker authority, persistence, and recovery. A delegated worker is never given cognition storage, continuity keys, raw memory, or ambient filesystem access. The service persists only signed navi-delegation-v1 contracts, hash-only context references, exact capability references, an active resource-lease binding, and bounded report evidence. File-capable workers operate through a VFS overlay adapter scoped from their verified Faculty capabilities.",
      "exports": [
        {
          "name": "NaviDelegationServiceError",
          "kind": "class",
          "signature": "class NaviDelegationServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviDelegationIntegrityError",
          "kind": "class",
          "signature": "class NaviDelegationIntegrityError extends NaviDelegationServiceError",
          "summary": ""
        },
        {
          "name": "NaviDelegationService",
          "kind": "class",
          "signature": "class NaviDelegationService",
          "summary": ""
        },
        {
          "name": "deriveNaviDelegationOverlayRoot",
          "kind": "function",
          "signature": "async deriveNaviDelegationOverlayRoot(naviId, delegationId)",
          "summary": "Derive the only VFS root a delegated capability may name. Capability issuance can call this before NaviDelegationService.create(), so signed tool arguments already target the overlay and never need post-signature rewriting."
        },
        {
          "name": "NAVI_DELEGATION_SERVICE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DELEGATION_SERVICE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_DELEGATION_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DELEGATION_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_DELEGATION_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_DELEGATION_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "NAVI_DELEGATION_STORAGE_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DELEGATION_STORAGE_RECEIPT_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviDerivedProjectionService",
      "path": "webgpu-os/reference/kernel/navi/NaviDerivedProjectionService.md",
      "source": "webgpu-os/kernel/navi/NaviDerivedProjectionService.js",
      "import": "/webgpu-os/kernel/navi/NaviDerivedProjectionService.js",
      "sourceHash": "b11c0248077eb109f026cddf2452a0360d7ada472e3555a33e7f8ead6cec23d1",
      "summary": "NaviDerivedProjectionService.js — deterministic, non-authoritative Navi views. Canonical memory and relationship services remain the only write authority. This service validates their signed contracts, verifies that signatures bind the current payload hash, and derives Wiki-compatible human-readable views. It never edits a source contract. A UI edit becomes an unsigned proposal that is handed back to memoryService.proposeDerivedEdit() for policy and review. Required adapters: memoryService.listProjectionEvents({ naviId, branchId, afterSequence, allowedDataClasses }) -> { event, eventHash, payloadStatus, payload }[] memoryService.proposeDerivedEdit(unsignedProposal) -> receipt/result relationshipService.listRelationships({ naviId }) -> Relationship[] The adapters must verify cryptographic signatures before returning contracts. This layer independently verifies schema closure and signed-hash binding so a modified cached contract cannot silently become a readable projection.",
      "exports": [
        {
          "name": "NaviDerivedProjectionError",
          "kind": "class",
          "signature": "class NaviDerivedProjectionError extends Error",
          "summary": ""
        },
        {
          "name": "NaviDerivedProjectionService",
          "kind": "class",
          "signature": "class NaviDerivedProjectionService",
          "summary": ""
        },
        {
          "name": "escapeNaviProjectionMarkdown",
          "kind": "function",
          "signature": "escapeNaviProjectionMarkdown(value)",
          "summary": "Escape payload text before inserting it into generated Markdown/HTML views."
        },
        {
          "name": "NAVI_DERIVED_PROJECTION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DERIVED_PROJECTION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_DERIVED_EDIT_PROPOSAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_DERIVED_EDIT_PROPOSAL_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviFacultyPackageBinding",
      "path": "webgpu-os/reference/kernel/navi/NaviFacultyPackageBinding.md",
      "source": "webgpu-os/kernel/navi/NaviFacultyPackageBinding.js",
      "import": "/webgpu-os/kernel/navi/NaviFacultyPackageBinding.js",
      "sourceHash": "996e2510b11c5effd8e1a3ed0f6d250fc148d93de50f35bc08036bd843d3ea83",
      "summary": "Strict, side-effect-free validation for a signed Faculty embedded in an authenticated package manifest. The builder and authorization policy share this boundary so accepted package evidence cannot drift between creation and execution.",
      "exports": [
        {
          "name": "NaviFacultyPackageBindingError",
          "kind": "class",
          "signature": "class NaviFacultyPackageBindingError extends Error",
          "summary": ""
        },
        {
          "name": "validateNaviFacultyPackageBinding",
          "kind": "function",
          "signature": "async validateNaviFacultyPackageBinding(value, { resourceHash = null } = {})",
          "summary": "Validate and snapshot an already-signed Faculty package binding. This function never adds, removes, or rewrites a Faculty signature. The returned frozen snapshot contains the exact schema values supplied by the caller after strict JSON/schema validation."
        },
        {
          "name": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviFacultyPackagePolicy",
      "path": "webgpu-os/reference/kernel/navi/NaviFacultyPackagePolicy.md",
      "source": "webgpu-os/kernel/navi/NaviFacultyPackagePolicy.js",
      "import": "/webgpu-os/kernel/navi/NaviFacultyPackagePolicy.js",
      "sourceHash": "9d46ea944fa9e1a788203d2fee2493c7db3e9a6c5f2755a5fb15693a115d7c79",
      "summary": "NaviFacultyPackagePolicy.js The fail-closed trust boundary between a verified OS package and an executable Navi Faculty manifest. PackageManager remains the package integrity/provenance/scanning choke point; this policy narrows its broader application-install trust model for Faculties: - production authorization requires a fresh ring-0 certificate chain; - pinned/TOFU trust never becomes production Faculty authority; - developer-local/self-signed packages require an exact one-shot approval; - the authenticated package manifest, inline Faculty envelope, canonical Navi payload, and package resource root must all bind the same Faculty; - the Faculty publisher signature is verified with the package certificate. No package bytes, public keys, signatures, approval tokens, or verifier diagnostics are returned from this module.",
      "exports": [
        {
          "name": "NaviFacultyPackagePolicyError",
          "kind": "class",
          "signature": "class NaviFacultyPackagePolicyError extends Error",
          "summary": ""
        },
        {
          "name": "NaviFacultyPackagePolicy",
          "kind": "class",
          "signature": "class NaviFacultyPackagePolicy",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_POLICY_INSPECTION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_POLICY_INSPECTION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_AUTHORIZATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_AUTHORIZATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_LOCAL_APPROVAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_LOCAL_APPROVAL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_SCAN_APPROVAL_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_SCAN_APPROVAL_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
          "kind": "re-export",
          "signature": "NAVI_FACULTY_PACKAGE_BINDING_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviFacultyService",
      "path": "webgpu-os/reference/kernel/navi/NaviFacultyService.md",
      "source": "webgpu-os/kernel/navi/NaviFacultyService.js",
      "import": "/webgpu-os/kernel/navi/NaviFacultyService.js",
      "sourceHash": "0ed109ccba326981ea79dda7cd60d6a15a07abb87129100570aa730be243f697",
      "summary": "Kernel-owned Faculty authority membrane. Faculty code never receives this service, continuity keys, persistence, or driver objects. It receives only NaviFacultyWorkerHost's `api.tool` bridge. The bridge prepares one exact signed capability and hands it to ToolRouter; ToolRouter must consume that capability immediately before its existing driver dispatch. This module deliberately has no ToolDriver import or path.",
      "exports": [
        {
          "name": "NaviFacultyServiceError",
          "kind": "class",
          "signature": "class NaviFacultyServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviFacultyServiceIntegrityError",
          "kind": "class",
          "signature": "class NaviFacultyServiceIntegrityError extends NaviFacultyServiceError",
          "summary": ""
        },
        {
          "name": "NaviFacultyService",
          "kind": "class",
          "signature": "class NaviFacultyService",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_SERVICE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_SERVICE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_FAMILY_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_FAMILY_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_FAMILY_STATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_FAMILY_STATE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_MANIFEST_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_MANIFEST_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_SOURCE_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_SOURCE_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_CAPABILITY_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_CAPABILITY_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_OPERATION_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_OPERATION_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_RECEIPT_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_RECEIPT_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_LEGACY_RECEIPT_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_LEGACY_RECEIPT_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_RECOVERY_MARKER_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_RECOVERY_MARKER_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_RECOVERY_STATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_RECOVERY_STATE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviFacultyWorkerHost",
      "path": "webgpu-os/reference/kernel/navi/NaviFacultyWorkerHost.md",
      "source": "webgpu-os/kernel/navi/NaviFacultyWorkerHost.js",
      "import": "/webgpu-os/kernel/navi/NaviFacultyWorkerHost.js",
      "sourceHash": "075c562a782917c5ee3e07e3497971f8ef8387a564abce0f344e92d8aba70532",
      "summary": "NaviFacultyWorkerHost.js Executes one Faculty operation in a dedicated Worker nested inside an opaque-origin iframe. The worker has no ambient OS bridge. Its only host capability is the bounded `api.tool(name, args)` request channel supplied to `naviFaculty.run(input, api)`.",
      "exports": [
        {
          "name": "NaviFacultyWorkerError",
          "kind": "class",
          "signature": "class NaviFacultyWorkerError extends Error",
          "summary": ""
        },
        {
          "name": "NaviFacultyIframeAdapter",
          "kind": "class",
          "signature": "class NaviFacultyIframeAdapter",
          "summary": "DOM owner for the hidden opaque iframe and its sole MessageChannel port."
        },
        {
          "name": "NaviFacultyWorkerHost",
          "kind": "class",
          "signature": "class NaviFacultyWorkerHost",
          "summary": "Replace-only owner for one-shot Faculty Workers. `onToolRequest` is trusted host code and is the only route from Faculty source to ToolRouter."
        },
        {
          "name": "normalizeNaviFacultyJson",
          "kind": "function",
          "signature": "normalizeNaviFacultyJson(value, { label = 'value', maxBytes = NAVI_FACULTY_WORKER_LIMITS.messageBytes, } = {})",
          "summary": "Descriptor-first JSON normalization that never evaluates accessors."
        },
        {
          "name": "createNaviFacultyWorkerDescriptor",
          "kind": "function",
          "signature": "createNaviFacultyWorkerDescriptor()",
          "summary": "Immutable description of the Faculty execution boundary."
        },
        {
          "name": "NAVI_FACULTY_WORKER_SCHEMA",
          "kind": "constant",
          "signature": "NAVI_FACULTY_WORKER_SCHEMA",
          "summary": "NaviFacultyWorkerHost.js Executes one Faculty operation in a dedicated Worker nested inside an opaque-origin iframe. The worker has no ambient OS bridge. Its only host capability is the bounded `api.tool(name, args)` request channel supplied to `naviFaculty.run(input, api)`."
        },
        {
          "name": "NAVI_FACULTY_WORKER_VERSION",
          "kind": "constant",
          "signature": "NAVI_FACULTY_WORKER_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_WORKER_PROFILE",
          "kind": "constant",
          "signature": "NAVI_FACULTY_WORKER_PROFILE",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_WORKER_LIMITS",
          "kind": "constant",
          "signature": "NAVI_FACULTY_WORKER_LIMITS",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_IFRAME_CSP",
          "kind": "constant",
          "signature": "NAVI_FACULTY_IFRAME_CSP",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_PERMISSIONS_POLICY",
          "kind": "constant",
          "signature": "NAVI_FACULTY_PERMISSIONS_POLICY",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviFeatureGate",
      "path": "webgpu-os/reference/kernel/navi/NaviFeatureGate.md",
      "source": "webgpu-os/kernel/navi/NaviFeatureGate.js",
      "import": "/webgpu-os/kernel/navi/NaviFeatureGate.js",
      "sourceHash": "1e43b48aebb52b7a12045336de86b5aff621669727a3b33f2b84643b1d1911a8",
      "summary": "Always-on compatibility policy for the kernel-owned Navi runtime. Navi is part of WebGPU OS rather than an operator-controlled feature. This object keeps the versioned read contract used by kernel services and repairs legacy rollout records. Authority still fails closed inside each operator-bound service; an app can neither enable nor disable the runtime.",
      "exports": [
        {
          "name": "NaviFeatureGatePersistenceError",
          "kind": "class",
          "signature": "class NaviFeatureGatePersistenceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviFeatureGateGenerationError",
          "kind": "class",
          "signature": "class NaviFeatureGateGenerationError extends Error",
          "summary": ""
        },
        {
          "name": "NaviFeatureGate",
          "kind": "class",
          "signature": "class NaviFeatureGate",
          "summary": ""
        },
        {
          "name": "createNaviFeatureGate",
          "kind": "function",
          "signature": "createNaviFeatureGate(options)",
          "summary": ""
        },
        {
          "name": "NAVI_FEATURE_GATE_VERSION",
          "kind": "constant",
          "signature": "NAVI_FEATURE_GATE_VERSION",
          "summary": "Always-on compatibility policy for the kernel-owned Navi runtime. Navi is part of WebGPU OS rather than an operator-controlled feature. This object keeps the versioned read contract used by kernel services and repairs legacy rollout records. Authority still fails closed inside each operator-bound service; an app can neither enable nor disable the runtime."
        },
        {
          "name": "NAVI_FEATURE_GATE_KEY",
          "kind": "constant",
          "signature": "NAVI_FEATURE_GATE_KEY",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviGuidanceFacultyCandidate",
      "path": "webgpu-os/reference/kernel/navi/NaviGuidanceFacultyCandidate.md",
      "source": "webgpu-os/kernel/navi/NaviGuidanceFacultyCandidate.js",
      "import": "/webgpu-os/kernel/navi/NaviGuidanceFacultyCandidate.js",
      "sourceHash": "f1e787bf3425aa8bda1dff30b97fbcc38523ff2d2ad18e3b064bed1ade2e9f55",
      "summary": "Pure guidance-faculty-candidate-v2 derivation from observable receipts. This module cannot sign, persist, install, enable, or execute anything. It only creates a review-required candidate after two independent verified successes share one exact descriptor and verification profile binding.",
      "exports": [
        {
          "name": "deriveGuidanceFacultyCandidate",
          "kind": "function",
          "signature": "async deriveGuidanceFacultyCandidate(raw = {})",
          "summary": ""
        },
        {
          "name": "reviewGuidanceFacultyCandidate",
          "kind": "function",
          "signature": "reviewGuidanceFacultyCandidate(raw = {})",
          "summary": ""
        },
        {
          "name": "guidanceFacultyPromotionReadiness",
          "kind": "function",
          "signature": "guidanceFacultyPromotionReadiness(raw = {})",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviInvestigationAttestation",
      "path": "webgpu-os/reference/kernel/navi/NaviInvestigationAttestation.md",
      "source": "webgpu-os/kernel/navi/NaviInvestigationAttestation.js",
      "import": "/webgpu-os/kernel/navi/NaviInvestigationAttestation.js",
      "sourceHash": "2d4d67768dbc10c13253975663257d27b641dd1f1abcc6070af9dc661a6e1d6f",
      "summary": "",
      "exports": [
        {
          "name": "hashInvestigationSourceProjection",
          "kind": "function",
          "signature": "async hashInvestigationSourceProjection(value)",
          "summary": ""
        },
        {
          "name": "createInvestigationSourceProjection",
          "kind": "function",
          "signature": "async createInvestigationSourceProjection(value, sourceResultHash)",
          "summary": ""
        },
        {
          "name": "verifyInvestigationSourceProjection",
          "kind": "function",
          "signature": "async verifyInvestigationSourceProjection(value, sourceResultHash)",
          "summary": ""
        },
        {
          "name": "NAVI_INVESTIGATION_SOURCE_PROJECTION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_SOURCE_PROJECTION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_INVESTIGATION_SOURCE_PROJECTION_MAX_CHARS",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_SOURCE_PROJECTION_MAX_CHARS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviInvestigationProofReviewService",
      "path": "webgpu-os/reference/kernel/navi/NaviInvestigationProofReviewService.md",
      "source": "webgpu-os/kernel/navi/NaviInvestigationProofReviewService.js",
      "import": "/webgpu-os/kernel/navi/NaviInvestigationProofReviewService.js",
      "sourceHash": "e98bdbfd70f98a838549b48b58335d634d566c92289dc373698c8af1667c8f48",
      "summary": "Kernel-owned human review for a bounded Navi investigation proof. This service never calls a model and never accepts provider-hidden reasoning. It projects exact, locally verified evidence into one immutable review request, obtains a one-shot ElicitationManager approval, then rechecks every mutable task/case binding before returning the semantic-verifier attestation expected by NaviInvestigationService.",
      "exports": [
        {
          "name": "NaviInvestigationProofReviewError",
          "kind": "class",
          "signature": "class NaviInvestigationProofReviewError extends Error",
          "summary": ""
        },
        {
          "name": "NaviInvestigationProofReviewService",
          "kind": "class",
          "signature": "class NaviInvestigationProofReviewService",
          "summary": ""
        },
        {
          "name": "NAVI_INVESTIGATION_PROOF_REVIEW_FORMAT",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_INVESTIGATION_PROOF_REVIEW_PROJECTION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_PROJECTION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_INVESTIGATION_PROOF_REVIEW_RESULT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_RESULT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_INVESTIGATION_PROOF_REVIEW_PROFILE_ID",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_PROOF_REVIEW_PROFILE_ID",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviInvestigationService",
      "path": "webgpu-os/reference/kernel/navi/NaviInvestigationService.md",
      "source": "webgpu-os/kernel/navi/NaviInvestigationService.js",
      "import": "/webgpu-os/kernel/navi/NaviInvestigationService.js",
      "sourceHash": "c40571df92a64b913c6dc999037a8369a19db07744e22d314bd1ec7e314851e5",
      "summary": "NaviInvestigationService.js — deterministic, observation-only Sherlock episodes. The service owns case progression and evidence validation, but it cannot invoke tools, persist records, grant authority, or execute mutations. Callers must route reads through ToolRouter and submit the verified result.",
      "exports": [
        {
          "name": "NaviInvestigationService",
          "kind": "class",
          "signature": "class NaviInvestigationService",
          "summary": ""
        },
        {
          "name": "NaviInvestigationError",
          "kind": "class",
          "signature": "class NaviInvestigationError extends Error",
          "summary": ""
        },
        {
          "name": "shouldInvestigate",
          "kind": "function",
          "signature": "shouldInvestigate({ objective, taskKind = '', goalType = '' } = {})",
          "summary": "Select Sherlock only for investigation-shaped work, never greetings."
        },
        {
          "name": "validateDurableInvestigationProof",
          "kind": "function",
          "signature": "async validateDurableInvestigationProof(caseRecord, evidenceRecords)",
          "summary": "Recompute the durable semantic-proof binding without trusting the model interpretation that proposed it. This is shared by runtime restore and the cognition persistence boundary before a case can be signed."
        },
        {
          "name": "NAVI_INVESTIGATION_LIMITS",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_LIMITS",
          "summary": ""
        },
        {
          "name": "NAVI_INVESTIGATION_EPISODE",
          "kind": "constant",
          "signature": "NAVI_INVESTIGATION_EPISODE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviKeyVault",
      "path": "webgpu-os/reference/kernel/navi/NaviKeyVault.md",
      "source": "webgpu-os/kernel/navi/NaviKeyVault.js",
      "import": "/webgpu-os/kernel/navi/NaviKeyVault.js",
      "sourceHash": "28c7b32f1d960d0024a5ec960e0a6269c47a085c83ddca3e83d86a46de3caf15",
      "summary": "Kernel-internal cryptographic boundary for Navi continuity. This module deliberately exposes no generic \"sign this key\" or \"decrypt this ciphertext\" syscall surface.  Its methods are intended to be held by the kernel continuity service, which supplies the policy decision before a bounded operation reaches this vault.",
      "exports": [
        {
          "name": "NaviKeyVaultError",
          "kind": "class",
          "signature": "class NaviKeyVaultError extends Error",
          "summary": ""
        },
        {
          "name": "NaviKeyVault",
          "kind": "class",
          "signature": "class NaviKeyVault",
          "summary": ""
        },
        {
          "name": "naviConstantTimeEqual",
          "kind": "function",
          "signature": "naviConstantTimeEqual(left, right)",
          "summary": "Constant-time comparison for equal-length byte strings."
        },
        {
          "name": "NAVI_RECORD_ENVELOPE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECORD_ENVELOPE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BUNDLE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BUNDLE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_PAYLOAD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_PAYLOAD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_SIGNATURE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_SIGNATURE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONTINUITY_SIGNATURE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONTINUITY_SIGNATURE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_PERSISTENT_STATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PERSISTENT_STATE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_ROTATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_ROTATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_RECOVERY_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_RECOVERY_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_WEBAUTHN_PRF_DESCRIPTOR_FORMAT",
          "kind": "constant",
          "signature": "NAVI_WEBAUTHN_PRF_DESCRIPTOR_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_ANCESTRY_ATTESTATION_SCOPE",
          "kind": "constant",
          "signature": "NAVI_ANCESTRY_ATTESTATION_SCOPE",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_FACTOR",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_FACTOR",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviLegacyKnowledgeImportService",
      "path": "webgpu-os/reference/kernel/navi/NaviLegacyKnowledgeImportService.md",
      "source": "webgpu-os/kernel/navi/NaviLegacyKnowledgeImportService.js",
      "import": "/webgpu-os/kernel/navi/NaviLegacyKnowledgeImportService.js",
      "sourceHash": "b58b6370b84cdcd8db5cb4efec6b201c7c6a200668ad4c83acceeefb876fe404",
      "summary": "Idempotent, non-destructive migration of bounded AI Echo knowledge into the Navi causal-memory weave. The caller supplies a read-only snapshot assembled from legacy AI Echo state. This service never receives the legacy Store, so it cannot reset, delete, or rewrite that source. Each normalized source item receives a content-derived event ID; retries verify the existing signed event instead of appending a duplicate.",
      "exports": [
        {
          "name": "NaviLegacyKnowledgeImportError",
          "kind": "class",
          "signature": "class NaviLegacyKnowledgeImportError extends Error",
          "summary": ""
        },
        {
          "name": "NaviLegacyKnowledgeImportService",
          "kind": "class",
          "signature": "class NaviLegacyKnowledgeImportService",
          "summary": ""
        },
        {
          "name": "normalizeLegacyKnowledgeSnapshot",
          "kind": "function",
          "signature": "normalizeLegacyKnowledgeSnapshot(input)",
          "summary": ""
        },
        {
          "name": "hashLegacyKnowledgeSnapshot",
          "kind": "function",
          "signature": "async hashLegacyKnowledgeSnapshot(snapshot)",
          "summary": ""
        },
        {
          "name": "verifyNaviLegacyKnowledgeImportReceipt",
          "kind": "function",
          "signature": "async verifyNaviLegacyKnowledgeImportReceipt(receipt)",
          "summary": ""
        },
        {
          "name": "NAVI_LEGACY_KNOWLEDGE_SNAPSHOT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_LEGACY_KNOWLEDGE_SNAPSHOT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_LEGACY_KNOWLEDGE_ITEM_FORMAT",
          "kind": "constant",
          "signature": "NAVI_LEGACY_KNOWLEDGE_ITEM_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_LEGACY_KNOWLEDGE_IMPORT_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_LEGACY_KNOWLEDGE_IMPORT_RECEIPT_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviLegacyMigrationService",
      "path": "webgpu-os/reference/kernel/navi/NaviLegacyMigrationService.md",
      "source": "webgpu-os/kernel/navi/NaviLegacyMigrationService.js",
      "import": "/webgpu-os/kernel/navi/NaviLegacyMigrationService.js",
      "sourceHash": "ac2d702f29ba97e3f79851f9755c1dec1e0545e9e9ff32db18163c5e4771fc88",
      "summary": "Explicit, rollback-safe migration of unreleased AI Echo-owned state. Phase 0 creates and verifies a complete /user backup while navi-v1 is off. This Phase 1 service consumes that exact archive only after the always-on runtime is operator-bound and the operator supplies an exact confirmation. It archives the two AI Echo-owned surfaces, resets them, and never touches unrelated /user paths. A failed reset is compensated from the local migration archive.",
      "exports": [
        {
          "name": "NaviLegacyMigrationService",
          "kind": "class",
          "signature": "class NaviLegacyMigrationService",
          "summary": ""
        },
        {
          "name": "validateNaviLegacyMigrationReceipt",
          "kind": "function",
          "signature": "validateNaviLegacyMigrationReceipt(receipt)",
          "summary": ""
        },
        {
          "name": "NAVI_LEGACY_MIGRATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_LEGACY_MIGRATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_LEGACY_MIGRATION_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "NAVI_LEGACY_MIGRATION_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_LEGACY_MIGRATION_CONFIRMATION",
          "kind": "constant",
          "signature": "NAVI_LEGACY_MIGRATION_CONFIRMATION",
          "summary": ""
        },
        {
          "name": "NAVI_LEGACY_MIGRATION_ARCHIVE_ROOT",
          "kind": "constant",
          "signature": "NAVI_LEGACY_MIGRATION_ARCHIVE_ROOT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviLineage",
      "path": "webgpu-os/reference/kernel/navi/NaviLineage.md",
      "source": "webgpu-os/kernel/navi/NaviLineage.js",
      "import": "/webgpu-os/kernel/navi/NaviLineage.js",
      "sourceHash": "270dc8e5896c52482b821079bf16972730aefa4242d9ecfdaec0656cf053407e",
      "summary": "NaviLineage.js — linked, signed Navi continuity history. The ledger stores strict `navi-lineage-event-v1` contracts plus the exact payload whose hash the event commits to. Operational rotation takes effect after its rotation event, so the old key remains valid for historical verification but cannot authorize another event. Recovery and revocation are continuity-key operations. No generic signing primitive is exported.",
      "exports": [
        {
          "name": "NaviLineageError",
          "kind": "class",
          "signature": "class NaviLineageError extends Error",
          "summary": ""
        },
        {
          "name": "NaviLineageVerificationError",
          "kind": "class",
          "signature": "class NaviLineageVerificationError extends NaviLineageError",
          "summary": ""
        },
        {
          "name": "NaviLineageLedger",
          "kind": "class",
          "signature": "class NaviLineageLedger",
          "summary": ""
        },
        {
          "name": "hashNaviLineagePayload",
          "kind": "function",
          "signature": "hashNaviLineagePayload(payload)",
          "summary": "Hash a strict JSON lineage payload using the engine's canonical SHA-256 path."
        },
        {
          "name": "canonicalNaviOperationalCertificateBytes",
          "kind": "function",
          "signature": "canonicalNaviOperationalCertificateBytes(certificate)",
          "summary": "Return deterministic bytes suitable for an external continuity-certificate verifier."
        },
        {
          "name": "verifyNaviLineage",
          "kind": "function",
          "signature": "async verifyNaviLineage(entries, { expectedNaviId, expectedBranchId = null, expectedHeadHash = null, expectedEventCount = null, continuityKey, operationalKeys = [], keyResolver = null, certificateVerifier = null, logger = null, } = {})",
          "summary": "Verify the complete chain, payload commitments, signature policy, key certificates, key activation windows, and rotation/recovery transitions."
        },
        {
          "name": "NAVI_LINEAGE_PAYLOAD_SCHEMA",
          "kind": "constant",
          "signature": "NAVI_LINEAGE_PAYLOAD_SCHEMA",
          "summary": ""
        },
        {
          "name": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_OPERATIONAL_CERTIFICATE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviMaintenanceScheduler",
      "path": "webgpu-os/reference/kernel/navi/NaviMaintenanceScheduler.md",
      "source": "webgpu-os/kernel/navi/NaviMaintenanceScheduler.js",
      "import": "/webgpu-os/kernel/navi/NaviMaintenanceScheduler.js",
      "sourceHash": "3236fe759ca4a7b824357898e72058827bd572698de9bb7d60c3f60abfdda648",
      "summary": "Cooperative, lifecycle-aware scheduler for encrypted Navi maintenance. All Navi migrations and index hydration share one queue. A browser idle grant advances at most one bounded page. An idle callback with no available budget advances nothing; its timeout, or the delayed timer used where idle callbacks do not exist, is the bounded fallback grant.",
      "exports": [
        {
          "name": "NaviMaintenanceScheduler",
          "kind": "class",
          "signature": "class NaviMaintenanceScheduler",
          "summary": ""
        },
        {
          "name": "sharedNaviMaintenanceScheduler",
          "kind": "function",
          "signature": "sharedNaviMaintenanceScheduler()",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviManifestationAdapterRegistry",
      "path": "webgpu-os/reference/kernel/navi/NaviManifestationAdapterRegistry.md",
      "source": "webgpu-os/kernel/navi/NaviManifestationAdapterRegistry.js",
      "import": "/webgpu-os/kernel/navi/NaviManifestationAdapterRegistry.js",
      "sourceHash": "188a71f560f30734d02bc26a0741add85ee0295607cf822d59a5b9f887dfa7d3",
      "summary": "Kernel-only registry for Navi Manifestation adapters. The descriptors are inert declarations. Live engine, audio, vehicle, or network objects are attached by trusted kernel integrations and are never accepted through an app syscall. The registry therefore exposes a narrow body boundary without turning an avatar, entity, or runtime object into Navi identity authority.",
      "exports": [
        {
          "name": "NaviManifestationAdapterRegistry",
          "kind": "class",
          "signature": "class NaviManifestationAdapterRegistry",
          "summary": ""
        },
        {
          "name": "NAVI_MANIFESTATION_BUILTIN_ADAPTERS",
          "kind": "re-export",
          "signature": "NAVI_MANIFESTATION_BUILTIN_ADAPTERS",
          "summary": ""
        },
        {
          "name": "createConstructManifestationAdapter",
          "kind": "re-export",
          "signature": "createConstructManifestationAdapter",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviManifestationService",
      "path": "webgpu-os/reference/kernel/navi/NaviManifestationService.md",
      "source": "webgpu-os/kernel/navi/NaviManifestationService.js",
      "import": "/webgpu-os/kernel/navi/NaviManifestationService.js",
      "sourceHash": "ee5011224276674b0546709dbf2602fc39c6b615d4a372740ab9ff5b141cc359",
      "summary": "Kernel-owned Navi Manifestation and task-handoff runtime. Models, bodies, voices, avatars, and apps remain replaceable presentation or execution surfaces. Every durable registration and handoff is an encrypted, purpose-signed contract bound to the continuity-root Navi identifier.",
      "exports": [
        {
          "name": "NaviManifestationServiceError",
          "kind": "class",
          "signature": "class NaviManifestationServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviManifestationService",
          "kind": "class",
          "signature": "class NaviManifestationService",
          "summary": ""
        },
        {
          "name": "NAVI_PRIMARY_MANIFESTATION_ID",
          "kind": "constant",
          "signature": "NAVI_PRIMARY_MANIFESTATION_ID",
          "summary": ""
        },
        {
          "name": "NAVI_MANIFESTATION_BRANCH_ID",
          "kind": "constant",
          "signature": "NAVI_MANIFESTATION_BRANCH_ID",
          "summary": ""
        },
        {
          "name": "NAVI_MANIFESTATION_CLASSIFICATION",
          "kind": "constant",
          "signature": "NAVI_MANIFESTATION_CLASSIFICATION",
          "summary": ""
        },
        {
          "name": "NAVI_HANDOFF_CLASSIFICATION",
          "kind": "constant",
          "signature": "NAVI_HANDOFF_CLASSIFICATION",
          "summary": ""
        },
        {
          "name": "NAVI_HANDOFF_DEFAULT_TTL_MS",
          "kind": "constant",
          "signature": "NAVI_HANDOFF_DEFAULT_TTL_MS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviMemoryService",
      "path": "webgpu-os/reference/kernel/navi/NaviMemoryService.md",
      "source": "webgpu-os/kernel/navi/NaviMemoryService.js",
      "import": "/webgpu-os/kernel/navi/NaviMemoryService.js",
      "sourceHash": "73dd8d642a500a2bc6b6b650832aed955f400f0386fb22b0e763f540566cc8e6",
      "summary": "Kernel-owned causal memory over the existing encrypted cognition Store. Signed events are append-only. Their payloads live in separately wrapped AES-GCM records so forgetting can destroy one wrapped record key without rewriting history. Provider output, application projections, and callers never receive Store access or encryption/signing authority.",
      "exports": [
        {
          "name": "NaviMemoryServiceError",
          "kind": "class",
          "signature": "class NaviMemoryServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviMemoryService",
          "kind": "class",
          "signature": "class NaviMemoryService",
          "summary": ""
        },
        {
          "name": "NAVI_MEMORY_HEAD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MEMORY_HEAD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MEMORY_PAYLOAD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MEMORY_PAYLOAD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MEMORY_PAYLOAD_REFERENCE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MEMORY_PAYLOAD_REFERENCE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MEMORY_ERASURE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MEMORY_ERASURE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviModelBroker",
      "path": "webgpu-os/reference/kernel/navi/NaviModelBroker.md",
      "source": "webgpu-os/kernel/navi/NaviModelBroker.js",
      "import": "/webgpu-os/kernel/navi/NaviModelBroker.js",
      "sourceHash": "9712f4abcb4e2a745c20223b42e4eee06a3e5577157bf1b8914f0d296c3be12a",
      "summary": "NaviModelBroker.js — deterministic, per-Navi model selection and failover. The broker owns no provider conversation and executes no tools. It chooses one declared cognition route, invokes the injected AI Hub exactly once at a time, and only advances to a bounded fallback after a retryable model-call failure. Prompt/model output is deliberately excluded from routing evidence.",
      "exports": [
        {
          "name": "NaviModelBrokerError",
          "kind": "class",
          "signature": "class NaviModelBrokerError extends Error",
          "summary": ""
        },
        {
          "name": "NaviModelBroker",
          "kind": "class",
          "signature": "class NaviModelBroker",
          "summary": "An injected AI Hub must expose `request(appId, request)`. Route catalog and policy remain per Navi; the AI Hub is only the replaceable transport."
        },
        {
          "name": "verifyNaviModelRouteDecision",
          "kind": "function",
          "signature": "async verifyNaviModelRouteDecision(rawDecision, rawConfiguration)",
          "summary": "Verify that a projected route decision is the exact content-addressed decision produced for the supplied normalized broker configuration. This is an integrity/binding check only; it never authorizes model use."
        },
        {
          "name": "normalizeModelFailure",
          "kind": "function",
          "signature": "normalizeModelFailure(source, signal = null)",
          "summary": ""
        },
        {
          "name": "normalizeNaviModelRequirements",
          "kind": "function",
          "signature": "normalizeNaviModelRequirements(raw = {}, purpose = 'chat')",
          "summary": "Return the broker's exact model-neutral requirement evidence. Resource selection receipts must hash the same defaults and canonical ordering that `decide()` used; callers must not reconstruct those defaults independently."
        },
        {
          "name": "NAVI_MODEL_ROUTE_PURPOSES",
          "kind": "constant",
          "signature": "NAVI_MODEL_ROUTE_PURPOSES",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_TASK_FAMILIES",
          "kind": "constant",
          "signature": "NAVI_MODEL_TASK_FAMILIES",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_FAILURE_KINDS",
          "kind": "constant",
          "signature": "NAVI_MODEL_FAILURE_KINDS",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_ROUTE_DECISION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MODEL_ROUTE_DECISION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_EXECUTION_EVIDENCE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MODEL_EXECUTION_EVIDENCE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_EXECUTION_PLAN_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MODEL_EXECUTION_PLAN_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_ROUTE_CONFIGURATION_HASH_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MODEL_ROUTE_CONFIGURATION_HASH_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_ROUTE_ACCESS_EVIDENCE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MODEL_ROUTE_ACCESS_EVIDENCE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_MODEL_ROUTE_DATA_POLICY_EVIDENCE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_MODEL_ROUTE_DATA_POLICY_EVIDENCE_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviParticleNetworkAdapter",
      "path": "webgpu-os/reference/kernel/navi/NaviParticleNetworkAdapter.md",
      "source": "webgpu-os/kernel/navi/NaviParticleNetworkAdapter.js",
      "import": "/webgpu-os/kernel/navi/NaviParticleNetworkAdapter.js",
      "sourceHash": "3aabe0d9f3b2533385f9c89fb8c7ac9f861e19ea6b4d77b0a6d0520bdafc8e3c",
      "summary": "NaviParticleNetworkAdapter.js — inert Navi/Particle Network protocol bridge. This module creates and verifies Realm semantic envelopes, but never opens a socket, fetches a peer, publishes a package, or owns a credential. Network dispatch remains the NetworkDriver's job. Contract verification and live authority are mandatory injected kernel decisions and fail closed.",
      "exports": [
        {
          "name": "NaviParticleNetworkAdapter",
          "kind": "class",
          "signature": "class NaviParticleNetworkAdapter",
          "summary": "Create a transport-only Particle Network adapter. `contractVerifiers` must contain one verifier per adapter ID. A verifier may return true, `{ valid: true }`, or the exact verified signed contract. The latter matches NaviContinuityService's purpose-bound verification methods."
        },
        {
          "name": "NaviParticleReplicationInbox",
          "kind": "class",
          "signature": "class NaviParticleReplicationInbox",
          "summary": "Idempotent inbound application boundary built on Realm SemanticInbox. Verification and application are serialized so concurrent replay cannot apply one signed envelope twice."
        },
        {
          "name": "createNaviParticleNetworkAdapter",
          "kind": "function",
          "signature": "createNaviParticleNetworkAdapter(options)",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_NETWORK_ADAPTER_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PARTICLE_NETWORK_ADAPTER_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_INBOX_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PARTICLE_INBOX_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
          "kind": "re-export",
          "signature": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
          "kind": "re-export",
          "signature": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_ADAPTERS",
          "kind": "re-export",
          "signature": "NAVI_PARTICLE_ADAPTERS",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_ADAPTER_IDS",
          "kind": "re-export",
          "signature": "NAVI_PARTICLE_ADAPTER_IDS",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_REPLICATION_FORMAT",
          "kind": "re-export",
          "signature": "NAVI_PARTICLE_REPLICATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NaviParticleReplicationError",
          "kind": "re-export",
          "signature": "NaviParticleReplicationError",
          "summary": ""
        },
        {
          "name": "assertNaviParticleReplicationPayload",
          "kind": "re-export",
          "signature": "assertNaviParticleReplicationPayload",
          "summary": ""
        },
        {
          "name": "assertNaviReplicationContentSafe",
          "kind": "re-export",
          "signature": "assertNaviReplicationContentSafe",
          "summary": ""
        },
        {
          "name": "naviParticleAdapterDescriptor",
          "kind": "re-export",
          "signature": "naviParticleAdapterDescriptor",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviParticleReplicationPolicy",
      "path": "webgpu-os/reference/kernel/navi/NaviParticleReplicationPolicy.md",
      "source": "webgpu-os/kernel/navi/NaviParticleReplicationPolicy.js",
      "import": "/webgpu-os/kernel/navi/NaviParticleReplicationPolicy.js",
      "sourceHash": "81d75ce494511247704b4bd1869f7be143e7270f2f5719c4e50bbf01f14ac900",
      "summary": "NaviParticleReplicationPolicy.js — closed, side-effect-free Navi replication policy. Particle Network transports already-authoritative Navi contracts. It never becomes a second Navi store and it never accepts an arbitrary JSON tunnel. Every permitted record has one fixed schema, semantic kind, classification policy, destination, disclosure evidence, and live authority approval.",
      "exports": [
        {
          "name": "NaviParticleReplicationError",
          "kind": "class",
          "signature": "class NaviParticleReplicationError extends Error",
          "summary": ""
        },
        {
          "name": "naviParticleAdapterDescriptor",
          "kind": "function",
          "signature": "naviParticleAdapterDescriptor(adapterId)",
          "summary": "Return the immutable descriptor for one closed Navi/Particle adapter."
        },
        {
          "name": "assertNaviParticleReplicationPayload",
          "kind": "function",
          "signature": "async assertNaviParticleReplicationPayload(value, expectedAdapterId = null)",
          "summary": "Validate an already-built replication payload, including its nested Navi contract hash and adapter-specific semantics. No signature is synthesized."
        },
        {
          "name": "assertNaviReplicationContentSafe",
          "kind": "function",
          "signature": "assertNaviReplicationContentSafe(value)",
          "summary": "Reject forbidden content before any signer, policy, or transport is called."
        },
        {
          "name": "NAVI_PARTICLE_REPLICATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PARTICLE_REPLICATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
          "kind": "constant",
          "signature": "NAVI_LINEAGE_HEAD_WITNESS_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_FACULTY_NETWORK_ARTIFACT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_ADAPTER_IDS",
          "kind": "constant",
          "signature": "NAVI_PARTICLE_ADAPTER_IDS",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_REPLICATION_KINDS",
          "kind": "constant",
          "signature": "NAVI_PARTICLE_REPLICATION_KINDS",
          "summary": ""
        },
        {
          "name": "NAVI_PARTICLE_ADAPTERS",
          "kind": "constant",
          "signature": "NAVI_PARTICLE_ADAPTERS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviPasskeyRecoveryAdapter",
      "path": "webgpu-os/reference/kernel/navi/NaviPasskeyRecoveryAdapter.md",
      "source": "webgpu-os/kernel/navi/NaviPasskeyRecoveryAdapter.js",
      "import": "/webgpu-os/kernel/navi/NaviPasskeyRecoveryAdapter.js",
      "sourceHash": "3d7ed6c45ad5e05d5fa160d107432f0bc03a5e496ab05fb1aeb7236723e81f57",
      "summary": "Kernel-owned WebAuthn PRF ceremony adapter. Apps see boolean support/enrollment status and completed continuity results. Credential IDs, PRF inputs, and PRF outputs remain inside this adapter and the continuity-signed recovery bundle. PRF output is zeroed after each call.",
      "exports": [
        {
          "name": "NaviPasskeyRecoveryError",
          "kind": "class",
          "signature": "class NaviPasskeyRecoveryError extends Error",
          "summary": ""
        },
        {
          "name": "NaviPasskeyRecoveryAdapter",
          "kind": "class",
          "signature": "class NaviPasskeyRecoveryAdapter",
          "summary": "Kernel-owned WebAuthn PRF ceremony adapter. Apps see boolean support/enrollment status and completed continuity results. Credential IDs, PRF inputs, and PRF outputs remain inside this adapter and the continuity-signed recovery bundle. PRF output is zeroed after each call."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviPreflightService",
      "path": "webgpu-os/reference/kernel/navi/NaviPreflightService.md",
      "source": "webgpu-os/kernel/navi/NaviPreflightService.js",
      "import": "/webgpu-os/kernel/navi/NaviPreflightService.js",
      "sourceHash": "d7993d21f4b25b200a6814fabe2fd29de94b73819dfa71a0416380db7b56e407",
      "summary": "Phase 0 Navi migration preflight. This service is deliberately not wired into the kernel. It only creates and verifies a reversible development archive while `navi-v1` is disabled. It has no delete, clear, restore, or reset operation.",
      "exports": [
        {
          "name": "NaviPreflightService",
          "kind": "class",
          "signature": "class NaviPreflightService",
          "summary": ""
        },
        {
          "name": "validateUserBackupManifest",
          "kind": "function",
          "signature": "validateUserBackupManifest(manifest)",
          "summary": ""
        },
        {
          "name": "validateNaviPreflightManifest",
          "kind": "function",
          "signature": "validateNaviPreflightManifest(manifest)",
          "summary": ""
        },
        {
          "name": "validateNaviRollbackReceipt",
          "kind": "function",
          "signature": "validateNaviRollbackReceipt(receipt)",
          "summary": ""
        },
        {
          "name": "NAVI_PREFLIGHT_ARCHIVE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PREFLIGHT_ARCHIVE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_PREFLIGHT_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PREFLIGHT_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_PREFLIGHT_SCHEMA_VERSION",
          "kind": "constant",
          "signature": "NAVI_PREFLIGHT_SCHEMA_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_PREFLIGHT_AGENT_APP_ID",
          "kind": "constant",
          "signature": "NAVI_PREFLIGHT_AGENT_APP_ID",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviProjectDossier",
      "path": "webgpu-os/reference/kernel/navi/NaviProjectDossier.md",
      "source": "webgpu-os/kernel/navi/NaviProjectDossier.js",
      "import": "/webgpu-os/kernel/navi/NaviProjectDossier.js",
      "sourceHash": "589fec2b44e2cc6c7c2826fe7c7c43d0ee4b78b3257eb620306e8c23380f227e",
      "summary": "Rebuildable, authority-free project dossier for one exact Navi task. The dossier owns no state and never copies provider reasoning, scratchpads, planner transcripts, file bodies, or Wiki bodies. It projects bounded links from the canonical task state, durable run reports, receipts, evidence, Wiki metadata, and Workspace Output Index. Deleting it loses no canonical data.",
      "exports": [
        {
          "name": "NaviProjectDossier",
          "kind": "class",
          "signature": "class NaviProjectDossier",
          "summary": ""
        },
        {
          "name": "NAVI_PROJECT_DOSSIER_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PROJECT_DOSSIER_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_PROJECT_DOSSIER_REBUILD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_PROJECT_DOSSIER_REBUILD_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviRecoveryBranchAuthorityService",
      "path": "webgpu-os/reference/kernel/navi/NaviRecoveryBranchAuthorityService.md",
      "source": "webgpu-os/kernel/navi/NaviRecoveryBranchAuthorityService.js",
      "import": "/webgpu-os/kernel/navi/NaviRecoveryBranchAuthorityService.js",
      "sourceHash": "f3236ef5b49b83885d4dea755e3bcfbd2784828bc603c06c8b376351d64dafe6",
      "summary": "Kernel-only authority for staged recovery branches and permanent separation. A recovery branch is never an identity authority. It may be inspected and reconciled only within the exact ceiling carried by its verified restore receipt. Publication, authority expansion, identity transfer, and continuity-root rotation are unconditional denials. Permanent separation is a distinct, explicitly approved operation that asks Continuity to stage a fresh independent Navi and records a dual-continuity-signed ancestry attestation without exposing either signer or private key.",
      "exports": [
        {
          "name": "NaviRecoveryBranchAuthorityError",
          "kind": "class",
          "signature": "class NaviRecoveryBranchAuthorityError extends Error",
          "summary": ""
        },
        {
          "name": "NaviRecoveryBranchAuthorityService",
          "kind": "class",
          "signature": "class NaviRecoveryBranchAuthorityService",
          "summary": ""
        },
        {
          "name": "createNaviRecoveryBranchAuthorityService",
          "kind": "function",
          "signature": "createNaviRecoveryBranchAuthorityService(options)",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BRANCH_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BRANCH_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_RESTORE_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_ANCESTRY_ATTESTATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_ANCESTRY_ATTESTATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BRANCH_DECISION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BRANCH_DECISION_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviRecoveryBranchStore",
      "path": "webgpu-os/reference/kernel/navi/NaviRecoveryBranchStore.md",
      "source": "webgpu-os/kernel/navi/NaviRecoveryBranchStore.js",
      "import": "/webgpu-os/kernel/navi/NaviRecoveryBranchStore.js",
      "sourceHash": "5474977a1ab71b74bf6f4f92a714dcd52511b1299f5404b32009907c3fc01673",
      "summary": "Durable, encrypted-at-rest recovery-branch journal. The Store never persists decrypted Navi backup payloads. It retains the authenticated encrypted bundle, a content-free reconciliation diff, and exact approval/settlement evidence. Canonical Navi state remains owned by the continuity and cognition services.",
      "exports": [
        {
          "name": "NaviRecoveryBranchStoreError",
          "kind": "class",
          "signature": "class NaviRecoveryBranchStoreError extends Error",
          "summary": ""
        },
        {
          "name": "NaviRecoveryBranchConflictError",
          "kind": "class",
          "signature": "class NaviRecoveryBranchConflictError extends NaviRecoveryBranchStoreError",
          "summary": ""
        },
        {
          "name": "NaviRecoveryBranchIntegrityError",
          "kind": "class",
          "signature": "class NaviRecoveryBranchIntegrityError extends NaviRecoveryBranchStoreError",
          "summary": ""
        },
        {
          "name": "NaviRecoveryBranchStore",
          "kind": "class",
          "signature": "class NaviRecoveryBranchStore",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BRANCH_DATABASE_NAME",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BRANCH_DATABASE_NAME",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BRANCH_DATABASE_VERSION",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BRANCH_DATABASE_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BRANCH_STORE_NAME",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BRANCH_STORE_NAME",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_BRANCH_RECORD_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviRecoveryEscrow",
      "path": "webgpu-os/reference/kernel/navi/NaviRecoveryEscrow.md",
      "source": "webgpu-os/kernel/navi/NaviRecoveryEscrow.js",
      "import": "/webgpu-os/kernel/navi/NaviRecoveryEscrow.js",
      "sourceHash": "279ff2a8ace9e78d5a1823f28c365d50d2351497c3dd724358ad1f3dfdd86487",
      "summary": "Kernel-only, progressive recovery-factor escrow. Recovery material is isolated from the ordinary VFS and continuity stores in a purpose-specific IndexedDB database. Public projections contain only bounded disclosure metadata. The device factor (C) can be retrieved only by kernel code holding the module capability symbol.",
      "exports": [
        {
          "name": "NaviRecoveryEscrowError",
          "kind": "class",
          "signature": "class NaviRecoveryEscrowError extends Error",
          "summary": ""
        },
        {
          "name": "NaviRecoveryEscrow",
          "kind": "class",
          "signature": "class NaviRecoveryEscrow",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ESCROW_DATABASE_NAME",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ESCROW_DATABASE_NAME",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ESCROW_DATABASE_VERSION",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ESCROW_DATABASE_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ESCROW_KEYS_STORE",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ESCROW_KEYS_STORE",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ESCROW_FACTORS_STORE",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ESCROW_FACTORS_STORE",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ESCROW_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ESCROW_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ESCROW_STATUS_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ESCROW_STATUS_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RECOVERY_ESCROW_INTERNAL",
          "kind": "constant",
          "signature": "NAVI_RECOVERY_ESCROW_INTERNAL",
          "summary": "Opaque kernel capability. It must never be copied into a syscall, app projection, log, or persisted record."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviRecoveryRuntime",
      "path": "webgpu-os/reference/kernel/navi/NaviRecoveryRuntime.md",
      "source": "webgpu-os/kernel/navi/NaviRecoveryRuntime.js",
      "import": "/webgpu-os/kernel/navi/NaviRecoveryRuntime.js",
      "sourceHash": "e7931520d00c16dae5503c161446f6e528aa3ae9c6731d6463dd05f10318ac7a",
      "summary": "Operator-bound Phase 7 recovery aggregate. This runtime keeps approval construction, portable-state verification, canonical cognition writes, and ancestry authority inside the kernel. Apps submit recovery factors and human decisions, never hashes or signatures.",
      "exports": [
        {
          "name": "NaviRecoveryRuntimeError",
          "kind": "class",
          "signature": "class NaviRecoveryRuntimeError extends Error",
          "summary": ""
        },
        {
          "name": "NaviRecoveryRuntime",
          "kind": "class",
          "signature": "class NaviRecoveryRuntime",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviRelationshipService",
      "path": "webgpu-os/reference/kernel/navi/NaviRelationshipService.md",
      "source": "webgpu-os/kernel/navi/NaviRelationshipService.js",
      "import": "/webgpu-os/kernel/navi/NaviRelationshipService.js",
      "sourceHash": "da233c46f8aa2100267cb3ffd27311feba5bdce3072acf3de0c2dfca11b3a2ed",
      "summary": "NaviRelationshipService — signed, append-only relationship authority. Relationships are evidence, not ambient trust. Chat contacts and package publishers never enter this service, and an active relationship grants no authority unless one of its exact signed policy rules matches the request. Raw contracts and encrypted records remain kernel-private; public methods return immutable projections with signature values and condition values removed.",
      "exports": [
        {
          "name": "NaviRelationshipServiceError",
          "kind": "class",
          "signature": "class NaviRelationshipServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviRelationshipIntegrityError",
          "kind": "class",
          "signature": "class NaviRelationshipIntegrityError extends NaviRelationshipServiceError",
          "summary": ""
        },
        {
          "name": "NaviRelationshipService",
          "kind": "class",
          "signature": "class NaviRelationshipService",
          "summary": ""
        },
        {
          "name": "NAVI_RELATIONSHIP_SERVICE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RELATIONSHIP_SERVICE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RELATIONSHIP_EVENT_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RELATIONSHIP_EVENT_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RELATIONSHIP_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_RELATIONSHIP_RECORD_TYPE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviResourceCatalog",
      "path": "webgpu-os/reference/kernel/navi/NaviResourceCatalog.md",
      "source": "webgpu-os/kernel/navi/NaviResourceCatalog.js",
      "import": "/webgpu-os/kernel/navi/NaviResourceCatalog.js",
      "sourceHash": "4692d76a8f11c2e0bee31118dc4cd14572dc48a9b27599d4cd260515b80f7c51",
      "summary": "NaviResourceCatalog.js — one deterministic, searchable projection of Navi tools, Faculties, guidance recipes, task episodes, and related resources. Catalog entries are descriptions only. Search never executes a resource or grants permission, and callers must resolve live authority independently.",
      "exports": [
        {
          "name": "NaviResourceCatalog",
          "kind": "class",
          "signature": "class NaviResourceCatalog",
          "summary": ""
        },
        {
          "name": "projectBrokerDecisionToResourceSelection",
          "kind": "function",
          "signature": "async projectBrokerDecisionToResourceSelection(rawInput = {}, rawOptions = {})",
          "summary": "Convert one existing NaviModelBroker decision into the Phase 8 resource selection contract without running a second selector. The broker's selected route and candidate order are authoritative. This projection only validates, binds, and signs that already-made decision."
        },
        {
          "name": "createNaviModelRouteResourceBindings",
          "kind": "function",
          "signature": "async createNaviModelRouteResourceBindings(routeConfiguration, purpose)",
          "summary": "Build the exact descriptor and verifier bindings for every model route in a broker candidate set. The descriptor hash intentionally shares the execution-plan route domain so the persisted selection and executable plan attest the same normalized route. No provider content or credential enters either binding."
        },
        {
          "name": "NAVI_RESOURCE_CATALOG_FORMATS",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_CATALOG_FORMATS",
          "summary": ""
        },
        {
          "name": "NAVI_BROKER_RESOURCE_EXCLUSION_REASON_MAP",
          "kind": "constant",
          "signature": "NAVI_BROKER_RESOURCE_EXCLUSION_REASON_MAP",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviResourceService",
      "path": "webgpu-os/reference/kernel/navi/NaviResourceService.md",
      "source": "webgpu-os/kernel/navi/NaviResourceService.js",
      "import": "/webgpu-os/kernel/navi/NaviResourceService.js",
      "sourceHash": "986fcdd5d3f33f59096bb78565d4d87c82a0ff107f07d8f43dc7d0cb935cc00c",
      "summary": "Kernel-owned resource reservation, metering, and settlement. One encrypted CAS account owns every lease for one Navi task. An authenticated encrypted branch index owns the exact aggregate charge and account membership. Account and index revisions commit through one Store batch while all accounts for the same Navi branch share one Web Lock. Every task binds its exact kernel-supplied resource ceiling on first reservation. Every externally meaningful lease state is an operationally signed navi-resource-lease-v1 contract.",
      "exports": [
        {
          "name": "NaviResourceServiceError",
          "kind": "class",
          "signature": "class NaviResourceServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviResourceService",
          "kind": "class",
          "signature": "class NaviResourceService",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_SERVICE_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_SERVICE_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_ACCOUNT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_ACCOUNT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_LEASE_RECORD_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_LEASE_RECORD_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_PROJECTION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_PROJECTION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_INDEX_RECORD_TYPE",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_INDEX_RECORD_TYPE",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_BRANCH_INDEX_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_BRANCH_INDEX_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_INDEX_MIGRATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_INDEX_MIGRATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_INDEX_MIGRATION_EVENT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_INDEX_MIGRATION_EVENT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_DIMENSIONS",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_DIMENSIONS",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_VERIFICATION_RESERVE",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_VERIFICATION_RESERVE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviStrategyScorecard",
      "path": "webgpu-os/reference/kernel/navi/NaviStrategyScorecard.md",
      "source": "webgpu-os/kernel/navi/NaviStrategyScorecard.js",
      "import": "/webgpu-os/kernel/navi/NaviStrategyScorecard.js",
      "sourceHash": "d278e06f6f044685c12f06fd5db608e2ff067c9303eeabe24c56565a06d91967",
      "summary": "Deterministic, per-Navi, analysis-only scorecards from verified receipts.",
      "exports": [
        {
          "name": "deriveNaviStrategyScorecard",
          "kind": "function",
          "signature": "async deriveNaviStrategyScorecard(raw = {})",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviStrictProjectionInput",
      "path": "webgpu-os/reference/kernel/navi/NaviStrictProjectionInput.md",
      "source": "webgpu-os/kernel/navi/NaviStrictProjectionInput.js",
      "import": "/webgpu-os/kernel/navi/NaviStrictProjectionInput.js",
      "sourceHash": "f4453c1513f277cbcd715b45eced41926847dd1ad0d07268783e3c3ca6d4bffb",
      "summary": "Strict JSON input helpers shared by authority-free Navi projections. These helpers reject accessors, extensions, cycles, sparse arrays, and non-finite values before a projection derives hashes or evidence counts.",
      "exports": [
        {
          "name": "strictProjectionSnapshot",
          "kind": "function",
          "signature": "strictProjectionSnapshot(value, label = 'projection input')",
          "summary": "Strict JSON input helpers shared by authority-free Navi projections. These helpers reject accessors, extensions, cycles, sparse arrays, and non-finite values before a projection derives hashes or evidence counts."
        },
        {
          "name": "exactProjectionKeys",
          "kind": "function",
          "signature": "exactProjectionKeys(value, allowed, label, required = [])",
          "summary": ""
        },
        {
          "name": "projectionInputError",
          "kind": "function",
          "signature": "projectionInputError(message, code = 'NAVI_PROJECTION_INPUT_INVALID')",
          "summary": ""
        },
        {
          "name": "deepFreezeProjection",
          "kind": "function",
          "signature": "deepFreezeProjection(value)",
          "summary": ""
        },
        {
          "name": "uniqueSortedProjectionStrings",
          "kind": "function",
          "signature": "uniqueSortedProjectionStrings(values, label, { minimum = 0, maximum = 1024 } = {})",
          "summary": ""
        },
        {
          "name": "strictProjectionTime",
          "kind": "function",
          "signature": "strictProjectionTime(value, label)",
          "summary": ""
        },
        {
          "name": "compareCodeUnits",
          "kind": "function",
          "signature": "compareCodeUnits(left, right)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviSurfaceIntelligence",
      "path": "webgpu-os/reference/kernel/navi/NaviSurfaceIntelligence.md",
      "source": "webgpu-os/kernel/navi/NaviSurfaceIntelligence.js",
      "import": "/webgpu-os/kernel/navi/NaviSurfaceIntelligence.js",
      "sourceHash": "fabfd97259e6701f31889a02fa657478c169131393fbb3929291822b30383e28",
      "summary": "NaviSurfaceIntelligence — bounded, read-only semantic evidence for visible OS surfaces. Surface observations are untrusted evidence. They never grant authority and never execute an action. Mutations named by an action catalog still enter ToolRouter, Live Patch, Dodad Forge, or an app-owned command boundary.",
      "exports": [
        {
          "name": "NaviSurfaceIntelligence",
          "kind": "class",
          "signature": "class NaviSurfaceIntelligence",
          "summary": ""
        },
        {
          "name": "MAX_VISUAL_PAYLOAD_ENCODED_BYTES",
          "kind": "constant",
          "signature": "MAX_VISUAL_PAYLOAD_ENCODED_BYTES",
          "summary": ""
        },
        {
          "name": "MAX_VISUAL_PAYLOAD_DECODED_BYTES",
          "kind": "constant",
          "signature": "MAX_VISUAL_PAYLOAD_DECODED_BYTES",
          "summary": ""
        },
        {
          "name": "MAX_RETAINED_VISUAL_BYTES",
          "kind": "constant",
          "signature": "MAX_RETAINED_VISUAL_BYTES",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviVfsOverlayService",
      "path": "webgpu-os/reference/kernel/navi/NaviVfsOverlayService.md",
      "source": "webgpu-os/kernel/navi/NaviVfsOverlayService.js",
      "import": "/webgpu-os/kernel/navi/NaviVfsOverlayService.js",
      "sourceHash": "79f7a0c480a68101738f0c4f5b2408b32af775ba7d2dd56bb4702e714dd84c4b",
      "summary": "Kernel-owned VFS isolation for delegated Navi workers. A delegated file capability is issued for one deterministic hidden overlay root. The adapter never rewrites a signed path: it verifies that the exact execution path is inside the bound overlay and returns that same path. The immutable snapshot hash describes the overlay at admission time; subsequent writes remain constrained by the signed path scopes rather than changing the authorization identity after every edit. Storage accounting is deliberately application-byte based. Kernel-owned overlay metadata, hashes, and signed receipts are excluded. Creating an empty overlay and observing a snapshot therefore cost zero storage bytes. Moving an overlay into recoverable trash is a durable application-data rewrite and is charged at the exact sum of the files present in its prepared snapshot.",
      "exports": [
        {
          "name": "NaviVfsOverlayServiceError",
          "kind": "class",
          "signature": "class NaviVfsOverlayServiceError extends Error",
          "summary": ""
        },
        {
          "name": "NaviVfsOverlayService",
          "kind": "class",
          "signature": "class NaviVfsOverlayService",
          "summary": ""
        },
        {
          "name": "NAVI_VFS_OVERLAY_FORMAT",
          "kind": "constant",
          "signature": "NAVI_VFS_OVERLAY_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_VFS_OVERLAY_STORAGE_RECEIPT_FORMAT",
          "kind": "constant",
          "signature": "NAVI_VFS_OVERLAY_STORAGE_RECEIPT_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_VFS_OVERLAY_METADATA_ROOT",
          "kind": "constant",
          "signature": "NAVI_VFS_OVERLAY_METADATA_ROOT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/NaviWorkspaceOutputIndex",
      "path": "webgpu-os/reference/kernel/navi/NaviWorkspaceOutputIndex.md",
      "source": "webgpu-os/kernel/navi/NaviWorkspaceOutputIndex.js",
      "import": "/webgpu-os/kernel/navi/NaviWorkspaceOutputIndex.js",
      "sourceHash": "ebd9950896dc746ffb90161a49d4a09761ba39bda382b6f535f5e284d42fee37",
      "summary": "Rebuildable, non-authoritative references to canonical workspace outputs. The index owns no file content. Every entry is derived from an exact VFS observation and points back to the app-owned canonical path. Deleting the index loses no user data because the same projection can be rebuilt.",
      "exports": [
        {
          "name": "NaviWorkspaceOutputIndex",
          "kind": "class",
          "signature": "class NaviWorkspaceOutputIndex",
          "summary": ""
        },
        {
          "name": "WORKSPACE_OUTPUT_CONTRACT_FORMAT",
          "kind": "constant",
          "signature": "WORKSPACE_OUTPUT_CONTRACT_FORMAT",
          "summary": ""
        },
        {
          "name": "WORKSPACE_OUTPUT_REBUILD_FORMAT",
          "kind": "constant",
          "signature": "WORKSPACE_OUTPUT_REBUILD_FORMAT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/SurfaceTemporalVerifier",
      "path": "webgpu-os/reference/kernel/navi/SurfaceTemporalVerifier.md",
      "source": "webgpu-os/kernel/navi/SurfaceTemporalVerifier.js",
      "import": "/webgpu-os/kernel/navi/SurfaceTemporalVerifier.js",
      "sourceHash": "1742dee5eb3385aed24ab44440e2c094bb794bcd11e823ede749ce0195aa272a",
      "summary": "SurfaceTemporalVerifier compares two retained semantic captures. It is deliberately read-only. Visual comparison accepts contract evidence that was captured earlier and compares content hashes only; it never reads a payload.",
      "exports": [
        {
          "name": "SurfaceTemporalVerifier",
          "kind": "class",
          "signature": "class SurfaceTemporalVerifier",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/adapters/ConstructManifestationAdapter",
      "path": "webgpu-os/reference/kernel/navi/adapters/ConstructManifestationAdapter.md",
      "source": "webgpu-os/kernel/navi/adapters/ConstructManifestationAdapter.js",
      "import": "/webgpu-os/kernel/navi/adapters/ConstructManifestationAdapter.js",
      "sourceHash": "a75817ff4f1a5e6842e52c0fc34be6d892b6342bd0ef5b5ed37386a2a17b8fae",
      "summary": "Narrow Construct manifestation boundary. The adapter deliberately captures only bound ActiveBody-style functions and explicit observation readers supplied by trusted kernel wiring. It never exposes the engine object, treats a body as identity, or derives authority from scene, presence, spatial, model, avatar, or body data.",
      "exports": [
        {
          "name": "NaviConstructManifestationAdapterError",
          "kind": "class",
          "signature": "class NaviConstructManifestationAdapterError extends Error",
          "summary": ""
        },
        {
          "name": "createConstructManifestationAdapter",
          "kind": "function",
          "signature": "createConstructManifestationAdapter({ bodyId, bodyRuntime, manifestationId = NAVI_CONSTRUCT_PRIMARY_MANIFESTATION_ID, spawnPosition = [0, 0, 0], bodyOptions = {}, readActiveScene, readSelectedEntity, readVerifiedRealmPresence, readSpatialLocality, playAnimation, requestRealmAuthority, maxObservationBytes = DEFAULT_MAX_OBSERVATION_BYTES, clock = ()",
          "summary": "Create the trusted Construct runtime attached by NaviManifestationAdapterRegistry. bodyRuntime is expected to be an ActiveBodySystem-compatible object. Readers are narrow kernel wrappers; each receives a frozen exact-scope request."
        },
        {
          "name": "NAVI_CONSTRUCT_ADAPTER_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONSTRUCT_ADAPTER_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONSTRUCT_ACTIVATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONSTRUCT_ACTIVATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONSTRUCT_OBSERVATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONSTRUCT_OBSERVATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONSTRUCT_ACTUATION_FORMAT",
          "kind": "constant",
          "signature": "NAVI_CONSTRUCT_ACTUATION_FORMAT",
          "summary": ""
        },
        {
          "name": "NAVI_CONSTRUCT_PRIMARY_MANIFESTATION_ID",
          "kind": "constant",
          "signature": "NAVI_CONSTRUCT_PRIMARY_MANIFESTATION_ID",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/builtins/ArtifactStudioFaculty",
      "path": "webgpu-os/reference/kernel/navi/builtins/ArtifactStudioFaculty.md",
      "source": "webgpu-os/kernel/navi/builtins/ArtifactStudioFaculty.js",
      "import": "/webgpu-os/kernel/navi/builtins/ArtifactStudioFaculty.js",
      "sourceHash": "52333cd6de6a2cf824d9255085440b076cff65ac41ea46715d61162d5a1bb6ab",
      "summary": "ArtifactStudioFaculty.js Canonical contract factory and worker source for AI Echo's built-in Artifact Studio adapter. The worker is deliberately tiny: it can request exactly one declared Artifact tool and receives no storage, credential, network, DOM, or raw-JavaScript authority of its own.",
      "exports": [
        {
          "name": "createArtifactStudioNaviFaculty",
          "kind": "function",
          "signature": "createArtifactStudioNaviFaculty({ descriptorHashes = {}, provenance = null, tests = [], signatures = null, version = ARTIFACT_STUDIO_FACULTY_VERSION, publisherId = ARTIFACT_STUDIO_PUBLISHER_ID, } = {})",
          "summary": ""
        },
        {
          "name": "createArtifactStudioFacultyPackageBinding",
          "kind": "function",
          "signature": "async createArtifactStudioFacultyPackageBinding(manifest, { resourceHash = null } = {})",
          "summary": ""
        },
        {
          "name": "assertArtifactStudioManifest",
          "kind": "function",
          "signature": "assertArtifactStudioManifest(value)",
          "summary": ""
        },
        {
          "name": "artifactStudioPackageEvidence",
          "kind": "function",
          "signature": "artifactStudioPackageEvidence()",
          "summary": "Return the complete package evidence shape consumed by NaviFacultyPackagePolicy. The release preamble wins when present; raw browser development uses the checked-in public fallback package. No private signing material is present in either record."
        },
        {
          "name": "artifactStudioSignedManifest",
          "kind": "function",
          "signature": "artifactStudioSignedManifest()",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_FACULTY_ID",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_FACULTY_ID",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_FACULTY_VERSION_BASE",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_FACULTY_VERSION_BASE",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_FACULTY_VERSION",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_FACULTY_VERSION",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_PACKAGE_ID",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_PACKAGE_ID",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_PUBLISHER_ID",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_PUBLISHER_ID",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_SOURCE_PATH",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_SOURCE_PATH",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_TOOL_NAMES",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_TOOL_NAMES",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_FACULTY_SOURCE",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_FACULTY_SOURCE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/builtins/BrowserSemanticFaculty",
      "path": "webgpu-os/reference/kernel/navi/builtins/BrowserSemanticFaculty.md",
      "source": "webgpu-os/kernel/navi/builtins/BrowserSemanticFaculty.js",
      "import": "/webgpu-os/kernel/navi/builtins/BrowserSemanticFaculty.js",
      "sourceHash": "01df2cbe28783b9f340c0451264fd9a6413da385c733ea51bcada020abf5ea3b",
      "summary": "Canonical signed boundary for extension-backed semantic browser automation. The package is installed inert: only an explicit operator action may enable its device and network authority for a Navi.",
      "exports": [
        {
          "name": "browserSemanticFacultyDefinitionAtVersion",
          "kind": "function",
          "signature": "browserSemanticFacultyDefinitionAtVersion(version)",
          "summary": ""
        },
        {
          "name": "createBrowserSemanticNaviFaculty",
          "kind": "function",
          "signature": "createBrowserSemanticNaviFaculty({ descriptorHashes = {}, provenance = null, tests = [], signatures = null, version = BROWSER_SEMANTIC_FACULTY_VERSION, publisherId = BROWSER_SEMANTIC_PUBLISHER_ID, maxCalls = 1, } = {})",
          "summary": ""
        },
        {
          "name": "createBrowserSemanticFacultyPackageBinding",
          "kind": "function",
          "signature": "async createBrowserSemanticFacultyPackageBinding(manifest, { resourceHash = null } = {})",
          "summary": ""
        },
        {
          "name": "assertBrowserSemanticManifest",
          "kind": "function",
          "signature": "assertBrowserSemanticManifest(value, definition = BROWSER_SEMANTIC_FACULTY_DEFINITION)",
          "summary": ""
        },
        {
          "name": "browserSemanticPackageEvidence",
          "kind": "function",
          "signature": "browserSemanticPackageEvidence()",
          "summary": ""
        },
        {
          "name": "browserSemanticSignedManifest",
          "kind": "function",
          "signature": "browserSemanticSignedManifest()",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_FACULTY_ID",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_FACULTY_ID",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_FACULTY_VERSION_BASE",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_FACULTY_VERSION_BASE",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_FACULTY_VERSION",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_FACULTY_VERSION",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_PACKAGE_ID",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_PACKAGE_ID",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_PUBLISHER_ID",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_PUBLISHER_ID",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_SOURCE_PATH",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_SOURCE_PATH",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_NETWORK_BYTES_PER_CALL",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_NETWORK_BYTES_PER_CALL",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_TOOL_NAMES",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_TOOL_NAMES",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_FACULTY_SOURCE",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_FACULTY_SOURCE",
          "summary": ""
        },
        {
          "name": "BROWSER_SEMANTIC_FACULTY_DEFINITION",
          "kind": "constant",
          "signature": "BROWSER_SEMANTIC_FACULTY_DEFINITION",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/builtins/BuiltInFacultyPackageEvidence",
      "path": "webgpu-os/reference/kernel/navi/builtins/BuiltInFacultyPackageEvidence.md",
      "source": "webgpu-os/kernel/navi/builtins/BuiltInFacultyPackageEvidence.js",
      "import": "/webgpu-os/kernel/navi/builtins/BuiltInFacultyPackageEvidence.js",
      "sourceHash": "4e5810b9d4d669e69627318b13f9ad2878fc52a3e631f485f7487e023187d238",
      "summary": "Shared fail-closed reader for OS-owned signed Faculty package evidence.",
      "exports": [
        {
          "name": "builtInFacultyPackageEvidence",
          "kind": "function",
          "signature": "builtInFacultyPackageEvidence({ label, packageId, version, publisherId, sourcePath, source, generatedPackage, assertManifest, })",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/builtins/BuiltInToolFaculties",
      "path": "webgpu-os/reference/kernel/navi/builtins/BuiltInToolFaculties.md",
      "source": "webgpu-os/kernel/navi/builtins/BuiltInToolFaculties.js",
      "import": "/webgpu-os/kernel/navi/builtins/BuiltInToolFaculties.js",
      "sourceHash": "a307b383bd03ad1a404f11bc95229db511e7d035c4d98fe9f29bc1843636ff94",
      "summary": "Bind one catalog definition to the immutable version carried by its signed package.",
      "exports": [
        {
          "name": "builtInToolFacultyDefinition",
          "kind": "function",
          "signature": "builtInToolFacultyDefinition(facultyId)",
          "summary": ""
        },
        {
          "name": "builtInToolFacultyDefinitionAtVersion",
          "kind": "function",
          "signature": "builtInToolFacultyDefinitionAtVersion(definitionOrId, version)",
          "summary": "Bind one catalog definition to the immutable version carried by its signed package."
        },
        {
          "name": "assertBuiltInToolFacultyManifest",
          "kind": "function",
          "signature": "assertBuiltInToolFacultyManifest(value, definitionOrId)",
          "summary": ""
        },
        {
          "name": "builtInToolFacultyPackageEvidence",
          "kind": "function",
          "signature": "builtInToolFacultyPackageEvidence(definitionOrId)",
          "summary": ""
        },
        {
          "name": "builtInToolFacultySignedManifest",
          "kind": "function",
          "signature": "builtInToolFacultySignedManifest(definitionOrId)",
          "summary": ""
        },
        {
          "name": "BUILT_IN_TOOL_FACULTY_VERSION",
          "kind": "constant",
          "signature": "BUILT_IN_TOOL_FACULTY_VERSION",
          "summary": ""
        },
        {
          "name": "BUILT_IN_TOOL_FACULTY_PUBLISHER_ID",
          "kind": "constant",
          "signature": "BUILT_IN_TOOL_FACULTY_PUBLISHER_ID",
          "summary": ""
        },
        {
          "name": "BUILT_IN_TOOL_FACULTY_DEFINITIONS_JSON",
          "kind": "constant",
          "signature": "BUILT_IN_TOOL_FACULTY_DEFINITIONS_JSON",
          "summary": ""
        },
        {
          "name": "BUILT_IN_TOOL_FACULTY_EXCLUSIONS_JSON",
          "kind": "constant",
          "signature": "BUILT_IN_TOOL_FACULTY_EXCLUSIONS_JSON",
          "summary": ""
        },
        {
          "name": "BUILT_IN_TOOL_FACULTY_SOURCE",
          "kind": "constant",
          "signature": "BUILT_IN_TOOL_FACULTY_SOURCE",
          "summary": ""
        },
        {
          "name": "BUILT_IN_TOOL_FACULTIES",
          "kind": "constant",
          "signature": "BUILT_IN_TOOL_FACULTIES",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/contracts/ContractCanonical",
      "path": "webgpu-os/reference/kernel/navi/contracts/ContractCanonical.md",
      "source": "webgpu-os/kernel/navi/contracts/ContractCanonical.js",
      "import": "/webgpu-os/kernel/navi/contracts/ContractCanonical.js",
      "sourceHash": "1eaa7addde0b20b6460b9706c5db67d2fb3e15894a981a013b6e331eb6440bea",
      "summary": "ContractCanonical.js — domain-separated signing bytes and secure identifiers.",
      "exports": [
        {
          "name": "naviSigningValue",
          "kind": "function",
          "signature": "naviSigningValue(contract)",
          "summary": "Return the JSON value covered by every top-level Navi contract signature. Signature envelopes are excluded to avoid circular signing input."
        },
        {
          "name": "canonicalNaviSigningText",
          "kind": "function",
          "signature": "canonicalNaviSigningText(contract)",
          "summary": "Return the deterministic, domain-separated signing text."
        },
        {
          "name": "canonicalNaviSigningBytes",
          "kind": "function",
          "signature": "canonicalNaviSigningBytes(contract)",
          "summary": "Return the exact UTF-8 bytes that P-256 signs or verifies."
        },
        {
          "name": "hashNaviSigningPayload",
          "kind": "function",
          "signature": "async hashNaviSigningPayload(contract)",
          "summary": "Return a tagged SHA-256 identifier for the signature-covered payload."
        },
        {
          "name": "hashNaviContractEnvelope",
          "kind": "function",
          "signature": "async hashNaviContractEnvelope(contract)",
          "summary": "Return a tagged SHA-256 identifier for the complete signed envelope."
        },
        {
          "name": "naviSigningPayloadEquals",
          "kind": "function",
          "signature": "naviSigningPayloadEquals(a, b)",
          "summary": "Compare contract payloads without relying on insertion order. Useful before signing, during recovery diffs, and when checking fixture determinism."
        },
        {
          "name": "NAVI_SIGNING_DOMAIN",
          "kind": "constant",
          "signature": "NAVI_SIGNING_DOMAIN",
          "summary": ""
        },
        {
          "name": "NAVI_SIGNING_SCOPE",
          "kind": "constant",
          "signature": "NAVI_SIGNING_SCOPE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/contracts/ContractRegistry",
      "path": "webgpu-os/reference/kernel/navi/contracts/ContractRegistry.md",
      "source": "webgpu-os/kernel/navi/contracts/ContractRegistry.js",
      "import": "/webgpu-os/kernel/navi/contracts/ContractRegistry.js",
      "sourceHash": "bdde5afffad876afec1ee87d0ded7aa742a26954b2c92355d3b848136329c21b",
      "summary": "ContractRegistry.js — isolated Navi v1 schema registry and semantic checks. This registry deliberately does not mutate the OS-wide singleton. Kernel bootstrap can integrate it after the Phase 0 gate passes without making an import of this module a side effect.",
      "exports": [
        {
          "name": "createNaviContractRegistry",
          "kind": "function",
          "signature": "createNaviContractRegistry()",
          "summary": ""
        },
        {
          "name": "isKnownNaviSchema",
          "kind": "function",
          "signature": "isKnownNaviSchema(schemaId)",
          "summary": ""
        },
        {
          "name": "validateNaviContract",
          "kind": "function",
          "signature": "validateNaviContract(data, expectedSchemaId = null, options = {})",
          "summary": ""
        },
        {
          "name": "assertNaviContract",
          "kind": "function",
          "signature": "assertNaviContract(data, expectedSchemaId = null, options = {})",
          "summary": ""
        },
        {
          "name": "naviContractRegistry",
          "kind": "constant",
          "signature": "naviContractRegistry",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/contracts/ContractSchemas",
      "path": "webgpu-os/reference/kernel/navi/contracts/ContractSchemas.md",
      "source": "webgpu-os/kernel/navi/contracts/ContractSchemas.js",
      "import": "/webgpu-os/kernel/navi/contracts/ContractSchemas.js",
      "sourceHash": "b4ffc29bdf2c8589e1e10cd7ce5c23dc03b950005cdffce33f98c4080e4a35d0",
      "summary": "ContractSchemas.js — strict, versioned Navi v1 wire schemas. The OS schema validator intentionally supports a compact JSON Schema subset. Every declared object is closed with additionalProperties:false. Fields that intentionally contain application JSON are named `value` or `metadata` and are still checked by ContractRegistry's JSON-safety pass before acceptance.",
      "exports": [
        {
          "name": "NAVI_ARTIFACT_REFERENCE_PATTERN",
          "kind": "constant",
          "signature": "NAVI_ARTIFACT_REFERENCE_PATTERN",
          "summary": ""
        },
        {
          "name": "NAVI_CAPABILITY_PATH_OPERATIONS",
          "kind": "constant",
          "signature": "NAVI_CAPABILITY_PATH_OPERATIONS",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_KINDS",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_KINDS",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_SELECTION_REJECTION_REASON_CODES",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_SELECTION_REJECTION_REASON_CODES",
          "summary": ""
        },
        {
          "name": "NAVI_RESOURCE_SELECTION_REASON_CODES",
          "kind": "constant",
          "signature": "NAVI_RESOURCE_SELECTION_REASON_CODES",
          "summary": ""
        },
        {
          "name": "NAVI_SCHEMA_IDS",
          "kind": "constant",
          "signature": "NAVI_SCHEMA_IDS",
          "summary": ""
        },
        {
          "name": "NAVI_SCHEMA_ID_LIST",
          "kind": "constant",
          "signature": "NAVI_SCHEMA_ID_LIST",
          "summary": ""
        },
        {
          "name": "NAVI_COMMON_SCHEMA_NAMES",
          "kind": "constant",
          "signature": "NAVI_COMMON_SCHEMA_NAMES",
          "summary": ""
        },
        {
          "name": "NAVI_COMMON_SCHEMAS",
          "kind": "constant",
          "signature": "NAVI_COMMON_SCHEMAS",
          "summary": ""
        },
        {
          "name": "NAVI_CONTRACT_SCHEMAS",
          "kind": "constant",
          "signature": "NAVI_CONTRACT_SCHEMAS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/contracts/Vocabulary",
      "path": "webgpu-os/reference/kernel/navi/contracts/Vocabulary.md",
      "source": "webgpu-os/kernel/navi/contracts/Vocabulary.js",
      "import": "/webgpu-os/kernel/navi/contracts/Vocabulary.js",
      "sourceHash": "06ba46d6acdb4382a8df2df149c8c64801e889029f8dc3595e027296dc30c385",
      "summary": "Vocabulary.js — canonical Navi v1 terminology and closed policy vocabularies. These values are wire contracts. Additions require a new contract revision; renaming an entry would change signed meaning and is therefore forbidden.",
      "exports": [
        {
          "name": "NAVI_ARCHITECTURE_VERSION",
          "kind": "constant",
          "signature": "NAVI_ARCHITECTURE_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_SYSTEMS",
          "kind": "constant",
          "signature": "NAVI_SYSTEMS",
          "summary": ""
        },
        {
          "name": "NAVI_SYSTEM_BY_CODE",
          "kind": "constant",
          "signature": "NAVI_SYSTEM_BY_CODE",
          "summary": ""
        },
        {
          "name": "NAVI_DATA_CLASSIFICATIONS",
          "kind": "constant",
          "signature": "NAVI_DATA_CLASSIFICATIONS",
          "summary": ""
        },
        {
          "name": "NAVI_AUTHORITY_DOMAINS",
          "kind": "constant",
          "signature": "NAVI_AUTHORITY_DOMAINS",
          "summary": ""
        },
        {
          "name": "NAVI_MEMORY_CLASSES",
          "kind": "constant",
          "signature": "NAVI_MEMORY_CLASSES",
          "summary": ""
        },
        {
          "name": "NAVI_SECURITY_TIERS",
          "kind": "constant",
          "signature": "NAVI_SECURITY_TIERS",
          "summary": ""
        },
        {
          "name": "NAVI_SECURITY_TIER_IDS",
          "kind": "constant",
          "signature": "NAVI_SECURITY_TIER_IDS",
          "summary": ""
        },
        {
          "name": "NAVI_PRINCIPAL_KINDS",
          "kind": "constant",
          "signature": "NAVI_PRINCIPAL_KINDS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/navi/contracts/index",
      "path": "webgpu-os/reference/kernel/navi/contracts/index.md",
      "source": "webgpu-os/kernel/navi/contracts/index.js",
      "import": "/webgpu-os/kernel/navi/contracts/index.js",
      "sourceHash": "a78e72a3e678531d25cd3f355fb524ae689c0679601ca92fa873e8c4ff1b242a",
      "summary": "",
      "exports": [
        {
          "name": "NAVI_ARCHITECTURE_VERSION",
          "kind": "re-export",
          "signature": "NAVI_ARCHITECTURE_VERSION",
          "summary": ""
        },
        {
          "name": "NAVI_ARTIFACT_REFERENCE_PATTERN",
          "kind": "re-export",
          "signature": "NAVI_ARTIFACT_REFERENCE_PATTERN",
          "summary": ""
        },
        {
          "name": "NAVI_AUTHORITY_DOMAINS",
          "kind": "re-export",
          "signature": "NAVI_AUTHORITY_DOMAINS",
          "summary": ""
        },
        {
          "name": "NAVI_CAPABILITY_PATH_OPERATIONS",
          "kind": "re-export",
          "signature": "NAVI_CAPABILITY_PATH_OPERATIONS",
          "summary": ""
        },
        {
          "name": "NAVI_COMMON_SCHEMAS",
          "kind": "re-export",
          "signature": "NAVI_COMMON_SCHEMAS",
          "summary": ""
        },
        {
          "name": "NAVI_COMMON_SCHEMA_NAMES",
          "kind": "re-export",
          "signature": "NAVI_COMMON_SCHEMA_NAMES",
          "summary": ""
        },
        {
          "name": "NAVI_CONTRACT_SCHEMAS",
          "kind": "re-export",
          "signature": "NAVI_CONTRACT_SCHEMAS",
          "summary": ""
        },
        {
          "name": "NAVI_DATA_CLASSIFICATIONS",
          "kind": "re-export",
          "signature": "NAVI_DATA_CLASSIFICATIONS",
          "summary": ""
        },
        {
          "name": "NAVI_MEMORY_CLASSES",
          "kind": "re-export",
          "signature": "NAVI_MEMORY_CLASSES",
          "summary": ""
        },
        {
          "name": "NAVI_PRINCIPAL_KINDS",
          "kind": "re-export",
          "signature": "NAVI_PRINCIPAL_KINDS",
          "summary": ""
        },
        {
          "name": "NAVI_SCHEMA_IDS",
          "kind": "re-export",
          "signature": "NAVI_SCHEMA_IDS",
          "summary": ""
        },
        {
          "name": "NAVI_SCHEMA_ID_LIST",
          "kind": "re-export",
          "signature": "NAVI_SCHEMA_ID_LIST",
          "summary": ""
        },
        {
          "name": "NAVI_SECURITY_TIERS",
          "kind": "re-export",
          "signature": "NAVI_SECURITY_TIERS",
          "summary": ""
        },
        {
          "name": "NAVI_SECURITY_TIER_IDS",
          "kind": "re-export",
          "signature": "NAVI_SECURITY_TIER_IDS",
          "summary": ""
        },
        {
          "name": "NAVI_SIGNING_DOMAIN",
          "kind": "re-export",
          "signature": "NAVI_SIGNING_DOMAIN",
          "summary": ""
        },
        {
          "name": "NAVI_SIGNING_SCOPE",
          "kind": "re-export",
          "signature": "NAVI_SIGNING_SCOPE",
          "summary": ""
        },
        {
          "name": "NAVI_SYSTEMS",
          "kind": "re-export",
          "signature": "NAVI_SYSTEMS",
          "summary": ""
        },
        {
          "name": "NAVI_SYSTEM_BY_CODE",
          "kind": "re-export",
          "signature": "NAVI_SYSTEM_BY_CODE",
          "summary": ""
        },
        {
          "name": "assertNaviContract",
          "kind": "re-export",
          "signature": "assertNaviContract",
          "summary": ""
        },
        {
          "name": "canonicalNaviSigningBytes",
          "kind": "re-export",
          "signature": "canonicalNaviSigningBytes",
          "summary": ""
        },
        {
          "name": "canonicalNaviSigningText",
          "kind": "re-export",
          "signature": "canonicalNaviSigningText",
          "summary": ""
        },
        {
          "name": "createNaviContractRegistry",
          "kind": "re-export",
          "signature": "createNaviContractRegistry",
          "summary": ""
        },
        {
          "name": "hashNaviContractEnvelope",
          "kind": "re-export",
          "signature": "hashNaviContractEnvelope",
          "summary": ""
        },
        {
          "name": "hashNaviSigningPayload",
          "kind": "re-export",
          "signature": "hashNaviSigningPayload",
          "summary": ""
        },
        {
          "name": "isKnownNaviSchema",
          "kind": "re-export",
          "signature": "isKnownNaviSchema",
          "summary": ""
        },
        {
          "name": "naviContractRegistry",
          "kind": "re-export",
          "signature": "naviContractRegistry",
          "summary": ""
        },
        {
          "name": "naviSigningPayloadEquals",
          "kind": "re-export",
          "signature": "naviSigningPayloadEquals",
          "summary": ""
        },
        {
          "name": "naviSigningValue",
          "kind": "re-export",
          "signature": "naviSigningValue",
          "summary": ""
        },
        {
          "name": "validateNaviContract",
          "kind": "re-export",
          "signature": "validateNaviContract",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/net-safety",
      "path": "webgpu-os/reference/kernel/net-safety.md",
      "source": "webgpu-os/kernel/net-safety.js",
      "import": "/webgpu-os/kernel/net-safety.js",
      "sourceHash": "5d23c99689985fbc4afc09c0616fa36030cf169295310451c40b9f97337b4f41",
      "summary": "net-safety.js — shared SSRF / private-host guards for OS-mediated fetches. Reused by the sandboxed-app network bridge, the package UpdateManager, and the package source-URL policy so the same allow/deny rules apply everywhere: - http(s) only (no file:, data:, blob:, chrome-extension:, etc.) - no embedded credentials in the URL - no loopback / link-local / RFC-1918 / CGNAT / multicast / .local hosts Public hostnames pass (still subject to the browser's CORS rules).",
      "exports": [
        {
          "name": "isPrivateHost",
          "kind": "function",
          "signature": "isPrivateHost(host)",
          "summary": "True if a hostname points at the local machine or a private network range."
        },
        {
          "name": "assertSafeFetchUrl",
          "kind": "function",
          "signature": "assertSafeFetchUrl(url, opts = {})",
          "summary": "Validate and normalise a URL for an OS-mediated fetch. Throws on policy violation; returns the normalised href on success."
        },
        {
          "name": "isLocalDevHost",
          "kind": "function",
          "signature": "isLocalDevHost(host)",
          "summary": "True when a host is localhost-like (used to relax https for local dev sources)."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/CapabilityNegotiator",
      "path": "webgpu-os/reference/kernel/protocol/CapabilityNegotiator.md",
      "source": "webgpu-os/kernel/protocol/CapabilityNegotiator.js",
      "import": "/webgpu-os/kernel/protocol/CapabilityNegotiator.js",
      "sourceHash": "a4fab05e75a26342adab9b1bf4a71f55a96d68a7760e0e2fea47d8e3453c243a",
      "summary": "CapabilityNegotiator.js — Particle Realms Protocol capability minting. Thin wrapper over engine/state's CapabilityRegistry + Capability.js (makeCapability/attenuate/authorizes) — no parallel capability logic. Used by the AI Hub's two-pass execution loop (Phase 9) to mint short-lived, narrowly-scoped capabilities for a single OS.ai() request's tool/resource access, on top of (not instead of) the RuleGraph/Permissions manifest gate.",
      "exports": [
        {
          "name": "CapabilityNegotiator",
          "kind": "class",
          "signature": "class CapabilityNegotiator",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/ElicitationManager",
      "path": "webgpu-os/reference/kernel/protocol/ElicitationManager.md",
      "source": "webgpu-os/kernel/protocol/ElicitationManager.js",
      "import": "/webgpu-os/kernel/protocol/ElicitationManager.js",
      "sourceHash": "7c9bc351a26037e6bf47b612e9fe693a9a139f44ee5d7abe8ed786a7b89beb67",
      "summary": "ElicitationManager.js — Particle Realms Protocol elicitation (MCP-inspired): lets a mid-task AI Hub request pause and ask the user a clarifying question instead of guessing. Phase 4 provides the data-layer queue; Phase 8's overlay (ElicitationCard.js) is the UI that calls respond()/decline().",
      "exports": [
        {
          "name": "ElicitationManager",
          "kind": "class",
          "signature": "class ElicitationManager",
          "summary": "ElicitationManager.js — Particle Realms Protocol elicitation (MCP-inspired): lets a mid-task AI Hub request pause and ask the user a clarifying question instead of guessing. Phase 4 provides the data-layer queue; Phase 8's overlay (ElicitationCard.js) is the UI that calls respond()/decline()."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/ParticleRealmsProtocol",
      "path": "webgpu-os/reference/kernel/protocol/ParticleRealmsProtocol.md",
      "source": "webgpu-os/kernel/protocol/ParticleRealmsProtocol.js",
      "import": "/webgpu-os/kernel/protocol/ParticleRealmsProtocol.js",
      "sourceHash": "5f0973814a18ec7d8e240d1b3e0998e688e94633aae2ab13f3c5378cc12e3010",
      "summary": "ParticleRealmsProtocol.js — the MCP-inspired protocol facade tying together this app's capability/tool/resource/prompt/root/elicitation/sampling registries. Exposed as kernel.protocol; wrapped by syscalls.protocol. An app calls declare(manifest) once (validated against os.AppAICapabilityManifest in OsSchemas.js) to register its tool/resource/ prompt/root metadata for AI discovery. Declaring metadata here is always advisory/self-descriptive — it never grants authority; actual tool execution still goes through ToolRouter's firewall (Phase 3) and actual resource reads still go through ResourceRegistry -> UntrustedBoundary.",
      "exports": [
        {
          "name": "ParticleRealmsProtocol",
          "kind": "class",
          "signature": "class ParticleRealmsProtocol",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/PromptRegistry",
      "path": "webgpu-os/reference/kernel/protocol/PromptRegistry.md",
      "source": "webgpu-os/kernel/protocol/PromptRegistry.js",
      "import": "/webgpu-os/kernel/protocol/PromptRegistry.js",
      "sourceHash": "e35dff6c75da568a49a0a66c9d44894d14e363fb2cceb74b0b2bcf3d1759827a",
      "summary": "PromptRegistry.js — Particle Realms Protocol named prompt-template catalog (MCP-inspired \"prompts\"). Apps register a render(args) function; the OS owns the final prompt text by always routing rendered output through PromptRegistry.sanitize() before it reaches the AI Hub — an app cannot smuggle raw control tokens or fake role delimiters into the final prompt.",
      "exports": [
        {
          "name": "PromptRegistry",
          "kind": "class",
          "signature": "class PromptRegistry",
          "summary": "PromptRegistry.js — Particle Realms Protocol named prompt-template catalog (MCP-inspired \"prompts\"). Apps register a render(args) function; the OS owns the final prompt text by always routing rendered output through PromptRegistry.sanitize() before it reaches the AI Hub — an app cannot smuggle raw control tokens or fake role delimiters into the final prompt."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/ResourceRegistry",
      "path": "webgpu-os/reference/kernel/protocol/ResourceRegistry.md",
      "source": "webgpu-os/kernel/protocol/ResourceRegistry.js",
      "import": "/webgpu-os/kernel/protocol/ResourceRegistry.js",
      "sourceHash": "33997e5fe13b23edb75bd56f93effa4ba37cd34a563684ff5697483a26b112fa",
      "summary": "ResourceRegistry.js — Particle Realms Protocol resource catalog. Apps expose readable data to the AI Hub under a `<appId>://...` URI scheme (MCP-inspired \"resources\"). Every read is routed through engine/state/worldmodel/UntrustedBoundary.js (Phase 3 reuse) before it's handed back — resource content is always an untrusted observation, never authority, regardless of how much the reading app trusts its own data.",
      "exports": [
        {
          "name": "ResourceRegistry",
          "kind": "class",
          "signature": "class ResourceRegistry",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/RootBoundaryManager",
      "path": "webgpu-os/reference/kernel/protocol/RootBoundaryManager.md",
      "source": "webgpu-os/kernel/protocol/RootBoundaryManager.js",
      "import": "/webgpu-os/kernel/protocol/RootBoundaryManager.js",
      "sourceHash": "880f1f0826c971c28c8f7d090a300a6dacd149e0e4835be9eac33644b0c7839a",
      "summary": "RootBoundaryManager.js — Particle Realms Protocol \"roots\" (MCP-inspired): the set of resource URI prefixes an app has declared as in-scope for a given AI request. Roots only ever NARROW what an OS.ai() request may touch — they are advisory scoping on top of (never a substitute for) the ResourceRegistry/RuleGraph capability checks.",
      "exports": [
        {
          "name": "RootBoundaryManager",
          "kind": "class",
          "signature": "class RootBoundaryManager",
          "summary": "RootBoundaryManager.js — Particle Realms Protocol \"roots\" (MCP-inspired): the set of resource URI prefixes an app has declared as in-scope for a given AI request. Roots only ever NARROW what an OS.ai() request may touch — they are advisory scoping on top of (never a substitute for) the ResourceRegistry/RuleGraph capability checks."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/SamplingBroker",
      "path": "webgpu-os/reference/kernel/protocol/SamplingBroker.md",
      "source": "webgpu-os/kernel/protocol/SamplingBroker.js",
      "import": "/webgpu-os/kernel/protocol/SamplingBroker.js",
      "sourceHash": "7b7990b60f293039cd0b707de5bc4192670e0d3f897d48a5215774636283bacf",
      "summary": "SamplingBroker.js — Particle Realms Protocol sampling (MCP-inspired): lets a TOOL handler request a nested LLM completion mid-execution (the inverse of a normal OS.ai() call). Every sample enters the full AI executor, which creates a model-neutral Navi task and applies Covenant disclosure, resource, tool-firewall, verification, and receipt policy. There is no raw AI Hub fallback. A hard recursion-depth guard prevents sampling loops.",
      "exports": [
        {
          "name": "SamplingBroker",
          "kind": "class",
          "signature": "class SamplingBroker",
          "summary": "SamplingBroker.js — Particle Realms Protocol sampling (MCP-inspired): lets a TOOL handler request a nested LLM completion mid-execution (the inverse of a normal OS.ai() call). Every sample enters the full AI executor, which creates a model-neutral Navi task and applies Covenant disclosure, resource, tool-firewall, verification, and receipt policy. There is no raw AI Hub fallback. A hard recursion-depth guard prevents sampling loops."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/protocol/ToolRegistry",
      "path": "webgpu-os/reference/kernel/protocol/ToolRegistry.md",
      "source": "webgpu-os/kernel/protocol/ToolRegistry.js",
      "import": "/webgpu-os/kernel/protocol/ToolRegistry.js",
      "sourceHash": "ac2c2da55b1318bf0136adba98ae6ac9e2e2188161b3a1816481b1eb3c5cff07",
      "summary": "ToolRegistry.js — Particle Realms Protocol tool catalog. Distinct from kernel.toolDriver (the low-level execute/history engine, see webgpu-os/kernel/ToolDriver.js) and kernel.toolRouter (the AI Tool Firewall, see webgpu-os/kernel/tools/ToolRouter.js): this is the per-app CATALOG that says \"this app opts this already-registered tool into AI discovery\", so the AI Hub's two-pass execution loop (Phase 9) knows which tools are legal for a given app's request. Declaring a tool here never bypasses ToolRouter's firewall — it only makes the tool visible/offered.",
      "exports": [
        {
          "name": "ToolRegistry",
          "kind": "class",
          "signature": "class ToolRegistry",
          "summary": "ToolRegistry.js — Particle Realms Protocol tool catalog. Distinct from kernel.toolDriver (the low-level execute/history engine, see webgpu-os/kernel/ToolDriver.js) and kernel.toolRouter (the AI Tool Firewall, see webgpu-os/kernel/tools/ToolRouter.js): this is the per-app CATALOG that says \"this app opts this already-registered tool into AI discovery\", so the AI Hub's two-pass execution loop (Phase 9) knows which tools are legal for a given app's request. Declaring a tool here never bypasses ToolRouter's firewall — it only makes the tool visible/offered."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/schema/BinaryPack",
      "path": "webgpu-os/reference/kernel/schema/BinaryPack.md",
      "source": "webgpu-os/kernel/schema/BinaryPack.js",
      "import": "/webgpu-os/kernel/schema/BinaryPack.js",
      "sourceHash": "4262b8e5307be8cfc125635795baa0c2ba62b440454e41658931d098b6583455",
      "summary": "BinaryPack.js — custom binary codec, zero external dependencies. Wire format: MessagePack specification (https://msgpack.org/index.html) Implemented from spec only — not copied from any library. API: pack(value)         → Uint8Array unpack(buf)         → value packToBase64(value) → string  (base64-encoded packed bytes) unpackBase64(str)   → value Supported types: null / undefined → nil boolean          → true / false integer (safe)   → positive/negative fixint, uint8-32, int8-32 float            → float64 string           → fixstr / str8 / str16 / str32 Uint8Array       → bin8 / bin16 / bin32 Array            → fixarray / array16 / array32 Object (plain)   → fixmap / map16 / map32 Byte layout (big-endian throughout, per spec): 0x00–0x7f  positive fixint 0x80–0x8f  fixmap   (N = low nibble) 0x90–0x9f  fixarray (N = low nibble) 0xa0–0xbf  fixstr   (N = low 5 bits) 0xc0       nil 0xc2       false 0xc3       true 0xc4–0xc6  bin8 / bin16 / bin32 0xca       float32   (encode uses float64 for precision) 0xcb       float64 0xcc–0xcf  uint8 / uint16 / uint32 / uint64* 0xd0–0xd3  int8  / int16  / int32  / int64* 0xd9–0xdb  str8  / str16  / str32 0xdc–0xdd  array16 / array32 0xde–0xdf  map16   / map32 0xe0–0xff  negative fixint * int64/uint64 are encoded as float64 when |v| > 2^32 (JS safe integer limit).",
      "exports": [
        {
          "name": "BinaryPackError",
          "kind": "class",
          "signature": "class BinaryPackError extends Error",
          "summary": ""
        },
        {
          "name": "pack",
          "kind": "function",
          "signature": "pack(value)",
          "summary": "Encode any JS value to a Uint8Array (MessagePack wire format)."
        },
        {
          "name": "unpack",
          "kind": "function",
          "signature": "unpack(buf)",
          "summary": "Decode a Uint8Array or ArrayBuffer from MessagePack wire format."
        },
        {
          "name": "packToBase64",
          "kind": "function",
          "signature": "packToBase64(value)",
          "summary": "Pack and base64-encode — useful for JSON embedding and localStorage."
        },
        {
          "name": "unpackBase64",
          "kind": "function",
          "signature": "unpackBase64(str)",
          "summary": "Decode a base64-encoded pack string."
        },
        {
          "name": "packedSize",
          "kind": "function",
          "signature": "packedSize(value)",
          "summary": "Return the packed byte-size of a value without keeping the buffer."
        },
        {
          "name": "packEqual",
          "kind": "function",
          "signature": "packEqual(a, b)",
          "summary": "Compare two values by structural equality using pack → byte comparison."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/schema/OsSchemas",
      "path": "webgpu-os/reference/kernel/schema/OsSchemas.md",
      "source": "webgpu-os/kernel/schema/OsSchemas.js",
      "import": "/webgpu-os/kernel/schema/OsSchemas.js",
      "sourceHash": "2f669ecae768910432dc1cdd7431018bbde6b2154b6326d94b508474b3242836",
      "summary": "OsSchemas.js — all OS-level schema definitions. Registers schemas into the shared SchemaRegistry singleton. Call initOsSchemas() once during KernelBootstrap. Registered names: os.AppManifest      — app discovery manifest (manifest.json) os.AppSetting       — one settings descriptor inside a manifest os.ModManifest      — mod discovery manifest os.ModHook          — one hook entry in a mod manifest os.IPCMessage       — IPC channel message envelope os.VFSNode          — virtual filesystem node metadata os.GPUSurface       — GPU surface descriptor os.VRAMEntry        — per-app VRAM usage report os.ProcessEntry     — process table entry os.PermissionCheck  — permission check result os.Particle         — particle struct for binary packing (6 × f32) os.ParticleBatch    — array of particles os.NetPeerMessage   — envelope sent between OS peers via NetDriver os.AppAICapabilityManifest — Particle Realms Protocol tool/resource/prompt/root declaration",
      "exports": [
        {
          "name": "initOsSchemas",
          "kind": "function",
          "signature": "initOsSchemas()",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/schema/SchemaRegistry",
      "path": "webgpu-os/reference/kernel/schema/SchemaRegistry.md",
      "source": "webgpu-os/kernel/schema/SchemaRegistry.js",
      "import": "/webgpu-os/kernel/schema/SchemaRegistry.js",
      "sourceHash": "58a417fe4294d929b3964f2145285f943ddf5e41e0f38763c6394645a196f0d7",
      "summary": "SchemaRegistry.js — named schema store with validation and binary packing. Acts as the central authority for all schema definitions in the OS. Schemas are registered by name and resolved by $ref. Features: - Named schema registration and lookup - validate(name, data)   → { valid, errors } - assert(name, data)     → throws SchemaValidationError if invalid - pack(name, data)       → Uint8Array (validates then binary-packs) - unpack(name, buf)      → value (binary-unpacks then validates) - packAny(data)          → Uint8Array (binary-packs without schema) - unpackAny(buf)         → value (binary-unpacks without validation) Usage: import { schemaRegistry as sr } from './SchemaRegistry.js'; sr.define('myapp.MyType', { type: 'object', required: ['id'], properties: { id: { type: 'string' } } }); sr.assert('myapp.MyType', { id: 'abc' }); const bytes = sr.pack('myapp.MyType', { id: 'abc' });",
      "exports": [
        {
          "name": "SchemaRegistry",
          "kind": "class",
          "signature": "class SchemaRegistry",
          "summary": ""
        },
        {
          "name": "schemaRegistry",
          "kind": "constant",
          "signature": "schemaRegistry",
          "summary": ""
        },
        {
          "name": "SchemaValidationError",
          "kind": "re-export",
          "signature": "SchemaValidationError",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/schema/SchemaValidator",
      "path": "webgpu-os/reference/kernel/schema/SchemaValidator.md",
      "source": "webgpu-os/kernel/schema/SchemaValidator.js",
      "import": "/webgpu-os/kernel/schema/SchemaValidator.js",
      "sourceHash": "a1d18ba37dbd527c95c55c3400311b73cfcbffef7e620b85666f9b1a8e38145f",
      "summary": "SchemaValidator.js — JSON Schema (subset) validator, zero dependencies. Supported keywords: type              string | number | integer | boolean | null | array | object | 'any' properties        { key: schema } required          string[] additionalProperties  boolean | schema (false = deny unknown keys) items             schema (all elements) or schema[] (positional) minLength / maxLength / pattern   (string) minimum / maximum / exclusiveMinimum / exclusiveMaximum / multipleOf  (number) minItems / maxItems   (array) minProperties / maxProperties     (object) const             exact value match enum              allowed values list oneOf / anyOf / allOf / not nullable          shorthand — wraps schema as oneOf:[schema,{type:'null'}] $ref              string — resolved via refResolver(name) Usage: const v = new SchemaValidator(refResolver); const { valid, errors } = v.validate(data, schema); v.assert(data, schema, 'MyContext'); // throws SchemaValidationError",
      "exports": [
        {
          "name": "SchemaValidationError",
          "kind": "class",
          "signature": "class SchemaValidationError extends Error",
          "summary": "SchemaValidator.js — JSON Schema (subset) validator, zero dependencies. Supported keywords: type              string | number | integer | boolean | null | array | object | 'any' properties        { key: schema } required          string[] additionalProperties  boolean | schema (false = deny unknown keys) items             schema (all elements) or schema[] (positional) minLength / maxLength / pattern   (string) minimum / maximum / exclusiveMinimum / exclusiveMaximum / multipleOf  (number) minItems / maxItems   (array) minProperties / maxProperties     (object) const             exact value match enum              allowed values list oneOf / anyOf / allOf / not nullable          shorthand — wraps schema as oneOf:[schema,{type:'null'}] $ref              string — resolved via refResolver(name) Usage: const v = new SchemaValidator(refResolver); const { valid, errors } = v.validate(data, schema); v.assert(data, schema, 'MyContext'); // throws SchemaValidationError"
        },
        {
          "name": "SchemaValidator",
          "kind": "class",
          "signature": "class SchemaValidator",
          "summary": ""
        },
        {
          "name": "t",
          "kind": "constant",
          "signature": "t",
          "summary": "Fluent schema type builders for ergonomic schema authoring. import { t } from './SchemaValidator.js'; const schema = t.obj({ name: t.str({ minLength: 1 }), age: t.int({ minimum: 0 }) }, ['name']);"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/schema/ShellPreferenceRecords",
      "path": "webgpu-os/reference/kernel/schema/ShellPreferenceRecords.md",
      "source": "webgpu-os/kernel/schema/ShellPreferenceRecords.js",
      "import": "/webgpu-os/kernel/schema/ShellPreferenceRecords.js",
      "sourceHash": "b39ba60ac510d4b66aa7959d417b3413cbc1a797c831be5e6f2f5281cff73dd5",
      "summary": "Versioned, schema-specific localStorage records shared by the OS shell. Readers accept the one historical unversioned shape that each preference used before schema versioning. Writers always publish the current envelope and must successfully preflight the existing value before touching storage. Unsupported or corrupt records are therefore quarantined in place.",
      "exports": [
        {
          "name": "readVersionedStorageRecord",
          "kind": "function",
          "signature": "readVersionedStorageRecord(storage, contract, { normalizeLegacy, normalizeCurrent })",
          "summary": "Strictly read a versioned shell preference without ever rewriting it."
        },
        {
          "name": "writeVersionedStorageRecord",
          "kind": "function",
          "signature": "writeVersionedStorageRecord(storage, contract, value, normalizers)",
          "summary": "Preflight the old record, then atomically replace its one localStorage key."
        },
        {
          "name": "readNotificationPreferences",
          "kind": "function",
          "signature": "readNotificationPreferences(storage)",
          "summary": ""
        },
        {
          "name": "writeNotificationPreferences",
          "kind": "function",
          "signature": "writeNotificationPreferences(patch, storage)",
          "summary": ""
        },
        {
          "name": "readUiSoundPreferences",
          "kind": "function",
          "signature": "readUiSoundPreferences(storage)",
          "summary": ""
        },
        {
          "name": "writeUiSoundPreferences",
          "kind": "function",
          "signature": "writeUiSoundPreferences(value, storage)",
          "summary": ""
        },
        {
          "name": "readAudioPreferences",
          "kind": "function",
          "signature": "readAudioPreferences(storage)",
          "summary": ""
        },
        {
          "name": "writeAudioPreferences",
          "kind": "function",
          "signature": "writeAudioPreferences(value, storage)",
          "summary": ""
        },
        {
          "name": "readAmbientPreferences",
          "kind": "function",
          "signature": "readAmbientPreferences(storage)",
          "summary": ""
        },
        {
          "name": "writeAmbientPreferences",
          "kind": "function",
          "signature": "writeAmbientPreferences(config, storage)",
          "summary": ""
        },
        {
          "name": "readDeepLinkPreferences",
          "kind": "function",
          "signature": "readDeepLinkPreferences(storage)",
          "summary": ""
        },
        {
          "name": "writeDeepLinkPreferences",
          "kind": "function",
          "signature": "writeDeepLinkPreferences(value, storage)",
          "summary": ""
        },
        {
          "name": "readWindowStateCache",
          "kind": "function",
          "signature": "readWindowStateCache(storage)",
          "summary": ""
        },
        {
          "name": "writeWindowStateCache",
          "kind": "function",
          "signature": "writeWindowStateCache(states, storage)",
          "summary": ""
        },
        {
          "name": "readAiOverlayPosition",
          "kind": "function",
          "signature": "readAiOverlayPosition(storage)",
          "summary": ""
        },
        {
          "name": "writeAiOverlayPosition",
          "kind": "function",
          "signature": "writeAiOverlayPosition(position, storage)",
          "summary": ""
        },
        {
          "name": "readSyncRulePreferences",
          "kind": "function",
          "signature": "readSyncRulePreferences(storage)",
          "summary": ""
        },
        {
          "name": "writeSyncRulePreferences",
          "kind": "function",
          "signature": "writeSyncRulePreferences(rules, storage)",
          "summary": ""
        },
        {
          "name": "readStartMenuPreferences",
          "kind": "function",
          "signature": "readStartMenuPreferences(storage)",
          "summary": ""
        },
        {
          "name": "writeStartMenuPreferences",
          "kind": "function",
          "signature": "writeStartMenuPreferences(patch, storage)",
          "summary": ""
        },
        {
          "name": "SHELL_PREFERENCE_CONTRACTS",
          "kind": "constant",
          "signature": "SHELL_PREFERENCE_CONTRACTS",
          "summary": ""
        },
        {
          "name": "START_MENU_LEGACY_KEYS",
          "kind": "constant",
          "signature": "START_MENU_LEGACY_KEYS",
          "summary": ""
        },
        {
          "name": "START_MENU_DEFAULTS",
          "kind": "constant",
          "signature": "START_MENU_DEFAULTS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/schema/index",
      "path": "webgpu-os/reference/kernel/schema/index.md",
      "source": "webgpu-os/kernel/schema/index.js",
      "import": "/webgpu-os/kernel/schema/index.js",
      "sourceHash": "9de38443bde477634031b838b981dec98f2234313e885c0b39b5601c4ab2a2fa",
      "summary": "kernel/schema/index.js — barrel export for the OS schema system. Usage (anywhere in the OS): import { schemaRegistry, t, pack, unpack } from '../schema/index.js';",
      "exports": [
        {
          "name": "BinaryPackError",
          "kind": "re-export",
          "signature": "BinaryPackError",
          "summary": ""
        },
        {
          "name": "SchemaRegistry",
          "kind": "re-export",
          "signature": "SchemaRegistry",
          "summary": ""
        },
        {
          "name": "SchemaValidationError",
          "kind": "re-export",
          "signature": "SchemaValidationError",
          "summary": ""
        },
        {
          "name": "SchemaValidator",
          "kind": "re-export",
          "signature": "SchemaValidator",
          "summary": ""
        },
        {
          "name": "initOsSchemas",
          "kind": "re-export",
          "signature": "initOsSchemas",
          "summary": ""
        },
        {
          "name": "pack",
          "kind": "re-export",
          "signature": "pack",
          "summary": ""
        },
        {
          "name": "packEqual",
          "kind": "re-export",
          "signature": "packEqual",
          "summary": ""
        },
        {
          "name": "packToBase64",
          "kind": "re-export",
          "signature": "packToBase64",
          "summary": ""
        },
        {
          "name": "packedSize",
          "kind": "re-export",
          "signature": "packedSize",
          "summary": ""
        },
        {
          "name": "schemaRegistry",
          "kind": "re-export",
          "signature": "schemaRegistry",
          "summary": ""
        },
        {
          "name": "t",
          "kind": "re-export",
          "signature": "t",
          "summary": ""
        },
        {
          "name": "unpack",
          "kind": "re-export",
          "signature": "unpack",
          "summary": ""
        },
        {
          "name": "unpackBase64",
          "kind": "re-export",
          "signature": "unpackBase64",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/state/AppStateChannelAdapter",
      "path": "webgpu-os/reference/kernel/state/AppStateChannelAdapter.md",
      "source": "webgpu-os/kernel/state/AppStateChannelAdapter.js",
      "import": "/webgpu-os/kernel/state/AppStateChannelAdapter.js",
      "sourceHash": "2e033f6c464e5253365625d2c8951f651655b96dfabc02d347d60295338ac22f",
      "summary": "CSE-backed State Channel authority for an app-owned AppStateEngine key. AppStateEngine remains the source of truth and its expectedVersion is the compare-and-swap fence for every accepted intent.",
      "exports": [
        {
          "name": "AppStateChannelAdapter",
          "kind": "class",
          "signature": "class AppStateChannelAdapter",
          "summary": "CSE-backed State Channel authority for an app-owned AppStateEngine key. AppStateEngine remains the source of truth and its expectedVersion is the compare-and-swap fence for every accepted intent."
        },
        {
          "name": "createAppStateChannelAdapter",
          "kind": "function",
          "signature": "createAppStateChannelAdapter(options)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/state/AppStateEngine",
      "path": "webgpu-os/reference/kernel/state/AppStateEngine.md",
      "source": "webgpu-os/kernel/state/AppStateEngine.js",
      "import": "/webgpu-os/kernel/state/AppStateEngine.js",
      "sourceHash": "97de0c4a8d7abd4eaf928adecf72b28be77eee0aa7ba7a1e8536dba2147766d6",
      "summary": "AppStateEngine — app-scoped CSE state exposed through guarded syscalls. Logical values are immutable EntityRegistry versions. Every successful write is HLC-stamped and appended to a shared hash-chained EventLog. Apps never receive the registry or log directly; Syscalls injects the authenticated appId so a caller cannot address another app's state.",
      "exports": [
        {
          "name": "AppStateEngine",
          "kind": "class",
          "signature": "class AppStateEngine",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/AIStoryletFactory",
      "path": "webgpu-os/reference/kernel/storylets/AIStoryletFactory.md",
      "source": "webgpu-os/kernel/storylets/AIStoryletFactory.js",
      "import": "/webgpu-os/kernel/storylets/AIStoryletFactory.js",
      "sourceHash": "bd18259a7ee0cf884ffcd2accb82c07a46e2083877f669a40b7f0310be9d5af1",
      "summary": "AIStoryletFactory.js — defines the OS's AI-pipeline storylets via the existing createStorylet() from engine/gameplay/narrative/StoryGraph.js. Each storylet gates on the request worldState's `phase` and advances it; Phase 9's two-pass execution loop drives StoryletRuntime.tick() with these. Pipeline phases: received → classified → contextGathered → capabilitiesNegotiated → tierChosen → planned → executed → finalized  (+ 'malformed' → repair) Handlers are injected (not hardcoded) so the factory stays a pure catalog; every handler receives the worldState and returns a storylet result ({ phase, facts?, observations?, ... } — see StoryletEffectsApplier).",
      "exports": [
        {
          "name": "AIStoryletFactory",
          "kind": "class",
          "signature": "class AIStoryletFactory",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/AdversarialFixtures",
      "path": "webgpu-os/reference/kernel/storylets/AdversarialFixtures.md",
      "source": "webgpu-os/kernel/storylets/AdversarialFixtures.js",
      "import": "/webgpu-os/kernel/storylets/AdversarialFixtures.js",
      "sourceHash": "b28ecd0f4b486a8d81c036b7600a1005aaca2d6f46a8df4a642b3d15e76de29a",
      "summary": "AdversarialFixtures.js — the canned adversarial test list for the Phase 14 storylet harness. Two families: 1. DESCRIPTOR fixtures — malformed/poisoned storylet DEFINITIONS that must fail StoryletDescriptorSanitizer.scan (prompt injection, bad id, wrong handler types). 2. WORLDSTATE fixtures — hostile task states a well-formed storylet must handle safely: missing tools, poisoned resource/descriptor text, hidden params, a changed attestation hash, a bad mass ratio, an exploding joint. These are DATA only; the runner decides pass/fail. `expectSafe` means the storylet must NOT trigger (or must trigger and return a rejecting result) — never silently proceed as if the state were trustworthy.",
      "exports": [
        {
          "name": "DESCRIPTOR_FIXTURES",
          "kind": "constant",
          "signature": "DESCRIPTOR_FIXTURES",
          "summary": "Poisoned/malformed storylet definitions — must fail sanitization."
        },
        {
          "name": "WORLDSTATE_FIXTURES",
          "kind": "constant",
          "signature": "WORLDSTATE_FIXTURES",
          "summary": "Hostile task worldStates — a well-formed storylet must handle each safely."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/NaviTaskEpisodeRuntime",
      "path": "webgpu-os/reference/kernel/storylets/NaviTaskEpisodeRuntime.md",
      "source": "webgpu-os/kernel/storylets/NaviTaskEpisodeRuntime.js",
      "import": "/webgpu-os/kernel/storylets/NaviTaskEpisodeRuntime.js",
      "sourceHash": "3aeeae7fdb42b9fbe528ed87347dd548eebd750a23ba5188dc37a97e2e26ea3d",
      "summary": "NaviTaskEpisodeRuntime.js — deterministic, resumable task episodes for onboarding, approvals, recovery, provider failure, handoff, and long builds. Episode actions are data-only proposals. This runtime cannot execute tools, grant authority, force-fire Storylets, or choose a random transition.",
      "exports": [
        {
          "name": "NaviTaskEpisodeRuntime",
          "kind": "class",
          "signature": "class NaviTaskEpisodeRuntime",
          "summary": ""
        },
        {
          "name": "validateEpisodeSnapshot",
          "kind": "function",
          "signature": "async validateEpisodeSnapshot(snapshot)",
          "summary": ""
        },
        {
          "name": "NAVI_TASK_EPISODE_FORMATS",
          "kind": "constant",
          "signature": "NAVI_TASK_EPISODE_FORMATS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/OSEventGraphAdapter",
      "path": "webgpu-os/reference/kernel/storylets/OSEventGraphAdapter.md",
      "source": "webgpu-os/kernel/storylets/OSEventGraphAdapter.js",
      "import": "/webgpu-os/kernel/storylets/OSEventGraphAdapter.js",
      "sourceHash": "45179b51a1dded1b7f79005ff521980391d5566e3b0d63db41582dec0a1c0deb",
      "summary": "OSEventGraphAdapter.js — minimal `{ emit(event) }` shim satisfying StoryGraph's expected EventGraph collaborator (engine/gameplay/core/ EventGraph.js doesn't exist yet). Fired storylet events are: 1. re-emitted on the kernel event bus as `storylet:<type>`, 2. kept in a bounded in-memory log, and 3. forwarded to the Task Ledger's event/observation log once Phase 8 attaches it via setLedger().",
      "exports": [
        {
          "name": "OSEventGraphAdapter",
          "kind": "class",
          "signature": "class OSEventGraphAdapter",
          "summary": "OSEventGraphAdapter.js — minimal `{ emit(event) }` shim satisfying StoryGraph's expected EventGraph collaborator (engine/gameplay/core/ EventGraph.js doesn't exist yet). Fired storylet events are: 1. re-emitted on the kernel event bus as `storylet:<type>`, 2. kept in a bounded in-memory log, and 3. forwarded to the Task Ledger's event/observation log once Phase 8 attaches it via setLedger()."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/StoryletDescriptorSanitizer",
      "path": "webgpu-os/reference/kernel/storylets/StoryletDescriptorSanitizer.md",
      "source": "webgpu-os/kernel/storylets/StoryletDescriptorSanitizer.js",
      "import": "/webgpu-os/kernel/storylets/StoryletDescriptorSanitizer.js",
      "sourceHash": "b85d05f979977f3d392e2ace75f73534dac103a2f746ee1aa68d766589d6fb42",
      "summary": "StoryletDescriptorSanitizer.js — validates a storylet definition before registration. Reuses Phase 5's DescriptorSanitizer for prompt-injection text scanning (no parallel scanner) and adds storylet-specific structural checks (id shape, handler types, sane numeric gates).",
      "exports": [
        {
          "name": "StoryletDescriptorSanitizer",
          "kind": "class",
          "signature": "class StoryletDescriptorSanitizer",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/StoryletEffectsApplier",
      "path": "webgpu-os/reference/kernel/storylets/StoryletEffectsApplier.md",
      "source": "webgpu-os/kernel/storylets/StoryletEffectsApplier.js",
      "import": "/webgpu-os/kernel/storylets/StoryletEffectsApplier.js",
      "sourceHash": "983dd1c0789a09a8669a4bf0bdd515be6a2650a91e017a07f94626e6a48bd0e8",
      "summary": "StoryletEffectsApplier.js — applies a storylet execute() result into the Task Ledger / Fact Store instead of game consequences/memories. Facts are monotonic canonical strings (engine/state/facts) — never deleted, only tombstoned — so an AI task's effect history stays audit-stable.",
      "exports": [
        {
          "name": "StoryletEffectsApplier",
          "kind": "class",
          "signature": "class StoryletEffectsApplier",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/StoryletEligibilityBridge",
      "path": "webgpu-os/reference/kernel/storylets/StoryletEligibilityBridge.md",
      "source": "webgpu-os/kernel/storylets/StoryletEligibilityBridge.js",
      "import": "/webgpu-os/kernel/storylets/StoryletEligibilityBridge.js",
      "sourceHash": "517940d540da9243857cb0f197655560f1ad2b75d43a71efc8daf644e5c5681a",
      "summary": "StoryletEligibilityBridge.js — layers doctrine preconditions on top of StoryGraph's built-in cooldown/maxFires gating by COMPOSING them into a storylet config's canTrigger — no duplicate eligibility engine. Doctrine gates only ever NARROW eligibility (canTrigger && doctrine), never widen it. Doctrine fields: preconditions:      [(worldState) => boolean]  — all must pass allowedTools:       [string]  — worldState.requestedTool must be listed (if set) allowedResources:   [string]  — worldState.requestedResource must match a prefix (if set) capabilityRequired: string    — checked via kernel.permissions (RuleGraph)",
      "exports": [
        {
          "name": "StoryletEligibilityBridge",
          "kind": "class",
          "signature": "class StoryletEligibilityBridge",
          "summary": "StoryletEligibilityBridge.js — layers doctrine preconditions on top of StoryGraph's built-in cooldown/maxFires gating by COMPOSING them into a storylet config's canTrigger — no duplicate eligibility engine. Doctrine gates only ever NARROW eligibility (canTrigger && doctrine), never widen it. Doctrine fields: preconditions:      [(worldState) => boolean]  — all must pass allowedTools:       [string]  — worldState.requestedTool must be listed (if set) allowedResources:   [string]  — worldState.requestedResource must match a prefix (if set) capabilityRequired: string    — checked via kernel.permissions (RuleGraph)"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/StoryletFailureHandler",
      "path": "webgpu-os/reference/kernel/storylets/StoryletFailureHandler.md",
      "source": "webgpu-os/kernel/storylets/StoryletFailureHandler.js",
      "import": "/webgpu-os/kernel/storylets/StoryletFailureHandler.js",
      "sourceHash": "18e0e66abe64ffbda625fa3c6f451566beb7bdfd758db1fcb35bdc542cb3e43d",
      "summary": "StoryletFailureHandler.js — storylet-chain rollback: delegates to the generic time/RollbackEngine.js (the single Saga.js wrapper — forward + compensating actions, irreversible pivot) and adds storylet-specific logging + kernel eventing. If a step fails before the pivot, completed steps are compensated in reverse; past the pivot the failure is surfaced (FAILED_PIVOTED) for repair instead of silently undone.",
      "exports": [
        {
          "name": "StoryletFailureHandler",
          "kind": "class",
          "signature": "class StoryletFailureHandler",
          "summary": ""
        },
        {
          "name": "SAGA_STATUS",
          "kind": "re-export",
          "signature": "SAGA_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/StoryletRuntime",
      "path": "webgpu-os/reference/kernel/storylets/StoryletRuntime.md",
      "source": "webgpu-os/kernel/storylets/StoryletRuntime.js",
      "import": "/webgpu-os/kernel/storylets/StoryletRuntime.js",
      "sourceHash": "42bd85e52ad5ffbdfa6d304b0f544f8de748f0d7a1cc28c557188f2832327673",
      "summary": "StoryletRuntime.js — thin facade constructing `new StoryGraph(adapter)` from engine/gameplay/narrative/StoryGraph.js; exposes register/registerAll/tick/ getAll. Forced execution is intentionally named as a trusted test/recovery operation so it is never advertised as a model-authored Storylet ability. Here \"worldState\" is AI task/goal state (an OS.ai() request's pipeline phase), not game state.",
      "exports": [
        {
          "name": "StoryletRuntime",
          "kind": "class",
          "signature": "class StoryletRuntime",
          "summary": ""
        },
        {
          "name": "createStorylet",
          "kind": "re-export",
          "signature": "createStorylet",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/StoryletTestRunner",
      "path": "webgpu-os/reference/kernel/storylets/StoryletTestRunner.md",
      "source": "webgpu-os/kernel/storylets/StoryletTestRunner.js",
      "import": "/webgpu-os/kernel/storylets/StoryletTestRunner.js",
      "sourceHash": "409a523f2a267c4ca5fa0e0c6e60653ce3b6d3090388a36ef7121761db0ccd25",
      "summary": "StoryletTestRunner.js — the Phase 14 storylet test harness. Runs a storylet definition against fixture worldStates on an ISOLATED StoryletRuntime (never the live kernel.storylets graph) and reports trigger/execute outcomes. Also runs the canned adversarial suite (AdversarialFixtures): poisoned descriptors must fail sanitization, and hostile worldStates must be handled safely (rejected or refused — never silently obeyed).",
      "exports": [
        {
          "name": "StoryletTestRunner",
          "kind": "class",
          "signature": "class StoryletTestRunner",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/storylets/StoryletVersionManager",
      "path": "webgpu-os/reference/kernel/storylets/StoryletVersionManager.md",
      "source": "webgpu-os/kernel/storylets/StoryletVersionManager.js",
      "import": "/webgpu-os/kernel/storylets/StoryletVersionManager.js",
      "sourceHash": "8f7d6fe3cb73dac35d71d25300844ab1be03a7ef64d2ee28091400698ef78ca2",
      "summary": "StoryletVersionManager.js — tracks versions of registered storylet definitions so a definition can be upgraded in place and rolled back if the new version misbehaves. Purely in-memory version history keyed by storylet id; the runtime re-registers whichever config version is current.",
      "exports": [
        {
          "name": "StoryletVersionManager",
          "kind": "class",
          "signature": "class StoryletVersionManager",
          "summary": "StoryletVersionManager.js — tracks versions of registered storylet definitions so a definition can be upgraded in place and rolled back if the new version misbehaves. Purely in-memory version history keyed by storylet id; the runtime re-registers whichever config version is current."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/terminal/TerminalCommandContract",
      "path": "webgpu-os/reference/kernel/terminal/TerminalCommandContract.md",
      "source": "webgpu-os/kernel/terminal/TerminalCommandContract.js",
      "import": "/webgpu-os/kernel/terminal/TerminalCommandContract.js",
      "sourceHash": "64dfde6e50b4767e5c00729bca2191413577868a46eead6e8c5589a6b3b7f352",
      "summary": "Canonical WebGPU OS terminal grammar shared by the interactive Terminal app and the read-only AI tool bridge. This is intentionally not a host shell.",
      "exports": [
        {
          "name": "parseWebGpuOsTerminalCommand",
          "kind": "function",
          "signature": "parseWebGpuOsTerminalCommand(raw, { surface = 'interactive' } = {})",
          "summary": ""
        },
        {
          "name": "formatWebGpuOsTerminalHelp",
          "kind": "function",
          "signature": "formatWebGpuOsTerminalHelp({ surface = 'interactive', json = false } = {})",
          "summary": ""
        },
        {
          "name": "terminalVfsPath",
          "kind": "function",
          "signature": "terminalVfsPath(value)",
          "summary": ""
        },
        {
          "name": "terminalCommandError",
          "kind": "function",
          "signature": "terminalCommandError(code, message, suggestion = '')",
          "summary": ""
        },
        {
          "name": "TERMINAL_MUTATION_COMMANDS",
          "kind": "constant",
          "signature": "TERMINAL_MUTATION_COMMANDS",
          "summary": ""
        },
        {
          "name": "TERMINAL_HOST_COMMANDS",
          "kind": "constant",
          "signature": "TERMINAL_HOST_COMMANDS",
          "summary": ""
        },
        {
          "name": "WEBGPU_OS_TERMINAL_COMMANDS",
          "kind": "constant",
          "signature": "WEBGPU_OS_TERMINAL_COMMANDS",
          "summary": ""
        },
        {
          "name": "WEBGPU_OS_TOOL_TERMINAL_HELP",
          "kind": "constant",
          "signature": "WEBGPU_OS_TOOL_TERMINAL_HELP",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/CausalClock",
      "path": "webgpu-os/reference/kernel/time/CausalClock.md",
      "source": "webgpu-os/kernel/time/CausalClock.js",
      "import": "/webgpu-os/kernel/time/CausalClock.js",
      "sourceHash": "d44364f6c3f10ba71c27110d8d2e350281bc582e5c9bd2d0a0fc9b31d3bde96c",
      "summary": "CausalClock.js — thin wrapper over engine/state/causal/HLC.js (Hybrid Logical Clock). Orders AI task events causally while staying readable as wall time. Per CSE rule 11: a timestamp NEVER establishes authority — the commit gate decides truth; this only orders.",
      "exports": [
        {
          "name": "CausalClock",
          "kind": "class",
          "signature": "class CausalClock",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/CheckpointManager",
      "path": "webgpu-os/reference/kernel/time/CheckpointManager.md",
      "source": "webgpu-os/kernel/time/CheckpointManager.js",
      "import": "/webgpu-os/kernel/time/CheckpointManager.js",
      "sourceHash": "561d41e5b70f1cd5b7a5033fa9053257289a14e94900ed9765f5fb6bbb469af0",
      "summary": "CheckpointManager.js — wraps engine/state/integrity/Checkpoint.js (makeCheckpoint/verifyCheckpoint) over the shared OS event log. Checkpoints summarize history without pretending it never existed: each links to its predecessor and pins the event-log head + state root at that point.",
      "exports": [
        {
          "name": "CheckpointManager",
          "kind": "class",
          "signature": "class CheckpointManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/CooldownManager",
      "path": "webgpu-os/reference/kernel/time/CooldownManager.md",
      "source": "webgpu-os/kernel/time/CooldownManager.js",
      "import": "/webgpu-os/kernel/time/CooldownManager.js",
      "sourceHash": "e5ff7fc85a92faef855cab3ab0b79b0db6d5763e2c99c42b03194b894ccebc24",
      "summary": "CooldownManager.js — wraps engine/state/consistency/Reservation.js (ReservationManager over a USORegistry + BoundedCounterEscrow). Cooldowns are reservations: reserving a scarce AI resource (model budget, tool slot) creates a single-use output that is consumed on commit or released on expiry — it can never be honored twice. Escrows divide a budget among holders for coordination-free local spending.",
      "exports": [
        {
          "name": "CooldownManager",
          "kind": "class",
          "signature": "class CooldownManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/DependencyScheduler",
      "path": "webgpu-os/reference/kernel/time/DependencyScheduler.md",
      "source": "webgpu-os/kernel/time/DependencyScheduler.js",
      "import": "/webgpu-os/kernel/time/DependencyScheduler.js",
      "sourceHash": "831af535b3b2ebfe00f1eaf79d112d6c55f8780b9876ceeac682fca06d02ec5a",
      "summary": "DependencyScheduler.js — dependency-ordered task readiness (Kahn-style). Tracks tasks with dependency edges and answers \"what can run now?\": a task is ready once every dependency has completed. Cycles are rejected at add time so a plan can never deadlock on itself.",
      "exports": [
        {
          "name": "DependencyScheduler",
          "kind": "class",
          "signature": "class DependencyScheduler",
          "summary": ""
        },
        {
          "name": "TASK_STATE",
          "kind": "re-export",
          "signature": "TASK_STATE",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/ExpirationManager",
      "path": "webgpu-os/reference/kernel/time/ExpirationManager.md",
      "source": "webgpu-os/kernel/time/ExpirationManager.js",
      "import": "/webgpu-os/kernel/time/ExpirationManager.js",
      "sourceHash": "71fb7d575bc29d00ef0a1e918edf1df56196b40f70f2831a8dce7183ecbbd435",
      "summary": "ExpirationManager.js — TTL tracking for short-lived AI artifacts (capabilities, elicitations, pending approvals). Sweep-based (no timers per item): callers invoke sweep() periodically or before authorization checks; expired items run their onExpire callback exactly once and are removed.",
      "exports": [
        {
          "name": "ExpirationManager",
          "kind": "class",
          "signature": "class ExpirationManager",
          "summary": "ExpirationManager.js — TTL tracking for short-lived AI artifacts (capabilities, elicitations, pending approvals). Sweep-based (no timers per item): callers invoke sweep() periodically or before authorization checks; expired items run their onExpire callback exactly once and are removed."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/FactConflictResolver",
      "path": "webgpu-os/reference/kernel/time/FactConflictResolver.md",
      "source": "webgpu-os/kernel/time/FactConflictResolver.js",
      "import": "/webgpu-os/kernel/time/FactConflictResolver.js",
      "sourceHash": "ae8abda64161f0214974f9751a9db4e834030bc38053bba3e1b38b31c82c167f",
      "summary": "FactConflictResolver.js — detects and resolves conflicting live facts on the monotonic FactStore. Detection reuses the CSE constraint helpers (engine/state/facts/Constraints.js: validateFacts/atMostOne/ mutuallyExclusive) — no parallel constraint engine. Resolution tombstones losers via a caller-supplied preference; a constraint never repairs on its own (CSE law), so resolution here is an explicit, logged act.",
      "exports": [
        {
          "name": "FactConflictResolver",
          "kind": "class",
          "signature": "class FactConflictResolver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/FactInvalidationEngine",
      "path": "webgpu-os/reference/kernel/time/FactInvalidationEngine.md",
      "source": "webgpu-os/kernel/time/FactInvalidationEngine.js",
      "import": "/webgpu-os/kernel/time/FactInvalidationEngine.js",
      "sourceHash": "1b714bc3e897679d82144aabea538b625c61847b6532534c522c14a3f0bbc33d",
      "summary": "FactInvalidationEngine.js — namespaced `invalidatedBy` rules layered on the monotonic FactStore (engine/state/facts): adding a fact whose predicate has invalidation rules TOMBSTONES (never deletes) currently-live facts with the listed predicates. e.g. rule('planReady', ['planDraft']) — a new planReady fact revokes any live planDraft facts. History stays intact.",
      "exports": [
        {
          "name": "FactInvalidationEngine",
          "kind": "class",
          "signature": "class FactInvalidationEngine",
          "summary": "FactInvalidationEngine.js — namespaced `invalidatedBy` rules layered on the monotonic FactStore (engine/state/facts): adding a fact whose predicate has invalidation rules TOMBSTONES (never deletes) currently-live facts with the listed predicates. e.g. rule('planReady', ['planDraft']) — a new planReady fact revokes any live planDraft facts. History stays intact."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/IdempotencyManager",
      "path": "webgpu-os/reference/kernel/time/IdempotencyManager.md",
      "source": "webgpu-os/kernel/time/IdempotencyManager.js",
      "import": "/webgpu-os/kernel/time/IdempotencyManager.js",
      "sourceHash": "9fe1078567f6dd73e3a0f6a40a330287b1862e98a57c6cc5a200e2f73553e4ab",
      "summary": "IdempotencyManager.js — bounded process-local replay for settled tool and storylet results. Concurrent callers for one key share a single execution. Durable mutation replay safety is provided by the task-graph dispatch fence, not by this TTL/LRU cache.",
      "exports": [
        {
          "name": "IdempotencyCapacityError",
          "kind": "class",
          "signature": "class IdempotencyCapacityError extends Error",
          "summary": ""
        },
        {
          "name": "IdempotencyManager",
          "kind": "class",
          "signature": "class IdempotencyManager",
          "summary": ""
        },
        {
          "name": "IDEMPOTENCY_TOOL_REPLAY_MAX_ENTRIES",
          "kind": "constant",
          "signature": "IDEMPOTENCY_TOOL_REPLAY_MAX_ENTRIES",
          "summary": ""
        },
        {
          "name": "IDEMPOTENCY_TOOL_REPLAY_TTL_MS",
          "kind": "constant",
          "signature": "IDEMPOTENCY_TOOL_REPLAY_TTL_MS",
          "summary": ""
        },
        {
          "name": "IDEMPOTENCY_TOOL_REPLAY_MAX_BYTES",
          "kind": "constant",
          "signature": "IDEMPOTENCY_TOOL_REPLAY_MAX_BYTES",
          "summary": ""
        },
        {
          "name": "IDEMPOTENCY_MAX_IN_FLIGHT",
          "kind": "constant",
          "signature": "IDEMPOTENCY_MAX_IN_FLIGHT",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/ParallelTaskScheduler",
      "path": "webgpu-os/reference/kernel/time/ParallelTaskScheduler.md",
      "source": "webgpu-os/kernel/time/ParallelTaskScheduler.js",
      "import": "/webgpu-os/kernel/time/ParallelTaskScheduler.js",
      "sourceHash": "089d4cd50305415483fd75c027160c9230b8bf960581c872da2eddc0f09fc411",
      "summary": "ParallelTaskScheduler.js — executes async tasks respecting dependency order (via DependencyScheduler) with a bounded concurrency limit. A failed task marks its transitive dependents blocked rather than aborting unrelated branches.",
      "exports": [
        {
          "name": "ParallelTaskScheduler",
          "kind": "class",
          "signature": "class ParallelTaskScheduler",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/ReplayEngine",
      "path": "webgpu-os/reference/kernel/time/ReplayEngine.md",
      "source": "webgpu-os/kernel/time/ReplayEngine.js",
      "import": "/webgpu-os/kernel/time/ReplayEngine.js",
      "sourceHash": "346200991359ab800acca5cc0885dd15ba11651bce20a9403fdb3adc9c7cf642",
      "summary": "ReplayEngine.js — rebuild materialized state by folding the hash-chained EventLog through a reducer (event sourcing), optionally starting from a CheckpointManager checkpoint. The chain is verified BEFORE replay: tampered history refuses to replay rather than materializing a lie.",
      "exports": [
        {
          "name": "ReplayEngine",
          "kind": "class",
          "signature": "class ReplayEngine",
          "summary": "ReplayEngine.js — rebuild materialized state by folding the hash-chained EventLog through a reducer (event sourcing), optionally starting from a CheckpointManager checkpoint. The chain is verified BEFORE replay: tampered history refuses to replay rather than materializing a lie."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/RetryManager",
      "path": "webgpu-os/reference/kernel/time/RetryManager.md",
      "source": "webgpu-os/kernel/time/RetryManager.js",
      "import": "/webgpu-os/kernel/time/RetryManager.js",
      "sourceHash": "61afadd91dfd4b73882e011b95b2e2154b8060cab66568401ee7ca1e875cb141",
      "summary": "RetryManager.js — bounded exponential-backoff retry with jitter for transient AI/tool failures. Retries are attempts, not new intents: pair with IdempotencyManager keys so a retried effect is never applied twice.",
      "exports": [
        {
          "name": "RetryManager",
          "kind": "class",
          "signature": "class RetryManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/RollbackEngine",
      "path": "webgpu-os/reference/kernel/time/RollbackEngine.md",
      "source": "webgpu-os/kernel/time/RollbackEngine.js",
      "import": "/webgpu-os/kernel/time/RollbackEngine.js",
      "sourceHash": "40a7c95928f0dcc540104ff1e8df304cc850fd2fe8b8a891cd56dc462c701c68",
      "summary": "RollbackEngine.js — the generic compensation runner: wraps engine/state/workflow/Saga.js (forward + compensating actions, irreversible pivot). Domain layers (e.g. storylets/StoryletFailureHandler.js) build on this rather than re-wrapping Saga themselves.",
      "exports": [
        {
          "name": "RollbackEngine",
          "kind": "class",
          "signature": "class RollbackEngine",
          "summary": ""
        },
        {
          "name": "SAGA_STATUS",
          "kind": "re-export",
          "signature": "SAGA_STATUS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/TickClock",
      "path": "webgpu-os/reference/kernel/time/TickClock.md",
      "source": "webgpu-os/kernel/time/TickClock.js",
      "import": "/webgpu-os/kernel/time/TickClock.js",
      "sourceHash": "93b2c2f609d0192057c9fbcfd6bb591d7df617fd8053296f55798373ba581f51",
      "summary": "TickClock.js — thin wrapper over engine/state/time/TimeModel.js (TIME_MODES/createTimeSource). Manages NAMED time sources: an AI task only \"has time\" if it subscribes to a source, and each source advances per its mode (causal steps, oscillator dt, irreversible change, observation, …) — never a global `time++`.",
      "exports": [
        {
          "name": "TickClock",
          "kind": "class",
          "signature": "class TickClock",
          "summary": ""
        },
        {
          "name": "TIME_MODES",
          "kind": "re-export",
          "signature": "TIME_MODES",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/TimeAuthority",
      "path": "webgpu-os/reference/kernel/time/TimeAuthority.md",
      "source": "webgpu-os/kernel/time/TimeAuthority.js",
      "import": "/webgpu-os/kernel/time/TimeAuthority.js",
      "sourceHash": "c08909ec0301c6544f48dda72f1561ee04a8e6fffd66b8f1b5424d851b5ef752",
      "summary": "Disciplined civil-time authority. Network samples are transient observations. A consensus decision is accepted only after collapsing endpoints into independent operator groups, finding a majority interval, and combining the surviving offsets by uncertainty. The CSE records semantic transitions; it never treats timestamps as authority.",
      "exports": [
        {
          "name": "TimeAuthority",
          "kind": "class",
          "signature": "class TimeAuthority",
          "summary": ""
        },
        {
          "name": "timeSourceCatalog",
          "kind": "function",
          "signature": "timeSourceCatalog()",
          "summary": ""
        },
        {
          "name": "defaultSourceIds",
          "kind": "function",
          "signature": "defaultSourceIds(mode = TIME_AUTHORITY_MODES.UTC_CONSENSUS)",
          "summary": ""
        },
        {
          "name": "normalizeTimeAuthorityConfig",
          "kind": "function",
          "signature": "normalizeTimeAuthorityConfig(input = {})",
          "summary": ""
        },
        {
          "name": "selectTimeConsensus",
          "kind": "function",
          "signature": "selectTimeConsensus(samples, options = {})",
          "summary": "Select one robust time estimate from already-filtered source samples. Each operator gets at most one vote even when it exposes many hostnames."
        },
        {
          "name": "TIME_AUTHORITY_MODES",
          "kind": "constant",
          "signature": "TIME_AUTHORITY_MODES",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/TimeEngine",
      "path": "webgpu-os/reference/kernel/time/TimeEngine.md",
      "source": "webgpu-os/kernel/time/TimeEngine.js",
      "import": "/webgpu-os/kernel/time/TimeEngine.js",
      "sourceHash": "aecaa40887efa9c0b544c2598642b645ab0bd031b740d16a1a08b4a14cc94d80",
      "summary": "TimeEngine.js — Phase 7 facade (kernel.timeEngine) composing the Time Engine's CSE wrappers around ONE shared, hash-chained EventLog: authority   TimeAuthority (NTP consensus + slew) — disciplined physical time causal      CausalClock (HLC)                    — causal ordering ticks       TickClock (TimeModel sources)        — per-mode progression eventLog    engine/state EventLog                — the single OS AI log (Phase 9's AuditLog views the same log) timeline    TimelineExporter                     — tamper-evident export checkpoints CheckpointManager                    — compaction + restore replay      ReplayEngine                         — event-sourced rebuild idempotency IdempotencyManager                   — at-most-once effects cooldowns   CooldownManager                      — reservations + escrow rollback    RollbackEngine (Saga)                — compensation scheduler   Dependency/ParallelTaskScheduler     — ordered execution retry       RetryManager                         — bounded backoff expiry      ExpirationManager                    — TTL sweep facts       engine/state FactStore (direct reuse — no FactRegistry) invalidation/conflicts — rules layered on the monotonic FactStore",
      "exports": [
        {
          "name": "TimeEngine",
          "kind": "class",
          "signature": "class TimeEngine",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/time/TimelineExporter",
      "path": "webgpu-os/reference/kernel/time/TimelineExporter.md",
      "source": "webgpu-os/kernel/time/TimelineExporter.js",
      "import": "/webgpu-os/kernel/time/TimelineExporter.js",
      "sourceHash": "5cacb657222f1fa713e9cc6e3c17befc9caeb4b5b8adb27ef9e985f17dcfd596",
      "summary": "TimelineExporter.js — export view over engine/state/integrity/EventLog.js (append-only, hash-chained). Filters + serializes a range of the SHARED OS event log (the same log Phase 9's AuditLog views — one log, not two) with the chain verification result attached, so an exported timeline is tamper-evident.",
      "exports": [
        {
          "name": "TimelineExporter",
          "kind": "class",
          "signature": "class TimelineExporter",
          "summary": "TimelineExporter.js — export view over engine/state/integrity/EventLog.js (append-only, hash-chained). Filters + serializes a range of the SHARED OS event log (the same log Phase 9's AuditLog views — one log, not two) with the chain verification result attached, so an exported timeline is tamper-evident."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/CapabilityAttenuator",
      "path": "webgpu-os/reference/kernel/tools/CapabilityAttenuator.md",
      "source": "webgpu-os/kernel/tools/CapabilityAttenuator.js",
      "import": "/webgpu-os/kernel/tools/CapabilityAttenuator.js",
      "sourceHash": "efdeb461e29eadad0ee28e0383487012d32ac335ade58bea80d2d8e79d29e74d",
      "summary": "CapabilityAttenuator.js — thin wrapper over engine/state Capability.attenuate() for narrowing a capability before handing it to a single tool call. Never widens a capability (attenuate() itself enforces this).",
      "exports": [
        {
          "name": "CapabilityAttenuator",
          "kind": "class",
          "signature": "class CapabilityAttenuator",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/ContextTaintTracker",
      "path": "webgpu-os/reference/kernel/tools/ContextTaintTracker.md",
      "source": "webgpu-os/kernel/tools/ContextTaintTracker.js",
      "import": "/webgpu-os/kernel/tools/ContextTaintTracker.js",
      "sourceHash": "251bb2e48700fff5d027d2abd317a507c489807b8a0f75b98ab0c895fb946ec1",
      "summary": "ContextTaintTracker.js — tracks which OS.ai() request contexts have absorbed untrusted (tool/webpage/model) content, so prompt assembly can keep the CSE prompt-injection boundary visible downstream instead of silently blending untrusted text into \"instructions\".",
      "exports": [
        {
          "name": "ContextTaintTracker",
          "kind": "class",
          "signature": "class ContextTaintTracker",
          "summary": "ContextTaintTracker.js — tracks which OS.ai() request contexts have absorbed untrusted (tool/webpage/model) content, so prompt assembly can keep the CSE prompt-injection boundary visible downstream instead of silently blending untrusted text into \"instructions\"."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/HiddenParameterDetector",
      "path": "webgpu-os/reference/kernel/tools/HiddenParameterDetector.md",
      "source": "webgpu-os/kernel/tools/HiddenParameterDetector.js",
      "import": "/webgpu-os/kernel/tools/HiddenParameterDetector.js",
      "sourceHash": "2f11f5f8d5e86ce58af5f170d374fd63fe1c6fa716470df22d1c6a054fa9ecd2",
      "summary": "HiddenParameterDetector.js — flags AI-supplied tool-call arguments that are NOT declared in the tool's schema (potential smuggled/hidden parameters) and prototype-pollution-shaped keys.",
      "exports": [
        {
          "name": "HiddenParameterDetector",
          "kind": "class",
          "signature": "class HiddenParameterDetector",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/MetadataRugPullDetector",
      "path": "webgpu-os/reference/kernel/tools/MetadataRugPullDetector.md",
      "source": "webgpu-os/kernel/tools/MetadataRugPullDetector.js",
      "import": "/webgpu-os/kernel/tools/MetadataRugPullDetector.js",
      "sourceHash": "59c3a9b997b8c5e8646f996c71e2705286e1c27fdff3ba905abedb901d0ec70e",
      "summary": "",
      "exports": [
        {
          "name": "MetadataRugPullDetector",
          "kind": "class",
          "signature": "class MetadataRugPullDetector",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/ToolCallSchemaValidator",
      "path": "webgpu-os/reference/kernel/tools/ToolCallSchemaValidator.md",
      "source": "webgpu-os/kernel/tools/ToolCallSchemaValidator.js",
      "import": "/webgpu-os/kernel/tools/ToolCallSchemaValidator.js",
      "sourceHash": "38024a4e38346db1230199a26b502702e0263ad825adda1b300750c93a27ce8d",
      "summary": "ToolCallSchemaValidator.js — validates AI-supplied tool call arguments against the tool's declared JSON schema, reusing the existing webgpu-os/kernel/schema/SchemaValidator.js (no parallel validator).",
      "exports": [
        {
          "name": "ToolCallSchemaValidator",
          "kind": "class",
          "signature": "class ToolCallSchemaValidator",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/ToolPermissionChecker",
      "path": "webgpu-os/reference/kernel/tools/ToolPermissionChecker.md",
      "source": "webgpu-os/kernel/tools/ToolPermissionChecker.js",
      "import": "/webgpu-os/kernel/tools/ToolPermissionChecker.js",
      "sourceHash": "007f7651005864574c43d0e3ef9e089c0c3157980563e0ff6b4c7389f099b23d",
      "summary": "ToolPermissionChecker.js — gates AI-initiated tool calls through kernel.permissions (RuleGraph), on top of (not instead of) the per-tool AffordanceRegistry.capabilityRequired check done by ToolRouter.",
      "exports": [
        {
          "name": "ToolPermissionChecker",
          "kind": "class",
          "signature": "class ToolPermissionChecker",
          "summary": "ToolPermissionChecker.js — gates AI-initiated tool calls through kernel.permissions (RuleGraph), on top of (not instead of) the per-tool AffordanceRegistry.capabilityRequired check done by ToolRouter."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/ToolResultIngestAdapter",
      "path": "webgpu-os/reference/kernel/tools/ToolResultIngestAdapter.md",
      "source": "webgpu-os/kernel/tools/ToolResultIngestAdapter.js",
      "import": "/webgpu-os/kernel/tools/ToolResultIngestAdapter.js",
      "sourceHash": "d2845f518d377381b0798b679e84654fe058ba3ce387ea94f690a51277c621c2",
      "summary": "ToolResultIngestAdapter.js — the single chokepoint every AI-invoked tool result passes through on its way into the world model. Delegates to engine/state/worldmodel/UntrustedBoundary.js (no parallel wrapper); a tool result is always trusted:false and can never mint authority.",
      "exports": [
        {
          "name": "ToolResultIngestAdapter",
          "kind": "class",
          "signature": "class ToolResultIngestAdapter",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "kernel/tools/ToolRouter",
      "path": "webgpu-os/reference/kernel/tools/ToolRouter.md",
      "source": "webgpu-os/kernel/tools/ToolRouter.js",
      "import": "/webgpu-os/kernel/tools/ToolRouter.js",
      "sourceHash": "a355df4f693b04069dc8820e2e54466884989888962c0b12901712027abaf734",
      "summary": "ToolRouter.js — AI Tool Firewall. The single entrypoint the AI Hub's tool-calling loop uses to run a registered tool on behalf of an app. Delegates actual tool registration/execution/history to the existing ToolDriver.js (kernel.toolDriver) — this class never duplicates that machinery, it wraps it with the checks an *AI-initiated* call needs before it's safe to run: permission check, rug-pull detection, hidden-parameter detection, schema validation, and affordance/capability gating. Every result is then ingested through the CSE prompt-injection boundary (ToolResultIngestAdapter → engine/state UntrustedBoundary) before it's handed back — a tool result is observation, never authority.",
      "exports": [
        {
          "name": "ToolRouter",
          "kind": "class",
          "signature": "class ToolRouter",
          "summary": ""
        },
        {
          "name": "boundedAIValue",
          "kind": "function",
          "signature": "boundedAIValue(value, output = '')",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/AppCompiler",
      "path": "webgpu-os/reference/packages/AppCompiler.md",
      "source": "webgpu-os/packages/AppCompiler.js",
      "import": "/webgpu-os/packages/AppCompiler.js",
      "sourceHash": "cf3f2f41e7ebe5dd8f59410bf98c4f6393b65c8731be7b3d93f38cefe2641288",
      "summary": "AppCompiler.js — compile an ingested source bundle into a signed `.prpkg`. Two paths: 1. NATIVE — the folder already has a valid `manifest.json` + JS entry. Files are packaged as-is under `files/`. 2. AUTO   — any HTML/WebGPU app. We probe it (engine/compat), generate a compatibility profile, an embedded source module (`__compat_source.js`), and a bootloader entry (`index.js`) that calls `engine.compat.boot(...)` at mount time. A normal WebGPU app → an engine-native, signed OS app. Output uses PackageBuilder.buildV2 (signed + encrypted + merkle + cert). With a developer (self-signed) key the package verifies as the community/unofficial tier; a root-issued cert promotes it to trusted.",
      "exports": [
        {
          "name": "AppCompiler",
          "kind": "class",
          "signature": "class AppCompiler",
          "summary": ""
        },
        {
          "name": "CompatGuestApp",
          "kind": "class",
          "signature": "class CompatGuestApp",
          "summary": ""
        },
        {
          "name": "buildFilesMap",
          "kind": "function",
          "signature": "buildFilesMap()",
          "summary": ""
        },
        {
          "name": "entry",
          "kind": "constant",
          "signature": "entry",
          "summary": ""
        },
        {
          "name": "profile",
          "kind": "constant",
          "signature": "profile",
          "summary": ""
        },
        {
          "name": "html",
          "kind": "constant",
          "signature": "html",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/CapabilityMap",
      "path": "webgpu-os/reference/packages/CapabilityMap.md",
      "source": "webgpu-os/packages/CapabilityMap.js",
      "import": "/webgpu-os/packages/CapabilityMap.js",
      "sourceHash": "8cccee3e9c847a9754a6a66f9fdd0a28aae0709cbfb21c704539caa99a56e63b",
      "summary": "CapabilityMap.js — OS-adaptive bridge between the compat static probe and the kernel's capability vocabulary. The kernel's RuleGraph is the single source of truth for what capabilities exist (`KNOWN_CAPABILITIES`) and how risky each one is (`CAPABILITY_LABELS`). This module classifies EVERY known capability into one disposition and, for the statically-detectable ones, maps a compat probe signal (`profile.uses` / `profile.gpu`) onto it. Dispositions: - 'free'    — universally allowed by the default rule graph; never emitted (the app already has it). - 'auto'    — detectable + low/medium risk → auto-added when the probe sees it. - 'suggest' — detectable + high risk → SURFACED for review, never silently added. - 'declare' — grantable but not statically inferable → author opts in. - 'system'  — privileged / system-trust → never auto-added under any path. - 'runtime' — kernel-mediated ephemeral consent token → never accepted from or emitted into an application manifest. Least-privilege is preserved: only 'auto' caps are granted without review; high-risk and privileged caps always require an explicit decision. IMPORTANT — this is a BUILD-TIME ADVISORY layer, not a security boundary. Static source scanning has unavoidable false negatives (minification, obfuscation, dynamically-constructed API calls, runtime behavior that differs from source). The authoritative gate is the kernel's runtime complete-mediation stack: `guardSyscalls` default-deny + per-call `Permissions.require` + the `PermissionPortal`. Auto-added caps only ever cover low/medium-risk APIs, so a missed or spoofed signal cannot silently escalate to a high-risk capability. A module-load guard logs any kernel capability that is missing a disposition, so the table can never silently drift behind a newly-added kernel cap; the Security Doctor surfaces the same check (`auditCapabilityMap`) at boot.",
      "exports": [
        {
          "name": "policyOf",
          "kind": "function",
          "signature": "policyOf(cap)",
          "summary": "Resolve a capability's disposition string ('free'|'auto'|'suggest'|'declare'|'system'|'runtime'|'unknown')."
        },
        {
          "name": "riskOf",
          "kind": "function",
          "signature": "riskOf(cap)",
          "summary": "Risk level for a cap, read from the kernel's CAPABILITY_LABELS (default 'medium')."
        },
        {
          "name": "detectCapabilities",
          "kind": "function",
          "signature": "detectCapabilities(signals)",
          "summary": "Run every detector against probe signals. Detectors are wrapped so a single malformed signal or detector bug can never throw during a build — a failing detector is treated as \"not detected\" and a one-time warning is logged. (Static detection is best-effort UX; the kernel's runtime guard remains the authoritative boundary — see module header.)"
        },
        {
          "name": "classifyPermissions",
          "kind": "function",
          "signature": "classifyPermissions({ signals, declared = [], granted = [] } = {})",
          "summary": "Classify a probe against what is already declared/granted and produce the final permission list + a reconciliation report."
        },
        {
          "name": "unclassifiedCapabilities",
          "kind": "function",
          "signature": "unclassifiedCapabilities()",
          "summary": "Kernel capabilities that have no disposition in this table (should be empty)."
        },
        {
          "name": "staleCapabilities",
          "kind": "function",
          "signature": "staleCapabilities()",
          "summary": "Capabilities classified here that no longer exist in the kernel vocabulary (stale entries)."
        },
        {
          "name": "auditCapabilityMap",
          "kind": "function",
          "signature": "auditCapabilityMap()",
          "summary": "Self-audit for the Security Doctor / boot self-test. Returns coverage counts and any drift (kernel caps with no disposition, or table entries that are no longer kernel caps). `ok` is true only when there is no drift in either direction."
        },
        {
          "name": "CAPABILITY_POLICY",
          "kind": "constant",
          "signature": "CAPABILITY_POLICY",
          "summary": "Disposition + (for detectable caps) a `detect(signals)` predicate, keyed by the exact capability string from KNOWN_CAPABILITIES. A bare string is shorthand for `{ policy: <string> }` (no detector)."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/FolderIngestor",
      "path": "webgpu-os/reference/packages/FolderIngestor.md",
      "source": "webgpu-os/packages/FolderIngestor.js",
      "import": "/webgpu-os/packages/FolderIngestor.js",
      "sourceHash": "85da02867518747e49625f107d733a645229c34862c50c5ab4d41efc4757d7c8",
      "summary": "FolderIngestor.js — turn any developer source into a { files, entry } bundle that AppCompiler can package. Sources: • Directory picker (File System Access `showDirectoryPicker`) • <input type=\"file\" webkitdirectory> FileList • A single HTML File • A `.zip` (Uint8Array/ArrayBuffer/File) via Zip.parse • The OS VFS (a folder path or single file) via StorageManager • A remote URL (single-file HTML; CORS-aware) Output: { files: Map<string, string|Uint8Array>, entry: string, sourceType: string, name: string } Text files are decoded to strings; binary files stay as Uint8Array.",
      "exports": [
        {
          "name": "FolderIngestor",
          "kind": "class",
          "signature": "class FolderIngestor",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/Gzip",
      "path": "webgpu-os/reference/packages/Gzip.md",
      "source": "webgpu-os/packages/Gzip.js",
      "import": "/webgpu-os/packages/Gzip.js",
      "sourceHash": "6e2501cde50fff65dba136d8274402465f5614ece287baaff32bd3274d2237d7",
      "summary": "Gzip.js — gzip compress/decompress via the browser-native Compression Streams API. This is the SAME approach `bundle_engine.py` uses for the runtime bundle (`*.min.js.gz`) and its `--encrypt` loader: gzip the payload, then (optionally) AES-GCM it, and decompress in-browser with `DecompressionStream('gzip')`. No custom container format — a `.prpkg` payload is just `gzip(JSON)`. gzip carries its own whole-stream CRC-32 (validated by DecompressionStream), and we layer per-file SHA-256 + a signed Merkle root on top, so integrity is covered.",
      "exports": [
        {
          "name": "gzip",
          "kind": "function",
          "signature": "async gzip(input)",
          "summary": "Gzip-compress a string or bytes."
        },
        {
          "name": "gunzip",
          "kind": "function",
          "signature": "async gunzip(input, opts = {})",
          "summary": "Gunzip to bytes, with a decompressed-size cap (zip-bomb guard)."
        },
        {
          "name": "gunzipText",
          "kind": "function",
          "signature": "async gunzipText(input, opts = {})",
          "summary": "Gunzip to a UTF-8 string."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PackageBuilder",
      "path": "webgpu-os/reference/packages/PackageBuilder.md",
      "source": "webgpu-os/packages/PackageBuilder.js",
      "import": "/webgpu-os/packages/PackageBuilder.js",
      "sourceHash": "7e72d47959c7fa24e8a6e178ba2e23c33215aa1633191c75085348c18e75bbcc",
      "summary": "PackageBuilder.js — build a signed .prpkg from a folder of files. Output format (JSON envelope — zip support planned): { format:    'prpkg-v1', manifest:  { ... },          // manifest.json with files hash map blockmap:  { files: {...} }, // sha256 per file signature: { pubKey, sig },  // ECDSA P-256 over blockmap JSON files:     { path: content } // all file contents as strings } Usage: const pkg = await PackageBuilder.build({ id: 'os.my-app', name: 'My App', version: '1.0.0', publisher: 'local', entry: 'files/app.html', permissions: ['gpu'], files: { 'files/app.html': '<html>...' } }, cryptoDriver);",
      "exports": [
        {
          "name": "PackageBuilder",
          "kind": "class",
          "signature": "class PackageBuilder",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PackageCrypto",
      "path": "webgpu-os/reference/packages/PackageCrypto.md",
      "source": "webgpu-os/packages/PackageCrypto.js",
      "import": "/webgpu-os/packages/PackageCrypto.js",
      "sourceHash": "41b4c1d6853dda35a68f880a02d5e9dd98ee809ad9473a6e985504f45e94c2ed",
      "summary": "PackageCrypto.js — AES-GCM payload encryption for .prpkg v2 containers. SECURITY NOTE (acknowledged in the plan): in a browser the decryption key must ship with the OS, so this encryption is OBFUSCATION / a licensing-and-guard hook — NOT true secrecy. Package *authenticity* comes from the ECDSA signature + the ring-0 trust chain (Phase 2), not from this encryption. Container binary layout (`.prpkg` v2): bytes 0..5   magic  \"PRPKG2\" byte  6      version (0x02) byte  7      flags  (bit0 = encrypted) bytes 8..19  AES-GCM IV (12 bytes)        [only if encrypted] bytes 20..   ciphertext (AES-GCM, tag appended)  | or plaintext gzip if not encrypted The inner plaintext is gzip(JSON{manifest, blockmap, files}) — the same gzip codec the bundler uses, decompressed in-browser via DecompressionStream('gzip'). ── Single-file layout (`.prpkg`, embeds the envelope) ────────────────────── A v2 package historically shipped as TWO files (the binary container + a `.prpkg.json` sidecar envelope). `embed()` fuses both into ONE self-describing `.prpkg`, so there is a single artifact to move around and verify: bytes 0..5    magic \"PRPKGS\" byte  6       version (0x01) byte  7       reserved (0x00) bytes 8..11   envelope length (uint32, little-endian) bytes 12..    envelope JSON (UTF-8) then          the full PRPKG2 container bytes (as produced by seal()) `split()` reverses it. The envelope is the PUBLIC, signed metadata; the embedded container is cross-verified against it by PackageVerifier.parseV2 (manifest + blockmap equality, signed blockmap.manifestHash, AES-GCM AAD = id@version, and the ECDSA signature) — so tampering with either half is detected.",
      "exports": [
        {
          "name": "PackageCrypto",
          "kind": "class",
          "signature": "class PackageCrypto",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PackageLoader",
      "path": "webgpu-os/reference/packages/PackageLoader.md",
      "source": "webgpu-os/packages/PackageLoader.js",
      "import": "/webgpu-os/packages/PackageLoader.js",
      "sourceHash": "49ba04cf89f47d088ffe9654dd2b5cbbef003395cedebaa35a38fcd79c70beea",
      "summary": "PackageLoader.js — load an installed .prpkg app's entry module from OPFS. Installed packages live at: /os/packages/installed/{appId}/{version}/files/{relPath} Loading strategy: 1. Gather every file under the package's files/ dir. 2. Apply enabled PatchManager overlays (file-overlay layer) on top of base files. 3. Build a blob-URL module graph: each JS module's *relative* import/export specifiers are rewritten to the blob URL of the corresponding packaged file, resolved in dependency order (best-effort for cycles). 4. import() the entry blob URL and return the module namespace. Why rewrite specifiers instead of an import map? Import maps must exist before the first module loads; we resolve packages at runtime, so we inline the graph by rewriting relative specifiers to blob URLs. Blob URLs are retained for the lifetime of the loaded app and revoked when the package is reloaded or removed.",
      "exports": [
        {
          "name": "PackageLoader",
          "kind": "class",
          "signature": "class PackageLoader",
          "summary": ""
        },
        {
          "name": "CompatGuestApp",
          "kind": "class",
          "signature": "class CompatGuestApp",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PackageManager",
      "path": "webgpu-os/reference/packages/PackageManager.md",
      "source": "webgpu-os/packages/PackageManager.js",
      "import": "/webgpu-os/packages/PackageManager.js",
      "sourceHash": "8f595d6e8af1599a70066994c17821fc7374e288d827f075168848d060188cf3",
      "summary": "PackageManager.js — install, remove, update, verify, repair, rollback .prpkg packages. Package lifecycle: download/pick → stage → verify → install → register → (update → rollback) Storage layout: /os/packages/installed/{appId}/{version}/   ← active package files /os/packages/staging/{appId}/{version}/     ← in-progress installs /os/packages/rollback/{appId}/{version}/    ← previous version for rollback /os/packages/locks/{appId}.lock.json        ← prevents concurrent installs /os/packages/chunks/sha256-{hash}           ← chunk cache (CacheDriver)",
      "exports": [
        {
          "name": "PackageManager",
          "kind": "class",
          "signature": "class PackageManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PackageRegistry",
      "path": "webgpu-os/reference/packages/PackageRegistry.md",
      "source": "webgpu-os/packages/PackageRegistry.js",
      "import": "/webgpu-os/packages/PackageRegistry.js",
      "sourceHash": "14891172f063d9b77c001735c8e5940970bcb5334724edd7a2bda4fc4c0821b2",
      "summary": "PackageRegistry.js — IndexedDB-backed registry of installed packages. Each record in the 'packages' store: { id:          'os.shader-lab', name:        'Shader Lab', version:     '1.0.0', activeRootHash: 'a1b2c3d4...', // content-addressed install directory rollbackRootHash: '...',        // previous activation root hash rollbackVersion: null, rollbackAvailable: false, publisher:   'local', installedAt: 1234567890, updatedAt:   1234567890, entryPath:   '/os/packages/installed/os.shader-lab/a1b2c3d4.../files/app.html', manifest:    { ...full manifest... }, format:      'prpkg-v1', trustVerdict: 'trusted', pinned:      false, pinnedVersion: null, sourceUrl:   null,           // URL to check for updates }",
      "exports": [
        {
          "name": "PackageRegistry",
          "kind": "class",
          "signature": "class PackageRegistry",
          "summary": "PackageRegistry.js — IndexedDB-backed registry of installed packages. Each record in the 'packages' store: { id:          'os.shader-lab', name:        'Shader Lab', version:     '1.0.0', activeRootHash: 'a1b2c3d4...', // content-addressed install directory rollbackRootHash: '...',        // previous activation root hash rollbackVersion: null, rollbackAvailable: false, publisher:   'local', installedAt: 1234567890, updatedAt:   1234567890, entryPath:   '/os/packages/installed/os.shader-lab/a1b2c3d4.../files/app.html', manifest:    { ...full manifest... }, format:      'prpkg-v1', trustVerdict: 'trusted', pinned:      false, pinnedVersion: null, sourceUrl:   null,           // URL to check for updates }"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PackageScanner",
      "path": "webgpu-os/reference/packages/PackageScanner.md",
      "source": "webgpu-os/packages/PackageScanner.js",
      "import": "/webgpu-os/packages/PackageScanner.js",
      "sourceHash": "4f13f9ae60d2632244bdc0d3a0191c497ae31cd74b44965957661e093e800be2",
      "summary": "PackageScanner.js — heuristic static pre-scan of package contents. This is an EARLY-WARNING badge, not a guarantee: novel obfuscation will evade heuristics. The real containment is default-deny egress + sandboxed execution (see PermissionPortal / guardSyscalls). The scanner flags the patterns seen in real 2025–2026 supply-chain payloads: heavy obfuscation, base64 blobs, dynamic code execution, credential/secret access, network exfiltration, and payloads hidden inside non-code assets. scan(pkg) → { risk: 'low'|'medium'|'high', findings: [{ level, code, file, msg }] }",
      "exports": [
        {
          "name": "PackageScanner",
          "kind": "class",
          "signature": "class PackageScanner",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PackageVerifier",
      "path": "webgpu-os/reference/packages/PackageVerifier.md",
      "source": "webgpu-os/packages/PackageVerifier.js",
      "import": "/webgpu-os/packages/PackageVerifier.js",
      "sourceHash": "d6961e6a5e1b707ebcc22bd93b1d509ddd23c94516c84238f0663a86248c337b",
      "summary": "PackageVerifier.js — verifies .prpkg package integrity. Verification steps: 1. Validate manifest schema (format, required fields) 2. Verify each file's SHA-256 hash against blockmap 3. Verify ECDSA P-256 publisher signature over blockmap hash The publisher key fingerprint is stored in the manifest. Trusted publishers are managed by kernel.permissions.",
      "exports": [
        {
          "name": "PackageVerifier",
          "kind": "class",
          "signature": "class PackageVerifier",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/PublisherKeyManager",
      "path": "webgpu-os/reference/packages/PublisherKeyManager.md",
      "source": "webgpu-os/packages/PublisherKeyManager.js",
      "import": "/webgpu-os/packages/PublisherKeyManager.js",
      "sourceHash": "d8decd95dd3d284e8f931e7d5f44ada4333007dcafd64b6606d39feece5c753e",
      "summary": "PublisherKeyManager.js — the developer's portable package-signing key. Distinct from `CryptoDriver` (the device identity), whose private key is NON-extractable and therefore cannot be backed up, moved between machines, or rotated with a lineage. A publisher who ships packages needs a key they can: - generate once and KEEP SAFE (encrypted export the dev stores offline), - re-import on another machine / after reinstall, - ROTATE while proving continuity (old key signs the new key — see kernel/SigningLineage.js), so app updates stay verifiable and isolated. The keypair is ECDSA P-256, **extractable**, stored locally (JWK in the IDB kv store) for day-to-day signing, plus an AES-256-GCM (PBKDF2-SHA256) encrypted backup the dev downloads and keeps. Signatures are raw IEEE-P1363 (WebCrypto default), the same format `CryptoDriver.verify` / CollabIdentity `verifyData` expects, and fingerprints are computed via `cryptoDriver.fingerprintOf` so the publisher fingerprint scheme matches the rest of the trust system.",
      "exports": [
        {
          "name": "PublisherKeyManager",
          "kind": "class",
          "signature": "class PublisherKeyManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/UpdateManager",
      "path": "webgpu-os/reference/packages/UpdateManager.md",
      "source": "webgpu-os/packages/UpdateManager.js",
      "import": "/webgpu-os/packages/UpdateManager.js",
      "sourceHash": "a774a344769c49b09ae16fca2dc2600e74c7cbc416908d766839b784da06866d",
      "summary": "UpdateManager.js — block-level differential update engine (MSIX-style, web-native). Update flow: check(appId)   → fetch remote blockmap from sourceUrl, diff against installed blockmap, return UpdateJob with changed/removed file lists. apply(appId)   → download only changed chunks, verify each sha256, verify package ECDSA-P256 signature, atomic-swap installed dirs, save previous version to rollback slot, update registry. rollback(appId)→ delegate to PackageManager.rollback() checkAll()     → check all installed packages that have a sourceUrl setSource()    → delegate to PackageManager.setSource() Remote blockmap format (served at {sourceUrl}/blockmap.json): { \"appId\":          \"os.my-app\", \"version\":        \"1.2.0\", \"files\": [ { \"path\": \"index.js\",      \"sha256\": \"hex...\", \"size\": 8192 }, { \"path\": \"manifest.json\", \"sha256\": \"hex...\", \"size\":  512 } ], \"signature\":      \"base64-ecdsa-der...\",   // optional — over canonical payload \"signerPublicKey\": { \"kty\":\"EC\",\"crv\":\"P-256\", ... }  // optional JWK } Storage layout (under /os/packages/): .updates/{appId}/remote-blockmap.json  ← cached remote blockmap post-check .updates/{appId}/staged/               ← downloaded changed files installed/{appId}/{version}/           ← live package (PackageManager layout) rollback/{appId}/{version}/            ← previous version slot",
      "exports": [
        {
          "name": "UpdateManager",
          "kind": "class",
          "signature": "class UpdateManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "packages/Zip",
      "path": "webgpu-os/reference/packages/Zip.md",
      "source": "webgpu-os/packages/Zip.js",
      "import": "/webgpu-os/packages/Zip.js",
      "sourceHash": "444a297ce9c44e3a6f8cfaad2b824bb2a5105d8fe3ff7715857d1a7a010f1942",
      "summary": "",
      "exports": [
        {
          "name": "Zip",
          "kind": "class",
          "signature": "class Zip",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/Desktop",
      "path": "webgpu-os/reference/shell/Desktop.md",
      "source": "webgpu-os/shell/Desktop.js",
      "import": "/webgpu-os/shell/Desktop.js",
      "sourceHash": "7572a6912353fade12348c11369b57da02ed8c375407c395574b942974d732a1",
      "summary": "Desktop.js — the OS shell compositor. Owns: - Plauna workspace (virtual desktops, panel chrome, window management). - Taskbar (bottom bar: start menu + running apps + status tray). - NotificationCenter (toast/banner delivery). - Routing of kernel 'ui:open-panel' events to WorkspaceManager. Phase 2 adds AppManifestLoader → dynamic app registration. Phase 3 adds GPU panel wiring (canvas surface allocation per app).",
      "exports": [
        {
          "name": "Desktop",
          "kind": "class",
          "signature": "class Desktop",
          "summary": "Desktop.js — the OS shell compositor. Owns: - Plauna workspace (virtual desktops, panel chrome, window management). - Taskbar (bottom bar: start menu + running apps + status tray). - NotificationCenter (toast/banner delivery). - Routing of kernel 'ui:open-panel' events to WorkspaceManager. Phase 2 adds AppManifestLoader → dynamic app registration. Phase 3 adds GPU panel wiring (canvas surface allocation per app)."
        },
        {
          "name": "createProvisionalMountHandoff",
          "kind": "function",
          "signature": "createProvisionalMountHandoff({ controller = new AbortController()",
          "summary": "Own teardown while an async app mount is still provisional. Cancellation calls an attached cleanup synchronously, so the app observes its AbortSignal before the panel is removed. Any cleanup promise continues in the background while a pending close returns immediately. Once the mount has settled, callers replace this handoff with the real app and retain the normal awaited-unmount contract."
        },
        {
          "name": "guardMountRegistrations",
          "kind": "function",
          "signature": "guardMountRegistrations(namespace, signal, methods = [], label = 'app capability')",
          "summary": ""
        },
        {
          "name": "resolveAppConstructor",
          "kind": "function",
          "signature": "resolveAppConstructor(mod)",
          "summary": ""
        },
        {
          "name": "desktopFrameRgbHash",
          "kind": "function",
          "signature": "desktopFrameRgbHash(data)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/DialogManager",
      "path": "webgpu-os/reference/shell/DialogManager.md",
      "source": "webgpu-os/shell/DialogManager.js",
      "import": "/webgpu-os/shell/DialogManager.js",
      "sourceHash": "7e33151453eb9683688350e98d912d8f684c778ca96206a1f293b43d962e3f35",
      "summary": "DialogManager.js — OS-level dialog system. Handles kernel `ui:modal` events and renders styled alert / confirm / prompt dialogs as a layered overlay above all panels. API (via kernel.events or syscalls.ui.*): ui:modal  { type, title, message, icon, buttons, defaultValue, resolve } Promise-returning syscalls (see Syscalls.js): syscalls.ui.alert(msg, opts)               → Promise<void> syscalls.ui.confirm(msg, opts)             → Promise<boolean> syscalls.ui.prompt(msg, default, opts)     → Promise<string|null>",
      "exports": [
        {
          "name": "DialogManager",
          "kind": "class",
          "signature": "class DialogManager",
          "summary": "DialogManager.js — OS-level dialog system. Handles kernel `ui:modal` events and renders styled alert / confirm / prompt dialogs as a layered overlay above all panels. API (via kernel.events or syscalls.ui.*): ui:modal  { type, title, message, icon, buttons, defaultValue, resolve } Promise-returning syscalls (see Syscalls.js): syscalls.ui.alert(msg, opts)               → Promise<void> syscalls.ui.confirm(msg, opts)             → Promise<boolean> syscalls.ui.prompt(msg, default, opts)     → Promise<string|null>"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/NotificationCenter",
      "path": "webgpu-os/reference/shell/NotificationCenter.md",
      "source": "webgpu-os/shell/NotificationCenter.js",
      "import": "/webgpu-os/shell/NotificationCenter.js",
      "sourceHash": "7ce55232d6394f3d9e7acbe4c5f0b82702e6511f5aec6a941eabb5ee025b2989",
      "summary": "NotificationCenter.js — routes kernel ui:notify events to Plauna's ToastManager. Uses Plauna ToastManager directly (the same underlying system NotificationSystem uses). Falls back to a minimal DOM toast only if Plauna has not mounted yet.",
      "exports": [
        {
          "name": "NotificationCenter",
          "kind": "class",
          "signature": "class NotificationCenter",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/PackageHostRealm",
      "path": "webgpu-os/reference/shell/PackageHostRealm.md",
      "source": "webgpu-os/shell/PackageHostRealm.js",
      "import": "/webgpu-os/shell/PackageHostRealm.js",
      "sourceHash": "7bea7ddd3418de07411ce628a3e4ac3ca4f514704953cadf4fe661eb09643b88",
      "summary": "PackageHostRealm.js — run an installed NATIVE package app inside an opaque-origin sandboxed iframe, bridging the kernel syscalls over a nonce-bound postMessage RPC. WHY: `PackageLoader` imports a package's entry module straight into the OS origin (S2). Trusted/root packages may keep that fast shared realm, but pinned/untrusted packages must NOT touch `window`, the OS DOM, localStorage, the extension bridge, or any accidental globals. This realm gives them an `allow-scripts` (NO `allow-same-origin`) iframe — a true origin boundary — and proxies the syscall surface back to the host's GUARDED syscalls for that app. BRIDGE SCOPE (honest limits): - Async, structured-cloneable syscalls (fs.*, storage.*, ui.notify/alert/ confirm/prompt, log.*, sandbox.*, net send/fetch, pkg reads, etc.) work: each call round-trips to the host, which invokes the real guarded method. - Subscriptions / callbacks (`.on`, `.onChange`, `.onEvent`, …) CANNOT cross the boundary; the in-iframe proxy returns a no-op unsubscribe so apps that register listeners do not crash (they simply receive no host events yet). - Raw `GPUDevice` / GPU surfaces cannot cross an opaque-origin boundary, so GPU-panel apps are NOT isolated here (the launcher keeps them shared). SECURITY: the host only ever services RPC bearing the exact per-instance nonce from the iframe it created, and only invokes `this._syscalls` (already guarded + capability-checked for THIS appId). Unknown namespaces/methods are refused.",
      "exports": [
        {
          "name": "PackageHostRealm",
          "kind": "class",
          "signature": "class PackageHostRealm",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/StartMenu",
      "path": "webgpu-os/reference/shell/StartMenu.md",
      "source": "webgpu-os/shell/StartMenu.js",
      "import": "/webgpu-os/shell/StartMenu.js",
      "sourceHash": "12ece44999f60ce5026d3e39bf2ad0d0b4a550f53c61644fc93d503f7bba4545",
      "summary": "",
      "exports": [
        {
          "name": "StartMenu",
          "kind": "class",
          "signature": "class StartMenu",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/StatusTray",
      "path": "webgpu-os/reference/shell/StatusTray.md",
      "source": "webgpu-os/shell/StatusTray.js",
      "import": "/webgpu-os/shell/StatusTray.js",
      "sourceHash": "eb8398160bd0a6d1801dbd06768c58221537f8c657bbb4397c3a6ee197f134cc",
      "summary": "StatusTray.js — rightmost section of the taskbar. A thin orchestrator: it composes stateless tray widgets (see ./tray/ tray-widgets.js) and owns the per-frame update loop. It does NOT render the calendar — clicking the clock requests the Calendar app's flyout surface. Layout (left → right): GPU stat | FPS stat | 🔍 | ⚡ | Clock | 🔔",
      "exports": [
        {
          "name": "StatusTray",
          "kind": "class",
          "signature": "class StatusTray",
          "summary": "StatusTray.js — rightmost section of the taskbar. A thin orchestrator: it composes stateless tray widgets (see ./tray/ tray-widgets.js) and owns the per-frame update loop. It does NOT render the calendar — clicking the clock requests the Calendar app's flyout surface. Layout (left → right): GPU stat | FPS stat | 🔍 | ⚡ | Clock | 🔔"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/Taskbar",
      "path": "webgpu-os/reference/shell/Taskbar.md",
      "source": "webgpu-os/shell/Taskbar.js",
      "import": "/webgpu-os/shell/Taskbar.js",
      "sourceHash": "af0dcf40d67ab69fd019c53011c1efdd9c156616283b70ee315074ba5882146a",
      "summary": "Taskbar.js - bottom shell coordinator. Rendering and behavior live in shell/taskbar modules so the taskbar can grow without becoming another monolithic desktop controller.",
      "exports": [
        {
          "name": "Taskbar",
          "kind": "class",
          "signature": "class Taskbar",
          "summary": "Taskbar.js - bottom shell coordinator. Rendering and behavior live in shell/taskbar modules so the taskbar can grow without becoming another monolithic desktop controller."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/WindowSizer",
      "path": "webgpu-os/reference/shell/WindowSizer.md",
      "source": "webgpu-os/shell/WindowSizer.js",
      "import": "/webgpu-os/shell/WindowSizer.js",
      "sourceHash": "9a78a78b47dee396436a9dcb056570e34f336c112ed1d207a60cace139478c29",
      "summary": "WindowSizer.js — Viewport-aware window sizing and placement. Computes default window dimensions and screen position based on: 1. The LIVE available desktop area (viewport minus taskbar) — not device type. 2. The app manifest's `category` (and optional `sizingHint`) to pick a sizing profile. 3. The manifest's `defaultWidth/defaultHeight` treated as design-time values at a 1440px reference viewport, then scaled proportionally to the actual viewport. Windows are centered in the available desktop area, with a configurable cascade offset for stacking multiple windows. ── Viewport contexts (based on available desktop width) ────────────────── compact   < 640px   — very constrained (browser in half-screen, etc.) medium    640–1024  — tablet / laptop / small desktop window wide      1024–1440 — typical desktop ultrawide > 1440    — large monitor / maximized on 4K ── Sizing profiles (per manifest category / sizingHint) ────────────────── compact   → small, fixed-size utility (calculator, clock) utility   → small utility panel tools     → medium tool (settings, pkg-manager) system    → medium-large system panel (sysmon, task-manager, terminal, files) debug     → narrow + tall (devconsole, log-viewer) creative  → large workspace (paint, notepad) webgpu    → large with canvas (fractal, particles, gpu-manager) games     → large, prefers square-ish (minesweeper, snake, solitaire) workspace → near-full (browser, heavy editors)  [sizingHint override] full      → fills entire desktop area            [sizingHint override]",
      "exports": [
        {
          "name": "availableDesktop",
          "kind": "function",
          "signature": "availableDesktop()",
          "summary": "Returns the current available desktop dimensions (px)."
        },
        {
          "name": "computeWindow",
          "kind": "function",
          "signature": "computeWindow(manifest, cascadeIndex = 0)",
          "summary": "Compute the optimal window { width, height, x, y } for a given manifest."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/WindowStateStore",
      "path": "webgpu-os/reference/shell/WindowStateStore.md",
      "source": "webgpu-os/shell/WindowStateStore.js",
      "import": "/webgpu-os/shell/WindowStateStore.js",
      "sourceHash": "1a279ceb82bdc923369c5aaee7c68a793448c6ef4c21ccd9d7342efda82d167a",
      "summary": "WindowStateStore.js — Persist and restore per-app window position/size. Stored in localStorage under 'os.windowStates' as a versioned envelope whose `states` field maps appId → state. The historical bare map remains readable. Validates a restored state against the current viewport before using it; if the position is out of bounds or the size is unreasonable the saved state is silently ignored and the app opens at its computed default.",
      "exports": [
        {
          "name": "validateState",
          "kind": "function",
          "signature": "validateState(state)",
          "summary": "Validate a saved state for corruption only (finite, positive size). Position reachability is no longer a reject reason — clampToViewport() moves an off-screen window back into view instead of discarding the saved state."
        },
        {
          "name": "clampToViewport",
          "kind": "function",
          "signature": "clampToViewport(state)",
          "summary": "Reposition a state so a reachable strip of its titlebar stays inside the work area. Handles smaller screens / resolution changes / disconnected monitors — the window is pulled back on-screen rather than left unclickable."
        },
        {
          "name": "clampStateSize",
          "kind": "function",
          "signature": "clampStateSize(state)",
          "summary": "Clamp a state's width and height so neither falls below 15% nor exceeds 100% of the available desktop area.  Position is preserved as-is."
        },
        {
          "name": "loadState",
          "kind": "function",
          "signature": "loadState(appId)",
          "summary": "Load the saved window state for an app. Returns null when nothing is stored yet."
        },
        {
          "name": "saveState",
          "kind": "function",
          "signature": "saveState(appId, { x, y, width, height, maximized = false })",
          "summary": "Persist the current window state for an app."
        },
        {
          "name": "clearState",
          "kind": "function",
          "signature": "clearState(appId)",
          "summary": "Remove the saved window state for an app (e.g. after a reset)."
        },
        {
          "name": "clearAllStates",
          "kind": "function",
          "signature": "clearAllStates()",
          "summary": "Remove every persisted window geometry record."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/app-icon",
      "path": "webgpu-os/reference/shell/app-icon.md",
      "source": "webgpu-os/shell/app-icon.js",
      "import": "/webgpu-os/shell/app-icon.js",
      "sourceHash": "475e024270e296f1e5a7a55745f8660d872a84b72af7f85451b1f616c4e33d78",
      "summary": "app-icon.js — custom app icons: emoji/glyph OR an uploaded/online image, animated GIF/WebP, or a short video. A manifest `icon` value may be ANY of: • an emoji / short glyph     — \"🧩\"  (default; what the shell drew before) • a still image data/URL     — data:image/… or https://…/x.png • an ANIMATED image          — animated GIF / WebP (plays via <img>) • a short video              — data:video/… or https://…/x.webm (muted loop) renderAppIcon() paints the right element into a container — drop-in for the old `el.textContent = manifest.icon`. Media icons size to the container's font-size (1em square), so each call site keeps its existing sizing. fileToIcon()/urlToIcon() turn a chosen file or remote URL into a compact, self-contained data URL (downscaled + size-capped; animation preserved when it fits) suitable for embedding in a manifest at compile time.",
      "exports": [
        {
          "name": "isImageIcon",
          "kind": "function",
          "signature": "isImageIcon(v)",
          "summary": ""
        },
        {
          "name": "isVideoIcon",
          "kind": "function",
          "signature": "isVideoIcon(v)",
          "summary": ""
        },
        {
          "name": "isMediaIcon",
          "kind": "function",
          "signature": "isMediaIcon(v)",
          "summary": ""
        },
        {
          "name": "renderAppIcon",
          "kind": "function",
          "signature": "renderAppIcon(container, icon, { fallback = '▪' } = {})",
          "summary": "Render `icon` into `container` (cleared first). Emoji/glyph → text (so the caller's font-size applies); image/video → a 1em-square media element."
        },
        {
          "name": "fileToIcon",
          "kind": "function",
          "signature": "async fileToIcon(file)",
          "summary": "Turn a chosen File into a compact icon data URL. • video      → kept as-is if ≤ VIDEO_CAP (muted loop). • animated   → kept as-is if ≤ FULL_CAP (preserves animation); else flattened. • SVG        → kept as-is if small; else rasterised. • other img  → center-cropped + downscaled to a 128² WebP."
        },
        {
          "name": "bytesToIcon",
          "kind": "function",
          "signature": "async bytesToIcon(bytes, filename = 'icon')",
          "summary": "Build an icon data URL from raw bundled file bytes (Uint8Array/ArrayBuffer) or a string (SVG/text), inferring the MIME type from the filename. Used to auto-detect an icon from an app's own files at ingest time."
        },
        {
          "name": "urlToIcon",
          "kind": "function",
          "signature": "async urlToIcon(url, { fetchImpl = null } = {})",
          "summary": "Fetch a remote image/video URL and embed it as a compact data URL (so the icon is self-contained — no live remote dependency, no privacy leak at render time). Cross-origin hosts that block CORS will reject; the caller should suggest downloading + uploading instead."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/desktop/WindowLayoutEngine",
      "path": "webgpu-os/reference/shell/desktop/WindowLayoutEngine.md",
      "source": "webgpu-os/shell/desktop/WindowLayoutEngine.js",
      "import": "/webgpu-os/shell/desktop/WindowLayoutEngine.js",
      "sourceHash": "adf7b0a642521498c30807e5765f6df7bf9f7ad6f40a75d9dd63438ea741d1ec",
      "summary": "Pure window-layout geometry shared by the desktop shell and Theme Manager.",
      "exports": [
        {
          "name": "normalizeWorkArea",
          "kind": "function",
          "signature": "normalizeWorkArea(area = {})",
          "summary": ""
        },
        {
          "name": "computeLayoutRect",
          "kind": "function",
          "signature": "computeLayoutRect(layout, inputArea, inputGap = 8)",
          "summary": "Compute a pixel rect for a named layout. Gaps are applied at outer and inner edges."
        },
        {
          "name": "detectEdgeLayout",
          "kind": "function",
          "signature": "detectEdgeLayout(pointer, inputArea, threshold = 34)",
          "summary": "Resolve an edge/corner pointer position into a snap layout."
        },
        {
          "name": "SNAP_LAYOUTS",
          "kind": "constant",
          "signature": "SNAP_LAYOUTS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/desktop/shellEnhancements",
      "path": "webgpu-os/reference/shell/desktop/shellEnhancements.md",
      "source": "webgpu-os/shell/desktop/shellEnhancements.js",
      "import": "/webgpu-os/shell/desktop/shellEnhancements.js",
      "sourceHash": "3e14685cf5760114b05b4e7165df66ae11297510dab1ee00aedf2f5344fdf83a",
      "summary": "",
      "exports": [
        {
          "name": "installShellEnhancements",
          "kind": "function",
          "signature": "installShellEnhancements(desktop)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/desktop/windowActions",
      "path": "webgpu-os/reference/shell/desktop/windowActions.md",
      "source": "webgpu-os/shell/desktop/windowActions.js",
      "import": "/webgpu-os/shell/desktop/windowActions.js",
      "sourceHash": "ff92d70212935451f682e9abf1f0fbcc6e104a77e36344f2958b003732f07859",
      "summary": "",
      "exports": [
        {
          "name": "bindViewportReclamp",
          "kind": "function",
          "signature": "bindViewportReclamp(desktop)",
          "summary": ""
        },
        {
          "name": "unbindViewportReclamp",
          "kind": "function",
          "signature": "unbindViewportReclamp(desktop)",
          "summary": ""
        },
        {
          "name": "minimizePanel",
          "kind": "function",
          "signature": "minimizePanel(desktop, appId)",
          "summary": ""
        },
        {
          "name": "restorePanel",
          "kind": "function",
          "signature": "restorePanel(desktop, appId)",
          "summary": ""
        },
        {
          "name": "focusPanel",
          "kind": "function",
          "signature": "focusPanel(desktop, appId)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/gpu-ui/GPUTextRenderer",
      "path": "webgpu-os/reference/shell/gpu-ui/GPUTextRenderer.md",
      "source": "webgpu-os/shell/gpu-ui/GPUTextRenderer.js",
      "import": "/webgpu-os/shell/gpu-ui/GPUTextRenderer.js",
      "sourceHash": "c6ddd7ab2ecd267a78812eaa857bcc8f7f37488b116bfb55dd81ee1c00a9490c",
      "summary": "GPUTextRenderer.js — Level-4 GPU-native text. The browser gives us no GPU text primitive, so we rasterize each glyph ONCE with Canvas2D (white on transparent) and pack it into the engine's VGPUTextureAtlas. Drawing a string then becomes a run of tinted textured quads sampled from that atlas — fully GPU-composited, no DOM. Glyphs are cached per (sizePx, weight, char). Whitespace stores advance-only (no atlas region). Coordinates are CSS pixels, top-left origin, matching the compositor's quad space.",
      "exports": [
        {
          "name": "GPUTextRenderer",
          "kind": "class",
          "signature": "class GPUTextRenderer",
          "summary": "GPUTextRenderer.js — Level-4 GPU-native text. The browser gives us no GPU text primitive, so we rasterize each glyph ONCE with Canvas2D (white on transparent) and pack it into the engine's VGPUTextureAtlas. Drawing a string then becomes a run of tinted textured quads sampled from that atlas — fully GPU-composited, no DOM. Glyphs are cached per (sizePx, weight, char). Whitespace stores advance-only (no atlas region). Coordinates are CSS pixels, top-left origin, matching the compositor's quad space."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/gpu-ui/GPUUICompositor",
      "path": "webgpu-os/reference/shell/gpu-ui/GPUUICompositor.md",
      "source": "webgpu-os/shell/gpu-ui/GPUUICompositor.js",
      "import": "/webgpu-os/shell/gpu-ui/GPUUICompositor.js",
      "sourceHash": "bb60cd3846e42dcd05d518e91164150eb159306f69676d029e25b7399b271d48",
      "summary": "GPUUICompositor.js — Level-4 GPU-native UI compositor (3D by default). Renders the desktop's windows as tinted textured quads in a real perspective scene on a full-screen WebGPU canvas. There is NO DOM in this path: text is rasterized into a glyph atlas (GPUTextRenderer) and everything — window surfaces, titlebars, glyphs — is one unified quad primitive. Camera: a perspective camera placed on +Z at d = (vpH/2)/tan(fov/2) so the z=0 plane maps 1:1 to CSS pixels. A window at z=0 with no tilt is therefore pixel-perfect and fully usable, yet it's a genuine 3D quad — depth (z) and tilt are first-class, focused windows come forward, and a subtle pointer parallax sells the 3D space. Coordinate spaces: - window-local px: origin top-left, +x right, +y down (what widgets author) - world units == CSS px, origin = viewport center, +Y up, desktop on z=0 - per-window model matrix maps local px → world (bakes centering + Y-flip) Transparency uses painter's order (windows sorted far→near, widgets in emit order) so there is no depth buffer and no coplanar z-fighting. Engine tech reused (no duplication): VirtualGPU (isolated instance), VGPUTextureAtlas (glyph/solid atlas), engine/core/math (camera + unproject).",
      "exports": [
        {
          "name": "GPUUICompositor",
          "kind": "class",
          "signature": "class GPUUICompositor",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/gpu-ui/GPUWindow",
      "path": "webgpu-os/reference/shell/gpu-ui/GPUWindow.md",
      "source": "webgpu-os/shell/gpu-ui/GPUWindow.js",
      "import": "/webgpu-os/shell/gpu-ui/GPUWindow.js",
      "sourceHash": "36c81fe141caae9f4992279385f2c9beb8c70987f95dc19c7a764de7528a167c",
      "summary": "GPUWindow.js — a GPU-native window for the Level-4 3D UI. The window is authored entirely in LOCAL pixel space (origin = top-left, +x right, +y down) and emits tinted atlas quads through the compositor's sink. It knows nothing about the camera: the compositor builds a per-window model matrix from this window's desktop-space rect + 3D placement (z/tilt) and applies the shared viewProj. This keeps widgets camera-agnostic so the same window is pixel-perfect head-on (z=0) or tilted in the immersive spread. Hit-testing is done in local space (compositor unprojects the pointer ray onto the window plane, then asks the window what was hit).",
      "exports": [
        {
          "name": "GPUWindow",
          "kind": "class",
          "signature": "class GPUWindow",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/gpu-ui/GPUWindowCapture",
      "path": "webgpu-os/reference/shell/gpu-ui/GPUWindowCapture.md",
      "source": "webgpu-os/shell/gpu-ui/GPUWindowCapture.js",
      "import": "/webgpu-os/shell/gpu-ui/GPUWindowCapture.js",
      "sourceHash": "5625f7d4aaf3b332597674425fc4d9398784a135d0e306ec818524dd068121e7",
      "summary": "GPUWindowCapture.js — live per-window content via the Element Capture API. Chrome 132+ lets us restrict a getDisplayMedia track to a single DOM element (RestrictionTarget + track.restrictTo), yielding a live MediaStream of just that element's rendered subtree (no occlusion / \"hall of mirrors\"). We take ONE getDisplayMedia('this tab') stream, clone its track per window, restrict each clone to that app's panel element, and feed a hidden <video>. The GPU compositor then copyExternalImageToTexture()s each video frame into the window's content-atlas region every frame → fully live GPU windows. Requirements (per spec) on each captured element: it must form a stacking context (isolation:isolate) and be flattened (transform-style:flat) with an opaque background. Desktop applies these before attaching. Gracefully unsupported on non-Chromium / older builds (supported=false) so callers fall back to extension snapshot, then native chrome.",
      "exports": [
        {
          "name": "GPUWindowCapture",
          "kind": "class",
          "signature": "class GPUWindowCapture",
          "summary": "GPUWindowCapture.js — live per-window content via the Element Capture API. Chrome 132+ lets us restrict a getDisplayMedia track to a single DOM element (RestrictionTarget + track.restrictTo), yielding a live MediaStream of just that element's rendered subtree (no occlusion / \"hall of mirrors\"). We take ONE getDisplayMedia('this tab') stream, clone its track per window, restrict each clone to that app's panel element, and feed a hidden <video>. The GPU compositor then copyExternalImageToTexture()s each video frame into the window's content-atlas region every frame → fully live GPU windows. Requirements (per spec) on each captured element: it must form a stacking context (isolation:isolate) and be flattened (transform-style:flat) with an opaque background. Desktop applies these before attaching. Gracefully unsupported on non-Chromium / older builds (supported=false) so callers fall back to extension snapshot, then native chrome."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/immersive/Immersive3DCompositor",
      "path": "webgpu-os/reference/shell/immersive/Immersive3DCompositor.md",
      "source": "webgpu-os/shell/immersive/Immersive3DCompositor.js",
      "import": "/webgpu-os/shell/immersive/Immersive3DCompositor.js",
      "sourceHash": "99e02390496926758ed81f97da9676df92e42a1ff4c0ed95a7c1eef442a86717",
      "summary": "Immersive3DCompositor.js — Level-3 GPU compositor (Exposé-style 3D desktop). Captures every live DOM panel to a GPU texture (via PanelCapture), then renders each as a textured quad in a perspective 3D scene on a full-screen WebGPU overlay canvas. ALL matrix/camera math comes from the engine's direct-named shader-math library (engine/core/math) — we only add the WebGPU plumbing and the DOM→bitmap bridge the browser doesn't provide. Coordinate system (pixel-perfect at immersion=0): - World units == CSS pixels. Origin at viewport center, +Y up, desktop on z=0. - Camera sits on +Z at distance d = (vpH/2)/tan(fov/2) so the z=0 plane fills the viewport exactly. A panel quad at z=0 therefore maps 1:1 to its DOM rect. - immersion ∈ [0,1] pushes panels apart in Z by stacking order and adds a gentle mouse-driven camera yaw/pitch for parallax — the \"3D world\" feel. Lifecycle: const c = new Immersive3DCompositor({ device, getPanels }); c.mount();                 // create overlay canvas + pipeline await c.enter();           // capture panels, hide DOM, animate in await c.exit(panelId?);    // animate out, restore DOM (focus panelId if given) c.unmount();               // full teardown Engine math used: mat4Identity, mat4Translate, mat4Scale, mat4Multiply, mat4LookAt, mat4PerspectiveDegWebGPU.",
      "exports": [
        {
          "name": "Immersive3DCompositor",
          "kind": "class",
          "signature": "class Immersive3DCompositor",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/immersive/PanelCapture",
      "path": "webgpu-os/reference/shell/immersive/PanelCapture.md",
      "source": "webgpu-os/shell/immersive/PanelCapture.js",
      "import": "/webgpu-os/shell/immersive/PanelCapture.js",
      "sourceHash": "cc2375642716792ee169ce22d73849d6ca225b814efcb65d53bfd4e0b9e296ba",
      "summary": "⚠️ SUPERSEDED for GPU use. The bitmaps this produces are PERMANENTLY cross-origin-tainted (SVG <foreignObject> rule) and are REJECTED by `copyExternalImageToTexture`. The immersive compositor now captures the viewport via the extension bridge (chrome.tabs.captureVisibleTab → Desktop._captureViewport), which yields untainted, GPU-uploadable pixels. This file is kept only for display-only canvas uses (which tolerate taint). PanelCapture.js — live DOM element → ImageBitmap via SVG foreignObject. Everything else in the immersive compositor (3D quads, perspective camera, texture upload) is done with the engine's shader-math + WebGPU stack. But the browser provides no API to turn an arbitrary <div> (text + Plauna widgets) into pixels — `createImageBitmap` only accepts <img>/<canvas>/<video>/Blob. The zero-dependency route is SVG <foreignObject>: clone the element, inline its computed styles (a standalone SVG blob has no access to the page's stylesheets), serialize to XHTML, wrap in an SVG, rasterize through an <img>, then `createImageBitmap`. The resulting bitmap is uploaded by the engine's TextureManager (`copyExternalImageToTexture`). Known limitations (inherent to foreignObject, documented for callers): - <canvas>/<video> children don't serialize (their live pixels are lost). - Cross-origin images taint and are skipped by the browser. - `backdrop-filter` is not honored inside foreignObject. - Custom web fonts must already be loaded (we don't embed font files). Usage: const cap = new PanelCapture(); const bitmap = await cap.capture(panel.element, { scale: devicePixelRatio }); // → upload bitmap via engine TextureManager._uploadBitmap(bitmap, label) bitmap.close();",
      "exports": [
        {
          "name": "PanelCapture",
          "kind": "class",
          "signature": "class PanelCapture",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/overlay/AIOverlay",
      "path": "webgpu-os/reference/shell/overlay/AIOverlay.md",
      "source": "webgpu-os/shell/overlay/AIOverlay.js",
      "import": "/webgpu-os/shell/overlay/AIOverlay.js",
      "sourceHash": "dfc863e6be9d029e4a62d0bf693ff499060c7178d3107999ad57d7d2efdbe818",
      "summary": "AIOverlay.js — shell-owned approval and elicitation popup. The surface is hidden unless the shared ElicitationManager has a pending request. It deliberately has no ambient bar, chat console, task browser, or timeline. Approval notes are bound to the exact request and elicitation and recorded before the resumed task can observe the decision promise.",
      "exports": [
        {
          "name": "AIOverlay",
          "kind": "class",
          "signature": "class AIOverlay",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/overlay/AdaptationReviewPolicy",
      "path": "webgpu-os/reference/shell/overlay/AdaptationReviewPolicy.md",
      "source": "webgpu-os/shell/overlay/AdaptationReviewPolicy.js",
      "import": "/webgpu-os/shell/overlay/AdaptationReviewPolicy.js",
      "sourceHash": "0a759c8c7e538967f38292c92715ea4170c68268a370dd21f63e6a1b444c85e0",
      "summary": "The shell gives adaptation reviews distinct trusted UI only when the request is the exact AI Echo operation. Caller-controlled schema labels alone are never enough to obtain privileged wording or non-blocking decision behavior.",
      "exports": [
        {
          "name": "isTrustedAdaptationReview",
          "kind": "function",
          "signature": "isTrustedAdaptationReview(elicitation = {})",
          "summary": "The shell gives adaptation reviews distinct trusted UI only when the request is the exact AI Echo operation. Caller-controlled schema labels alone are never enough to obtain privileged wording or non-blocking decision behavior."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/overlay/ApprovalCard",
      "path": "webgpu-os/reference/shell/overlay/ApprovalCard.md",
      "source": "webgpu-os/shell/overlay/ApprovalCard.js",
      "import": "/webgpu-os/shell/overlay/ApprovalCard.js",
      "sourceHash": "7655cf6b5d6884edff3083c89af8e3f3bc9a766273a0548a0571ff7534b72aab",
      "summary": "ApprovalCard.js — overlay card for a pending AI tool-call approval. Driven through the SAME ElicitationManager as questions (an approval is a boolean elicitation whose schema carries { kind:'approval', toolName, params, risk }) — no parallel approval queue. Parameters are shown through ParameterPreviewer (Phase 5) so secrets are masked before they ever hit the DOM.",
      "exports": [
        {
          "name": "createApprovalCard",
          "kind": "function",
          "signature": "createApprovalCard(elicitation, { onApprove, onDeny })",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/overlay/ElicitationCard",
      "path": "webgpu-os/reference/shell/overlay/ElicitationCard.md",
      "source": "webgpu-os/shell/overlay/ElicitationCard.js",
      "import": "/webgpu-os/shell/overlay/ElicitationCard.js",
      "sourceHash": "a1160fee216370a10789fed1dceb4a720d4364078448965669ff4394080aa822",
      "summary": "ElicitationCard.js — overlay card for a mid-task AI question to the user (Phase 4 ElicitationManager). Renders a text input, or buttons when the schema declares an enum of options. Answer → respond(); dismiss → decline().",
      "exports": [
        {
          "name": "taskCheckpointChoices",
          "kind": "function",
          "signature": "taskCheckpointChoices(schema)",
          "summary": "Validate the kernel-owned checkpoint envelope before exposing choices. The UI does not infer choices or authority from prompts. It only renders the exact bounded values supplied by the active task elicitation."
        },
        {
          "name": "createElicitationCard",
          "kind": "function",
          "signature": "createElicitationCard(elicitation, { onRespond, onDecline })",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/actions",
      "path": "webgpu-os/reference/shell/start-menu/actions.md",
      "source": "webgpu-os/shell/start-menu/actions.js",
      "import": "/webgpu-os/shell/start-menu/actions.js",
      "sourceHash": "9ac38f01ef11e0056770f914cae4bbcb4720982ff22da5987c7ed20e3a01fb6d",
      "summary": "",
      "exports": [
        {
          "name": "makeDraggable",
          "kind": "function",
          "signature": "makeDraggable(menu, node, app)",
          "summary": ""
        },
        {
          "name": "launchApp",
          "kind": "function",
          "signature": "launchApp(menu, app)",
          "summary": ""
        },
        {
          "name": "addToDesktop",
          "kind": "function",
          "signature": "addToDesktop(menu, appId)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/apps",
      "path": "webgpu-os/reference/shell/start-menu/apps.md",
      "source": "webgpu-os/shell/start-menu/apps.js",
      "import": "/webgpu-os/shell/start-menu/apps.js",
      "sourceHash": "8fe077a1ddea62f8145c5b94b96637446b0009f40645ffbf977ffe423ddcc42d",
      "summary": "",
      "exports": [
        {
          "name": "visibleApps",
          "kind": "function",
          "signature": "visibleApps()",
          "summary": ""
        },
        {
          "name": "searchApps",
          "kind": "function",
          "signature": "searchApps(query)",
          "summary": ""
        },
        {
          "name": "groupAppsByCategory",
          "kind": "function",
          "signature": "groupAppsByCategory(apps)",
          "summary": ""
        },
        {
          "name": "categoryLabel",
          "kind": "function",
          "signature": "categoryLabel(category)",
          "summary": ""
        },
        {
          "name": "categoryIcon",
          "kind": "function",
          "signature": "categoryIcon(category)",
          "summary": ""
        },
        {
          "name": "appMap",
          "kind": "function",
          "signature": "appMap(apps)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/constants",
      "path": "webgpu-os/reference/shell/start-menu/constants.md",
      "source": "webgpu-os/shell/start-menu/constants.js",
      "import": "/webgpu-os/shell/start-menu/constants.js",
      "sourceHash": "6e2e924a8f0fd8022b1e0cad6eaa851e2c99613581d1f8502c9228002025f320",
      "summary": "",
      "exports": [
        {
          "name": "SYSTEM_CATEGORIES",
          "kind": "constant",
          "signature": "SYSTEM_CATEGORIES",
          "summary": ""
        },
        {
          "name": "LS_PINNED",
          "kind": "constant",
          "signature": "LS_PINNED",
          "summary": ""
        },
        {
          "name": "LS_RECENT",
          "kind": "constant",
          "signature": "LS_RECENT",
          "summary": ""
        },
        {
          "name": "LS_COLLAPSED",
          "kind": "constant",
          "signature": "LS_COLLAPSED",
          "summary": ""
        },
        {
          "name": "LS_STATE",
          "kind": "constant",
          "signature": "LS_STATE",
          "summary": ""
        },
        {
          "name": "MAX_RECENT",
          "kind": "constant",
          "signature": "MAX_RECENT",
          "summary": ""
        },
        {
          "name": "DEFAULT_PINNED",
          "kind": "constant",
          "signature": "DEFAULT_PINNED",
          "summary": ""
        },
        {
          "name": "CATEGORY_META",
          "kind": "constant",
          "signature": "CATEGORY_META",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/contextMenu",
      "path": "webgpu-os/reference/shell/start-menu/contextMenu.md",
      "source": "webgpu-os/shell/start-menu/contextMenu.js",
      "import": "/webgpu-os/shell/start-menu/contextMenu.js",
      "sourceHash": "b619d903c48448de9205eea81414106b9769fc31f166c9476ae2007843271678",
      "summary": "",
      "exports": [
        {
          "name": "showContextMenu",
          "kind": "function",
          "signature": "showContextMenu(menu, event, app)",
          "summary": ""
        },
        {
          "name": "dismissContextMenu",
          "kind": "function",
          "signature": "dismissContextMenu(menu)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/dom",
      "path": "webgpu-os/reference/shell/start-menu/dom.md",
      "source": "webgpu-os/shell/start-menu/dom.js",
      "import": "/webgpu-os/shell/start-menu/dom.js",
      "sourceHash": "bbe2cc265d6c372df8dadc154ed45796541762e3759e16ff54dd8b44f5216780",
      "summary": "",
      "exports": [
        {
          "name": "el",
          "kind": "function",
          "signature": "el(tag, options = {}, children = [])",
          "summary": ""
        },
        {
          "name": "append",
          "kind": "function",
          "signature": "append(parent, children = [])",
          "summary": ""
        },
        {
          "name": "clear",
          "kind": "function",
          "signature": "clear(node)",
          "summary": ""
        },
        {
          "name": "sectionTitle",
          "kind": "function",
          "signature": "sectionTitle(label, action = null)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/state",
      "path": "webgpu-os/reference/shell/start-menu/state.md",
      "source": "webgpu-os/shell/start-menu/state.js",
      "import": "/webgpu-os/shell/start-menu/state.js",
      "sourceHash": "cf41f9c77cb56645e091a40ba33fd871be529814ab70846e307c0fe5eacb7d5a",
      "summary": "",
      "exports": [
        {
          "name": "loadPinned",
          "kind": "function",
          "signature": "loadPinned()",
          "summary": ""
        },
        {
          "name": "savePinned",
          "kind": "function",
          "signature": "savePinned(pinned)",
          "summary": ""
        },
        {
          "name": "loadRecent",
          "kind": "function",
          "signature": "loadRecent()",
          "summary": ""
        },
        {
          "name": "saveRecent",
          "kind": "function",
          "signature": "saveRecent(recent)",
          "summary": ""
        },
        {
          "name": "loadCollapsed",
          "kind": "function",
          "signature": "loadCollapsed()",
          "summary": ""
        },
        {
          "name": "saveCollapsed",
          "kind": "function",
          "signature": "saveCollapsed(collapsed)",
          "summary": ""
        },
        {
          "name": "trackRecent",
          "kind": "function",
          "signature": "trackRecent(recent, appId)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/vfsPins",
      "path": "webgpu-os/reference/shell/start-menu/vfsPins.md",
      "source": "webgpu-os/shell/start-menu/vfsPins.js",
      "import": "/webgpu-os/shell/start-menu/vfsPins.js",
      "sourceHash": "893570936613250079e791aad219976baa0312c18576f75b4bbf8d4a765cc656",
      "summary": "",
      "exports": [
        {
          "name": "writePinFile",
          "kind": "function",
          "signature": "writePinFile(menu, appId)",
          "summary": ""
        },
        {
          "name": "deletePinFile",
          "kind": "function",
          "signature": "deletePinFile(menu, appId)",
          "summary": ""
        },
        {
          "name": "initVFSPins",
          "kind": "function",
          "signature": "async initVFSPins(menu)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/start-menu/views",
      "path": "webgpu-os/reference/shell/start-menu/views.md",
      "source": "webgpu-os/shell/start-menu/views.js",
      "import": "/webgpu-os/shell/start-menu/views.js",
      "sourceHash": "559db81bee5b6bc48bb528afb076631f75a89f76ee51318ea572beb7626ea147",
      "summary": "",
      "exports": [
        {
          "name": "buildShell",
          "kind": "function",
          "signature": "buildShell(menu)",
          "summary": ""
        },
        {
          "name": "renderAll",
          "kind": "function",
          "signature": "renderAll(menu)",
          "summary": ""
        },
        {
          "name": "renderSearch",
          "kind": "function",
          "signature": "renderSearch(menu, query)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/taskbar/appButtons",
      "path": "webgpu-os/reference/shell/taskbar/appButtons.md",
      "source": "webgpu-os/shell/taskbar/appButtons.js",
      "import": "/webgpu-os/shell/taskbar/appButtons.js",
      "sourceHash": "beacc8e69e28926a2293c6b92d5d033851e0f4e93df5b5cc0c16f5a3cd160a89",
      "summary": "",
      "exports": [
        {
          "name": "mountAppsArea",
          "kind": "function",
          "signature": "mountAppsArea(taskbar)",
          "summary": ""
        },
        {
          "name": "bindProcessButtons",
          "kind": "function",
          "signature": "bindProcessButtons(taskbar)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/taskbar/devBadge",
      "path": "webgpu-os/reference/shell/taskbar/devBadge.md",
      "source": "webgpu-os/shell/taskbar/devBadge.js",
      "import": "/webgpu-os/shell/taskbar/devBadge.js",
      "sourceHash": "b22401d6d5428ab3b6c8cb2557e163ec196420d2ffb04a10d417897848397cc0",
      "summary": "",
      "exports": [
        {
          "name": "mountDevBadge",
          "kind": "function",
          "signature": "mountDevBadge(taskbar)",
          "summary": ""
        },
        {
          "name": "bindModeBadge",
          "kind": "function",
          "signature": "bindModeBadge(taskbar)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/taskbar/showDesktop",
      "path": "webgpu-os/reference/shell/taskbar/showDesktop.md",
      "source": "webgpu-os/shell/taskbar/showDesktop.js",
      "import": "/webgpu-os/shell/taskbar/showDesktop.js",
      "sourceHash": "c4e391bd0a7f320aa16d0ec3efc7d5df3ae52b1acf7ad2bd852429e05c21d0aa",
      "summary": "showDesktop.js — the far-right \"Show desktop\" sliver (Windows-style). Click once to minimize every open window; click again to restore the same set. Mirrors the Win+D peek/minimize-all corner button. We track which panels are currently minimized via the kernel's panel events so the toggle stays correct even as the user opens/closes/minimizes windows manually.",
      "exports": [
        {
          "name": "mountShowDesktop",
          "kind": "function",
          "signature": "mountShowDesktop(taskbar)",
          "summary": "showDesktop.js — the far-right \"Show desktop\" sliver (Windows-style). Click once to minimize every open window; click again to restore the same set. Mirrors the Win+D peek/minimize-all corner button. We track which panels are currently minimized via the kernel's panel events so the toggle stays correct even as the user opens/closes/minimizes windows manually."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/taskbar/startButton",
      "path": "webgpu-os/reference/shell/taskbar/startButton.md",
      "source": "webgpu-os/shell/taskbar/startButton.js",
      "import": "/webgpu-os/shell/taskbar/startButton.js",
      "sourceHash": "52ef8b3e9536c365149508f9b1728e17638e0bd2565ed59e2bf240e7f56ace00",
      "summary": "",
      "exports": [
        {
          "name": "mountStartButton",
          "kind": "function",
          "signature": "mountStartButton(taskbar)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/tray/system-tray",
      "path": "webgpu-os/reference/shell/tray/system-tray.md",
      "source": "webgpu-os/shell/tray/system-tray.js",
      "import": "/webgpu-os/shell/tray/system-tray.js",
      "sourceHash": "2dcdde0cf1321cc55e777976b3aa71167ec5904804e3a731697c82a85f3c2e6b",
      "summary": "system-tray.js — the notification-area icon strip. Renders app-registered status icons (kernel.tray) inline, collapsing extras into an overflow popup (the \"^\" chevron) just like Windows' notification area. Left click runs the icon's onClick; right click opens its menu (if any). createSystemTray(kernel) -> { el, dispose }",
      "exports": [
        {
          "name": "createSystemTray",
          "kind": "function",
          "signature": "createSystemTray(kernel)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "shell/tray/tray-widgets",
      "path": "webgpu-os/reference/shell/tray/tray-widgets.md",
      "source": "webgpu-os/shell/tray/tray-widgets.js",
      "import": "/webgpu-os/shell/tray/tray-widgets.js",
      "sourceHash": "eff19e1baa740084383017ff63a7e91f8ed911f5c49da0cdcc3317901d2b6562",
      "summary": "tray-widgets.js — stateless builders for the status-tray DOM widgets. Un-nested from StatusTray so the tray class stays a thin orchestrator. Each factory returns plain DOM (plus refs where the tray needs to update them); none of them hold tray state.",
      "exports": [
        {
          "name": "makeStatPill",
          "kind": "function",
          "signature": "makeStatPill(modClass = '')",
          "summary": "Stat pill with a status dot + text (used for GPU / FPS readouts)."
        },
        {
          "name": "makeIconButton",
          "kind": "function",
          "signature": "makeIconButton(icon, tooltip, onClick)",
          "summary": "Square icon button (search / quick-settings / bell)."
        },
        {
          "name": "makeBellButton",
          "kind": "function",
          "signature": "makeBellButton(onClick)",
          "summary": "Bell button with an unread badge. Returns { wrap, badge, setCount }."
        },
        {
          "name": "makeClockButton",
          "kind": "function",
          "signature": "makeClockButton(onClick)",
          "summary": "Clock button (time + date stacked). Returns { btn, tick, dispose }. `tick()` refreshes the displayed time; `dispose()` clears its interval."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/AppDataReadbackService",
      "path": "webgpu-os/reference/storage/AppDataReadbackService.md",
      "source": "webgpu-os/storage/AppDataReadbackService.js",
      "import": "/webgpu-os/storage/AppDataReadbackService.js",
      "sourceHash": "2d6dd72e6b161e1a308c4fc9de95a08d01994b87974de6ca0d3b833fa11f60a4",
      "summary": "OS-wide catalog and encrypted readback coordinator for durable app data.",
      "exports": [
        {
          "name": "AppDataReadbackService",
          "kind": "class",
          "signature": "class AppDataReadbackService",
          "summary": ""
        },
        {
          "name": "APP_CANONICAL_DATA_PATHS",
          "kind": "re-export",
          "signature": "APP_CANONICAL_DATA_PATHS",
          "summary": ""
        },
        {
          "name": "APP_WORKSPACE_OUTPUT_CONTRACTS",
          "kind": "re-export",
          "signature": "APP_WORKSPACE_OUTPUT_CONTRACTS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/AppSandbox",
      "path": "webgpu-os/reference/storage/AppSandbox.md",
      "source": "webgpu-os/storage/AppSandbox.js",
      "import": "/webgpu-os/storage/AppSandbox.js",
      "sourceHash": "4e4d7905668caaef3eb9a06c2e578a1d3ea52a51cb296a8799b97faa19bcbdc5",
      "summary": "AppSandbox.js — Per-app isolated, AES-256-GCM encrypted IndexedDB storage. Each app runs in its own IndexedDB database:  os.sandbox.<appId> completely separate from the kernel database (os.kernel). ── Isolation guarantees ───────────────────────────────────────────────────── • Different IDB database per app  → app A can never query app B's IDB. • AES-256-GCM encryption at rest → even if raw IDB is accessed directly, values are unreadable without the derived key. • Key is PBKDF2-derived from: OS fingerprint (ECDSA public key hash) + appId → keys are device-bound AND app-bound; exporting the raw IDB to another OS instance or another appId produces only garbage. ── API ────────────────────────────────────────────────────────────────────── const sb = new AppSandbox('os.calculator', cryptoDriver); await sb.init(); await sb.set('lastResult', 42);       // encrypt + store const v = await sb.get('lastResult'); // decrypt + return (null if missing) const keys = await sb.list();         // returns key names (not values) await sb.delete('lastResult'); await sb.clear();                     // wipe all of this app's data const info = sb.info();               // { appId, dbName, encrypted: true } ── Syscall surface (apps see syscalls.sandbox.*) ──────────────────────────── Created by createSandboxSyscalls(sandbox) exported below. Apps never receive a reference to AppSandbox directly.",
      "exports": [
        {
          "name": "AppSandbox",
          "kind": "class",
          "signature": "class AppSandbox",
          "summary": ""
        },
        {
          "name": "createSandboxSyscalls",
          "kind": "function",
          "signature": "createSandboxSyscalls(sandbox)",
          "summary": "Wrap an AppSandbox as the `syscalls.sandbox` namespace for an app. Apps receive this — they never get a reference to the AppSandbox itself. Usage in app code: await syscalls.sandbox.set('prefs', { theme: 'dark' }); const p = await syscalls.sandbox.get('prefs'); const keys = await syscalls.sandbox.list(); await syscalls.sandbox.delete('prefs'); await syscalls.sandbox.clear(); const { appId, dbName, encrypted } = syscalls.sandbox.info();"
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/AppSettingsFile",
      "path": "webgpu-os/reference/storage/AppSettingsFile.md",
      "source": "webgpu-os/storage/AppSettingsFile.js",
      "import": "/webgpu-os/storage/AppSettingsFile.js",
      "sourceHash": "9f3d261d05318f03a6f2d7b5e209bbe78c09402fa869d94ebfc5c077ca0faed2",
      "summary": "Shared, Files-visible settings document used by OS apps.",
      "exports": [
        {
          "name": "readAppSettings",
          "kind": "function",
          "signature": "async readAppSettings(syscalls, { migrate = true } = {})",
          "summary": ""
        },
        {
          "name": "writeAppSettings",
          "kind": "function",
          "signature": "async writeAppSettings(syscalls, value)",
          "summary": ""
        },
        {
          "name": "patchAppSetting",
          "kind": "function",
          "signature": "async patchAppSetting(syscalls, appId, value)",
          "summary": ""
        },
        {
          "name": "APP_SETTINGS_PATH",
          "kind": "constant",
          "signature": "APP_SETTINGS_PATH",
          "summary": ""
        },
        {
          "name": "LEGACY_APP_SETTINGS_PATH",
          "kind": "constant",
          "signature": "LEGACY_APP_SETTINGS_PATH",
          "summary": ""
        },
        {
          "name": "APP_SETTINGS_COMPAT_PATH",
          "kind": "constant",
          "signature": "APP_SETTINGS_COMPAT_PATH",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/BoundedTraversal",
      "path": "webgpu-os/reference/storage/BoundedTraversal.md",
      "source": "webgpu-os/storage/BoundedTraversal.js",
      "import": "/webgpu-os/storage/BoundedTraversal.js",
      "sourceHash": "dded79dea8ee206a3eafb802e1263ecc6149372b2f4451b5954b65467cccfee8",
      "summary": "Breadth-first, paged traversal shared by OPFS and mounted folders.",
      "exports": [
        {
          "name": "StorageTraversalLimitError",
          "kind": "class",
          "signature": "class StorageTraversalLimitError extends Error",
          "summary": ""
        },
        {
          "name": "isIgnoredEntry",
          "kind": "function",
          "signature": "isIgnoredEntry(name, rules = [], path = '')",
          "summary": ""
        },
        {
          "name": "walkPaged",
          "kind": "function",
          "signature": "async walkPaged(rootPath, listPage, options = {}, defaultIgnore = [])",
          "summary": "Breadth-first, paged traversal shared by OPFS and mounted folders."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/CacheDriver",
      "path": "webgpu-os/reference/storage/CacheDriver.md",
      "source": "webgpu-os/storage/CacheDriver.js",
      "import": "/webgpu-os/storage/CacheDriver.js",
      "sourceHash": "68ffe67fdd6d04ac92141207ebd5b34c108825787fa7c9a714ea3ee3f70c3331",
      "summary": "CacheDriver.js — Cache API wrapper for rebuildable assets. Used for content that can always be re-downloaded/rebuilt: - CDN assets and web dependencies - Downloaded package chunks (sha256-keyed) - App bundles and compiled shaders - Prefetched update manifests Keys are URLs or opaque cache keys like \"chunk:sha256-abc123\". All methods are async.",
      "exports": [
        {
          "name": "CacheDriver",
          "kind": "class",
          "signature": "class CacheDriver",
          "summary": ""
        },
        {
          "name": "cacheDriver",
          "kind": "constant",
          "signature": "cacheDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/IndexedDBDriver",
      "path": "webgpu-os/reference/storage/IndexedDBDriver.md",
      "source": "webgpu-os/storage/IndexedDBDriver.js",
      "import": "/webgpu-os/storage/IndexedDBDriver.js",
      "sourceHash": "0ca093c65d4c81f9fe4c3600157cba325c1ef237e8f4a2a11dbd3a04100dbfb3",
      "summary": "IndexedDBDriver.js — IndexedDB-backed metadata store. The driver waits for transaction completion, closes connections when another tab upgrades the database, and refuses to reuse such stale connections. Store owners may opt into per-record schema metadata and synchronous migrations; unregistered stores retain their original record shape.",
      "exports": [
        {
          "name": "IndexedDBDriverError",
          "kind": "class",
          "signature": "class IndexedDBDriverError extends Error",
          "summary": ""
        },
        {
          "name": "IndexedDBBlockedError",
          "kind": "class",
          "signature": "class IndexedDBBlockedError extends IndexedDBDriverError",
          "summary": ""
        },
        {
          "name": "IndexedDBStaleConnectionError",
          "kind": "class",
          "signature": "class IndexedDBStaleConnectionError extends IndexedDBDriverError",
          "summary": ""
        },
        {
          "name": "IndexedDBRecordVersionError",
          "kind": "class",
          "signature": "class IndexedDBRecordVersionError extends IndexedDBDriverError",
          "summary": ""
        },
        {
          "name": "IndexedDBDriver",
          "kind": "class",
          "signature": "class IndexedDBDriver",
          "summary": ""
        },
        {
          "name": "INDEXED_DB_RECORD_SCHEMA_KEY",
          "kind": "constant",
          "signature": "INDEXED_DB_RECORD_SCHEMA_KEY",
          "summary": "IndexedDBDriver.js — IndexedDB-backed metadata store. The driver waits for transaction completion, closes connections when another tab upgrades the database, and refuses to reuse such stale connections. Store owners may opt into per-record schema metadata and synchronous migrations; unregistered stores retain their original record shape."
        },
        {
          "name": "idbDriver",
          "kind": "constant",
          "signature": "idbDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/KernelMetadataReadback",
      "path": "webgpu-os/reference/storage/KernelMetadataReadback.md",
      "source": "webgpu-os/storage/KernelMetadataReadback.js",
      "import": "/webgpu-os/storage/KernelMetadataReadback.js",
      "sourceHash": "db96a1943c5714305f2639a353a55d46bf09b772b03958fc2e19d96ea6b21a4c",
      "summary": "Encrypted readback snapshot for the structured `webgpu-os` metadata DB. Non-extractable CryptoKeys and native directory handles are represented by safe descriptors; their browser security boundary is intentionally retained.",
      "exports": [
        {
          "name": "KernelMetadataReadback",
          "kind": "class",
          "signature": "class KernelMetadataReadback",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/LegacyStorageReadback",
      "path": "webgpu-os/reference/storage/LegacyStorageReadback.md",
      "source": "webgpu-os/storage/LegacyStorageReadback.js",
      "import": "/webgpu-os/storage/LegacyStorageReadback.js",
      "sourceHash": "9e167203635999e02ae928cc86c39061bdcd6d8f99bd92d4cd915a2fef4227ca",
      "summary": "LegacyStorageReadback.js — encrypted VFS readback for durable localStorage. Older OS modules still use localStorage directly. Rewriting every caller at once would create migration risk, so this service mirrors the durable keys into an AppSandbox. AppSandbox then publishes one authenticated, device-bound ciphertext container under /user/app-data. Raw names and values never appear in Files. OPFS fallback records and rebuildable caches are deliberately excluded because their authoritative data already lives elsewhere.",
      "exports": [
        {
          "name": "LegacyStorageReadback",
          "kind": "class",
          "signature": "class LegacyStorageReadback",
          "summary": ""
        },
        {
          "name": "LEGACY_STORAGE_READBACK_APP_ID",
          "kind": "constant",
          "signature": "LEGACY_STORAGE_READBACK_APP_ID",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/MountDriver",
      "path": "webgpu-os/reference/storage/MountDriver.md",
      "source": "webgpu-os/storage/MountDriver.js",
      "import": "/webgpu-os/storage/MountDriver.js",
      "sourceHash": "428ff86d6527ab52c2c3a817b4bfe8dee3a1da14bd7d083c8d9d3bba7669b19a",
      "summary": "MountDriver.js — File System Access API driver for user-mounted folders. Manages persistent directory handles for: /mnt/engine    — local engine source folder /mnt/assets    — local asset folder /mnt/projects  — local projects folder /mnt/apps      — local user app folder Directory handles are persisted via IndexedDB (idbDriver) so mounts survive page reloads without re-prompting the user (if permission granted). All read/write methods are async.",
      "exports": [
        {
          "name": "MountDriver",
          "kind": "class",
          "signature": "class MountDriver",
          "summary": ""
        },
        {
          "name": "mountDriver",
          "kind": "constant",
          "signature": "mountDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/MountGraph",
      "path": "webgpu-os/reference/storage/MountGraph.md",
      "source": "webgpu-os/storage/MountGraph.js",
      "import": "/webgpu-os/storage/MountGraph.js",
      "sourceHash": "a365c848a3d262218e4266fbd0046edb1cab047e7dba40be1295f77cc2b38969",
      "summary": "Ordered provider layers with GMod-style read fallthrough and one write layer.",
      "exports": [
        {
          "name": "MountGraph",
          "kind": "class",
          "signature": "class MountGraph",
          "summary": "Ordered provider layers with GMod-style read fallthrough and one write layer."
        },
        {
          "name": "normalizeMountNamespace",
          "kind": "re-export",
          "signature": "normalizeMountNamespace",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/MountRegistry",
      "path": "webgpu-os/reference/storage/MountRegistry.md",
      "source": "webgpu-os/storage/MountRegistry.js",
      "import": "/webgpu-os/storage/MountRegistry.js",
      "sourceHash": "5d69c8ce6a4aeb396a269535ff582e4f2a5381bec346afccbd983cc05cdb26b5",
      "summary": "Case-insensitive registry for provider-neutral mount metadata.",
      "exports": [
        {
          "name": "MountAliasError",
          "kind": "class",
          "signature": "class MountAliasError extends Error",
          "summary": ""
        },
        {
          "name": "MountRegistry",
          "kind": "class",
          "signature": "class MountRegistry",
          "summary": "Case-insensitive registry for provider-neutral mount metadata."
        },
        {
          "name": "validateMountAlias",
          "kind": "function",
          "signature": "validateMountAlias(value)",
          "summary": "Return a portable, single-segment mount alias without changing its case."
        },
        {
          "name": "mountAliasKey",
          "kind": "function",
          "signature": "mountAliasKey(value)",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/OPFSDriver",
      "path": "webgpu-os/reference/storage/OPFSDriver.md",
      "source": "webgpu-os/storage/OPFSDriver.js",
      "import": "/webgpu-os/storage/OPFSDriver.js",
      "sourceHash": "2fcd5ffed126177e1f6c194672322d9185599dce68fa412b1235f00ade871ada",
      "summary": "OPFSDriver.js — Origin-Private File System driver. Uses navigator.storage.getDirectory() to provide a private OS disk that: - survives page reloads and browser restarts - is not subject to the 5 MB localStorage quota - supports byte-level writes and sync access from workers - is not visible or accessible to other origins All methods are async. Paths are POSIX-style: /os/state/foo.json",
      "exports": [
        {
          "name": "OPFSDriver",
          "kind": "class",
          "signature": "class OPFSDriver",
          "summary": "OPFSDriver.js — Origin-Private File System driver. Uses navigator.storage.getDirectory() to provide a private OS disk that: - survives page reloads and browser restarts - is not subject to the 5 MB localStorage quota - supports byte-level writes and sync access from workers - is not visible or accessible to other origins All methods are async. Paths are POSIX-style: /os/state/foo.json"
        },
        {
          "name": "opfsDriver",
          "kind": "constant",
          "signature": "opfsDriver",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/RealmContentStore",
      "path": "webgpu-os/reference/storage/RealmContentStore.md",
      "source": "webgpu-os/storage/RealmContentStore.js",
      "import": "/webgpu-os/storage/RealmContentStore.js",
      "sourceHash": "b629d63a0c467dee3d8fbec60427e2481dfbba70077d898d21b232537fdffd67",
      "summary": "",
      "exports": [
        {
          "name": "RealmContentStore",
          "kind": "class",
          "signature": "class RealmContentStore",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/StorageCoordination",
      "path": "webgpu-os/reference/storage/StorageCoordination.md",
      "source": "webgpu-os/storage/StorageCoordination.js",
      "import": "/webgpu-os/storage/StorageCoordination.js",
      "sourceHash": "d36016ae23ca424c24089b26e306b2919029ee321a26b75eb58ff3f791eebb18",
      "summary": "Same-origin storage coordination shared by tabs and workers. BroadcastChannel keeps observers coherent; Web Locks serializes lifecycle mutations. Both degrade to an in-process queue when unavailable.",
      "exports": [
        {
          "name": "StorageCoordinationUnavailableError",
          "kind": "class",
          "signature": "class StorageCoordinationUnavailableError extends Error",
          "summary": ""
        },
        {
          "name": "StorageCoordination",
          "kind": "class",
          "signature": "class StorageCoordination",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/StorageManager",
      "path": "webgpu-os/reference/storage/StorageManager.md",
      "source": "webgpu-os/storage/StorageManager.js",
      "import": "/webgpu-os/storage/StorageManager.js",
      "sourceHash": "7ed090db6776584e350ab8e0f709e32abdafc0e306d8c38b84df1c966a764351",
      "summary": "StorageManager.js — unified storage facade. Routes filesystem paths to the correct backend: /os/*        → OPFSDriver  (OS internal files, packages, patches, logs) /user/*      → OPFSDriver  (user documents, settings, projects) /run/*       → OPFSDriver  (ephemeral runtime state — cleared on boot) /mnt/*       → MountDriver (user-mounted native folders via FSAA) /cache/*     → CacheDriver (rebuildable assets, package chunks) (other)      → OPFSDriver  (fallback) IndexedDB (idbDriver) is NOT path-routed — it is accessed directly by structured subsystems (PackageManager, PermissionManager, etc.). This is the backend for kernel/VirtualFS.js (which keeps its sync-friendly public API and delegates here for persistence).",
      "exports": [
        {
          "name": "StorageAtomicConflictError",
          "kind": "class",
          "signature": "class StorageAtomicConflictError extends Error",
          "summary": ""
        },
        {
          "name": "StorageAtomicUnsupportedError",
          "kind": "class",
          "signature": "class StorageAtomicUnsupportedError extends Error",
          "summary": ""
        },
        {
          "name": "StorageAtomicOutcomeUnknownError",
          "kind": "class",
          "signature": "class StorageAtomicOutcomeUnknownError extends Error",
          "summary": ""
        },
        {
          "name": "StorageAtomicAbortError",
          "kind": "class",
          "signature": "class StorageAtomicAbortError extends Error",
          "summary": ""
        },
        {
          "name": "StorageQuotaError",
          "kind": "class",
          "signature": "class StorageQuotaError extends Error",
          "summary": ""
        },
        {
          "name": "RecycleBinSafetyError",
          "kind": "class",
          "signature": "class RecycleBinSafetyError extends Error",
          "summary": ""
        },
        {
          "name": "StorageContractError",
          "kind": "class",
          "signature": "class StorageContractError extends Error",
          "summary": ""
        },
        {
          "name": "StorageManager",
          "kind": "class",
          "signature": "class StorageManager",
          "summary": ""
        },
        {
          "name": "storageManager",
          "kind": "constant",
          "signature": "storageManager",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/StorageSafety",
      "path": "webgpu-os/reference/storage/StorageSafety.md",
      "source": "webgpu-os/storage/StorageSafety.js",
      "import": "/webgpu-os/storage/StorageSafety.js",
      "sourceHash": "adfad3adec958fd80996f60d1c1fe2bdc6e0e66b155527534083fa0c7f5e8794",
      "summary": "Browser-file validation and secret detection. Files remain untrusted after validation.",
      "exports": [
        {
          "name": "StorageContentValidationError",
          "kind": "class",
          "signature": "class StorageContentValidationError extends Error",
          "summary": ""
        },
        {
          "name": "detectSecrets",
          "kind": "function",
          "signature": "detectSecrets(value)",
          "summary": ""
        },
        {
          "name": "assertNoSecrets",
          "kind": "function",
          "signature": "assertNoSecrets(value, { path = 'managed file' } = {})",
          "summary": ""
        },
        {
          "name": "validateImportedFile",
          "kind": "function",
          "signature": "async validateImportedFile(blob, name = '')",
          "summary": ""
        },
        {
          "name": "safePreviewBlob",
          "kind": "function",
          "signature": "async safePreviewBlob(blob, name = '')",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/StorageWorker",
      "path": "webgpu-os/reference/storage/StorageWorker.md",
      "source": "webgpu-os/storage/StorageWorker.js",
      "import": "/webgpu-os/storage/StorageWorker.js",
      "sourceHash": "99e145e8981d4ca40e786ddb63749b0ca792b78defb887fab53aa94d6ca53874",
      "summary": "",
      "exports": [],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/StorageWorkerClient",
      "path": "webgpu-os/reference/storage/StorageWorkerClient.md",
      "source": "webgpu-os/storage/StorageWorkerClient.js",
      "import": "/webgpu-os/storage/StorageWorkerClient.js",
      "sourceHash": "bacbf496de14c6e9b1406d1103c75b0edf4607e83ff9755106f7e1c29dabc38a",
      "summary": "",
      "exports": [
        {
          "name": "StorageWorkerUnavailableError",
          "kind": "class",
          "signature": "class StorageWorkerUnavailableError extends Error",
          "summary": ""
        },
        {
          "name": "StorageWorkerClient",
          "kind": "class",
          "signature": "class StorageWorkerClient",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/SystemFS",
      "path": "webgpu-os/reference/storage/SystemFS.md",
      "source": "webgpu-os/storage/SystemFS.js",
      "import": "/webgpu-os/storage/SystemFS.js",
      "sourceHash": "a8b52ffd5bd486a0d76de497987dfe9137d35d5ed7a717a2218b9e36ad04b119",
      "summary": "SystemFS.js — read-only virtual filesystem for the compiled-in OS. The engine, Plauna shell, editor, AGI runtime and the built-in apps are packaged directly into the OS bundle (ES modules compiled into the runtime). They are NOT stored in OPFS or IndexedDB, so they can never be edited, moved, or deleted — they are part of the system image. This driver surfaces them as a browsable, read-only tree mounted at `/system` so the Files app can SHOW where they live and clearly mark them immutable, while user/installed content (OPFS + IndexedDB) stays fully writable. Every entry returned carries `{ system: true, readOnly: true }` so the UI and the StorageManager guards can treat it as immutable. All methods are async to match the other storage drivers.",
      "exports": [
        {
          "name": "SystemFS",
          "kind": "class",
          "signature": "class SystemFS",
          "summary": ""
        },
        {
          "name": "systemFS",
          "kind": "constant",
          "signature": "systemFS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/UserDataPaths",
      "path": "webgpu-os/reference/storage/UserDataPaths.md",
      "source": "webgpu-os/storage/UserDataPaths.js",
      "import": "/webgpu-os/storage/UserDataPaths.js",
      "sourceHash": "1d8f3b1f8c296915663bf6e187ea37cf2956c8b51bb14a712c1c6d4a793ac629",
      "summary": "Canonical user-owned locations shown and managed by the Files app.",
      "exports": [
        {
          "name": "appDataReadbackPath",
          "kind": "function",
          "signature": "appDataReadbackPath(appId)",
          "summary": "Device-bound encrypted readback container for an app-owned sandbox."
        },
        {
          "name": "cleanUserFileName",
          "kind": "function",
          "signature": "cleanUserFileName(value, fallback = 'untitled')",
          "summary": ""
        },
        {
          "name": "joinUserDataPath",
          "kind": "function",
          "signature": "joinUserDataPath(root, ...parts)",
          "summary": ""
        },
        {
          "name": "USER_DATA_PATHS",
          "kind": "constant",
          "signature": "USER_DATA_PATHS",
          "summary": "Canonical user-owned locations shown and managed by the Files app."
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/WorkspaceOutputTerminology",
      "path": "webgpu-os/reference/storage/WorkspaceOutputTerminology.md",
      "source": "webgpu-os/storage/WorkspaceOutputTerminology.js",
      "import": "/webgpu-os/storage/WorkspaceOutputTerminology.js",
      "sourceHash": "62b9d21bf7018360dc46ddbad99f66992672088fe4a029b1181c94dfefd7e619",
      "summary": "Presentation-only terminology for canonical Workspace Output references.",
      "exports": [
        {
          "name": "workspaceOutputPresentation",
          "kind": "function",
          "signature": "workspaceOutputPresentation(entry, outputContracts = [])",
          "summary": "Classify an indexed output for human-facing UI without changing its signed identity or treating a derived index entry as a second copy of the file."
        },
        {
          "name": "workspaceOutputContractPresentation",
          "kind": "function",
          "signature": "workspaceOutputContractPresentation(contract)",
          "summary": "Human-facing catalog projection for settings and Files coverage views."
        },
        {
          "name": "WORKSPACE_OUTPUT_PRESENTATION_TYPE",
          "kind": "constant",
          "signature": "WORKSPACE_OUTPUT_PRESENTATION_TYPE",
          "summary": "Presentation-only terminology for canonical Workspace Output references."
        },
        {
          "name": "ARTIFACT_STUDIO_OUTPUT_PRESENTATION_TYPE",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_OUTPUT_PRESENTATION_TYPE",
          "summary": ""
        },
        {
          "name": "WORKSPACE_OUTPUT_LABEL",
          "kind": "constant",
          "signature": "WORKSPACE_OUTPUT_LABEL",
          "summary": ""
        },
        {
          "name": "ARTIFACT_STUDIO_OUTPUT_LABEL",
          "kind": "constant",
          "signature": "ARTIFACT_STUDIO_OUTPUT_LABEL",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    },
    {
      "schemaVersion": 1,
      "title": "storage/system-docs",
      "path": "webgpu-os/reference/storage/system-docs.md",
      "source": "webgpu-os/storage/system-docs.js",
      "import": "/webgpu-os/storage/system-docs.js",
      "sourceHash": "1b9162d3fce7774a9f69000c9a87b85b217e59cea45f0bb6bf0e8601e58ddda5",
      "summary": "system-docs.js — the \"examples database\" surfaced as the read-only /system tree. Goal: expose HOW to use each part of the compiled-in OS (engine, Plauna shell, editor, AGI runtime, built-in apps) WITHOUT shipping the proprietary source. Every leaf here is a usage/recipe document — it shows the public API and example calls a developer would write, not the implementation. Shape — a recursive node: { icon?:  string,                  // shown in the Files app files?: { '<name>': '<text>' },  // leaf docs (markdown / example text) dirs?:  { '<name>': <node> },    // sub-folders } Notes for authors: - Use 4-space-indented code blocks (NOT triple backticks) so content stays valid inside these template-literal strings. - Only document verified, public API surface (syscalls, app lifecycle, manifest schema, VFS). Keep deep internals conceptual. - This is a database: add files/dirs freely — SystemFS renders them as-is.",
      "exports": [
        {
          "name": "MyGpuApp",
          "kind": "class",
          "signature": "class MyGpuApp",
          "summary": ""
        },
        {
          "name": "HelloApp",
          "kind": "class",
          "signature": "class HelloApp",
          "summary": ""
        },
        {
          "name": "SYSTEM_DOCS",
          "kind": "constant",
          "signature": "SYSTEM_DOCS",
          "summary": ""
        }
      ],
      "subsystem": "webgpu-os"
    }
  ]
}
