@downdraft/engine 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/src/index.ts +10 -0
- package/app/src/renderer/bootstrap.ts +271 -0
- package/app/src/renderer/downdraft-base.css +93 -0
- package/app/src/renderer/feature-log.ts +200 -0
- package/app/src/renderer/game-module.ts +923 -0
- package/app/src/renderer/hooks.ts +88 -0
- package/app/src/renderer/hot-reload.ts +178 -0
- package/app/src/renderer/import-cache.ts +88 -0
- package/app/src/renderer/index.ts +206 -0
- package/app/src/renderer/mcp-harness.ts +144 -0
- package/app/src/renderer/save-store-factory.ts +239 -0
- package/app/src/renderer/sim-bridge.ts +183 -0
- package/app/src/renderer/standard-automation-tools.ts +771 -0
- package/app/src/shared/feature-log.ts +71 -0
- package/app/src/shared/gpu-info.ts +82 -0
- package/app/src/shared/import-cache-store.ts +142 -0
- package/app/src/shared/index.ts +6 -0
- package/app/src/shared/mcp-discovery.ts +47 -0
- package/app/src/shared/mcp-proxy.ts +82 -0
- package/app/src/shared/types.ts +324 -0
- package/asset-bake/src/bake-audio.ts +119 -0
- package/asset-bake/src/bake-gltf.ts +172 -0
- package/asset-bake/src/bake.ts +78 -0
- package/asset-bake/src/cache.ts +188 -0
- package/asset-bake/src/config.ts +186 -0
- package/asset-bake/src/index.ts +36 -0
- package/core/src/animation/animation-event.ts +41 -0
- package/core/src/animation/bone-mask.ts +122 -0
- package/core/src/animation/clip.ts +252 -0
- package/core/src/animation/index.ts +22 -0
- package/core/src/animation/mixamo.ts +113 -0
- package/core/src/animation/morph-target.ts +69 -0
- package/core/src/animation/player.ts +697 -0
- package/core/src/animation/retarget.ts +158 -0
- package/core/src/animation/skeleton-animator.ts +1399 -0
- package/core/src/animation/skeleton.ts +214 -0
- package/core/src/animation/state-machine.ts +280 -0
- package/core/src/assets/blob-store.ts +66 -0
- package/core/src/assets/cache.ts +186 -0
- package/core/src/assets/cubemap-converter.ts +155 -0
- package/core/src/assets/environment-manager.ts +121 -0
- package/core/src/assets/import-cache.ts +65 -0
- package/core/src/assets/import-settings.ts +72 -0
- package/core/src/assets/importer.ts +108 -0
- package/core/src/assets/index.ts +74 -0
- package/core/src/assets/irradiance-generator.ts +198 -0
- package/core/src/assets/loader-audio.ts +86 -0
- package/core/src/assets/loader-cubemap.ts +211 -0
- package/core/src/assets/loader-dds.ts +236 -0
- package/core/src/assets/loader-hdr.ts +474 -0
- package/core/src/assets/loader-mesh.ts +143 -0
- package/core/src/assets/loader-shader.ts +73 -0
- package/core/src/assets/loader-texture.ts +349 -0
- package/core/src/assets/lod.ts +198 -0
- package/core/src/assets/manager.ts +480 -0
- package/core/src/assets/manifest.ts +81 -0
- package/core/src/assets/material-bridge.ts +186 -0
- package/core/src/assets/model-importer.ts +72 -0
- package/core/src/assets/model-normalizer.ts +248 -0
- package/core/src/assets/model-to-gpu.ts +70 -0
- package/core/src/assets/model-to-mesh.ts +237 -0
- package/core/src/assets/prefilter-generator.ts +250 -0
- package/core/src/audio/engine.ts +177 -0
- package/core/src/audio/interface.ts +130 -0
- package/core/src/audio/listener.ts +32 -0
- package/core/src/audio/mixer.ts +141 -0
- package/core/src/audio/registry.ts +52 -0
- package/core/src/audio/sab.ts +87 -0
- package/core/src/audio/source.ts +89 -0
- package/core/src/change-detection/atomics.ts +1 -0
- package/core/src/change-detection/tracker.ts +47 -0
- package/core/src/debug-draw/lines.ts +64 -0
- package/core/src/debug-draw/points.ts +17 -0
- package/core/src/debug-draw/queue.ts +124 -0
- package/core/src/debug-draw/text.ts +25 -0
- package/core/src/ecs/archetype.ts +323 -0
- package/core/src/ecs/component.ts +188 -0
- package/core/src/ecs/entity.ts +25 -0
- package/core/src/ecs/events.ts +93 -0
- package/core/src/ecs/hierarchy.ts +124 -0
- package/core/src/ecs/hmr-swap-registry.ts +22 -0
- package/core/src/ecs/index.ts +25 -0
- package/core/src/ecs/query.ts +141 -0
- package/core/src/ecs/resource.ts +8 -0
- package/core/src/ecs/schedule.ts +181 -0
- package/core/src/ecs/system-params.ts +99 -0
- package/core/src/ecs/system.ts +42 -0
- package/core/src/ecs/world.ts +348 -0
- package/core/src/index.ts +352 -0
- package/core/src/input/context.ts +73 -0
- package/core/src/input/dom-handler.ts +380 -0
- package/core/src/input/local-player-manager.ts +218 -0
- package/core/src/input/mapping.ts +40 -0
- package/core/src/input/multi-sab-bridge.ts +276 -0
- package/core/src/input/multi-state.ts +54 -0
- package/core/src/input/sab-bridge.ts +71 -0
- package/core/src/input/state.ts +132 -0
- package/core/src/input/ui-router.ts +87 -0
- package/core/src/library/host.ts +317 -0
- package/core/src/library/index.ts +16 -0
- package/core/src/library/library.ts +292 -0
- package/core/src/material/compiler.ts +80 -0
- package/core/src/material/graph-bridge.ts +172 -0
- package/core/src/material/index.ts +9 -0
- package/core/src/material/library.ts +442 -0
- package/core/src/material/material.ts +156 -0
- package/core/src/material/variants.ts +61 -0
- package/core/src/math/mat4.ts +202 -0
- package/core/src/math/perlin-noise-2d.ts +77 -0
- package/core/src/math/perlin-noise-3d.ts +110 -0
- package/core/src/math/quat.ts +33 -0
- package/core/src/math/rng.ts +29 -0
- package/core/src/math/trig.ts +47 -0
- package/core/src/math/value-noise.ts +67 -0
- package/core/src/mesh/builder.ts +177 -0
- package/core/src/mesh/csg.ts +312 -0
- package/core/src/mesh/greased-line.ts +145 -0
- package/core/src/mesh/mesh.ts +17 -0
- package/core/src/mesh/parametric.ts +501 -0
- package/core/src/mesh/skinning.ts +67 -0
- package/core/src/mesh/vertex-layout.ts +91 -0
- package/core/src/module/cross-thread.ts +163 -0
- package/core/src/module/diagnostics.ts +123 -0
- package/core/src/module/host.ts +451 -0
- package/core/src/module/index.ts +22 -0
- package/core/src/module/module.ts +109 -0
- package/core/src/module/registry.ts +94 -0
- package/core/src/module/renderer-module.ts +247 -0
- package/core/src/module/ts-loader.ts +26 -0
- package/core/src/particles/compute-pass.ts +378 -0
- package/core/src/particles/emitter.ts +156 -0
- package/core/src/particles/index.ts +11 -0
- package/core/src/particles/particle-data.ts +47 -0
- package/core/src/particles/render-pass.ts +365 -0
- package/core/src/particles/simulator.ts +264 -0
- package/core/src/particles/system.ts +193 -0
- package/core/src/physics/body.ts +59 -0
- package/core/src/physics/ccd-heuristic.ts +55 -0
- package/core/src/physics/character.ts +282 -0
- package/core/src/physics/collider.ts +55 -0
- package/core/src/physics/collision-system.ts +91 -0
- package/core/src/physics/events.ts +133 -0
- package/core/src/physics/index.ts +34 -0
- package/core/src/physics/interface.ts +473 -0
- package/core/src/physics/interpolation-buffer.ts +192 -0
- package/core/src/physics/lifecycle.ts +87 -0
- package/core/src/physics/load-shedder.ts +164 -0
- package/core/src/physics/physics-accumulator.ts +101 -0
- package/core/src/physics/physics-system.ts +240 -0
- package/core/src/physics/ragdoll-presets.ts +272 -0
- package/core/src/physics/ragdoll-system.ts +220 -0
- package/core/src/physics/ragdoll.ts +182 -0
- package/core/src/physics/raycast.ts +143 -0
- package/core/src/physics/realm-manager.ts +499 -0
- package/core/src/physics/realm-worker-pool.ts +191 -0
- package/core/src/physics/realm-worker.ts +102 -0
- package/core/src/physics/realm.ts +189 -0
- package/core/src/physics/registry.ts +52 -0
- package/core/src/physics/safety.ts +247 -0
- package/core/src/physics/snapshot-manager.ts +141 -0
- package/core/src/physics/worker-protocol.ts +30 -0
- package/core/src/platform/bun-preload.ts +169 -0
- package/core/src/platform/css-stub.ts +4 -0
- package/core/src/platform/glob-polyfill.ts +124 -0
- package/core/src/platform/hidpi.ts +57 -0
- package/core/src/platform/render-surface.ts +77 -0
- package/core/src/platform/rpc.ts +98 -0
- package/core/src/platform/runtime.ts +123 -0
- package/core/src/plugin/context.ts +364 -0
- package/core/src/plugin/diagnostics.ts +61 -0
- package/core/src/plugin/discovery.ts +186 -0
- package/core/src/plugin/extension-loaders.ts +172 -0
- package/core/src/plugin/host.ts +659 -0
- package/core/src/plugin/index.ts +106 -0
- package/core/src/plugin/loader-asset.ts +124 -0
- package/core/src/plugin/loader-quickjs.ts +84 -0
- package/core/src/plugin/loader-wasm.ts +411 -0
- package/core/src/plugin/loader-worker.ts +261 -0
- package/core/src/plugin/manifest.ts +653 -0
- package/core/src/plugin/material-registry.ts +65 -0
- package/core/src/plugin/mcp-tools.ts +165 -0
- package/core/src/plugin/permissions.ts +175 -0
- package/core/src/plugin/quickjs-bridge.ts +294 -0
- package/core/src/plugin/registry.ts +107 -0
- package/core/src/plugin/sandbox-shim.ts +86 -0
- package/core/src/plugin/sandbox-worker.ts +215 -0
- package/core/src/plugin/wasm-abi.ts +152 -0
- package/core/src/plugin/wasm-worker.ts +229 -0
- package/core/src/plugin/workshop.ts +169 -0
- package/core/src/profiling/event-loop.ts +180 -0
- package/core/src/profiling/index.ts +69 -0
- package/core/src/profiling/iops/idb-patch.ts +242 -0
- package/core/src/profiling/iops/opfs-patch.ts +276 -0
- package/core/src/profiling/profiling-sab.ts +839 -0
- package/core/src/profiling/task-latency.ts +134 -0
- package/core/src/profiling/thread-metrics.ts +126 -0
- package/core/src/profiling/trace-event-writer.ts +205 -0
- package/core/src/profiling/warnings.ts +423 -0
- package/core/src/profiling/worker-prelude.ts +376 -0
- package/core/src/render/bind-group.ts +38 -0
- package/core/src/render/bindless/bindless-struct.ts +42 -0
- package/core/src/render/bindless/bindless.wgsl.ts +167 -0
- package/core/src/render/bindless/frame-bindings.ts +176 -0
- package/core/src/render/bindless/index.ts +10 -0
- package/core/src/render/bindless/material-manager.ts +257 -0
- package/core/src/render/bindless/texture-registry.ts +609 -0
- package/core/src/render/buffer.ts +82 -0
- package/core/src/render/camera-2d.ts +217 -0
- package/core/src/render/camera-controller.ts +440 -0
- package/core/src/render/camera.ts +409 -0
- package/core/src/render/canvas-resize-watcher.ts +46 -0
- package/core/src/render/compute-kernel.ts +172 -0
- package/core/src/render/constants.ts +2 -0
- package/core/src/render/device.ts +111 -0
- package/core/src/render/frame-graph.ts +768 -0
- package/core/src/render/frustum.ts +185 -0
- package/core/src/render/fullscreen-vs.ts +25 -0
- package/core/src/render/g-buffer.ts +186 -0
- package/core/src/render/game-renderer.ts +1452 -0
- package/core/src/render/gpu-driven/cull-pass.ts +394 -0
- package/core/src/render/gpu-driven/hzb.ts +215 -0
- package/core/src/render/gpu-driven/index.ts +7 -0
- package/core/src/render/gpu-driven/indirect-draw-pass.ts +324 -0
- package/core/src/render/gpu-driven/instance-buffer.ts +178 -0
- package/core/src/render/gpu-driven/mesh-table.ts +175 -0
- package/core/src/render/gpu-driven/passes/hzb-build-pass.ts +47 -0
- package/core/src/render/gpu-utils.ts +96 -0
- package/core/src/render/hdr.ts +88 -0
- package/core/src/render/hot-reload.ts +295 -0
- package/core/src/render/ibl-bind-group.ts +266 -0
- package/core/src/render/ibl.ts +180 -0
- package/core/src/render/index.ts +163 -0
- package/core/src/render/input-manager.ts +259 -0
- package/core/src/render/lighting/area-light.ts +196 -0
- package/core/src/render/lighting/cluster-grid.ts +288 -0
- package/core/src/render/lighting/cluster-types.ts +193 -0
- package/core/src/render/lighting/ies-parser.ts +162 -0
- package/core/src/render/lighting.ts +454 -0
- package/core/src/render/material-types/depth.wgsl +44 -0
- package/core/src/render/material-types/line.wgsl +50 -0
- package/core/src/render/material-types/matcap.wgsl +51 -0
- package/core/src/render/material-types/normal.wgsl +41 -0
- package/core/src/render/material-types/physical.wgsl +152 -0
- package/core/src/render/material-types/sprite.wgsl +46 -0
- package/core/src/render/material-types/sss.wgsl +79 -0
- package/core/src/render/material-types/toon.wgsl +79 -0
- package/core/src/render/passes/README.md +121 -0
- package/core/src/render/passes/atmosphere.ts +152 -0
- package/core/src/render/passes/cluster-lighting-pass.ts +476 -0
- package/core/src/render/passes/csm.ts +408 -0
- package/core/src/render/passes/cubemap-capture.ts +114 -0
- package/core/src/render/passes/debug-viz.ts +278 -0
- package/core/src/render/passes/debug.ts +538 -0
- package/core/src/render/passes/decal-mesh.ts +111 -0
- package/core/src/render/passes/decal-pass.ts +377 -0
- package/core/src/render/passes/deferred-lighting.ts +434 -0
- package/core/src/render/passes/depth-prepass.ts +163 -0
- package/core/src/render/passes/dome-360.ts +83 -0
- package/core/src/render/passes/fluid-render.ts +137 -0
- package/core/src/render/passes/gi-types.ts +118 -0
- package/core/src/render/passes/graph-compute.ts +300 -0
- package/core/src/render/passes/greased-line-pass.ts +232 -0
- package/core/src/render/passes/morph-target.ts +40 -0
- package/core/src/render/passes/opaque.ts +1028 -0
- package/core/src/render/passes/point-light-shadow.ts +266 -0
- package/core/src/render/passes/procedural-texture.ts +185 -0
- package/core/src/render/passes/reflection-probe.ts +140 -0
- package/core/src/render/passes/rsm-pass.ts +248 -0
- package/core/src/render/passes/sdf-text.ts +155 -0
- package/core/src/render/passes/shadow-map.ts +163 -0
- package/core/src/render/passes/shadow.ts +220 -0
- package/core/src/render/passes/skinning-vs.ts +121 -0
- package/core/src/render/passes/skinning.ts +326 -0
- package/core/src/render/passes/sky-dome.ts +404 -0
- package/core/src/render/passes/skybox.ts +162 -0
- package/core/src/render/passes/spot-light-shadow.ts +273 -0
- package/core/src/render/passes/terrain.ts +326 -0
- package/core/src/render/passes/transparent.ts +353 -0
- package/core/src/render/passes/underwater-fog.ts +185 -0
- package/core/src/render/passes/video-texture.ts +79 -0
- package/core/src/render/passes/volumetric-pass.ts +312 -0
- package/core/src/render/passes/volumetric-types.ts +171 -0
- package/core/src/render/passes/water.ts +753 -0
- package/core/src/render/pbr.ts +296 -0
- package/core/src/render/pipeline.ts +52 -0
- package/core/src/render/render-pass.ts +30 -0
- package/core/src/render/renderer-input-bus.ts +220 -0
- package/core/src/render/renderer-module-host.ts +623 -0
- package/core/src/render/resource-tracker.ts +67 -0
- package/core/src/render/sab-canvas-overlay.ts +122 -0
- package/core/src/render/shader-validator.ts +200 -0
- package/core/src/render/shaders/debug/debug-line.wgsl +27 -0
- package/core/src/render/shaders/debug/debug-point.wgsl +30 -0
- package/core/src/render/shaders/debug/debug-text.wgsl +42 -0
- package/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
- package/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
- package/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
- package/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
- package/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
- package/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
- package/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
- package/core/src/render/shaders/shadow-chunks.ts +135 -0
- package/core/src/render/skybox.ts +146 -0
- package/core/src/render/splitscreen.ts +85 -0
- package/core/src/render/surface.ts +78 -0
- package/core/src/render/tonemap.ts +180 -0
- package/core/src/render/tracked-render-pass.ts +158 -0
- package/core/src/render/viewport.ts +109 -0
- package/core/src/render/wgsl-hmr.ts +70 -0
- package/core/src/sab/core-input-channel.ts +23 -0
- package/core/src/sab/define.ts +239 -0
- package/core/src/sab/errors.ts +76 -0
- package/core/src/sab/game-input.ts +343 -0
- package/core/src/sab/gamepad-devices.ts +259 -0
- package/core/src/sab/grid-buffer.ts +117 -0
- package/core/src/sab/input.ts +55 -0
- package/core/src/sab/layout.ts +219 -0
- package/core/src/sab/multi-input-channel.ts +50 -0
- package/core/src/sab/record-buffer.ts +155 -0
- package/core/src/sab/sab-polyfill.ts +56 -0
- package/core/src/sab/sim-channel.ts +453 -0
- package/core/src/sab/slot-buffer.ts +190 -0
- package/core/src/sab/types.ts +158 -0
- package/core/src/safety/bounds.ts +76 -0
- package/core/src/safety/json.ts +80 -0
- package/core/src/safety/path.ts +167 -0
- package/core/src/save/binary-format.ts +117 -0
- package/core/src/save/game-save-system.ts +161 -0
- package/core/src/save/grid-save-system.ts +158 -0
- package/core/src/save/migrate.ts +44 -0
- package/core/src/save/migration-registry.ts +94 -0
- package/core/src/save/persist-types.ts +208 -0
- package/core/src/save/schema.ts +46 -0
- package/core/src/save/serializer.ts +180 -0
- package/core/src/scene/builder.ts +65 -0
- package/core/src/scene/camera.ts +142 -0
- package/core/src/scene/checkpoint.ts +109 -0
- package/core/src/scene/game-loop.ts +198 -0
- package/core/src/scene/index.ts +24 -0
- package/core/src/scene/layer.ts +6 -0
- package/core/src/scene/prefab.ts +145 -0
- package/core/src/scene/scene-manager.ts +157 -0
- package/core/src/scene/scene.ts +192 -0
- package/core/src/scene/sky.ts +256 -0
- package/core/src/scene/spatial-grid.ts +176 -0
- package/core/src/scene/streaming.ts +304 -0
- package/core/src/scene/vegetation.ts +163 -0
- package/core/src/scene/world.ts +89 -0
- package/core/src/scripting/binding.ts +129 -0
- package/core/src/scripting/hot-reload.ts +144 -0
- package/core/src/scripting/script.ts +99 -0
- package/core/src/sim/hot-reload-pipeline.ts +49 -0
- package/core/src/sim/sim-state-helper.ts +47 -0
- package/core/src/sim/transient-state-registry.ts +77 -0
- package/core/src/sim/types.ts +113 -0
- package/core/src/sim/worker-loop.ts +222 -0
- package/core/src/stores/game-store.ts +158 -0
- package/core/src/stores/hot-reload-store.ts +44 -0
- package/core/src/telemetry/collector.ts +410 -0
- package/core/src/telemetry/gc-controller.ts +453 -0
- package/core/src/telemetry/gc-profiler.ts +126 -0
- package/core/src/telemetry/gc-tracker.ts +69 -0
- package/core/src/telemetry/gpu-profiler.ts +703 -0
- package/core/src/telemetry/gpu-resource-tracker.ts +285 -0
- package/core/src/telemetry/gpu-timer-pool.ts +234 -0
- package/core/src/telemetry/gpu-timer.ts +123 -0
- package/core/src/telemetry/gpu-timestamp-gate.ts +21 -0
- package/core/src/telemetry/reporter.ts +62 -0
- package/core/src/types/engine-types.ts +129 -0
- package/core/src/ui-font-scale.ts +112 -0
- package/core/src/util/broad-phase-grid.ts +82 -0
- package/core/src/util/feature-log.ts +220 -0
- package/core/src/util/index.ts +17 -0
- package/core/src/util/logger.ts +604 -0
- package/core/src/webgpu-destroy-augmentation.d.ts +25 -0
- package/core/src/worker/base-worker-host.ts +183 -0
- package/core/src/worker/buffer-sync.ts +550 -0
- package/core/src/worker/crash-recovery.ts +201 -0
- package/core/src/worker/entity-sim-worker-host.ts +190 -0
- package/core/src/worker/instrumented-worker-host.ts +171 -0
- package/core/src/worker/rpc.ts +253 -0
- package/core/src/worker/sim-worker-base.ts +913 -0
- package/core/src/worker/sim-worker-host.ts +358 -0
- package/core/src/worker/task-pool.ts +256 -0
- package/core/src/worker/task-worker.ts +83 -0
- package/libraries/asset-browser/src/index.ts +11 -0
- package/libraries/asset-browser/src/software-thumbnails.ts +949 -0
- package/libraries/audio-kira/README.md +17 -0
- package/libraries/audio-kira/native/Cargo.toml +14 -0
- package/libraries/audio-kira/native/src/engine.rs +27 -0
- package/libraries/audio-kira/native/src/lib.rs +185 -0
- package/libraries/audio-kira/native/src/mixer.rs +11 -0
- package/libraries/audio-kira/native/src/source.rs +80 -0
- package/libraries/audio-kira/src/backend.ts +469 -0
- package/libraries/audio-kira/src/index.ts +8 -0
- package/libraries/audio-kira/src/library.ts +82 -0
- package/libraries/blitz-ui/native/Cargo.toml +33 -0
- package/libraries/blitz-ui/native/assets/DejaVuSans.woff2 +0 -0
- package/libraries/blitz-ui/native/src/bridge.rs +100 -0
- package/libraries/blitz-ui/native/src/fonts.rs +20 -0
- package/libraries/blitz-ui/native/src/input.rs +80 -0
- package/libraries/blitz-ui/native/src/lib.rs +96 -0
- package/libraries/blitz-ui/native/src/shell.rs +301 -0
- package/libraries/blitz-ui/native-osr/Cargo.toml +24 -0
- package/libraries/blitz-ui/native-osr/src/events.rs +237 -0
- package/libraries/blitz-ui/native-osr/src/lib.rs +846 -0
- package/libraries/blitz-ui/native-osr/src/mutate.rs +385 -0
- package/libraries/blitz-ui/native-osr/src/resources.rs +45 -0
- package/libraries/blitz-ui/native-osr-spike.ts +70 -0
- package/libraries/blitz-ui/src/index.ts +15 -0
- package/libraries/blitz-ui/src/native-module.ts +221 -0
- package/libraries/blitz-ui/src/native-osr-ffi.ts +423 -0
- package/libraries/blitz-ui/src/router.ts +101 -0
- package/libraries/blitz-ui/src/shaders/ui-blit.wgsl.ts +35 -0
- package/libraries/blitz-ui/src/ui-blit-pass.ts +116 -0
- package/libraries/character/README.md +25 -0
- package/libraries/character/src/character-animator.ts +374 -0
- package/libraries/character/src/index.ts +24 -0
- package/libraries/character/src/loader.ts +375 -0
- package/libraries/character/src/locomotion.ts +124 -0
- package/libraries/character/src/preview.ts +287 -0
- package/libraries/devtools/README.md +51 -0
- package/libraries/devtools/native/Cargo.toml +12 -0
- package/libraries/devtools/native/src/lib.rs +1646 -0
- package/libraries/devtools/native/src/panels/console.rs +338 -0
- package/libraries/devtools/native/src/panels/dom_tree.rs +47 -0
- package/libraries/devtools/native/src/panels/generic.rs +317 -0
- package/libraries/devtools/native/src/panels/gpu.rs +107 -0
- package/libraries/devtools/native/src/panels/input.rs +88 -0
- package/libraries/devtools/native/src/panels/mod.rs +154 -0
- package/libraries/devtools/native/src/panels/perf_metrics.rs +91 -0
- package/libraries/devtools/native/src/panels/perf_recorder.rs +158 -0
- package/libraries/devtools/native/src/panels/scene.rs +72 -0
- package/libraries/devtools/native/src/state.rs +394 -0
- package/libraries/devtools/src/cdp-bridge.ts +349 -0
- package/libraries/devtools/src/collectors.ts +346 -0
- package/libraries/devtools/src/egui-ffi.ts +804 -0
- package/libraries/devtools/src/egui-renderer.ts +407 -0
- package/libraries/devtools/src/host.ts +363 -0
- package/libraries/devtools/src/index.ts +40 -0
- package/libraries/devtools/src/mirror.ts +794 -0
- package/libraries/devtools/src/native-providers.ts +744 -0
- package/libraries/devtools/src/verify.ts +167 -0
- package/libraries/devtools/src/web/browser.ts +102 -0
- package/libraries/devtools/src/web/host.ts +212 -0
- package/libraries/devtools/src/web/mirror.ts +430 -0
- package/libraries/devtools/src/web/server.ts +198 -0
- package/libraries/entities/README.md +17 -0
- package/libraries/entities/src/index.ts +4 -0
- package/libraries/entities/src/library.ts +64 -0
- package/libraries/entities/src/model-renderer.ts +1345 -0
- package/libraries/entities/src/shaders/model.wgsl +375 -0
- package/libraries/gamepad/src/feed-input.ts +83 -0
- package/libraries/gamepad/src/filters.ts +49 -0
- package/libraries/gamepad/src/glyphs.ts +93 -0
- package/libraries/gamepad/src/hub.ts +206 -0
- package/libraries/gamepad/src/index.ts +22 -0
- package/libraries/gamepad/src/library.ts +68 -0
- package/libraries/gamepad/src/source-sab.ts +70 -0
- package/libraries/gamepad/src/sysfs-enrich.ts +138 -0
- package/libraries/gaussian-splats/README.md +25 -0
- package/libraries/gaussian-splats/src/gpu-sort.ts +595 -0
- package/libraries/gaussian-splats/src/index.ts +31 -0
- package/libraries/gaussian-splats/src/library.ts +60 -0
- package/libraries/gaussian-splats/src/parser.ts +382 -0
- package/libraries/gaussian-splats/src/renderer.ts +427 -0
- package/libraries/gaussian-splats/src/sh-eval.ts +211 -0
- package/libraries/gaussian-splats/src/sorter.ts +110 -0
- package/libraries/gaussian-splats/src/tile-raster.ts +473 -0
- package/libraries/gpu-kernels/README.md +154 -0
- package/libraries/gpu-kernels/src/index.ts +11 -0
- package/libraries/gpu-kernels/src/kernel.ts +696 -0
- package/libraries/gpu-kernels/src/transpile.ts +958 -0
- package/libraries/html-ui-kit/src/behaviors.ts +250 -0
- package/libraries/html-ui-kit/src/components.ts +309 -0
- package/libraries/html-ui-kit/src/index.ts +30 -0
- package/libraries/html-ui-kit/src/nav/nav-controller.ts +238 -0
- package/libraries/html-ui-kit/src/nav/nav-input.ts +145 -0
- package/libraries/html-ui-kit/src/nav/osk.ts +153 -0
- package/libraries/html-ui-kit/src/nav/router.ts +167 -0
- package/libraries/html-ui-kit/src/nav/vcursor.ts +203 -0
- package/libraries/html-ui-kit/src/ten-foot.ts +182 -0
- package/libraries/html-ui-kit/src/theme.ts +238 -0
- package/libraries/lighting/README.md +20 -0
- package/libraries/lighting/src/index.ts +5 -0
- package/libraries/lighting/src/library.ts +66 -0
- package/libraries/lighting/src/light-system.ts +452 -0
- package/libraries/lighting/src/lighting-system.ts +68 -0
- package/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
- package/libraries/marching-cubes/README.md +25 -0
- package/libraries/marching-cubes/src/chunked-field.ts +177 -0
- package/libraries/marching-cubes/src/deformation.ts +63 -0
- package/libraries/marching-cubes/src/generator.ts +407 -0
- package/libraries/marching-cubes/src/index.ts +32 -0
- package/libraries/marching-cubes/src/library.ts +80 -0
- package/libraries/marching-cubes/src/lod.ts +122 -0
- package/libraries/marching-cubes/src/marching-tetrahedra.ts +252 -0
- package/libraries/marching-cubes/src/sab.ts +45 -0
- package/libraries/marching-cubes/src/streaming-config.ts +48 -0
- package/libraries/marching-cubes/src/streaming-manager.ts +686 -0
- package/libraries/marching-cubes/src/tables.ts +323 -0
- package/libraries/marching-cubes/src/types.ts +18 -0
- package/libraries/models/README.md +25 -0
- package/libraries/models/src/bake-node-transforms.ts +171 -0
- package/libraries/models/src/codecs/basisu-codec.ts +180 -0
- package/libraries/models/src/codecs/draco-codec.ts +372 -0
- package/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
- package/libraries/models/src/codecs/index.ts +22 -0
- package/libraries/models/src/codecs/meshopt-codec.ts +91 -0
- package/libraries/models/src/codecs/registry.ts +221 -0
- package/libraries/models/src/dae.ts +753 -0
- package/libraries/models/src/default-part-selection.ts +56 -0
- package/libraries/models/src/dxf.ts +200 -0
- package/libraries/models/src/fbx/index.ts +457 -0
- package/libraries/models/src/fbx/interpreter/animation.ts +431 -0
- package/libraries/models/src/fbx/interpreter/blend-shapes.ts +323 -0
- package/libraries/models/src/fbx/interpreter/connections.ts +166 -0
- package/libraries/models/src/fbx/interpreter/diagnostics.ts +65 -0
- package/libraries/models/src/fbx/interpreter/geometry.ts +535 -0
- package/libraries/models/src/fbx/interpreter/global-settings.ts +92 -0
- package/libraries/models/src/fbx/interpreter/materials.ts +265 -0
- package/libraries/models/src/fbx/interpreter/nodes.ts +197 -0
- package/libraries/models/src/fbx/interpreter/skeleton.ts +476 -0
- package/libraries/models/src/fbx/parsers/binary-parser.ts +244 -0
- package/libraries/models/src/fbx/types.ts +119 -0
- package/libraries/models/src/gltf-extensions.ts +196 -0
- package/libraries/models/src/gltf.ts +935 -0
- package/libraries/models/src/index.ts +87 -0
- package/libraries/models/src/library.ts +75 -0
- package/libraries/models/src/loader.ts +265 -0
- package/libraries/models/src/material-adapter.ts +108 -0
- package/libraries/models/src/mini-xml.ts +174 -0
- package/libraries/models/src/normalize.ts +216 -0
- package/libraries/models/src/obj.ts +264 -0
- package/libraries/models/src/off.ts +95 -0
- package/libraries/models/src/ply.ts +348 -0
- package/libraries/models/src/pose-sampler.ts +219 -0
- package/libraries/models/src/sidecar/blender-extras.ts +37 -0
- package/libraries/models/src/sidecar/ddmeta.ts +114 -0
- package/libraries/models/src/sidecar/godot-import.ts +86 -0
- package/libraries/models/src/sidecar/resolver.ts +145 -0
- package/libraries/models/src/sidecar/types.ts +11 -0
- package/libraries/models/src/sidecar/unity-meta.ts +61 -0
- package/libraries/models/src/skeleton-synthesis.ts +132 -0
- package/libraries/models/src/stl.ts +149 -0
- package/libraries/models/src/threeds.ts +363 -0
- package/libraries/models/src/threemf.ts +201 -0
- package/libraries/models/src/types.ts +188 -0
- package/libraries/models/src/vtk.ts +218 -0
- package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +24 -0
- package/libraries/models/test-fixtures/fbx/README.md +46 -0
- package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
- package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
- package/libraries/navmesh/README.md +23 -0
- package/libraries/navmesh/src/crowd-system.ts +240 -0
- package/libraries/navmesh/src/debug-viz.ts +74 -0
- package/libraries/navmesh/src/index.ts +15 -0
- package/libraries/navmesh/src/library.ts +64 -0
- package/libraries/navmesh/src/navmesh-generator.ts +407 -0
- package/libraries/navmesh/src/navmesh.ts +159 -0
- package/libraries/navmesh/src/pathfinder.ts +252 -0
- package/libraries/navmesh/src/types.ts +63 -0
- package/libraries/networking/README.md +25 -0
- package/libraries/networking/src/authority.ts +121 -0
- package/libraries/networking/src/connection.ts +139 -0
- package/libraries/networking/src/discovery.ts +373 -0
- package/libraries/networking/src/enhanced-replication.ts +355 -0
- package/libraries/networking/src/epic-adapter.ts +129 -0
- package/libraries/networking/src/index.ts +45 -0
- package/libraries/networking/src/library.ts +69 -0
- package/libraries/networking/src/lobby.ts +108 -0
- package/libraries/networking/src/platform-adapter.ts +163 -0
- package/libraries/networking/src/rcs-adapter.ts +127 -0
- package/libraries/networking/src/remote-input.ts +188 -0
- package/libraries/networking/src/replication.ts +327 -0
- package/libraries/networking/src/rpc.ts +188 -0
- package/libraries/networking/src/session.ts +173 -0
- package/libraries/networking/src/transport.ts +201 -0
- package/libraries/networking/src/webrtc.ts +323 -0
- package/libraries/pathfinding-2d/README.md +15 -0
- package/libraries/pathfinding-2d/src/astar-grid.ts +312 -0
- package/libraries/pathfinding-2d/src/index.ts +11 -0
- package/libraries/persistence/README.md +25 -0
- package/libraries/persistence/src/autosave-manager.ts +112 -0
- package/libraries/persistence/src/binary-record-store.ts +244 -0
- package/libraries/persistence/src/browser.ts +51 -0
- package/libraries/persistence/src/file-save-store.ts +553 -0
- package/libraries/persistence/src/hash-utils.ts +59 -0
- package/libraries/persistence/src/index.ts +57 -0
- package/libraries/persistence/src/library.ts +74 -0
- package/libraries/persistence/src/mock-opfs.ts +141 -0
- package/libraries/persistence/src/node-fs-directory-handle.ts +161 -0
- package/libraries/persistence/src/opfs-save-store.ts +745 -0
- package/libraries/persistence/src/save-worker-proxy.ts +127 -0
- package/libraries/persistence/src/save-worker.ts +99 -0
- package/libraries/persistence/src/xxh3-ts.d.ts +10 -0
- package/libraries/physics-native/README.md +21 -0
- package/libraries/physics-native/native/Cargo.toml +11 -0
- package/libraries/physics-native/native/src/body.rs +403 -0
- package/libraries/physics-native/native/src/character.rs +226 -0
- package/libraries/physics-native/native/src/collider.rs +299 -0
- package/libraries/physics-native/native/src/joint.rs +81 -0
- package/libraries/physics-native/native/src/lib.rs +830 -0
- package/libraries/physics-native/native/src/query.rs +261 -0
- package/libraries/physics-native/native/src/realm.rs +33 -0
- package/libraries/physics-native/native/src/step.rs +54 -0
- package/libraries/physics-native/native/src/world.rs +148 -0
- package/libraries/physics-native/src/backend.ts +1046 -0
- package/libraries/physics-native/src/broadphase.ts +101 -0
- package/libraries/physics-native/src/ffi-spike-worker.ts +71 -0
- package/libraries/physics-native/src/index.ts +11 -0
- package/libraries/physics-native/src/library.ts +79 -0
- package/libraries/physics-native/src/narrowphase-shapes.ts +420 -0
- package/libraries/physics-native/src/narrowphase.ts +123 -0
- package/libraries/physics-native/src/solver.ts +141 -0
- package/libraries/physics-native/src/types.ts +76 -0
- package/libraries/physics-rapier/README.md +21 -0
- package/libraries/physics-rapier/bench/ffi-bench.ts +79 -0
- package/libraries/physics-rapier/bench/wasm-baseline.ts +90 -0
- package/libraries/physics-rapier/src/api.ts +452 -0
- package/libraries/physics-rapier/src/auto-backend.ts +59 -0
- package/libraries/physics-rapier/src/backend.ts +1207 -0
- package/libraries/physics-rapier/src/bulk-ops.ts +68 -0
- package/libraries/physics-rapier/src/ffi-backend.ts +21 -0
- package/libraries/physics-rapier/src/ffi-lib.ts +597 -0
- package/libraries/physics-rapier/src/index.ts +12 -0
- package/libraries/physics-rapier/src/library.ts +107 -0
- package/libraries/physics-rapier/src/rapier-backend.ts +1052 -0
- package/libraries/physics-rapier/src/realm-worker-script.ts +237 -0
- package/libraries/postfx/README.md +17 -0
- package/libraries/postfx/src/index.ts +19 -0
- package/libraries/postfx/src/library.ts +337 -0
- package/libraries/postfx/src/post-process-stack.ts +1752 -0
- package/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
- package/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
- package/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
- package/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
- package/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
- package/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
- package/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
- package/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
- package/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
- package/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
- package/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
- package/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
- package/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
- package/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
- package/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
- package/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
- package/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
- package/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
- package/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
- package/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
- package/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
- package/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
- package/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
- package/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
- package/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
- package/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
- package/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
- package/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
- package/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
- package/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
- package/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
- package/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
- package/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
- package/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
- package/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
- package/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
- package/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
- package/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
- package/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
- package/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
- package/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
- package/libraries/recast/README.md +21 -0
- package/libraries/recast/src/backend.ts +150 -0
- package/libraries/recast/src/crowd-system.ts +352 -0
- package/libraries/recast/src/index.ts +12 -0
- package/libraries/recast/src/library.ts +91 -0
- package/libraries/recast/src/types.ts +86 -0
- package/libraries/sand/README.md +25 -0
- package/libraries/sand/src/cell.ts +43 -0
- package/libraries/sand/src/fields.ts +29 -0
- package/libraries/sand/src/fluid-grid.ts +261 -0
- package/libraries/sand/src/grid-dims.ts +74 -0
- package/libraries/sand/src/grid-sim-buffer.ts +271 -0
- package/libraries/sand/src/index.ts +81 -0
- package/libraries/sand/src/library.ts +92 -0
- package/libraries/sand/src/materials.ts +492 -0
- package/libraries/sand/src/palette.ts +93 -0
- package/libraries/sand/src/particles.ts +185 -0
- package/libraries/sand/src/render/sand-grid-pass.ts +430 -0
- package/libraries/sand/src/rng.ts +51 -0
- package/libraries/sand/src/rules/builtin-rules.ts +132 -0
- package/libraries/sand/src/rules/rule-compiler.ts +162 -0
- package/libraries/sand/src/rules/rule-engine.ts +231 -0
- package/libraries/sand/src/rules/rule-types.ts +87 -0
- package/libraries/sand/src/sand-step-pool.ts +484 -0
- package/libraries/sand/src/sand-step-worker.ts +97 -0
- package/libraries/sand/src/sand-world.ts +3227 -0
- package/libraries/stickman/README.md +25 -0
- package/libraries/stickman/src/index.ts +25 -0
- package/libraries/stickman/src/library.ts +61 -0
- package/libraries/stickman/src/proportions.ts +45 -0
- package/libraries/stickman/src/shader.ts +117 -0
- package/libraries/stickman/src/skeleton.ts +197 -0
- package/libraries/stickman/src/stickman-pass.ts +255 -0
- package/libraries/stickman/src/thick-line.ts +123 -0
- package/libraries/surface-nets/README.md +25 -0
- package/libraries/surface-nets/src/chunked-field.ts +14 -0
- package/libraries/surface-nets/src/deformation.ts +45 -0
- package/libraries/surface-nets/src/index.ts +36 -0
- package/libraries/surface-nets/src/library.ts +59 -0
- package/libraries/surface-nets/src/lod.ts +7 -0
- package/libraries/surface-nets/src/sab.ts +4 -0
- package/libraries/surface-nets/src/streaming-config.ts +5 -0
- package/libraries/surface-nets/src/streaming-manager.ts +15 -0
- package/libraries/surface-nets/src/surface-nets.ts +334 -0
- package/libraries/surface-nets/src/types.ts +23 -0
- package/libraries/water/README.md +25 -0
- package/libraries/water/src/buoyancy.ts +103 -0
- package/libraries/water/src/index.ts +43 -0
- package/libraries/water/src/library.ts +85 -0
- package/libraries/water/src/shore-damping.ts +93 -0
- package/libraries/water/src/water-buffer.ts +89 -0
- package/libraries/water/src/water-chunks.ts +13 -0
- package/libraries/water/src/water-physics.ts +376 -0
- package/libraries/water/src/water-renderer.ts +809 -0
- package/libraries/water/src/water-sab.ts +161 -0
- package/libraries/water/src/wave-sources.ts +84 -0
- package/libraries/weather/README.md +20 -0
- package/libraries/weather/src/index.ts +9 -0
- package/libraries/weather/src/library.ts +72 -0
- package/libraries/weather/src/types.ts +64 -0
- package/libraries/weather/src/weather-blend.ts +112 -0
- package/libraries/weather/src/weather-system.ts +271 -0
- package/libraries/weatherfx/README.md +24 -0
- package/libraries/weatherfx/src/cloud-provider.ts +31 -0
- package/libraries/weatherfx/src/cloud-system.ts +372 -0
- package/libraries/weatherfx/src/index.ts +9 -0
- package/libraries/weatherfx/src/library.ts +58 -0
- package/libraries/weatherfx/src/particle-system.ts +434 -0
- package/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
- package/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
- package/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
- package/lint-plugin.mjs +41 -0
- package/mcp/src/client.ts +703 -0
- package/mcp/src/engine-context.ts +186 -0
- package/mcp/src/http-transport.ts +471 -0
- package/mcp/src/index.ts +13 -0
- package/mcp/src/prompts/add-entity.ts +42 -0
- package/mcp/src/prompts/create-scene.ts +44 -0
- package/mcp/src/prompts/debug-frame.ts +39 -0
- package/mcp/src/prompts/index.ts +12 -0
- package/mcp/src/resources/asset-list.ts +32 -0
- package/mcp/src/resources/checkpoint-list.ts +33 -0
- package/mcp/src/resources/entity-state.ts +55 -0
- package/mcp/src/resources/gpu-info.ts +103 -0
- package/mcp/src/resources/index.ts +57 -0
- package/mcp/src/resources/performance.ts +37 -0
- package/mcp/src/resources/scene-tree.ts +43 -0
- package/mcp/src/server.ts +375 -0
- package/mcp/src/tools/animation.ts +118 -0
- package/mcp/src/tools/asset.ts +161 -0
- package/mcp/src/tools/audio.ts +96 -0
- package/mcp/src/tools/build.ts +143 -0
- package/mcp/src/tools/camera.ts +167 -0
- package/mcp/src/tools/checkpoint.ts +100 -0
- package/mcp/src/tools/component.ts +199 -0
- package/mcp/src/tools/debug.ts +300 -0
- package/mcp/src/tools/entity.ts +361 -0
- package/mcp/src/tools/inspect.ts +210 -0
- package/mcp/src/tools/lighting.ts +263 -0
- package/mcp/src/tools/material.ts +243 -0
- package/mcp/src/tools/mesh.ts +239 -0
- package/mcp/src/tools/physics.ts +266 -0
- package/mcp/src/tools/scene.ts +153 -0
- package/mcp/src/tools/script.ts +122 -0
- package/mcp/src/types.ts +92 -0
- package/mcp/src/undo-redo.ts +77 -0
- package/modules/camera-controls/README.md +20 -0
- package/modules/camera-controls/src/index.ts +161 -0
- package/modules/controller-ui/src/index.ts +164 -0
- package/modules/devtools/README.md +25 -0
- package/modules/devtools/src/api.ts +461 -0
- package/modules/devtools/src/asset-utils.ts +105 -0
- package/modules/devtools/src/bind-debug-store.ts +48 -0
- package/modules/devtools/src/data-bridge.ts +286 -0
- package/modules/devtools/src/debug-overlay.ts +238 -0
- package/modules/devtools/src/debug-raycast.ts +328 -0
- package/modules/devtools/src/debug-store.ts +92 -0
- package/modules/devtools/src/debug-view-descriptors.ts +59 -0
- package/modules/devtools/src/doctor-panel.ts +182 -0
- package/modules/devtools/src/gizmo-module.ts +136 -0
- package/modules/devtools/src/graph-model.ts +509 -0
- package/modules/devtools/src/grid-renderer.ts +157 -0
- package/modules/devtools/src/height-ruler-renderer.ts +216 -0
- package/modules/devtools/src/index.ts +81 -0
- package/modules/devtools/src/init.ts +261 -0
- package/modules/devtools/src/label-overlay.ts +154 -0
- package/modules/devtools/src/material-stats-panel.ts +188 -0
- package/modules/devtools/src/profiling-bridge.ts +377 -0
- package/modules/devtools/src/profiling-hooks.ts +98 -0
- package/modules/devtools/src/renderer-adapter.ts +76 -0
- package/modules/devtools/src/scene-inspector.ts +637 -0
- package/modules/devtools/src/scene-store.ts +320 -0
- package/modules/devtools/src/scene-sync.ts +116 -0
- package/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
- package/modules/devtools/src/sim-stats-panel.ts +272 -0
- package/modules/devtools/src/sim-stats-provider.ts +105 -0
- package/modules/devtools/src/skeleton-renderer.ts +351 -0
- package/modules/devtools/src/transform-gizmo.ts +928 -0
- package/modules/devtools/src/types.ts +290 -0
- package/modules/devtools/src/worker-expose.ts +67 -0
- package/modules/devtools/src/worker-sync.ts +137 -0
- package/modules/editor/src/commands/component.ts +156 -0
- package/modules/editor/src/commands/entity.ts +287 -0
- package/modules/editor/src/commands/hierarchy.ts +83 -0
- package/modules/editor/src/commands/index.ts +61 -0
- package/modules/editor/src/commands/prefab.ts +163 -0
- package/modules/editor/src/commands/registry.ts +331 -0
- package/modules/editor/src/commands/scene-io.ts +211 -0
- package/modules/editor/src/commands/selection.ts +73 -0
- package/modules/editor/src/commands/transform.ts +91 -0
- package/modules/editor/src/ddscene.ts +267 -0
- package/modules/editor/src/document.ts +123 -0
- package/modules/editor/src/editor-context.ts +172 -0
- package/modules/editor/src/index.ts +41 -0
- package/modules/editor/src/mcp.ts +103 -0
- package/modules/editor/src/module.ts +148 -0
- package/modules/editor/src/selection.ts +70 -0
- package/modules/editor/src/shell.ts +456 -0
- package/modules/editor/src/viewport.ts +199 -0
- package/modules/html-ui/src/composite.ts +135 -0
- package/modules/html-ui/src/create-html-ui.ts +188 -0
- package/modules/html-ui/src/doc-backend.ts +343 -0
- package/modules/html-ui/src/host.ts +646 -0
- package/modules/html-ui/src/index.ts +13 -0
- package/modules/html-ui/src/jsx-dev-runtime.ts +12 -0
- package/modules/html-ui/src/jsx-runtime.ts +126 -0
- package/modules/html-ui/src/protocol.ts +88 -0
- package/modules/html-ui/src/ui-worker.ts +16 -0
- package/modules/mcp/README.md +18 -0
- package/modules/mcp/src/index.ts +27 -0
- package/modules/movement-2d/README.md +19 -0
- package/modules/movement-2d/src/grid-character.ts +455 -0
- package/modules/movement-2d/src/index.ts +45 -0
- package/modules/movement-3d/README.md +21 -0
- package/modules/movement-3d/src/character-motor.ts +230 -0
- package/modules/movement-3d/src/index.ts +46 -0
- package/modules/native-osr/src/index.ts +22 -0
- package/modules/native-osr/src/input-router.ts +401 -0
- package/modules/native-osr/src/native-osr-manager.ts +247 -0
- package/modules/native-osr/src/native-texture-source.ts +86 -0
- package/modules/native-osr/src/types.ts +112 -0
- package/modules/native-osr/src/world-space-ui-pass.ts +351 -0
- package/modules/sailing/README.md +18 -0
- package/modules/sailing/src/index.ts +51 -0
- package/modules/terrain/README.md +18 -0
- package/modules/terrain/src/index.ts +78 -0
- package/modules/vitals/README.md +17 -0
- package/modules/vitals/src/index.ts +43 -0
- package/modules/vitals/src/vitals.ts +265 -0
- package/modules/xr/README.md +25 -0
- package/modules/xr/src/camera-rig.ts +146 -0
- package/modules/xr/src/debug.ts +59 -0
- package/modules/xr/src/frame-loop.ts +197 -0
- package/modules/xr/src/index.ts +16 -0
- package/modules/xr/src/input.ts +208 -0
- package/modules/xr/src/layer.ts +140 -0
- package/modules/xr/src/session.ts +156 -0
- package/modules/xr/src/sim-module.ts +23 -0
- package/modules/xr/src/types.ts +32 -0
- package/modules/xr/src/webxr.d.ts +182 -0
- package/modules/xr/src/xr-module.ts +179 -0
- package/package.json +232 -3
- package/shader-graph/src/chunks.ts +349 -0
- package/shader-graph/src/compiler.ts +732 -0
- package/shader-graph/src/compute-compiler.ts +453 -0
- package/shader-graph/src/compute-graph.ts +112 -0
- package/shader-graph/src/compute-profiles.ts +54 -0
- package/shader-graph/src/graph.ts +52 -0
- package/shader-graph/src/index.ts +53 -0
- package/shader-graph/src/profiles.ts +407 -0
- package/shader-graph/src/validator.ts +48 -0
- package/shader-graph/src/wgsl-binding-validator.ts +143 -0
- package/shader-graph/src/wgsl-struct-validator.ts +245 -0
- package/shader-graph/src/wgsl-struct.ts +397 -0
- package/test/src/index.ts +7 -0
- package/test/src/vision-test.ts +369 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// MaterialRegistry — mod-defined material shaders for spawned props.
|
|
3
|
+
//
|
|
4
|
+
// Mods register custom WGSL material shaders via the ShaderRegistry extension
|
|
5
|
+
// loader. The MaterialRegistry tracks registered materials and provides
|
|
6
|
+
// lookup by id. The renderer integrates with this registry to apply custom
|
|
7
|
+
// materials to spawned props.
|
|
8
|
+
//
|
|
9
|
+
// This is a lightweight, testable registry. The actual GPU pipeline creation
|
|
10
|
+
// + bindless material integration happens in the renderer when a prop is
|
|
11
|
+
// spawned with a custom material id (the renderer looks up the material in
|
|
12
|
+
// this registry and compiles the WGSL on demand).
|
|
13
|
+
// ============================================================================
|
|
14
|
+
|
|
15
|
+
/** A registered mod-defined material shader. */
|
|
16
|
+
export interface RegisteredMaterial {
|
|
17
|
+
/** Unique material id (namespaced, e.g. "my-mod:iridescent"). */
|
|
18
|
+
id: string;
|
|
19
|
+
/** WGSL material shader source. */
|
|
20
|
+
wgsl: string;
|
|
21
|
+
/** The mod that registered this material. */
|
|
22
|
+
manifestId: string;
|
|
23
|
+
/** Uniform buffer size in bytes (if the shader needs a uniform). */
|
|
24
|
+
uniforms?: number;
|
|
25
|
+
/** Extra properties from the extension declaration. */
|
|
26
|
+
props: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Registry for mod-defined material shaders. */
|
|
30
|
+
export class MaterialRegistry {
|
|
31
|
+
private materials = new Map<string, RegisteredMaterial>();
|
|
32
|
+
|
|
33
|
+
/** Register a material shader. Throws if the id is already registered. */
|
|
34
|
+
register(material: RegisteredMaterial): void {
|
|
35
|
+
if (this.materials.has(material.id)) {
|
|
36
|
+
throw new Error(`Material "${material.id}" is already registered`);
|
|
37
|
+
}
|
|
38
|
+
this.materials.set(material.id, material);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Unregister a material by id. */
|
|
42
|
+
unregister(id: string): void {
|
|
43
|
+
this.materials.delete(id);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Get a registered material by id. Returns undefined if not found. */
|
|
47
|
+
get(id: string): RegisteredMaterial | undefined {
|
|
48
|
+
return this.materials.get(id);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Check if a material is registered. */
|
|
52
|
+
has(id: string): boolean {
|
|
53
|
+
return this.materials.has(id);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Get all registered material ids. */
|
|
57
|
+
ids(): string[] {
|
|
58
|
+
return [...this.materials.keys()];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Clear all registered materials. */
|
|
62
|
+
clear(): void {
|
|
63
|
+
this.materials.clear();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// MCP automation tools for the plugin system.
|
|
3
|
+
//
|
|
4
|
+
// Games call `createPluginMcpTools(pluginHost)` in their MCP setup to register
|
|
5
|
+
// tools that let the in-game MCP harness (and `draft test` e2e specs) inspect
|
|
6
|
+
// and control plugins:
|
|
7
|
+
// - plugin_list: list all discovered plugins with status.
|
|
8
|
+
// - plugin_get_info: get detailed info for a single plugin.
|
|
9
|
+
// - plugin_reload: reload a plugin by id.
|
|
10
|
+
// - plugin_unload: unload a plugin by id.
|
|
11
|
+
// - plugin_get_state: get a plugin's KV state.
|
|
12
|
+
//
|
|
13
|
+
// These integrate with the existing createMcpHarness from @downdraft/engine/app/renderer.
|
|
14
|
+
// ============================================================================
|
|
15
|
+
|
|
16
|
+
import type { PluginHost } from "./host";
|
|
17
|
+
|
|
18
|
+
/** MCP tool definition (structurally compatible with McpToolRegistration). */
|
|
19
|
+
export interface McpToolDef {
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
inputSchema: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface McpToolRegistration {
|
|
26
|
+
def: McpToolDef;
|
|
27
|
+
handler: (params: Record<string, unknown>) => Promise<unknown> | unknown;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function jsonResult(data: unknown): { content: [{ type: "text"; text: string }] } {
|
|
31
|
+
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function errorResult(msg: string): { content: [{ type: "text"; text: string }] } {
|
|
35
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: msg }) }] };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create MCP tool registrations for plugin management.
|
|
40
|
+
* Games pass these to `createMcpHarness({ tools: [...] })`.
|
|
41
|
+
*/
|
|
42
|
+
export function createPluginMcpTools(pluginHost: PluginHost): McpToolRegistration[] {
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
def: {
|
|
46
|
+
name: "plugin_list",
|
|
47
|
+
description:
|
|
48
|
+
"List all discovered plugins with their current status, format, tier, and thread. " +
|
|
49
|
+
"Useful for verifying plugins loaded correctly in e2e tests.",
|
|
50
|
+
inputSchema: { type: "object", properties: {} },
|
|
51
|
+
},
|
|
52
|
+
handler: async () => {
|
|
53
|
+
const snap = pluginHost.snapshot();
|
|
54
|
+
return jsonResult({
|
|
55
|
+
count: snap.length,
|
|
56
|
+
plugins: snap.map((p) => ({
|
|
57
|
+
id: p.id,
|
|
58
|
+
name: p.name,
|
|
59
|
+
version: p.version,
|
|
60
|
+
format: p.format,
|
|
61
|
+
tier: p.tier,
|
|
62
|
+
thread: p.thread,
|
|
63
|
+
status: p.status,
|
|
64
|
+
error: p.error,
|
|
65
|
+
permissions: p.permissions,
|
|
66
|
+
})),
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
def: {
|
|
72
|
+
name: "plugin_get_info",
|
|
73
|
+
description:
|
|
74
|
+
"Get detailed info for a single plugin by id, including denied permissions and source.",
|
|
75
|
+
inputSchema: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
id: { type: "string", description: "Plugin id" },
|
|
79
|
+
},
|
|
80
|
+
required: ["id"],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
handler: async (params) => {
|
|
84
|
+
const id = params.id as string;
|
|
85
|
+
const snap = pluginHost.snapshot();
|
|
86
|
+
const info = snap.find((p) => p.id === id);
|
|
87
|
+
if (!info) return errorResult(`Plugin "${id}" not found`);
|
|
88
|
+
return jsonResult(info);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
def: {
|
|
93
|
+
name: "plugin_reload",
|
|
94
|
+
description:
|
|
95
|
+
"Reload a plugin by id. The plugin is unloaded and re-loaded from its source. " +
|
|
96
|
+
"Useful for testing plugin lifecycle in e2e specs.",
|
|
97
|
+
inputSchema: {
|
|
98
|
+
type: "object",
|
|
99
|
+
properties: {
|
|
100
|
+
id: { type: "string", description: "Plugin id" },
|
|
101
|
+
},
|
|
102
|
+
required: ["id"],
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
handler: async (params) => {
|
|
106
|
+
const id = params.id as string;
|
|
107
|
+
try {
|
|
108
|
+
await pluginHost.reload(id);
|
|
109
|
+
const snap = pluginHost.snapshot();
|
|
110
|
+
const info = snap.find((p) => p.id === id);
|
|
111
|
+
return jsonResult({ success: true, status: info?.status, error: info?.error });
|
|
112
|
+
} catch (e) {
|
|
113
|
+
return errorResult(`Failed to reload plugin "${id}": ${(e as Error).message}`);
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
def: {
|
|
119
|
+
name: "plugin_unload",
|
|
120
|
+
description:
|
|
121
|
+
"Unload a plugin by id. The plugin is disposed and removed from the active set.",
|
|
122
|
+
inputSchema: {
|
|
123
|
+
type: "object",
|
|
124
|
+
properties: {
|
|
125
|
+
id: { type: "string", description: "Plugin id" },
|
|
126
|
+
},
|
|
127
|
+
required: ["id"],
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
handler: async (params) => {
|
|
131
|
+
const id = params.id as string;
|
|
132
|
+
try {
|
|
133
|
+
pluginHost.unload(id);
|
|
134
|
+
return jsonResult({ success: true });
|
|
135
|
+
} catch (e) {
|
|
136
|
+
return errorResult(`Failed to unload plugin "${id}": ${(e as Error).message}`);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
def: {
|
|
142
|
+
name: "plugin_get_state",
|
|
143
|
+
description:
|
|
144
|
+
"Get a plugin's KV state keys. Returns the list of state keys for the plugin.",
|
|
145
|
+
inputSchema: {
|
|
146
|
+
type: "object",
|
|
147
|
+
properties: {
|
|
148
|
+
id: { type: "string", description: "Plugin id" },
|
|
149
|
+
},
|
|
150
|
+
required: ["id"],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
handler: async (params) => {
|
|
154
|
+
const id = params.id as string;
|
|
155
|
+
const snap = pluginHost.snapshot();
|
|
156
|
+
const info = snap.find((p) => p.id === id);
|
|
157
|
+
if (!info) return errorResult(`Plugin "${id}" not found`);
|
|
158
|
+
// The PluginHost doesn't expose the per-plugin state store directly,
|
|
159
|
+
// but the snapshot includes the manifest. For full state access, the
|
|
160
|
+
// game would need to expose the context backing. This is a stub.
|
|
161
|
+
return jsonResult({ id, stateKeys: [], note: "State access requires game-side wiring" });
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Plugin permissions — the sandbox permission model.
|
|
3
|
+
//
|
|
4
|
+
// Each `PluginPermission` maps to a set of Web Worker globals the sandbox
|
|
5
|
+
// shim keeps (vs. strips) before the plugin's code runs. The host resolves
|
|
6
|
+
// the *granted* permission set = (requested ∩ tier-allowed ∩ game-allowlist),
|
|
7
|
+
// then hands it to the sandbox shim which deletes/overrides disallowed
|
|
8
|
+
// globals.
|
|
9
|
+
//
|
|
10
|
+
// This module is the single source of truth for:
|
|
11
|
+
// - the per-tier allowed permission sets (mirrored in manifest.ts)
|
|
12
|
+
// - the permission → global-allowlist mapping
|
|
13
|
+
// - permission resolution + grant computation
|
|
14
|
+
// ============================================================================
|
|
15
|
+
|
|
16
|
+
import type { PluginPermission, PluginTier } from "./manifest";
|
|
17
|
+
|
|
18
|
+
// ── Per-tier allowed permissions (mirror of manifest.ts rules) ──
|
|
19
|
+
|
|
20
|
+
export const TIER_ALLOWED: Record<PluginTier, ReadonlySet<PluginPermission>> = {
|
|
21
|
+
data: new Set<PluginPermission>([]),
|
|
22
|
+
script: new Set<PluginPermission>(["events", "state", "tick", "storage", "log"]),
|
|
23
|
+
native: new Set<PluginPermission>([
|
|
24
|
+
"ecs",
|
|
25
|
+
"sab",
|
|
26
|
+
"gpu",
|
|
27
|
+
"events",
|
|
28
|
+
"state",
|
|
29
|
+
"tick",
|
|
30
|
+
"storage",
|
|
31
|
+
"network",
|
|
32
|
+
"log",
|
|
33
|
+
"physics",
|
|
34
|
+
"assets",
|
|
35
|
+
]),
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// ── Permission → worker-global allowlist ──
|
|
39
|
+
//
|
|
40
|
+
// The sandbox shim deletes every global NOT in the granted allowlist. The
|
|
41
|
+
// allowlist is the union of (a) a baseline set always kept (needed for the
|
|
42
|
+
// plugin runtime itself) and (b) per-permission additions.
|
|
43
|
+
//
|
|
44
|
+
// Baseline: the JS runtime essentials + the host-provided `ddPlugin` bridge.
|
|
45
|
+
// These are NEVER stripped — without them the plugin can't run at all.
|
|
46
|
+
|
|
47
|
+
export const BASELINE_GLOBALS: readonly string[] = [
|
|
48
|
+
// JS runtime
|
|
49
|
+
"Object",
|
|
50
|
+
"Array",
|
|
51
|
+
"String",
|
|
52
|
+
"Number",
|
|
53
|
+
"Boolean",
|
|
54
|
+
"BigInt",
|
|
55
|
+
"Symbol",
|
|
56
|
+
"Math",
|
|
57
|
+
"JSON",
|
|
58
|
+
"Date",
|
|
59
|
+
"Error",
|
|
60
|
+
"TypeError",
|
|
61
|
+
"RangeError",
|
|
62
|
+
"SyntaxError",
|
|
63
|
+
"ReferenceError",
|
|
64
|
+
"EvalError",
|
|
65
|
+
"URIError",
|
|
66
|
+
"Promise",
|
|
67
|
+
"Map",
|
|
68
|
+
"Set",
|
|
69
|
+
"WeakMap",
|
|
70
|
+
"WeakSet",
|
|
71
|
+
"ArrayBuffer",
|
|
72
|
+
"SharedArrayBuffer",
|
|
73
|
+
"Int8Array",
|
|
74
|
+
"Uint8Array",
|
|
75
|
+
"Uint8ClampedArray",
|
|
76
|
+
"Int16Array",
|
|
77
|
+
"Uint16Array",
|
|
78
|
+
"Int32Array",
|
|
79
|
+
"Uint32Array",
|
|
80
|
+
"Float32Array",
|
|
81
|
+
"Float64Array",
|
|
82
|
+
"BigInt64Array",
|
|
83
|
+
"BigUint64Array",
|
|
84
|
+
"DataView",
|
|
85
|
+
"TextEncoder",
|
|
86
|
+
"TextDecoder",
|
|
87
|
+
"console",
|
|
88
|
+
"setTimeout",
|
|
89
|
+
"clearTimeout",
|
|
90
|
+
"setInterval",
|
|
91
|
+
"clearInterval",
|
|
92
|
+
"queueMicrotask",
|
|
93
|
+
"atob",
|
|
94
|
+
"btoa",
|
|
95
|
+
"structuredClone",
|
|
96
|
+
"performance",
|
|
97
|
+
"self",
|
|
98
|
+
"globalThis",
|
|
99
|
+
// Host bridge (injected by the sandbox shim)
|
|
100
|
+
"ddPlugin",
|
|
101
|
+
];
|
|
102
|
+
|
|
103
|
+
/** Globals kept when a given permission is granted. */
|
|
104
|
+
export const PERMISSION_GLOBALS: Record<PluginPermission, readonly string[]> = {
|
|
105
|
+
network: ["fetch", "WebSocket", "XMLHttpRequest", "EventSource", "Request", "Response", "Headers", "URL", "URLSearchParams"],
|
|
106
|
+
storage: ["indexedDB", "caches"],
|
|
107
|
+
// ecs/sab/gpu/events/state/tick/log don't add raw globals — they're
|
|
108
|
+
// mediated through the `ddPlugin` host bridge (typed APIs on the context).
|
|
109
|
+
// Listing them empty keeps the mapping explicit and extensible.
|
|
110
|
+
ecs: [],
|
|
111
|
+
sab: [],
|
|
112
|
+
gpu: [],
|
|
113
|
+
events: [],
|
|
114
|
+
state: [],
|
|
115
|
+
tick: [],
|
|
116
|
+
log: [],
|
|
117
|
+
physics: [],
|
|
118
|
+
assets: [],
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// ── Permission resolution ──
|
|
122
|
+
|
|
123
|
+
export interface PermissionGrant {
|
|
124
|
+
/** The final granted permission set (requested ∩ tier ∩ game-allowlist). */
|
|
125
|
+
granted: ReadonlySet<PluginPermission>;
|
|
126
|
+
/** Permissions requested but denied (with reason). */
|
|
127
|
+
denied: Array<{ permission: PluginPermission; reason: string }>;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Resolve the granted permission set for a plugin.
|
|
132
|
+
*
|
|
133
|
+
* @param requested Permissions requested in the manifest.
|
|
134
|
+
* @param tier The plugin's tier.
|
|
135
|
+
* @param gameAllow Optional game-defined allowlist. If provided, only
|
|
136
|
+
* permissions in this set can be granted (game can forbid
|
|
137
|
+
* e.g. `network` even for native-tier plugins). If omitted,
|
|
138
|
+
* the tier set is the only constraint.
|
|
139
|
+
*/
|
|
140
|
+
export function resolvePermissions(
|
|
141
|
+
requested: PluginPermission[],
|
|
142
|
+
tier: PluginTier,
|
|
143
|
+
gameAllow?: ReadonlySet<PluginPermission>,
|
|
144
|
+
): PermissionGrant {
|
|
145
|
+
const tierSet = TIER_ALLOWED[tier];
|
|
146
|
+
const granted = new Set<PluginPermission>();
|
|
147
|
+
const denied: Array<{ permission: PluginPermission; reason: string }> = [];
|
|
148
|
+
|
|
149
|
+
for (let _i = 0, _it = requested, _n = _it.length; _i < _n; _i++) { const p = _it[_i];
|
|
150
|
+
if (!tierSet.has(p)) {
|
|
151
|
+
denied.push({ permission: p, reason: `not allowed for tier "${tier}"` });
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (gameAllow && !gameAllow.has(p)) {
|
|
155
|
+
denied.push({ permission: p, reason: "denied by game allowlist" });
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
granted.add(p);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return { granted, denied };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Compute the full set of worker-global names the sandbox shim should KEEP
|
|
166
|
+
* for a plugin with the given granted permissions. Everything else on `self`
|
|
167
|
+
* gets deleted/replaced with a throwing trap.
|
|
168
|
+
*/
|
|
169
|
+
export function computeGlobalAllowlist(granted: ReadonlySet<PluginPermission>): Set<string> {
|
|
170
|
+
const keep = new Set<string>(BASELINE_GLOBALS);
|
|
171
|
+
for (const p of granted.values()) {
|
|
172
|
+
PERMISSION_GLOBALS[p].forEach((g) => { keep.add(g);; });
|
|
173
|
+
}
|
|
174
|
+
return keep;
|
|
175
|
+
}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// QuickJS bridge — host↔QuickJS value marshaling + interrupt/timeout.
|
|
3
|
+
//
|
|
4
|
+
// QuickJS plugins run in-process on the renderer thread inside a QuickJS WASM
|
|
5
|
+
// VM (via quickjs-emscripten). The VM provides hard isolation by construction:
|
|
6
|
+
// only the host-bridged globals exist. This module:
|
|
7
|
+
// - creates a QuickJS runtime + context,
|
|
8
|
+
// - sets an interrupt handler for per-tick instruction-budget enforcement,
|
|
9
|
+
// - bridges the ScriptPluginContext API into QuickJS functions,
|
|
10
|
+
// - marshals values between host and VM (primitives + plain objects via JSON),
|
|
11
|
+
// - evaluates the plugin entry and calls its register().
|
|
12
|
+
// ============================================================================
|
|
13
|
+
|
|
14
|
+
import type { QuickJSContext, QuickJSWASMModule } from "quickjs-emscripten";
|
|
15
|
+
import { getQuickJS as _getQuickJS } from "quickjs-emscripten";
|
|
16
|
+
import { getWarningEngine, METRIC_TASK_LATENCY, recordTaskLatency } from "../profiling/worker-prelude";
|
|
17
|
+
|
|
18
|
+
/** Re-export getQuickJS so consumers don't need a direct dep on quickjs-emscripten. */
|
|
19
|
+
export const getQuickJS = _getQuickJS;
|
|
20
|
+
|
|
21
|
+
/** Maximum instructions per eval/tick before the interrupt handler fires. */
|
|
22
|
+
const DEFAULT_INSTRUCTION_BUDGET = 1_000_000;
|
|
23
|
+
|
|
24
|
+
export interface QuickjsBridgeOptions {
|
|
25
|
+
/** Instruction budget per eval/tick. Exceeding → throws a budget error. */
|
|
26
|
+
instructionBudget?: number;
|
|
27
|
+
/** The plugin id (for logging + error messages). */
|
|
28
|
+
pluginId: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface QuickjsBridge {
|
|
32
|
+
/** The QuickJS context. */
|
|
33
|
+
ctx: QuickJSContext;
|
|
34
|
+
/** Evaluate code in the VM. Returns the result marshaled to a host value. */
|
|
35
|
+
eval(code: string, filename?: string): unknown;
|
|
36
|
+
/** Call a global function by name with marshaled args. */
|
|
37
|
+
callGlobal(fnName: string, ...args: unknown[]): unknown;
|
|
38
|
+
/** Drain pending jobs (promises). */
|
|
39
|
+
drainJobs(): void;
|
|
40
|
+
/** Dispose the VM (runtime + context). */
|
|
41
|
+
dispose(): void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Marshal a host value into a QuickJS handle. Caller must dispose. */
|
|
45
|
+
function marshalToVm(ctx: QuickJSContext, value: unknown): any {
|
|
46
|
+
if (value === undefined || value === null) return ctx.undefined;
|
|
47
|
+
if (typeof value === "number") return ctx.newNumber(value);
|
|
48
|
+
if (typeof value === "string") return ctx.newString(value);
|
|
49
|
+
if (typeof value === "boolean") return value ? ctx.true : ctx.false;
|
|
50
|
+
// Objects + arrays → JSON round-trip (simple, safe, no live sharing).
|
|
51
|
+
if (typeof value === "object") {
|
|
52
|
+
const result = ctx.evalCode(`JSON.parse(${JSON.stringify(JSON.stringify(value))})`);
|
|
53
|
+
if (result.error) {
|
|
54
|
+
result.error.dispose();
|
|
55
|
+
return ctx.undefined;
|
|
56
|
+
}
|
|
57
|
+
// unwrapResult transfers ownership — caller must dispose.
|
|
58
|
+
return ctx.unwrapResult(result);
|
|
59
|
+
}
|
|
60
|
+
return ctx.undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Marshal a QuickJS handle to a host value. Does NOT consume the handle. */
|
|
64
|
+
function marshalFromVm(ctx: QuickJSContext, handle: any): unknown {
|
|
65
|
+
try {
|
|
66
|
+
return ctx.dump(handle);
|
|
67
|
+
} catch {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create a QuickJS bridge with a runtime + context, interrupt handler, and
|
|
74
|
+
* bridged host functions. The `hostApi` object provides the actual
|
|
75
|
+
* ScriptPluginContext methods; the bridge wraps them as QuickJS functions.
|
|
76
|
+
*/
|
|
77
|
+
export function createQuickjsBridge(
|
|
78
|
+
module: QuickJSWASMModule,
|
|
79
|
+
hostApi: {
|
|
80
|
+
id: string;
|
|
81
|
+
events: {
|
|
82
|
+
subscribe(event: string, handler: (data: unknown) => void): () => void;
|
|
83
|
+
publish(event: string, data: unknown): void;
|
|
84
|
+
};
|
|
85
|
+
state: {
|
|
86
|
+
get(key: string): unknown;
|
|
87
|
+
set(key: string, value: unknown): void;
|
|
88
|
+
delete(key: string): void;
|
|
89
|
+
keys(): string[];
|
|
90
|
+
};
|
|
91
|
+
tick: { onTick(fn: (dt: number, t: number) => void): () => void };
|
|
92
|
+
log: { info(m: string): void; warn(m: string): void; error(m: string): void; debug(m: string): void };
|
|
93
|
+
onDispose(fn: () => void): void;
|
|
94
|
+
},
|
|
95
|
+
opts: QuickjsBridgeOptions,
|
|
96
|
+
): QuickjsBridge {
|
|
97
|
+
const runtime = module.newRuntime();
|
|
98
|
+
const budget = opts.instructionBudget ?? DEFAULT_INSTRUCTION_BUDGET;
|
|
99
|
+
let instructions = 0;
|
|
100
|
+
runtime.setInterruptHandler(() => {
|
|
101
|
+
instructions++;
|
|
102
|
+
if (instructions > budget) {
|
|
103
|
+
return true; // interrupt — throws "interrupted" in the VM
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const ctx = runtime.newContext();
|
|
109
|
+
|
|
110
|
+
// Track all persistent handles so we can dispose them before the context.
|
|
111
|
+
const handles: any[] = [];
|
|
112
|
+
const track = <T>(h: T): T => { handles.push(h); return h; };
|
|
113
|
+
const unsubFns: Array<() => void> = [];
|
|
114
|
+
const disposeCbs: Array<() => void> = [];
|
|
115
|
+
|
|
116
|
+
// Bridge the host API into the VM global as `ddPlugin`.
|
|
117
|
+
const ddPlugin = track(ctx.newObject());
|
|
118
|
+
|
|
119
|
+
// ── events ──
|
|
120
|
+
const events = track(ctx.newObject());
|
|
121
|
+
ctx.setProp(
|
|
122
|
+
events,
|
|
123
|
+
"subscribe",
|
|
124
|
+
track(ctx.newFunction("subscribe", (eventHandle, handlerHandle) => {
|
|
125
|
+
const event = ctx.getString(eventHandle as any);
|
|
126
|
+
// Dup the handler handle so it stays alive after this callback returns.
|
|
127
|
+
const handlerDup = (handlerHandle as any).dup();
|
|
128
|
+
handles.push(handlerDup);
|
|
129
|
+
const handler = (data: unknown) => {
|
|
130
|
+
try {
|
|
131
|
+
const dataHandle = marshalToVm(ctx, data);
|
|
132
|
+
ctx.unwrapResult(ctx.callFunction(handlerDup, ctx.undefined, dataHandle));
|
|
133
|
+
dataHandle.dispose();
|
|
134
|
+
runtime.executePendingJobs();
|
|
135
|
+
} catch { /* swallow */ }
|
|
136
|
+
};
|
|
137
|
+
unsubFns.push(hostApi.events.subscribe(event, handler));
|
|
138
|
+
return ctx.undefined;
|
|
139
|
+
})),
|
|
140
|
+
);
|
|
141
|
+
ctx.setProp(
|
|
142
|
+
events,
|
|
143
|
+
"publish",
|
|
144
|
+
track(ctx.newFunction("publish", (eventHandle, dataHandle) => {
|
|
145
|
+
hostApi.events.publish(ctx.getString(eventHandle as any), marshalFromVm(ctx, dataHandle));
|
|
146
|
+
return ctx.undefined;
|
|
147
|
+
})),
|
|
148
|
+
);
|
|
149
|
+
ctx.setProp(ddPlugin, "events", events);
|
|
150
|
+
|
|
151
|
+
// ── state ──
|
|
152
|
+
const state = track(ctx.newObject());
|
|
153
|
+
ctx.setProp(
|
|
154
|
+
state,
|
|
155
|
+
"get",
|
|
156
|
+
track(ctx.newFunction("get", (keyHandle) => marshalToVm(ctx, hostApi.state.get(ctx.getString(keyHandle as any))))),
|
|
157
|
+
);
|
|
158
|
+
ctx.setProp(
|
|
159
|
+
state,
|
|
160
|
+
"set",
|
|
161
|
+
track(ctx.newFunction("set", (keyHandle, valueHandle) => {
|
|
162
|
+
hostApi.state.set(ctx.getString(keyHandle as any), marshalFromVm(ctx, valueHandle));
|
|
163
|
+
return ctx.undefined;
|
|
164
|
+
})),
|
|
165
|
+
);
|
|
166
|
+
ctx.setProp(
|
|
167
|
+
state,
|
|
168
|
+
"delete",
|
|
169
|
+
track(ctx.newFunction("delete", (keyHandle) => { hostApi.state.delete(ctx.getString(keyHandle as any)); return ctx.undefined; })),
|
|
170
|
+
);
|
|
171
|
+
ctx.setProp(
|
|
172
|
+
state,
|
|
173
|
+
"keys",
|
|
174
|
+
track(ctx.newFunction("keys", () => marshalToVm(ctx, hostApi.state.keys()))),
|
|
175
|
+
);
|
|
176
|
+
ctx.setProp(ddPlugin, "state", state);
|
|
177
|
+
|
|
178
|
+
// ── tick ──
|
|
179
|
+
const tick = track(ctx.newObject());
|
|
180
|
+
ctx.setProp(
|
|
181
|
+
tick,
|
|
182
|
+
"onTick",
|
|
183
|
+
track(ctx.newFunction("onTick", (fnHandle) => {
|
|
184
|
+
const fnDup = (fnHandle as any).dup();
|
|
185
|
+
handles.push(fnDup);
|
|
186
|
+
const cb = (dt: number, t: number) => {
|
|
187
|
+
try {
|
|
188
|
+
const tickStart = performance.now();
|
|
189
|
+
ctx.unwrapResult(ctx.callFunction(fnDup, ctx.undefined, ctx.newNumber(dt), ctx.newNumber(t)));
|
|
190
|
+
runtime.executePendingJobs();
|
|
191
|
+
const durationUs = (performance.now() - tickStart) * 1000;
|
|
192
|
+
recordTaskLatency("quickjs", durationUs, "tick");
|
|
193
|
+
getWarningEngine()?.checkInstant(METRIC_TASK_LATENCY, durationUs);
|
|
194
|
+
} catch { /* swallow */ }
|
|
195
|
+
};
|
|
196
|
+
unsubFns.push(hostApi.tick.onTick(cb));
|
|
197
|
+
return ctx.undefined;
|
|
198
|
+
})),
|
|
199
|
+
);
|
|
200
|
+
ctx.setProp(ddPlugin, "tick", tick);
|
|
201
|
+
|
|
202
|
+
// ── log ──
|
|
203
|
+
const log = track(ctx.newObject());
|
|
204
|
+
ctx.setProp(log, "info", track(ctx.newFunction("info", (m) => { hostApi.log.info(ctx.getString(m as any)); return ctx.undefined; })));
|
|
205
|
+
ctx.setProp(log, "warn", track(ctx.newFunction("warn", (m) => { hostApi.log.warn(ctx.getString(m as any)); return ctx.undefined; })));
|
|
206
|
+
ctx.setProp(log, "error", track(ctx.newFunction("error", (m) => { hostApi.log.error(ctx.getString(m as any)); return ctx.undefined; })));
|
|
207
|
+
ctx.setProp(log, "debug", track(ctx.newFunction("debug", (m) => { hostApi.log.debug(ctx.getString(m as any)); return ctx.undefined; })));
|
|
208
|
+
ctx.setProp(ddPlugin, "log", log);
|
|
209
|
+
|
|
210
|
+
// ── onDispose ──
|
|
211
|
+
ctx.setProp(
|
|
212
|
+
ddPlugin,
|
|
213
|
+
"onDispose",
|
|
214
|
+
track(ctx.newFunction("onDispose", (fnHandle) => {
|
|
215
|
+
const fnDup = (fnHandle as any).dup();
|
|
216
|
+
handles.push(fnDup);
|
|
217
|
+
// Register the dispose callback directly — the bridge calls these
|
|
218
|
+
// in dispose() while the VM is still alive.
|
|
219
|
+
disposeCbs.push(() => {
|
|
220
|
+
try {
|
|
221
|
+
ctx.unwrapResult(ctx.callFunction(fnDup, ctx.undefined));
|
|
222
|
+
runtime.executePendingJobs();
|
|
223
|
+
} catch { /* swallow */ }
|
|
224
|
+
});
|
|
225
|
+
// Also notify the host API (for external tracking).
|
|
226
|
+
hostApi.onDispose(() => {});
|
|
227
|
+
return ctx.undefined;
|
|
228
|
+
})),
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
// ── id ──
|
|
232
|
+
ctx.setProp(ddPlugin, "id", track(ctx.newString(hostApi.id)));
|
|
233
|
+
|
|
234
|
+
// Expose ddPlugin as a global.
|
|
235
|
+
ctx.setProp(ctx.global, "ddPlugin", ddPlugin);
|
|
236
|
+
|
|
237
|
+
return {
|
|
238
|
+
ctx,
|
|
239
|
+
eval(code, filename) {
|
|
240
|
+
instructions = 0;
|
|
241
|
+
const evalStart = performance.now();
|
|
242
|
+
const result = ctx.evalCode(code, filename);
|
|
243
|
+
const durationUs = (performance.now() - evalStart) * 1000;
|
|
244
|
+
recordTaskLatency("quickjs", durationUs, "eval");
|
|
245
|
+
getWarningEngine()?.checkInstant(METRIC_TASK_LATENCY, durationUs);
|
|
246
|
+
if (result.error) {
|
|
247
|
+
const err = ctx.dump(result.error);
|
|
248
|
+
result.error.dispose();
|
|
249
|
+
throw new Error(`QuickJS eval error in "${opts.pluginId}": ${err}`);
|
|
250
|
+
}
|
|
251
|
+
const val = marshalFromVm(ctx, result.value);
|
|
252
|
+
result.value.dispose();
|
|
253
|
+
return val;
|
|
254
|
+
},
|
|
255
|
+
callGlobal(fnName, ...args) {
|
|
256
|
+
instructions = 0;
|
|
257
|
+
const fn = ctx.getProp(ctx.global, fnName);
|
|
258
|
+
if (ctx.typeof(fn) !== "function") {
|
|
259
|
+
fn.dispose();
|
|
260
|
+
throw new Error(`QuickJS: global "${fnName}" is not a function`);
|
|
261
|
+
}
|
|
262
|
+
const argHandles = args.map((a) => marshalToVm(ctx, a));
|
|
263
|
+
const callStart = performance.now();
|
|
264
|
+
const result = ctx.callFunction(fn, ctx.undefined, ...argHandles);
|
|
265
|
+
const durationUs = (performance.now() - callStart) * 1000;
|
|
266
|
+
recordTaskLatency("quickjs", durationUs, fnName);
|
|
267
|
+
getWarningEngine()?.checkInstant(METRIC_TASK_LATENCY, durationUs);
|
|
268
|
+
fn.dispose();
|
|
269
|
+
argHandles.forEach((h) => { try { h.dispose?.(); } catch { /* */ } });
|
|
270
|
+
if (result.error) {
|
|
271
|
+
const err = ctx.dump(result.error);
|
|
272
|
+
result.error.dispose();
|
|
273
|
+
throw new Error(`QuickJS call error in "${opts.pluginId}": ${err}`);
|
|
274
|
+
}
|
|
275
|
+
const val = marshalFromVm(ctx, result.value);
|
|
276
|
+
result.value.dispose();
|
|
277
|
+
return val;
|
|
278
|
+
},
|
|
279
|
+
drainJobs() {
|
|
280
|
+
runtime.executePendingJobs();
|
|
281
|
+
},
|
|
282
|
+
dispose() {
|
|
283
|
+
// Run dispose callbacks while the VM is still alive.
|
|
284
|
+
disposeCbs.forEach((cb) => { cb();; });
|
|
285
|
+
disposeCbs.length = 0;
|
|
286
|
+
unsubFns.forEach((unsub) => { unsub();; });
|
|
287
|
+
// Dispose all tracked handles before the context.
|
|
288
|
+
handles.forEach((h) => { try { h.dispose?.(); } catch { /* */ } });
|
|
289
|
+
handles.length = 0;
|
|
290
|
+
ctx.dispose();
|
|
291
|
+
runtime.dispose();
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|