@lampdotdev/lamp 0.0.0-stage → 0.36.2-nightly.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +397 -2
- package/Resources/Devices/roku.json +410 -0
- package/Resources/Devices/xbox-one.json +367 -0
- package/Resources/GameKit/NOTICE.md +63 -0
- package/Resources/GameKit/apple/LampPage.swift +1813 -0
- package/Resources/GameKit/apple/LampPlayer.swift +46 -0
- package/Resources/GameKit/apple/LampWebApp.swift +63 -0
- package/Resources/GameKit/apple/LampWebGame.swift +87 -0
- package/Resources/GameKit/apple/Native.swift +12 -0
- package/Resources/GameKit/build.sh +55 -0
- package/Resources/GameKit/lamp_game.h +116 -0
- package/Resources/GameKit/lamp_host.h +19 -0
- package/Resources/GameKit/lamp_kit.cpp +61 -0
- package/Resources/GameKit/lamp_sound.cpp +455 -0
- package/Resources/GameKit/lamp_xbox.cpp +374 -0
- package/Resources/GameKit/libraries/HandmadeMath.h +3940 -0
- package/Resources/GameKit/libraries/cgltf.h +7240 -0
- package/Resources/GameKit/libraries/dr_mp3.h +5430 -0
- package/Resources/GameKit/libraries/dr_wav.h +9209 -0
- package/Resources/GameKit/libraries/sokol_debugtext.h +4754 -0
- package/Resources/GameKit/libraries/sokol_gfx.h +29558 -0
- package/Resources/GameKit/libraries/sokol_gl.h +4538 -0
- package/Resources/GameKit/libraries/sokol_log.h +335 -0
- package/Resources/GameKit/libraries/sokol_shape.h +1531 -0
- package/Resources/GameKit/libraries/stb_image.h +7988 -0
- package/Resources/GameKit/libraries/stb_vorbis.c +5584 -0
- package/Resources/GameKit/page/lamp-live.js +672 -0
- package/Resources/GameKit/scaffold/Game/game.cpp +142 -0
- package/Resources/GameKit/scaffold/Game/scene.glsl +49 -0
- package/Resources/GameKit/scaffold-web/Web/game.js +31 -0
- package/Resources/GameKit/scaffold-web/Web/index.html +13 -0
- package/Resources/GameKit/scaffold-web/Web/making.js +33 -0
- package/Resources/GameKit/scaffold-web/Web/world.js +33 -0
- package/Resources/GameKit/web/lamp-game.js +3042 -0
- package/Resources/GameKit/web/lamp-phaser.js +128 -0
- package/Resources/WebHost/App.exe +0 -0
- package/Resources/WebHost/Microsoft.Web.WebView2.Core.dll +0 -0
- package/Resources/WebHost/WebView2-LICENSE.txt +27 -0
- package/Resources/WebHost/lamp_controllers.h +1506 -0
- package/Resources/WebHost/lamp_web_host.cpp +1173 -0
- package/Resources/WebLibraries/earlier.txt +318 -0
- package/Resources/WebLibraries/phaser/LICENSE.md +20 -0
- package/Resources/WebLibraries/phaser/NOTICE.md +2 -0
- package/Resources/WebLibraries/phaser/phaser.esm.min.js +1 -0
- package/Resources/WebLibraries/qrcode/LICENSE +21 -0
- package/Resources/WebLibraries/qrcode/NOTICE.md +4 -0
- package/Resources/WebLibraries/qrcode/qrcode.js +2297 -0
- package/Resources/WebLibraries/rapier/LICENSE +201 -0
- package/Resources/WebLibraries/rapier/NOTICE.md +3 -0
- package/Resources/WebLibraries/rapier/rapier.js +2 -0
- package/Resources/WebLibraries/three/LICENSE +21 -0
- package/Resources/WebLibraries/three/NOTICE.md +4 -0
- package/Resources/WebLibraries/three/addons/animation/AnimationClipCreator.js +168 -0
- package/Resources/WebLibraries/three/addons/animation/CCDIKSolver.js +607 -0
- package/Resources/WebLibraries/three/addons/controls/ArcballControls.js +3543 -0
- package/Resources/WebLibraries/three/addons/controls/DragControls.js +452 -0
- package/Resources/WebLibraries/three/addons/controls/FirstPersonControls.js +512 -0
- package/Resources/WebLibraries/three/addons/controls/FlyControls.js +384 -0
- package/Resources/WebLibraries/three/addons/controls/MapControls.js +116 -0
- package/Resources/WebLibraries/three/addons/controls/OrbitControls.js +1985 -0
- package/Resources/WebLibraries/three/addons/controls/PointerLockControls.js +264 -0
- package/Resources/WebLibraries/three/addons/controls/TrackballControls.js +1106 -0
- package/Resources/WebLibraries/three/addons/controls/TransformControls.js +2003 -0
- package/Resources/WebLibraries/three/addons/curves/CurveExtras.js +694 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSCurve.js +169 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSSurface.js +98 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSUtils.js +532 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSVolume.js +82 -0
- package/Resources/WebLibraries/three/addons/effects/AnaglyphEffect.js +274 -0
- package/Resources/WebLibraries/three/addons/effects/AsciiEffect.js +323 -0
- package/Resources/WebLibraries/three/addons/effects/OutlineEffect.js +489 -0
- package/Resources/WebLibraries/three/addons/effects/ParallaxBarrierEffect.js +155 -0
- package/Resources/WebLibraries/three/addons/effects/StereoEffect.js +91 -0
- package/Resources/WebLibraries/three/addons/environments/ColorEnvironment.js +59 -0
- package/Resources/WebLibraries/three/addons/environments/DebugEnvironment.js +102 -0
- package/Resources/WebLibraries/three/addons/environments/RoomEnvironment.js +185 -0
- package/Resources/WebLibraries/three/addons/geometries/BoxLineGeometry.js +92 -0
- package/Resources/WebLibraries/three/addons/geometries/ConvexGeometry.js +72 -0
- package/Resources/WebLibraries/three/addons/geometries/DecalGeometry.js +420 -0
- package/Resources/WebLibraries/three/addons/geometries/LoftGeometry.js +355 -0
- package/Resources/WebLibraries/three/addons/geometries/ParametricFunctions.js +100 -0
- package/Resources/WebLibraries/three/addons/geometries/ParametricGeometry.js +172 -0
- package/Resources/WebLibraries/three/addons/geometries/RoundedBoxGeometry.js +216 -0
- package/Resources/WebLibraries/three/addons/geometries/TeapotGeometry.js +689 -0
- package/Resources/WebLibraries/three/addons/geometries/TextGeometry.js +102 -0
- package/Resources/WebLibraries/three/addons/helpers/AnimationPathHelper.js +302 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelper.js +166 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeHelper.js +166 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeHelperGPU.js +102 -0
- package/Resources/WebLibraries/three/addons/helpers/OctreeHelper.js +109 -0
- package/Resources/WebLibraries/three/addons/helpers/PositionalAudioHelper.js +169 -0
- package/Resources/WebLibraries/three/addons/helpers/RapierHelper.js +59 -0
- package/Resources/WebLibraries/three/addons/helpers/RectAreaLightHelper.js +118 -0
- package/Resources/WebLibraries/three/addons/helpers/TextureHelper.js +265 -0
- package/Resources/WebLibraries/three/addons/helpers/TextureHelperGPU.js +214 -0
- package/Resources/WebLibraries/three/addons/helpers/VertexNormalsHelper.js +155 -0
- package/Resources/WebLibraries/three/addons/helpers/VertexTangentsHelper.js +133 -0
- package/Resources/WebLibraries/three/addons/helpers/ViewHelper.js +529 -0
- package/Resources/WebLibraries/three/addons/interactive/HTMLMesh.js +617 -0
- package/Resources/WebLibraries/three/addons/interactive/InteractiveGroup.js +224 -0
- package/Resources/WebLibraries/three/addons/interactive/SelectionBox.js +324 -0
- package/Resources/WebLibraries/three/addons/interactive/SelectionHelper.js +150 -0
- package/Resources/WebLibraries/three/addons/libs/fflate.module.js +2699 -0
- package/Resources/WebLibraries/three/addons/libs/lil-gui.module.min.js +8 -0
- package/Resources/WebLibraries/three/addons/libs/meshopt_decoder.module.js +196 -0
- package/Resources/WebLibraries/three/addons/libs/potpack.module.js +125 -0
- package/Resources/WebLibraries/three/addons/libs/stats.module.js +167 -0
- package/Resources/WebLibraries/three/addons/libs/tween.module.js +876 -0
- package/Resources/WebLibraries/three/addons/lighting/ClusteredLighting.js +153 -0
- package/Resources/WebLibraries/three/addons/lighting/DynamicLighting.js +82 -0
- package/Resources/WebLibraries/three/addons/lighting/LightMapper.js +295 -0
- package/Resources/WebLibraries/three/addons/lighting/LightProbeGrid.js +923 -0
- package/Resources/WebLibraries/three/addons/lighting/LightProbeGridUtils.js +107 -0
- package/Resources/WebLibraries/three/addons/lighting/LightProbeGridWebGL.js +846 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIConeTracer.js +243 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGINode.js +617 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGISceneCollector.js +793 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIVolume.js +1440 -0
- package/Resources/WebLibraries/three/addons/lights/LightProbeGenerator.js +337 -0
- package/Resources/WebLibraries/three/addons/lights/RectAreaLightTexturesLib.js +127 -0
- package/Resources/WebLibraries/three/addons/lights/RectAreaLightUniformsLib.js +40 -0
- package/Resources/WebLibraries/three/addons/lights/SunLight.js +100 -0
- package/Resources/WebLibraries/three/addons/lights/SunLightNode.js +56 -0
- package/Resources/WebLibraries/three/addons/lights/SunLightShadow.js +319 -0
- package/Resources/WebLibraries/three/addons/lights/SunShadowNode.js +312 -0
- package/Resources/WebLibraries/three/addons/lines/Line2.js +56 -0
- package/Resources/WebLibraries/three/addons/lines/LineGeometry.js +157 -0
- package/Resources/WebLibraries/three/addons/lines/LineMaterial.js +742 -0
- package/Resources/WebLibraries/three/addons/lines/LineSegments2.js +434 -0
- package/Resources/WebLibraries/three/addons/lines/LineSegmentsGeometry.js +298 -0
- package/Resources/WebLibraries/three/addons/lines/Wireframe.js +108 -0
- package/Resources/WebLibraries/three/addons/lines/WireframeGeometry2.js +49 -0
- package/Resources/WebLibraries/three/addons/lines/webgpu/Line2.js +46 -0
- package/Resources/WebLibraries/three/addons/lines/webgpu/LineSegments2.js +419 -0
- package/Resources/WebLibraries/three/addons/lines/webgpu/Wireframe.js +86 -0
- package/Resources/WebLibraries/three/addons/loaders/EXRLoader.js +3411 -0
- package/Resources/WebLibraries/three/addons/loaders/FBXLoader.js +4660 -0
- package/Resources/WebLibraries/three/addons/loaders/FontLoader.js +262 -0
- package/Resources/WebLibraries/three/addons/loaders/GLTFLoader.js +5006 -0
- package/Resources/WebLibraries/three/addons/loaders/HDRLoader.js +463 -0
- package/Resources/WebLibraries/three/addons/loaders/MTLLoader.js +601 -0
- package/Resources/WebLibraries/three/addons/loaders/OBJLoader.js +961 -0
- package/Resources/WebLibraries/three/addons/loaders/PLYLoader.js +992 -0
- package/Resources/WebLibraries/three/addons/loaders/RGBELoader.js +18 -0
- package/Resources/WebLibraries/three/addons/loaders/STLLoader.js +423 -0
- package/Resources/WebLibraries/three/addons/loaders/SVGLoader.js +3297 -0
- package/Resources/WebLibraries/three/addons/loaders/TGALoader.js +539 -0
- package/Resources/WebLibraries/three/addons/loaders/UltraHDRLoader.js +757 -0
- package/Resources/WebLibraries/three/addons/math/Capsule.js +159 -0
- package/Resources/WebLibraries/three/addons/math/ColorConverter.js +62 -0
- package/Resources/WebLibraries/three/addons/math/ColorSpaces.js +147 -0
- package/Resources/WebLibraries/three/addons/math/ConvexHull.js +1695 -0
- package/Resources/WebLibraries/three/addons/math/ImprovedNoise.js +88 -0
- package/Resources/WebLibraries/three/addons/math/Lut.js +317 -0
- package/Resources/WebLibraries/three/addons/math/MeshSurfaceSampler.js +315 -0
- package/Resources/WebLibraries/three/addons/math/OBB.js +535 -0
- package/Resources/WebLibraries/three/addons/math/Octree.js +825 -0
- package/Resources/WebLibraries/three/addons/math/SimplexNoise.js +470 -0
- package/Resources/WebLibraries/three/addons/misc/ConvexObjectBreaker.js +539 -0
- package/Resources/WebLibraries/three/addons/misc/GPUComputationRenderer.js +508 -0
- package/Resources/WebLibraries/three/addons/misc/Gyroscope.js +78 -0
- package/Resources/WebLibraries/three/addons/misc/MorphAnimMesh.js +119 -0
- package/Resources/WebLibraries/three/addons/misc/MorphBlendMesh.js +425 -0
- package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMap.js +370 -0
- package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMapGPU.js +322 -0
- package/Resources/WebLibraries/three/addons/misc/RollerCoaster.js +661 -0
- package/Resources/WebLibraries/three/addons/misc/Sculptor.js +1679 -0
- package/Resources/WebLibraries/three/addons/misc/SculptorMesh.js +1504 -0
- package/Resources/WebLibraries/three/addons/misc/SculptorTools.js +1180 -0
- package/Resources/WebLibraries/three/addons/misc/SculptorUtils.js +345 -0
- package/Resources/WebLibraries/three/addons/misc/TileCreasedNormalsPlugin.js +270 -0
- package/Resources/WebLibraries/three/addons/misc/TubePainter.js +611 -0
- package/Resources/WebLibraries/three/addons/misc/Volume.js +520 -0
- package/Resources/WebLibraries/three/addons/misc/VolumeSlice.js +275 -0
- package/Resources/WebLibraries/three/addons/modifiers/CurveModifier.js +374 -0
- package/Resources/WebLibraries/three/addons/modifiers/CurveModifierGPU.js +256 -0
- package/Resources/WebLibraries/three/addons/modifiers/EdgeSplitModifier.js +299 -0
- package/Resources/WebLibraries/three/addons/modifiers/TessellateModifier.js +340 -0
- package/Resources/WebLibraries/three/addons/objects/GroundedSkybox.js +69 -0
- package/Resources/WebLibraries/three/addons/objects/Lensflare.js +489 -0
- package/Resources/WebLibraries/three/addons/objects/LensflareMesh.js +376 -0
- package/Resources/WebLibraries/three/addons/objects/MarchingCubes.js +1261 -0
- package/Resources/WebLibraries/three/addons/objects/Reflector.js +390 -0
- package/Resources/WebLibraries/three/addons/objects/ReflectorForSSRPass.js +393 -0
- package/Resources/WebLibraries/three/addons/objects/Refractor.js +389 -0
- package/Resources/WebLibraries/three/addons/objects/ShadowMesh.js +130 -0
- package/Resources/WebLibraries/three/addons/objects/Sky.js +342 -0
- package/Resources/WebLibraries/three/addons/objects/SkyMesh.js +403 -0
- package/Resources/WebLibraries/three/addons/objects/Water.js +374 -0
- package/Resources/WebLibraries/three/addons/objects/Water2.js +403 -0
- package/Resources/WebLibraries/three/addons/objects/Water2Mesh.js +199 -0
- package/Resources/WebLibraries/three/addons/objects/WaterMesh.js +194 -0
- package/Resources/WebLibraries/three/addons/postprocessing/AfterimagePass.js +187 -0
- package/Resources/WebLibraries/three/addons/postprocessing/BloomPass.js +274 -0
- package/Resources/WebLibraries/three/addons/postprocessing/BokehPass.js +218 -0
- package/Resources/WebLibraries/three/addons/postprocessing/ClearPass.js +97 -0
- package/Resources/WebLibraries/three/addons/postprocessing/CubeTexturePass.js +146 -0
- package/Resources/WebLibraries/three/addons/postprocessing/DotScreenPass.js +114 -0
- package/Resources/WebLibraries/three/addons/postprocessing/EffectComposer.js +365 -0
- package/Resources/WebLibraries/three/addons/postprocessing/FXAAPass.js +40 -0
- package/Resources/WebLibraries/three/addons/postprocessing/FilmPass.js +113 -0
- package/Resources/WebLibraries/three/addons/postprocessing/GTAOPass.js +735 -0
- package/Resources/WebLibraries/three/addons/postprocessing/GlitchPass.js +177 -0
- package/Resources/WebLibraries/three/addons/postprocessing/HalftonePass.js +134 -0
- package/Resources/WebLibraries/three/addons/postprocessing/LUTPass.js +138 -0
- package/Resources/WebLibraries/three/addons/postprocessing/MaskPass.js +195 -0
- package/Resources/WebLibraries/three/addons/postprocessing/OutlinePass.js +776 -0
- package/Resources/WebLibraries/three/addons/postprocessing/OutputPass.js +148 -0
- package/Resources/WebLibraries/three/addons/postprocessing/Pass.js +191 -0
- package/Resources/WebLibraries/three/addons/postprocessing/RenderPass.js +193 -0
- package/Resources/WebLibraries/three/addons/postprocessing/RenderPixelatedPass.js +314 -0
- package/Resources/WebLibraries/three/addons/postprocessing/RenderTransitionPass.js +267 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SAOPass.js +407 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SMAAPass.js +230 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SSAARenderPass.js +313 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SSAOPass.js +527 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SSRPass.js +858 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SavePass.js +132 -0
- package/Resources/WebLibraries/three/addons/postprocessing/ShaderPass.js +135 -0
- package/Resources/WebLibraries/three/addons/postprocessing/TAARenderPass.js +243 -0
- package/Resources/WebLibraries/three/addons/postprocessing/TexturePass.js +131 -0
- package/Resources/WebLibraries/three/addons/postprocessing/UnrealBloomPass.js +541 -0
- package/Resources/WebLibraries/three/addons/shaders/ACESFilmicToneMappingShader.js +96 -0
- package/Resources/WebLibraries/three/addons/shaders/AfterimageShader.js +63 -0
- package/Resources/WebLibraries/three/addons/shaders/BasicShader.js +36 -0
- package/Resources/WebLibraries/three/addons/shaders/BleachBypassShader.js +68 -0
- package/Resources/WebLibraries/three/addons/shaders/BlendShader.js +56 -0
- package/Resources/WebLibraries/three/addons/shaders/BokehShader.js +151 -0
- package/Resources/WebLibraries/three/addons/shaders/BokehShader2.js +404 -0
- package/Resources/WebLibraries/three/addons/shaders/BrightnessContrastShader.js +62 -0
- package/Resources/WebLibraries/three/addons/shaders/ColorCorrectionShader.js +59 -0
- package/Resources/WebLibraries/three/addons/shaders/ColorifyShader.js +57 -0
- package/Resources/WebLibraries/three/addons/shaders/ConvolutionShader.js +74 -0
- package/Resources/WebLibraries/three/addons/shaders/CopyShader.js +52 -0
- package/Resources/WebLibraries/three/addons/shaders/DOFMipMapShader.js +63 -0
- package/Resources/WebLibraries/three/addons/shaders/DepthLimitedBlurShader.js +183 -0
- package/Resources/WebLibraries/three/addons/shaders/DigitalGlitch.js +104 -0
- package/Resources/WebLibraries/three/addons/shaders/DotScreenShader.js +75 -0
- package/Resources/WebLibraries/three/addons/shaders/ExposureShader.js +51 -0
- package/Resources/WebLibraries/three/addons/shaders/FXAAShader.js +298 -0
- package/Resources/WebLibraries/three/addons/shaders/FilmShader.js +73 -0
- package/Resources/WebLibraries/three/addons/shaders/FocusShader.js +94 -0
- package/Resources/WebLibraries/three/addons/shaders/FreiChenShader.js +103 -0
- package/Resources/WebLibraries/three/addons/shaders/GTAOShader.js +437 -0
- package/Resources/WebLibraries/three/addons/shaders/GammaCorrectionShader.js +52 -0
- package/Resources/WebLibraries/three/addons/shaders/HalftoneShader.js +332 -0
- package/Resources/WebLibraries/three/addons/shaders/HorizontalBlurShader.js +68 -0
- package/Resources/WebLibraries/three/addons/shaders/HorizontalTiltShiftShader.js +70 -0
- package/Resources/WebLibraries/three/addons/shaders/HueSaturationShader.js +74 -0
- package/Resources/WebLibraries/three/addons/shaders/KaleidoShader.js +65 -0
- package/Resources/WebLibraries/three/addons/shaders/LuminosityHighPassShader.js +68 -0
- package/Resources/WebLibraries/three/addons/shaders/LuminosityShader.js +54 -0
- package/Resources/WebLibraries/three/addons/shaders/MirrorShader.js +62 -0
- package/Resources/WebLibraries/three/addons/shaders/NormalMapShader.js +60 -0
- package/Resources/WebLibraries/three/addons/shaders/OutputShader.js +103 -0
- package/Resources/WebLibraries/three/addons/shaders/PoissonDenoiseShader.js +230 -0
- package/Resources/WebLibraries/three/addons/shaders/RGBShiftShader.js +61 -0
- package/Resources/WebLibraries/three/addons/shaders/SAOShader.js +201 -0
- package/Resources/WebLibraries/three/addons/shaders/SMAAShader.js +489 -0
- package/Resources/WebLibraries/three/addons/shaders/SSAOShader.js +331 -0
- package/Resources/WebLibraries/three/addons/shaders/SSRShader.js +396 -0
- package/Resources/WebLibraries/three/addons/shaders/SepiaShader.js +57 -0
- package/Resources/WebLibraries/three/addons/shaders/SobelOperatorShader.js +98 -0
- package/Resources/WebLibraries/three/addons/shaders/SubsurfaceScatteringShader.js +95 -0
- package/Resources/WebLibraries/three/addons/shaders/TechnicolorShader.js +51 -0
- package/Resources/WebLibraries/three/addons/shaders/ToonShader.js +349 -0
- package/Resources/WebLibraries/three/addons/shaders/TriangleBlurShader.js +79 -0
- package/Resources/WebLibraries/three/addons/shaders/UnpackDepthRGBAShader.js +60 -0
- package/Resources/WebLibraries/three/addons/shaders/VelocityShader.js +137 -0
- package/Resources/WebLibraries/three/addons/shaders/VerticalBlurShader.js +66 -0
- package/Resources/WebLibraries/three/addons/shaders/VerticalTiltShiftShader.js +70 -0
- package/Resources/WebLibraries/three/addons/shaders/VignetteShader.js +56 -0
- package/Resources/WebLibraries/three/addons/shaders/VolumeShader.js +285 -0
- package/Resources/WebLibraries/three/addons/shaders/WaterRefractionShader.js +106 -0
- package/Resources/WebLibraries/three/addons/textures/FlakesTexture.js +54 -0
- package/Resources/WebLibraries/three/addons/tsl/WebGLNodesHandler.js +607 -0
- package/Resources/WebLibraries/three/addons/tsl/display/AfterImageNode.js +256 -0
- package/Resources/WebLibraries/three/addons/tsl/display/AnaglyphPassNode.js +550 -0
- package/Resources/WebLibraries/three/addons/tsl/display/BilateralBlurNode.js +377 -0
- package/Resources/WebLibraries/three/addons/tsl/display/BleachBypass.js +33 -0
- package/Resources/WebLibraries/three/addons/tsl/display/BloomNode.js +599 -0
- package/Resources/WebLibraries/three/addons/tsl/display/CRT.js +150 -0
- package/Resources/WebLibraries/three/addons/tsl/display/ChromaticAberrationNode.js +163 -0
- package/Resources/WebLibraries/three/addons/tsl/display/DenoiseNode.js +354 -0
- package/Resources/WebLibraries/three/addons/tsl/display/DepthOfFieldNode.js +572 -0
- package/Resources/WebLibraries/three/addons/tsl/display/DotScreenNode.js +104 -0
- package/Resources/WebLibraries/three/addons/tsl/display/FSR1Node.js +481 -0
- package/Resources/WebLibraries/three/addons/tsl/display/FXAANode.js +357 -0
- package/Resources/WebLibraries/three/addons/tsl/display/FilmNode.js +101 -0
- package/Resources/WebLibraries/three/addons/tsl/display/GTAONode.js +727 -0
- package/Resources/WebLibraries/three/addons/tsl/display/GaussianBlurNode.js +412 -0
- package/Resources/WebLibraries/three/addons/tsl/display/GodraysNode.js +604 -0
- package/Resources/WebLibraries/three/addons/tsl/display/ImportanceSampledEnvironment.js +564 -0
- package/Resources/WebLibraries/three/addons/tsl/display/LensflareNode.js +282 -0
- package/Resources/WebLibraries/three/addons/tsl/display/Lut3DNode.js +109 -0
- package/Resources/WebLibraries/three/addons/tsl/display/MotionBlur.js +33 -0
- package/Resources/WebLibraries/three/addons/tsl/display/OITPassNode.js +341 -0
- package/Resources/WebLibraries/three/addons/tsl/display/OutlineNode.js +916 -0
- package/Resources/WebLibraries/three/addons/tsl/display/ParallaxBarrierPassNode.js +90 -0
- package/Resources/WebLibraries/three/addons/tsl/display/PixelationPassNode.js +227 -0
- package/Resources/WebLibraries/three/addons/tsl/display/RGBShiftNode.js +96 -0
- package/Resources/WebLibraries/three/addons/tsl/display/RecurrentDenoiseNode.js +812 -0
- package/Resources/WebLibraries/three/addons/tsl/display/RetroPassNode.js +263 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SMAANode.js +729 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSAAPassNode.js +344 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSAONode.js +422 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSGINode.js +698 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSRNode.js +1430 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSSNode.js +479 -0
- package/Resources/WebLibraries/three/addons/tsl/display/Sepia.js +24 -0
- package/Resources/WebLibraries/three/addons/tsl/display/Shape.js +29 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SharpenNode.js +284 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SobelOperatorNode.js +168 -0
- package/Resources/WebLibraries/three/addons/tsl/display/StereoCompositePassNode.js +190 -0
- package/Resources/WebLibraries/three/addons/tsl/display/StereoPassNode.js +117 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TAAUNode.js +700 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TRAANode.js +609 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TemporalReprojectNode.js +1024 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TransitionNode.js +141 -0
- package/Resources/WebLibraries/three/addons/tsl/display/boxBlur.js +65 -0
- package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlend.js +80 -0
- package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlur.js +63 -0
- package/Resources/WebLibraries/three/addons/tsl/display/hashBlur.js +55 -0
- package/Resources/WebLibraries/three/addons/tsl/display/lensDirt.js +30 -0
- package/Resources/WebLibraries/three/addons/tsl/display/radialBlur.js +68 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/ClusteredLightsNode.js +994 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/DynamicLightsNode.js +201 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/LightProbeGridNode.js +183 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/AmbientLightDataNode.js +67 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/DirectionalLightDataNode.js +117 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/HemisphereLightDataNode.js +105 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/PointLightDataNode.js +140 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/SpotLightDataNode.js +167 -0
- package/Resources/WebLibraries/three/addons/tsl/math/Bayer.js +84 -0
- package/Resources/WebLibraries/three/addons/tsl/math/curlNoise.js +107 -0
- package/Resources/WebLibraries/three/addons/tsl/math/voronoiNoise.js +112 -0
- package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNode.js +542 -0
- package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNodeHelper.js +212 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/GroundedSkybox.js +62 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/RNoise.js +51 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/Raymarching.js +70 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/SoftParticles.js +53 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/SpecularHelpers.js +302 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/TAAUtils.js +184 -0
- package/Resources/WebLibraries/three/addons/utils/BufferGeometryUtils.js +1523 -0
- package/Resources/WebLibraries/three/addons/utils/CameraUtils.js +82 -0
- package/Resources/WebLibraries/three/addons/utils/ColorUtils.js +76 -0
- package/Resources/WebLibraries/three/addons/utils/GaussianSplatUtils.js +229 -0
- package/Resources/WebLibraries/three/addons/utils/GeometryCompressionUtils.js +547 -0
- package/Resources/WebLibraries/three/addons/utils/GeometryUtils.js +226 -0
- package/Resources/WebLibraries/three/addons/utils/LDrawUtils.js +211 -0
- package/Resources/WebLibraries/three/addons/utils/SceneOptimizer.js +459 -0
- package/Resources/WebLibraries/three/addons/utils/SceneUtils.js +363 -0
- package/Resources/WebLibraries/three/addons/utils/ShadowMapViewer.js +244 -0
- package/Resources/WebLibraries/three/addons/utils/ShadowMapViewerGPU.js +233 -0
- package/Resources/WebLibraries/three/addons/utils/SkeletonUtils.js +496 -0
- package/Resources/WebLibraries/three/addons/utils/SortUtils.js +175 -0
- package/Resources/WebLibraries/three/addons/utils/UVsDebug.js +173 -0
- package/Resources/WebLibraries/three/addons/utils/WebGLTextureUtils.js +115 -0
- package/Resources/WebLibraries/three/addons/utils/WebGPUTextureUtils.js +81 -0
- package/Resources/WebLibraries/three/addons/utils/WorkerPool.js +167 -0
- package/Resources/WebLibraries/three/addons/utils/unwrapUVs.js +865 -0
- package/Resources/WebLibraries/three/three.core.js +61162 -0
- package/Resources/WebLibraries/three/three.module.js +19537 -0
- package/Resources/WebLibraries/three/three.tsl.js +41903 -0
- package/Resources/WebLibraries/three/three.webgpu.js +53714 -0
- package/Resources/share-rules.json +64 -0
- package/Resources/skills/2d-game/SKILL.md +305 -0
- package/Resources/skills/3d-game/SKILL.md +274 -0
- package/Resources/skills/accounts/SKILL.md +41 -0
- package/Resources/skills/android-design/SKILL.md +159 -0
- package/Resources/skills/app-ai/SKILL.md +154 -0
- package/Resources/skills/app-intents/SKILL.md +31 -0
- package/Resources/skills/app-kinds/SKILL.md +122 -0
- package/Resources/skills/apple-watch/SKILL.md +43 -0
- package/Resources/skills/assets/SKILL.md +183 -0
- package/Resources/skills/building-blocks/SKILL.md +97 -0
- package/Resources/skills/device-control/SKILL.md +56 -0
- package/Resources/skills/device-integrations/SKILL.md +278 -0
- package/Resources/skills/finder-files/SKILL.md +19 -0
- package/Resources/skills/game/SKILL.md +416 -0
- package/Resources/skills/game-3d/SKILL.md +12 -0
- package/Resources/skills/game-art/SKILL.md +11 -0
- package/Resources/skills/game-feel/SKILL.md +13 -0
- package/Resources/skills/game-levels/SKILL.md +12 -0
- package/Resources/skills/game-live/SKILL.md +12 -0
- package/Resources/skills/game-physics/SKILL.md +13 -0
- package/Resources/skills/game-playtest/SKILL.md +26 -0
- package/Resources/skills/game-ui/SKILL.md +278 -0
- package/Resources/skills/github-projects/SKILL.md +62 -0
- package/Resources/skills/icloud-sync/SKILL.md +30 -0
- package/Resources/skills/iphone-hardware/SKILL.md +57 -0
- package/Resources/skills/iphone-widgets/SKILL.md +53 -0
- package/Resources/skills/lg-developer-mode/SKILL.md +152 -0
- package/Resources/skills/mac-widgets/SKILL.md +60 -0
- package/Resources/skills/maps/SKILL.md +8 -0
- package/Resources/skills/menu-bar/SKILL.md +36 -0
- package/Resources/skills/more-apps/SKILL.md +53 -0
- package/Resources/skills/phone-controllers/SKILL.md +79 -0
- package/Resources/skills/phone-pages/SKILL.md +173 -0
- package/Resources/skills/roku-developer-mode/SKILL.md +106 -0
- package/Resources/skills/scene-3d/SKILL.md +27 -0
- package/Resources/skills/scripting/SKILL.md +17 -0
- package/Resources/skills/share-extension/SKILL.md +22 -0
- package/Resources/skills/tv-design/SKILL.md +72 -0
- package/Resources/skills/web-app/SKILL.md +170 -0
- package/Resources/skills/web-game/SKILL.md +95 -0
- package/Resources/skills/web-or-native/SKILL.md +108 -0
- package/Resources/skills/wish-links/SKILL.md +156 -0
- package/THIRD_PARTY_NOTICES.md +170 -0
- package/cli/ai.mjs +237 -0
- package/cli/android.mjs +941 -0
- package/cli/app-ai.mjs +473 -0
- package/cli/browser.mjs +284 -0
- package/cli/calls.mjs +594 -0
- package/cli/dev.mjs +820 -0
- package/cli/devices.mjs +984 -0
- package/cli/lamp.mjs +1326 -0
- package/cli/lampapp.mjs +332 -0
- package/cli/lamps/android-host/LampPageGateway.kt +345 -0
- package/cli/lamps/android-host/app/build.gradle.kts +40 -0
- package/cli/lamps/android-host/build.gradle.kts +4 -0
- package/cli/lamps/android-host/game/AndroidManifest.xml +33 -0
- package/cli/lamps/android-host/game/MainActivity.kt +173 -0
- package/cli/lamps/android-host/gradle/libs.versions.toml +39 -0
- package/cli/lamps/android-host/gradle.properties +8 -0
- package/cli/lamps/android-host/page/AndroidManifest.xml +35 -0
- package/cli/lamps/android-host/page/MainActivity.kt +193 -0
- package/cli/lamps/android-host/settings.gradle.kts +30 -0
- package/cli/lamps/android-host/tools.json +43 -0
- package/cli/lamps/lamp-controllers.js +2 -0
- package/cli/lamps/lamp-for-games.js +6922 -0
- package/cli/lamps/lamp.js +7082 -0
- package/cli/lamps/mac-starter/.lamp/meta.json +1 -0
- package/cli/lamps/mac-starter/APP.md +12 -0
- package/cli/lamps/mac-starter/Package.swift +8 -0
- package/cli/lamps/mac-starter/Sources/App.swift +11 -0
- package/cli/lamps/mac-starter/Sources/ContentView.swift +17 -0
- package/cli/lamps/mac-starter/Sources/LampSupport.swift +18215 -0
- package/cli/lamps/mac-starter/build.sh +336 -0
- package/cli/lamps/mac-starter/gitignore +3 -0
- package/cli/lamps/mac-starter/lamp-starter.json +6 -0
- package/cli/lamps/web-starter/APP.md +8 -0
- package/cli/lamps/web-starter/app.js +1 -0
- package/cli/lamps/web-starter/index.html +17 -0
- package/cli/lamps/web-starter/lamp-starter.json +5 -0
- package/cli/lamps/web-starter/lamp.js +7082 -0
- package/cli/lamps/web-starter/style.css +25 -0
- package/cli/link.mjs +202 -0
- package/cli/local-ai.mjs +193 -0
- package/cli/mac.mjs +621 -0
- package/cli/mdns.mjs +205 -0
- package/cli/msix.mjs +413 -0
- package/cli/network.mjs +209 -0
- package/cli/openrouter.mjs +133 -0
- package/cli/outside.mjs +203 -0
- package/cli/page.js +317 -0
- package/cli/place.mjs +298 -0
- package/cli/png.mjs +184 -0
- package/cli/share.mjs +270 -0
- package/cli/skill/SKILL.md +280 -0
- package/cli/skills.mjs +71 -0
- package/cli/state.mjs +176 -0
- package/cli/update.mjs +162 -0
- package/package.json +20 -4
- package/site/lib/quota.js +59 -0
- package/site/lib/shared-wishes.js +1727 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Roo Code, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,398 @@
|
|
|
1
|
-
#
|
|
1
|
+
# lamp, from a terminal
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Runs an app from its folder and puts each saved change into it, for whoever is making it: a person, or a coding
|
|
4
|
+
agent in a terminal. A web app or web game is served and shown in a browser; a Mac app Lamp made in Swift is built
|
|
5
|
+
and run on the Mac. It needs no Lamp app open and has no dependencies (Node 20 or later).
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
node cli/lamp.mjs dev path/to/app --open
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`npm link` in `cli/` makes it `lamp` everywhere. The folder is one Lamp made (its page is in `Web/`), one in Lamp's
|
|
12
|
+
format (its `lamp-app.json`, at its top or in a site's `.lamp-wish/`, says what it is: a web app, a game, a screen or a
|
|
13
|
+
Mac app, `projectOf`), or any folder with an `index.html`; without one, the folder you're in. A kind lamp doesn't run
|
|
14
|
+
(an iPhone app, an app for both, Android, a TV app) or a wish of several apps is said so, to open in Lamp's app.
|
|
15
|
+
|
|
16
|
+
| Command | What it does |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| `lamp new <folder> [--name "Its Name"] [--web \| --mac]` | Makes a new web game's folder from Lamp's starting files, or with `--web` a new web app's, or with `--mac` a new Mac app in Swift. |
|
|
19
|
+
| `lamp init [--update]` | Puts Lamp's game runtime beside a page that's already there, changing none of the page's own files. `--update` writes again the Lamp files the folder has (`lamp.js` too), adding the game's only to a page that's a game already. |
|
|
20
|
+
| `lamp unpack <file.lampapp> [folder]` | Unpacks a Lamp app file into a new folder beside it, named for it. A file carries none of Lamp's own files: a page gets them beside it as it's unpacked (the runtime for a game, lamp.js, the libraries its import map names), and a Mac app gets Package.swift, build.sh and LampSupport.swift from Lamp's starting files as it's first built (`writeMacStarter`), where it has none. One with a widget, a share extension or a 3D scene is left to Lamp's app, which writes the files they're built with. |
|
|
21
|
+
| `lamp export [--to file] [--anyway]` | Makes the app's Lamp app file as Lamp's Share… does (`Sharing.export`, followed by `cli/lampapp.mjs`): its own files as its kind travels, Assets/, APP.md, what it declares, its credits with the app added to the chain, the licenses they name, its icon's design and lamp-app.json, never Lamp's own files. Refused when a license its credits name is gone or something in it is shaped like a key; `--anyway` sends work its credits give no license for. The shapes of keys, the names a license goes by and the sizes another Lamp opens are in `Resources/share-rules.json`, which Lamp's app reads too (`ShareRules`). |
|
|
22
|
+
| `lamp dev [--open] [--lan] [--port N]` | Runs the page and says how each change went. Each save goes into every open copy of it, with the card Lamp's app puts on an app taking a change (`page.js`, left out of lamp's pictures; `lamp changing "<words>"` says on it what's changing). `--open` opens a window for it; `--lan` lets other devices on the network open it. |
|
|
23
|
+
| `lamp open` | Shows the page in a window, running it in the background if it isn't running, and returns at once. |
|
|
24
|
+
| `lamp open --in-lamp` | Gives a Mac app to Lamp's app (`cli/outside.mjs`), over the socket the person's own coding agent uses (`OutsideServer`, `OutsideWork`): `open_project` takes the folder on, with Lamp's review the first time, and from then on `look`, `reload` and `dev` call `apply_change`, so a change goes into the open app as Lamp's app puts it there (`LiveReload`) and its outcome is said: live, held, reopened, not_built, crashed. `use` calls `use_app`, in plain sight in the app Lamp's app has open, and `stop` calls `close_app`. A folder Lamp's app no longer has (its refusal says `taken_on: false`) is lamp's own again, said once. `lamp open --here` has lamp run its own copy again. `LAMP_APP` names another Lamp by its bundle id (a Lamp Dev instance). A Mac app `lamp new --mac` makes has the `lamp-app.json` Lamp's app takes a folder on by. |
|
|
25
|
+
| `lamp look [--reopen] [--wait s] [--json]` | How the changes since the last look went, a picture of the page, its screen as text, new errors and the log. `--reopen` opens the page again from its beginning first. |
|
|
26
|
+
| `lamp use key w 2` | Tries it as a person would, then looks: `click`, `type`, `key` (several at once with `w+d`), `drag`, `scroll`, `wait`, and in a game on Lamp's runtime `stick` and `button`, which hold Lamp's own controller as Lamp's app does (`window.__lampDrive`) and give it back when the person plays. Several moves with `then` between them go one after another, with one look at the end. |
|
|
27
|
+
| `lamp reload [--fresh]` | Opens the page again from its files, a game from where the player is, or with `--fresh` from its beginning (`window.lampFreshStart`). |
|
|
28
|
+
| `lamp stop` | Stops running it. |
|
|
29
|
+
| `lamp share --words "…"` | Puts the page on lamp.dev: anyone with the link plays it there and can send an idea. Again, it sends the page as it is now to the same link. |
|
|
30
|
+
| `lamp share` (a page of Lamp's) | A web app or game in a Lamp's own folder is lamp's to share like any other page, Lamp open or not, to the link that Lamp keeps for it: lamp takes the link from the Lamp's `Wish Links.json` (by the app's instance id in `.lamp/meta.json`, `lampsKeptLink`) the first time, and tells it what went after each share or `unshare` (`keepInLamp`), so its Share Link card shows the link as it is. `ideas` and `unshare` take the link the same way. |
|
|
31
|
+
| `lamp share` (any other app of Lamp's) | For a folder in Lamp's own (or a link to one) that lamp doesn't share as a page, shared by Lamp's app over its socket (`share_link`, `OutsideWork`): its Share Link card filled as it fills itself (`WishLinkCards.prepare`: the link's last words, the questions and what's new Lamp writes, the app's file, the GitHub release) and shared without its window, with `--line`, `--by`, `--asks`, `--notes`, `--no-file`, `--no-github`, `--put-on-github` in place of the card's own, and `--preview` to see it first. The link's secret stays in Lamp. Which Lamp is the one whose folder it is (`lampOwning`), or the one it was given to (`lamp open --in-lamp`, `givenTo`); any other folder is lamp's to share, whatever Lamp is running, and so is a given folder when its Lamp is too old to share for lamp. |
|
|
32
|
+
| `lamp ideas [in <n> \| dismiss <n> \| reply <n> \| done <n> \| email <address\|off>] [note]` | The ideas people playing the link have sent and what's been said since, saying what became of one, and answering whoever sent it. |
|
|
33
|
+
| `lamp unshare` | Takes the link down. |
|
|
34
|
+
| `lamp account [username] [--email address]` | The maker's account on lamp.dev, which their links go under (`lamp.dev/<username>/<app>`): with a username and an email it asks the site for one (`askAccount`), whose key lamp keeps with its state (`account.json`, by site) and sends with every share (`X-Lamp-Account`); the link in the email the site sends confirms it. With only an email that has an account, it signs in to it, with a key of its own. On its own, it says which it's signed in as. A share before the email's link is opened goes out as links always have (`/w/<id>-<name>`), and moves under the username at its next share. |
|
|
35
|
+
| `lamp play <link> [--to folder] [--newest]` | Plays an app shared on lamp.dev on this computer: the link's file (`latestOf`, its `.lampapp`), unpacked as `lamp unpack` does into a folder of its own in `~/Lamp Games` (or `--to`), with Lamp's own files beside its page, then opened as `lamp open` opens any folder. Its AI is answered by `lamp dev` (`ai.mjs`) in any browser, Safari included, where a shared page can't reach the computer. lamp remembers which folder each link went into (a file for each link under `played/` in its state), so playing it again goes on where it was; `--newest` takes the link's latest version into a new folder. |
|
|
36
|
+
| `lamp ai [--forget]` | Answers the AI of pages shared on lamp.dev, played in a browser on this computer, with the person's own Claude Code, Codex or OpenRouter key (`cli/local-ai.mjs`, the same answers as `ai.mjs` gives `lamp dev`), until it's stopped. It listens on this computer alone at a port lamp.js knows (`LOCAL_AI_PORT`, `NEARBY` in lamp.js), and answers only a link's own page (`<id in hex>.play.lamp.dev`, `playOrigin`): the first time a page uses the AI, the person is asked in the terminal, and the page keeps the token it's given. Whether there's an AI is answered without asking. The browser asks the person too, once, before a page may reach this computer, so the link's frame on lamp.dev is given that permission. Safari never lets the page reach it (Safari 27, checked against a stand-in on the port), so lamp.js tells someone playing in Safari to use Chrome, Lamp or `lamp play` instead. `--forget` takes back every page allowed. Lamp's app runs the same server while it's open (`sharedPages` in `calls.mjs`, `SharedPagesAI`): it asks the person in a dialog and answers with the AI they set up in Lamp, and the pages allowed are the same list; whichever of the two starts first answers. |
|
|
37
|
+
| `lamp devices [add \| forget <name>]` | The person's devices lamp puts a page on: an Xbox in Developer Mode (those set up and those found on the network), and Android (lamp's emulators, and the phones, tablets and TVs plugged in with USB debugging on). `add` sets one up, a step at a time; `add android` downloads Android's tools. |
|
|
38
|
+
| `lamp open --on xbox` | Packages the page, installs it on the device and opens it there. `lamp look --on xbox` is the device's screen and the app's log there, `lamp stop --on xbox` ends it, and `lamp remove --on xbox` takes it off. |
|
|
39
|
+
| `lamp open --on android [--hidden]` | Builds Lamp's Android app around the page and opens it in lamp's Android emulator (`--on android-tv`: its TV emulator; a device of the person's by its name), with `look`, `stop` and `remove` as on any device, and `lamp use --on android` to tap, type and press there. `--hidden` starts the emulator with no window. |
|
|
40
|
+
| `lamp setup [--remove]` | Teaches Claude Code and Codex on this computer to work this way: a skill for each. Says so when the computer has no browser lamp can drive, which web apps and games are looked at and played in; it's advice, never a failure. |
|
|
41
|
+
| `lamp guide` | What that skill says, for any other agent. |
|
|
42
|
+
| `lamp blocks [Name]` | Lamp's building blocks for a Mac app, each with what it's for, or one in full: read from the app's own `Sources/LampSupport.swift`, whose comments say how each is used. |
|
|
43
|
+
| `lamp skills [word]`, `lamp skill <name>` | Lamp's skills (`Resources/skills`), the one place that says which building blocks to use and how: all of them or those about a word, and one in full, put together from its sections as Lamp's app does (`cli/skills.mjs` follows `Skills.assembled`). |
|
|
44
|
+
|
|
45
|
+
## For a coding agent
|
|
46
|
+
|
|
47
|
+
On a Mac with Lamp, the lamp to set up is the one in Lamp's app, which updates with Lamp and runs on the app's own
|
|
48
|
+
runtime, so no Node is needed:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
/Applications/Lamp.app/Contents/Resources/cli/lamp setup
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
To type `lamp` anywhere, Lamp's menu has Install Command-Line Tool… (`CommandLineTool`): it links `/usr/local/bin/lamp`
|
|
55
|
+
to that copy, asking for the Mac's administrator password when Lamp can't write there itself, so the command updates
|
|
56
|
+
with Lamp. A build from source or an instance names its own (`Edition.commandName`: `lamp-dev`, `lamp-dev-<instance>`).
|
|
57
|
+
The launcher finds the app it's in through the link (`${0:A:h}` in `cli/lamp.sh`).
|
|
58
|
+
|
|
59
|
+
On a computer without Lamp, lamp comes from npm, `npm install -g @lampdotdev/lamp` (it needs Node 20), and
|
|
60
|
+
`lamp setup` sets it up the same way. From a checkout of this repository, `node cli/lamp.mjs setup`.
|
|
61
|
+
|
|
62
|
+
The npm package is laid out as the repository is (`scripts/npm-package.sh <version>` packs it into `build/npm`, and with
|
|
63
|
+
`--publish` publishes it): `cli/` with the files only Lamp's code makes written first (`scripts/cli-files.sh`), the
|
|
64
|
+
site's limits for a link, and the Lamp resources lamp reads, with their licenses. A copy npm installed asks npm's
|
|
65
|
+
registry for a newer one at most once a day, in a process of its own that never holds up the command, and the next
|
|
66
|
+
command says so in one line, once a day, with the command that updates it (`cli/update.mjs`). It never updates itself.
|
|
67
|
+
A checkout updates with its repository, so it doesn't ask; nor does a copy in CI, or with `LAMP_NO_UPDATE_CHECK` set.
|
|
68
|
+
|
|
69
|
+
lamp is also published to npm from every push to main, as `nightly` (the release workflow's `cli-nightly` job, at the
|
|
70
|
+
version `scripts/cli-version.sh` gives: `0.36.2-nightly.9` for the ninth commit after 0.36.1), in minutes rather than
|
|
71
|
+
the most of an hour Lamp Nightly takes. The `lamp` that Lamp's app puts on the PATH (`cli/lamp.sh`) follows it: at most
|
|
72
|
+
once an hour a process of its own fetches the newest of its channel (Lamp Nightly's `nightly`, Lamp's `latest`; none for
|
|
73
|
+
Lamp Dev) into `~/.lamp/cli` when it's newer than the app's own copy, checked against npm's integrity hash, and the
|
|
74
|
+
launcher runs that one from then on, until the app has caught up (`~/.lamp/cli/use` names it with the app version it was
|
|
75
|
+
fetched for). Lamp's app stamps its copy with the same numbering (build.sh), so the same commit compares equal. Lamp's
|
|
76
|
+
own calls of lamp (`LampCLI`) always run the app's copy, so the app and what it asks of lamp never differ.
|
|
77
|
+
`lamp --version` says which is running.
|
|
78
|
+
|
|
79
|
+
writes one skill, [`skill/SKILL.md`](skill/SKILL.md), where each agent found on the computer reads its skills
|
|
80
|
+
(`~/.claude/skills/lamp`, `~/.codex/skills/lamp`), with the command as it's run on this computer filled in. From its
|
|
81
|
+
next session the agent uses lamp by itself in an app's folder: it opens the window for the person, changes the
|
|
82
|
+
files, looks after each change, and tries the app only when asked to. `lamp setup` replaces only a skill it wrote,
|
|
83
|
+
and `--remove` takes it away. That file is the one place that says how an agent works with lamp; `lamp guide`
|
|
84
|
+
prints it for an agent that has no skills.
|
|
85
|
+
|
|
86
|
+
Lamp's app carries the whole of lamp (`build.sh`): its modules, `page.js`, the skill, and in `lamps/` the controllers'
|
|
87
|
+
list and the files only Lamp's code makes, written by the app itself as it's built (`Lamp --cli-files`, `CLIFiles`), with
|
|
88
|
+
`lamp` beside them, a launcher on pi's runtime (`cli/lamp.sh`: pi is Bun with `BUN_BE_BUN`). Lamp's resources are found
|
|
89
|
+
beside the copy either way (`RESOURCES`: the repository's `Resources/`, or the bundle's). The skill that copy writes
|
|
90
|
+
names its launcher, so the agent always runs the lamp of the Lamp that's installed.
|
|
91
|
+
|
|
92
|
+
## How a change goes in
|
|
93
|
+
|
|
94
|
+
Files are watched; a save is handed to every open page a moment later. `APP.md` at the page's top is the app's
|
|
95
|
+
notes, never part of the page, so saving it hands nothing over; any other Markdown may be content the page loads, and is a change.
|
|
96
|
+
|
|
97
|
+
- **A game made with Lamp's runtime** (`lamp-game.js` beside the page) takes it the way it does inside Lamp. The
|
|
98
|
+
runtime is handed the change exactly as Lamp's app around the page hands it over (`window.__lampLive`), so nothing
|
|
99
|
+
in the game differs. A module that accepts changes is swapped in while the game runs (`live`); other code runs
|
|
100
|
+
again with the player where they were (`reran`); what can't go in either way opens the page again from the
|
|
101
|
+
player's place (`reopened`); and a game at a moment it can't be interrupted waits for the person's Reload (`held`).
|
|
102
|
+
- **A game whose page doesn't run on the runtime** (a folder with `lamp-game.js` whose page doesn't load it) takes
|
|
103
|
+
it as it does inside Lamp too, through `lamp-live.js`, given after `page.js`: a stylesheet, or a change inside one
|
|
104
|
+
method of a class a module exports, goes in while the game runs (`live`); anything else waits for Reload (`held`).
|
|
105
|
+
- **Any other page** opens again.
|
|
106
|
+
|
|
107
|
+
## Lamp's own files beside a game's page
|
|
108
|
+
|
|
109
|
+
Lamp's app writes some files beside a game's page at every build. A folder that came from Lamp has them, and
|
|
110
|
+
`lamp new` writes them into the folder it makes, so the folder is a whole site that runs wherever it's served from.
|
|
111
|
+
What a game's folder lacks all the same, the server gives it:
|
|
112
|
+
|
|
113
|
+
| File | Where it comes from here |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| `lamp-device.js`, `lamp-build.js` | Made by the server: the device is a browser on any device, as a page published to the web is given, and the build is named for the files as they are. |
|
|
116
|
+
| `lamp-controllers.js` | `cli/lamps/lamp-controllers.js`, the list of controllers as Lamp writes it (`Controllers.pageJS`). `CLIFilesTests` fails when the two differ, and writes the copy again when run with `LAMP_WRITE_CLI_FILES=1`. The game runtime can't load without it. |
|
|
117
|
+
| `three/`, `phaser/`, `rapier/` | Lamp's copies (`Resources/WebLibraries`), for a library the page asks for and the folder has none of. |
|
|
118
|
+
| `lamp.js` | Lamp's building blocks for a page (saved data, the app's files, AI through Lamp's app), as Lamp's own code writes them: `scripts/cli-files.sh` writes the file out (`cli/lamps/lamp.js`, and `lamp-for-games.js` as a game is given it, without a TV's remote; not committed, since they change often), and without it a stand-in that holds nothing. Its AI (`LampAI`: status, ask, act, decide) is answered by `lamp dev` itself (`ai.mjs`, through `lampGatewayHost` in `page.js`, `/__lamp/ai`, only for the page on this Mac) with the person's own Claude Code or Codex, or OpenRouter with their key in `OPENROUTER_API_KEY` (`LAMP_AI` picks one: claude, codex or openrouter; `LAMP_AI_MODEL` its model), the engines sealed as Lamp's app seals it (the same run, `complete` in ai.mjs); making pictures and hearing need Lamp's app. On a page shared on lamp.dev, Lamp's app or `lamp ai` answers it instead. |
|
|
119
|
+
|
|
120
|
+
A file the page asks for that neither the folder nor Lamp has is logged as an error, since a module that imports one
|
|
121
|
+
never runs and the page can't say so itself.
|
|
122
|
+
|
|
123
|
+
## A new game
|
|
124
|
+
|
|
125
|
+
`lamp new` copies what Lamp gives a new web game: the starting page (`Resources/GameKit/scaffold-web`), the game
|
|
126
|
+
runtime (`Resources/GameKit/web`), the libraries its import map names (three.js and Phaser), and Lamp's own files
|
|
127
|
+
beside the page (the table above). `lamp init` gives a page that's already there the same, the starting page aside. The page is at
|
|
128
|
+
the top of the folder with nothing that builds it, which is what Lamp's app opens as a site (`StaticSite.isPlain`).
|
|
129
|
+
It isn't yet an app as Lamp's app makes one: it has no manifest and none of the app around the page, which Lamp's app
|
|
130
|
+
adds when it takes the folder on. A plain web page needs no starting files.
|
|
131
|
+
|
|
132
|
+
A change saved while a page is opening isn't lost: each page says which change its files had, and is handed what came
|
|
133
|
+
after. A server started again tells its pages to open again, since it can't know what changed while it was away.
|
|
134
|
+
|
|
135
|
+
## Looking and using
|
|
136
|
+
|
|
137
|
+
`lamp look` is how whoever made a change checks it. It checks every file first (a look straight after a save can
|
|
138
|
+
come before the system says the file changed), waits for the page to finish taking the change in, and answers:
|
|
139
|
+
|
|
140
|
+
- how each change since the last look went in, in the words above, and why;
|
|
141
|
+
- a picture of the page, one pixel a point, so a point of the picture is a point to click (each look's is a file of
|
|
142
|
+
its own, and the last forty are kept);
|
|
143
|
+
- the screen as text: each control and canvas with the point at its middle, and the words shown;
|
|
144
|
+
- the errors and the log since the last look.
|
|
145
|
+
|
|
146
|
+
What it looks at:
|
|
147
|
+
|
|
148
|
+
1. **The window `lamp open` or `lamp dev --open` opened**, when there is one: what the person sees, where they are in it.
|
|
149
|
+
2. **A copy of the page with no window**, which lamp starts for itself otherwise and closes ten minutes after it was
|
|
150
|
+
last looked at. It starts where the page starts.
|
|
151
|
+
3. With no browser lamp can drive on the computer, **a page open in any browser** says what's on it, without a picture,
|
|
152
|
+
and `lamp use` can't act in it. A look with no page open yet waits for one, as long as it's given to wait. `open`,
|
|
153
|
+
`look`, `use` and `setup` each say that Chrome, Edge, Brave or Chromium is what's missing (`noBrowser` in
|
|
154
|
+
`cli/browser.mjs`).
|
|
155
|
+
|
|
156
|
+
The window and the copy are a Chromium-family browser already on the computer (Chrome, Edge, Brave, Chromium;
|
|
157
|
+
`LAMP_BROWSER` names another), started with files of its own, never the person's own browser profile, and spoken to
|
|
158
|
+
over a pipe only lamp holds. `lamp use` acts in the same page, so with a window open the person sees it happen.
|
|
159
|
+
|
|
160
|
+
`lamp open`, `lamp look` and `lamp use` start `lamp dev` in the background when it isn't running. That one ends by
|
|
161
|
+
itself half an hour after it was last used, unless its window is open, and a `lamp dev` run by hand takes its place
|
|
162
|
+
when it has no window.
|
|
163
|
+
|
|
164
|
+
## A Mac app
|
|
165
|
+
|
|
166
|
+
A folder with `Package.swift`, `build.sh` and `Sources/` and no page is an app Lamp made in Swift (`cli/mac.mjs`).
|
|
167
|
+
The folder holds all it takes, so nothing of Lamp's app is run:
|
|
168
|
+
|
|
169
|
+
- **Building** is the app's own `build.sh`, which Lamp writes: it makes `build/<Name>.app`. lamp asks first for the
|
|
170
|
+
build Lamp's app makes while an app is being changed (`LAMP_LIVE`: a debug build of a copy of the sources in
|
|
171
|
+
`.lamp/live`, a few seconds for a small change), and when that doesn't build, for the plain one, whose errors are
|
|
172
|
+
in the app's own code at its own lines. An app whose copy doesn't build though its code does is built plainly from
|
|
173
|
+
then on.
|
|
174
|
+
- **The app takes lamp for its Lamp.** Its support code reads where Lamp is from `LampInstall` in its Info.plist,
|
|
175
|
+
which Lamp's app writes into every copy it installs (`Template.installValues`). lamp writes those values into the
|
|
176
|
+
built app and signs it again: its folder, a token only the two have, and a name for what they say to each other.
|
|
177
|
+
- **Looking** is the app's own doing: asked with a notification as Lamp's app asks (`snapshot`), it pictures its own
|
|
178
|
+
windows and writes what's on them as text beside its log, in the folder's `.lamp/runtime`. No permission is asked.
|
|
179
|
+
- **Using** is the app's own driver (`LampDriver`): the actions go as Lamp's app sends them (`useApp`), signed with
|
|
180
|
+
the token, and the app answers what it did.
|
|
181
|
+
- **A change** to what the build reads (the code, the package, the app's own files) builds the app again and opens
|
|
182
|
+
it again. The app's own build writes `build/`, `.build/` and `.lamp/` in the folder, as it does under Lamp's app.
|
|
183
|
+
|
|
184
|
+
- **A new one** (`lamp new --mac`) is a copy of the folder Lamp's app makes for a new Mac app (`Template.scaffold`),
|
|
185
|
+
under the app's own name; `lamp new --web` is the same for a web app's page (`ScreenKit.fill`, `cli/lamps/web-starter`). Those files are Lamp's own code's doing, and its building blocks change often, so the copy
|
|
186
|
+
isn't kept in the repository: `scripts/cli-files.sh` writes it (`cli/lamps/mac-starter`, through `CLIFilesTests`)
|
|
187
|
+
from the code as it is, and `lamp new --mac` says to run it when there's none.
|
|
188
|
+
|
|
189
|
+
- **The build is fenced in**, as it is under Lamp's app: it runs under `sandbox-exec` with Lamp's profile for a
|
|
190
|
+
build (`Sandbox.profile`, here `buildProfile`), which closes every person's files and opens the app's own folder
|
|
191
|
+
and what a build needs, with Lamp's `swift` in front of the real one, since SwiftPM's own sandbox can't start inside
|
|
192
|
+
another. What the build made is then copied out of the folder, to lamp's state for it, and that copy is given the
|
|
193
|
+
values and run: what only lamp and the app have is never in the folder for a later build to read, and the app that
|
|
194
|
+
runs is never one a build changed after it was made.
|
|
195
|
+
|
|
196
|
+
One difference from Lamp's app remains for an app that came from someone else. Lamp's app writes `build.sh`,
|
|
197
|
+
`Package.swift` and `LampSupport.swift` afresh before every build (`Template.writeOwnedFiles`), so nothing a folder
|
|
198
|
+
brought with it in those files ever runs. lamp runs the folder's own, inside the fence: they can do what a build
|
|
199
|
+
can, in the app's folder and the temporary folders, and no more.
|
|
200
|
+
|
|
201
|
+
- **What the app asks of Lamp** as it runs goes to lamp's server for the folder (`LampInstall.port`), shown the
|
|
202
|
+
token. Its secrets (`LampSecrets`, `/app/secrets`) are kept for it with lamp's state for the folder, readable only
|
|
203
|
+
by the person, as Lamp's app keeps them for an app whose own Keychain items macOS ties to one build; and its Reload
|
|
204
|
+
(`/app/reload`) is told no change is waiting, so the app opens itself again. Its AI (`/ai/…`), sharing and the rest
|
|
205
|
+
aren't answered yet: the app is told so, and the log says what it asked for.
|
|
206
|
+
|
|
207
|
+
What stays Lamp's app's for a Mac app: putting a change in while it runs (`LiveReload`), its AI and sharing, signing
|
|
208
|
+
for a team, and the chat beside the app.
|
|
209
|
+
|
|
210
|
+
## Sharing
|
|
211
|
+
|
|
212
|
+
`lamp share` speaks the site's API through `cli/link.mjs`, the one place Lamp does, for lamp and for Lamp's app's
|
|
213
|
+
Share Link card alike (`WishLink` asks it: the `link…` calls); the limits are read from `site/lib/shared-wishes.js`, so
|
|
214
|
+
the two can't disagree, and `build.sh` puts that file and the one it reads beside lamp in the app. `cli/share.mjs` sends the link's words
|
|
215
|
+
and a picture of the page, then the page itself, zipped and sent in parts, which the site unpacks and plays on a host
|
|
216
|
+
of the link's own.
|
|
217
|
+
|
|
218
|
+
- **What goes up** is the page as it's served: every file in its folder (nothing hidden, no link followed, `APP.md`
|
|
219
|
+
left out), and for a game Lamp's own files beside it, as Lamp's app stages a page it publishes (`GamePage.stage`).
|
|
220
|
+
- **The picture and the shape** come from the page as it runs: a picture of it for the link's card, and the stage a
|
|
221
|
+
game is drawn on (its width over its height) or `fill` for a page that takes any window. A page that's logging
|
|
222
|
+
errors isn't shared without `--anyway`.
|
|
223
|
+
- **The link's secret**, which is what lets it be changed or taken down, is kept with lamp's state for the folder
|
|
224
|
+
(`link.json`, readable only by the person), never in the folder.
|
|
225
|
+
- **Not sent:** the wish's own file, which only Lamp's app makes. The link plays the page and carries its words.
|
|
226
|
+
- **`LAMP_SITE`** names another site to share to, for trying this against a copy of the site (`npm run dev` in
|
|
227
|
+
`site/` keeps links in memory). The tests run against the site's handlers the same way, and never reach lamp.dev.
|
|
228
|
+
|
|
229
|
+
## Devices
|
|
230
|
+
|
|
231
|
+
A page goes on one of the person's devices through the device's integration, the same file Lamp's app reads
|
|
232
|
+
(`Resources/Devices/*.json`): how the device is found, its setup steps, and the requests that install, open, picture
|
|
233
|
+
and remove an app. Nothing in one is code: `cli/devices.mjs` runs it (`Runner`), for lamp and for Lamp's app alike
|
|
234
|
+
(`IntegrationRunner` asks it), so a change to an integration reaches both. An Xbox is the only device lamp puts a page on
|
|
235
|
+
itself so far (`takesPages`): the one whose host for a page lamp packages for.
|
|
236
|
+
|
|
237
|
+
- **Finding** is one SSDP search of the home network, with each answer read as its integration says
|
|
238
|
+
(`searchNetwork`: its search target, a Bonjour service, or a page on the device holding words; then its identity
|
|
239
|
+
read from the device's description or its own pages), and for Lamp's app the devices no integration knows, read
|
|
240
|
+
from their UPnP descriptions. Bonjour is asked as a one-shot mDNS question from a port of lamp's own, which each
|
|
241
|
+
device answers there, so nothing listens on mDNS's own port. A device found is only shown; it's kept once a setup
|
|
242
|
+
step has passed on it, and only a kept one is ever sent anything.
|
|
243
|
+
- **Setting up** (`lamp devices add`) takes the device through its integration's steps in order. What a step asks the
|
|
244
|
+
person to type (an Xbox's Device Portal password) is read from the terminal without being shown, so an agent can't
|
|
245
|
+
give it: run without a terminal, the command says the person runs it themselves.
|
|
246
|
+
- **The guards** are the ones every request to a device has, Lamp's app's too, since this is where a request is
|
|
247
|
+
made for both ("Lamp's app", below): a request goes only to the address the device was found at,
|
|
248
|
+
which must be on the home network and never this computer; no redirect is followed; over HTTPS the device's own
|
|
249
|
+
certificate is kept the first time, per port, and another refused from then on unless the device's own root, read
|
|
250
|
+
over that first connection, signed it (an Xbox makes itself a new certificate at each restart); and the password
|
|
251
|
+
goes only to a device whose certificate is kept, in answer to the device's own request for it (as it is to a
|
|
252
|
+
device that asks plainly, and to one that asks for a digest only what its challenge makes of it).
|
|
253
|
+
- **A request** is HTTP/1.1 written out by hand on a connection lamp opened itself (`exchange`), so it goes down the
|
|
254
|
+
very connection whose certificate was just checked, and runs the same on Node and on Bun. Nothing in it may end a
|
|
255
|
+
line: the path whole and each header are checked before anything is sent.
|
|
256
|
+
- **The package** (`cli/msix.mjs`) is the one package maker, Lamp's app's too ("Lamp's app", below): the manifest,
|
|
257
|
+
the block map, the content types, the Zip64 layout and the Authenticode signature, under a key and certificate of
|
|
258
|
+
lamp's own, which the console installs beside the package. `cli/tests/fixtures/msix` keeps one small package's
|
|
259
|
+
manifest and signature as Lamp's Swift code made them before this took its place, under a key made for that alone,
|
|
260
|
+
and `cli/tests/msix.test.mjs` makes the same package and compares: the signature signs the hashes of every record,
|
|
261
|
+
the directory, the block map and the content types, so one that matches says the whole package does.
|
|
262
|
+
- **What's in it** (`cli/place.mjs`) is Lamp's web host for the console (`Resources/WebHost`, as it ships), and under
|
|
263
|
+
`Web/` the page as `lamp share` gathers it, with `lamp-device.js` saying it's on an Xbox (the integration's
|
|
264
|
+
`input`, as `GamePage.descriptor` writes it). A page with `lamp-game.js`, or whose folder's `capabilities.json` says
|
|
265
|
+
`"game": true`, is installed as a game, which the console gives more memory and its whole GPU.
|
|
266
|
+
- **Installing** follows `DeviceApps.install`: the copy there is ended, the new one sent and waited for, then
|
|
267
|
+
launched until the console lists it running, since a console only just done installing refuses for a while. Each
|
|
268
|
+
package is a newer version than the last, so it replaces it.
|
|
269
|
+
- **Looking** (`lamp look --on xbox`) is the bridge's `look` and `log`: the console's screen, whatever is on it, and
|
|
270
|
+
the log Lamp's host keeps of the page's console there.
|
|
271
|
+
- **Not here yet:** where Lamp is isn't written into the page's `lamp.js` (`DeviceSupport.fill`), so its AI isn't
|
|
272
|
+
answered on the console; a game's phone controllers; a wish's other apps; and the test run a device's setup
|
|
273
|
+
offers in Lamp's app.
|
|
274
|
+
|
|
275
|
+
## Android
|
|
276
|
+
|
|
277
|
+
A page goes on Android in Lamp's Android app around it (`GameAndroid` in Lamp's app): one app for phones, tablets and
|
|
278
|
+
TVs, which serves the page from its own assets in a WebView, reads the controllers itself and hands them to a game's
|
|
279
|
+
runtime, and sends the page's console to the device's log. `cli/android.mjs` does what Lamp's app does to build it
|
|
280
|
+
and put it somewhere.
|
|
281
|
+
|
|
282
|
+
- **The app's files are Lamp's own**, written out by `scripts/cli-files.sh` (`cli/lamps/android-host`, not committed):
|
|
283
|
+
its Gradle files, its manifest and activity for a game and for any other page, and the list of tools Lamp builds
|
|
284
|
+
with (`tools.json`: the versions, where each is downloaded from and its checksum). lamp fills in the app's names as
|
|
285
|
+
`Template.write` does. Without that folder, or off a Mac, `--on android` says so.
|
|
286
|
+
- **The project** is written in lamp's folder for the app (`~/.lamp/dev/<app>/android/`), never in the app's: Lamp's
|
|
287
|
+
host, and the page's files as `lamp share` gathers them, with `lamp-device.js` saying it's on Android. Nothing in
|
|
288
|
+
the app's folder runs in the build. A file is written only when it changed, so a build after a small change is a
|
|
289
|
+
few seconds. The package is `dev.lamp.cli.<the app's id>`, lamp's own, so a copy lamp installs never takes the
|
|
290
|
+
place of one Lamp's app installed.
|
|
291
|
+
- **The tools** are the ones every Lamp on the Mac shares (`~/Library/Developer/Lamp/Android`: Java, Google's
|
|
292
|
+
command-line tools, Gradle, the platform, the emulator and its images), and so is Gradle's cache
|
|
293
|
+
(`~/Library/Caches/Lamp/gradle`). `lamp devices add android` downloads whichever are missing, as
|
|
294
|
+
`AndroidTools.install` does: each archive checked against the checksum its maker publishes, then Google's packages
|
|
295
|
+
through its own package manager. That accepts Google's terms for them, so it asks first, and only at a terminal:
|
|
296
|
+
an agent can't answer for the person.
|
|
297
|
+
- **lamp's own** (`~/.lamp/android/`, `LAMP_ANDROID_HOME` moves it): its adb server's key to the person's devices,
|
|
298
|
+
and its emulators, a phone ("android") and a 1080p TV ("android-tv"), each made the first time a page opens in it
|
|
299
|
+
and a few gigabytes once it has run. Its adb server and its emulators are on ports no Lamp's app uses, and it
|
|
300
|
+
doesn't look for emulators on adb's usual ports: those are the person's, or another Lamp's.
|
|
301
|
+
`lamp devices forget android` closes the emulators and removes that folder.
|
|
302
|
+
- **The emulator** opens as a window of its own, where the person plays. `--hidden` starts it with no window and no
|
|
303
|
+
sound, for a check nobody watches; `lamp stop --on android` then closes it too, since nobody could. In lamp's own
|
|
304
|
+
emulator Android's first-time tip on leaving full screen is taken as read, so it doesn't cover the first look.
|
|
305
|
+
- **A device of the person's** is one adb lists: plugged in, with USB debugging on, and this computer allowed on it
|
|
306
|
+
(it asks on its own screen, once for lamp). It goes by its name, or adb's serial for it. Connecting one over Wi‑Fi
|
|
307
|
+
isn't here yet.
|
|
308
|
+
- **Looking** is the device's screen as a picture, whether the app's process is running, and what the page said
|
|
309
|
+
since it was opened (its console, which Lamp's host logs, and how Android ended the app if it did).
|
|
310
|
+
**Using** is adb's own input: a tap or a drag at a point of the picture, typing, one key, or one of a controller's
|
|
311
|
+
buttons, which the host hands the game as a controller's. There's no stick, and nothing is held with another.
|
|
312
|
+
- **Not here yet:** the page's AI (the app is told where Lamp is as it's installed, `Adb.tellApp`, and lamp has no
|
|
313
|
+
gateway), a wish's other apps, connecting a device over Wi‑Fi, and an Android app written in Kotlin.
|
|
314
|
+
|
|
315
|
+
`cli/tests/android.test.mjs` holds what lamp writes and what it asks of Gradle and adb, with stand-ins for both; it
|
|
316
|
+
runs where `cli/lamps/android-host` has been written.
|
|
317
|
+
|
|
318
|
+
## Lamp's app
|
|
319
|
+
|
|
320
|
+
What lamp does, Lamp's app has it do, rather than doing the same again in Swift. The way in is `cli/calls.mjs`, run
|
|
321
|
+
once for each call (`LampCLI.call` in Lamp's app): the call's name is its argument, what it's given is one JSON object
|
|
322
|
+
on standard input, and its answer is the last line it prints, `{"done": …}`, or `{"problem": "…"}` in a sentence for
|
|
323
|
+
what the person can put right. Anything else ends the run with its words on standard error, which Lamp's app shows as
|
|
324
|
+
its own fault.
|
|
325
|
+
|
|
326
|
+
The many small things are asked of one run that stays (`calls.mjs --serve`, `LampCLI.ask`): a line in for each,
|
|
327
|
+
`{"id", "call", "given"}`, and a line out as each finishes, in any order; `{"stop": id}` lets go of one whoever asked
|
|
328
|
+
no longer wants (a task cancelled in Lamp's app), and the run ends when its input does, which is when Lamp's app
|
|
329
|
+
does. A problem says its kind where Lamp's app acts on which it was: a device that's away, a certificate that changed.
|
|
330
|
+
|
|
331
|
+
- **What a call is given** is paths in Lamp's own folders, laid out by Lamp's app, never an app's folder: what an
|
|
332
|
+
agent wrote is read by Lamp's app on that folder's terms first. A call refuses a link in what it's handed.
|
|
333
|
+
- **The runtime** in Lamp's app is the one it already carries: its bundled agent is built on Bun, and run with
|
|
334
|
+
`BUN_BE_BUN=1` that program is Bun itself (`LampCLI.launch`, the one place that decides). So `calls.mjs` and what it
|
|
335
|
+
imports must run on Bun as well as Node; `build.sh` copies `cli/*.mjs` into the app. The tests run on both. Run
|
|
336
|
+
from a copy of Lamp's app, the command line is that app to macOS: it's on the local network only once the app is
|
|
337
|
+
allowed there (a search before that hears nothing, and a request to a device gets no answer).
|
|
338
|
+
- **The calls so far:** `msix`, an Xbox's package from a folder of files; `send`, one request to a device, with the
|
|
339
|
+
file its certificates are kept in named by Lamp's app (`pinsAt`), so each device has one store whichever asks
|
|
340
|
+
(what the person typed for a device comes with the request, on the run's input, and is kept nowhere here); `look`,
|
|
341
|
+
one look at the home network for the integrations Lamp's app gives it, with the TVs that answered read as a
|
|
342
|
+
Samsung's API and an LG's descriptions say (`tvsIn`, cli/network.mjs); `tv`, a Samsung TV read again; `search`, a
|
|
343
|
+
search for one target; `probe`, whether a device is there now, as a setup step's check asks; `run`, `open`, `putBack` and `check`, an
|
|
344
|
+
integration's sequences and a setup's checks on one device, with the values Lamp's app fills in (what the person
|
|
345
|
+
typed, from its own store, on the call's input) and, while a call waits on the device, an event that says so; `network`, the sweep
|
|
346
|
+
of this computer's subnet and every Bonjour service (cli/mdns.mjs); and `neighbours`, the gateway and subnet now. An app's own AI is told and read here too (cli/app-ai.mjs, which `lamp dev`'s answers use as well): `actStep`,
|
|
347
|
+
`actAsk` and `actRead`, a step of `LampAI.act` checked, what its route is asked and its answer read (`AppAct`); and
|
|
348
|
+
`decideAsk` and `decideRead`, a decision answered by a text model (`AppAI.decideByText`). Which route answers and
|
|
349
|
+
asking it stay in Lamp's app, with its keys and its models, except Claude Code and Codex, which `engineAnswer` runs
|
|
350
|
+
(`AppAI.viaEngine`), sealed, with the program and its settings Lamp's app chose, and OpenRouter, which
|
|
351
|
+
`openRouterText`, `openRouterChat`, `openRouterDecide` and `openRouterImage` ask with the person's key (cli/openrouter.mjs; `AppAI.viaOpenRouter`,
|
|
352
|
+
`AppAct.openRouterStep`).
|
|
353
|
+
Two things stay in Lamp's app, since only it can see them: whether macOS lets Lamp look at all, which is
|
|
354
|
+
Network.framework's to say (`DeviceProbe.localNetworkDenied`), and the neighbor table, which macOS shows only to a
|
|
355
|
+
process it lets on the local network, and the runtime Lamp carries isn't one (`Neighbours`). Moving a
|
|
356
|
+
piece of work here means a call for it, the Swift that did it deleted, and a test on each side
|
|
357
|
+
(`cli/tests/calls.test.mjs`, `LampCLITests`).
|
|
358
|
+
|
|
359
|
+
## Where things are kept
|
|
360
|
+
|
|
361
|
+
- **Nothing in a page's folder.** lamp reads the folder and never writes in it (`lamp new` and `lamp init` aside,
|
|
362
|
+
which are asked to; a Mac app's folder takes its own build, as above), so nothing of
|
|
363
|
+
lamp's is committed or published with it, and a folder Lamp's app is running too keeps its own log.
|
|
364
|
+
- **Everything lamp keeps** (the page's log, which `lamp look` names; the browser's files, so a game's saves last
|
|
365
|
+
from one run to the next; the last few pictures; which server is running) is in
|
|
366
|
+
`~/.lamp/dev/<folder's name>-<hash>/`. `LAMP_DEV_HOME` moves it. What lamp made of the app for a device (its
|
|
367
|
+
package, and which version the device has) is in `device/` there, and its Android project and build in `android/`.
|
|
368
|
+
- **The person's devices** are in `~/.lamp/devices/` (`LAMP_DEVICES_HOME` moves it), readable only by them: each
|
|
369
|
+
device's record, its kept certificates and what was typed for it, and lamp's key for signing packages. They aren't
|
|
370
|
+
Lamp's app's: a device set up in one is set up again in the other.
|
|
371
|
+
- **The port** is the folder's own, from its path (4400 to 4899), or the next free one, so two apps run side by side.
|
|
372
|
+
A folder keeps its port from run to run, since a game's saves belong to the address.
|
|
373
|
+
|
|
374
|
+
## Who it answers
|
|
375
|
+
|
|
376
|
+
The server listens on this computer only, unless `--lan` is given. It answers requests made to its own name
|
|
377
|
+
(`localhost`, and with `--lan` the computer's names on the network), nothing sent by a page of another site, and
|
|
378
|
+
never a hidden file, one outside the page, or one a link in the folder points to elsewhere. `look`, `use`, `reload` and `stop` need a token only lamp's own commands
|
|
379
|
+
can read.
|
|
380
|
+
|
|
381
|
+
## What it doesn't do yet
|
|
382
|
+
|
|
383
|
+
iPhones, and Samsung and LG TVs, as places to run; an app's AI and a game's phone controllers; and putting a change
|
|
384
|
+
into a Mac app without opening it again.
|
|
385
|
+
|
|
386
|
+
## Tests
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
node --test cli/tests/*.test.mjs
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
The nightly Mac checks also pack and install the npm tarball in a temporary folder, then run its command, read its
|
|
393
|
+
guidance and create each kind of starter. To check the package without publishing it, on a Mac:
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
scripts/npm-package.sh 0.0.0
|
|
397
|
+
node scripts/check-npm-package.mjs build/npm/lampdotdev-lamp-0.0.0.tgz
|
|
398
|
+
```
|