@holoscript/core 2.0.1 → 2.0.2

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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-3N67RLQP.cjs +1298 -0
  3. package/dist/chunk-3N67RLQP.cjs.map +1 -0
  4. package/dist/chunk-3X2EGU7Z.cjs +52 -0
  5. package/dist/chunk-3X2EGU7Z.cjs.map +1 -0
  6. package/dist/chunk-4CV4JOE5.js +24 -0
  7. package/dist/chunk-4CV4JOE5.js.map +1 -0
  8. package/dist/chunk-4OHVW4XR.cjs +1027 -0
  9. package/dist/chunk-4OHVW4XR.cjs.map +1 -0
  10. package/dist/chunk-CZLDE2OZ.cjs +28 -0
  11. package/dist/chunk-CZLDE2OZ.cjs.map +1 -0
  12. package/{src/HoloScriptRuntime.ts → dist/chunk-EU6CZMGJ.js} +437 -794
  13. package/dist/chunk-EU6CZMGJ.js.map +1 -0
  14. package/dist/chunk-KWYIVRIH.js +344 -0
  15. package/dist/chunk-KWYIVRIH.js.map +1 -0
  16. package/dist/chunk-MCP6D4LT.js +1025 -0
  17. package/dist/chunk-MCP6D4LT.js.map +1 -0
  18. package/dist/chunk-SATNCODL.js +45 -0
  19. package/dist/chunk-SATNCODL.js.map +1 -0
  20. package/dist/chunk-VMZN4EVR.cjs +347 -0
  21. package/dist/chunk-VMZN4EVR.cjs.map +1 -0
  22. package/{src/HoloScriptDebugger.ts → dist/chunk-VYIDLUCV.js} +118 -257
  23. package/dist/chunk-VYIDLUCV.js.map +1 -0
  24. package/dist/chunk-WFI4T3XB.cjs +424 -0
  25. package/dist/chunk-WFI4T3XB.cjs.map +1 -0
  26. package/dist/debugger.cjs +20 -0
  27. package/dist/debugger.cjs.map +1 -0
  28. package/dist/debugger.d.cts +171 -0
  29. package/dist/debugger.d.ts +171 -0
  30. package/dist/debugger.js +7 -0
  31. package/dist/debugger.js.map +1 -0
  32. package/dist/index.cjs +6006 -0
  33. package/dist/index.cjs.map +1 -0
  34. package/dist/index.d.cts +2482 -0
  35. package/dist/index.d.ts +2482 -0
  36. package/dist/index.js +5926 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/parser.cjs +14 -0
  39. package/dist/parser.cjs.map +1 -0
  40. package/dist/parser.d.cts +139 -0
  41. package/dist/parser.d.ts +139 -0
  42. package/dist/parser.js +5 -0
  43. package/dist/parser.js.map +1 -0
  44. package/dist/runtime.cjs +14 -0
  45. package/dist/runtime.cjs.map +1 -0
  46. package/dist/runtime.d.cts +180 -0
  47. package/dist/runtime.d.ts +180 -0
  48. package/dist/runtime.js +5 -0
  49. package/dist/runtime.js.map +1 -0
  50. package/dist/type-checker.cjs +17 -0
  51. package/dist/type-checker.cjs.map +1 -0
  52. package/dist/type-checker.d.cts +105 -0
  53. package/dist/type-checker.d.ts +105 -0
  54. package/dist/type-checker.js +4 -0
  55. package/dist/type-checker.js.map +1 -0
  56. package/dist/types-D6g4ACjP.d.cts +262 -0
  57. package/dist/types-D6g4ACjP.d.ts +262 -0
  58. package/package.json +11 -8
  59. package/src/HoloScript2DParser.js +0 -227
  60. package/src/HoloScript2DParser.ts +0 -261
  61. package/src/HoloScriptCodeParser.js +0 -1102
  62. package/src/HoloScriptCodeParser.ts +0 -1188
  63. package/src/HoloScriptDebugger.js +0 -458
  64. package/src/HoloScriptParser.js +0 -338
  65. package/src/HoloScriptParser.ts +0 -397
  66. package/src/HoloScriptPlusParser.js +0 -371
  67. package/src/HoloScriptPlusParser.ts +0 -543
  68. package/src/HoloScriptRuntime.js +0 -1399
  69. package/src/HoloScriptRuntime.test.js +0 -351
  70. package/src/HoloScriptRuntime.test.ts +0 -436
  71. package/src/HoloScriptTypeChecker.js +0 -356
  72. package/src/HoloScriptTypeChecker.ts +0 -475
  73. package/src/__tests__/GraphicsServices.test.js +0 -357
  74. package/src/__tests__/GraphicsServices.test.ts +0 -427
  75. package/src/__tests__/HoloScriptPlusParser.test.js +0 -317
  76. package/src/__tests__/HoloScriptPlusParser.test.ts +0 -392
  77. package/src/__tests__/integration.test.js +0 -336
  78. package/src/__tests__/integration.test.ts +0 -416
  79. package/src/__tests__/performance.bench.js +0 -218
  80. package/src/__tests__/performance.bench.ts +0 -262
  81. package/src/__tests__/type-checker.test.js +0 -60
  82. package/src/__tests__/type-checker.test.ts +0 -73
  83. package/src/index.js +0 -217
  84. package/src/index.ts +0 -426
  85. package/src/interop/Interoperability.js +0 -413
  86. package/src/interop/Interoperability.ts +0 -494
  87. package/src/logger.js +0 -42
  88. package/src/logger.ts +0 -57
  89. package/src/parser/EnhancedParser.js +0 -205
  90. package/src/parser/EnhancedParser.ts +0 -251
  91. package/src/parser/HoloScriptPlusParser.js +0 -928
  92. package/src/parser/HoloScriptPlusParser.ts +0 -1089
  93. package/src/runtime/HoloScriptPlusRuntime.js +0 -674
  94. package/src/runtime/HoloScriptPlusRuntime.ts +0 -861
  95. package/src/runtime/PerformanceTelemetry.js +0 -323
  96. package/src/runtime/PerformanceTelemetry.ts +0 -467
  97. package/src/runtime/RuntimeOptimization.js +0 -361
  98. package/src/runtime/RuntimeOptimization.ts +0 -416
  99. package/src/services/HololandGraphicsPipelineService.js +0 -506
  100. package/src/services/HololandGraphicsPipelineService.ts +0 -662
  101. package/src/services/PlatformPerformanceOptimizer.js +0 -356
  102. package/src/services/PlatformPerformanceOptimizer.ts +0 -503
  103. package/src/state/ReactiveState.js +0 -427
  104. package/src/state/ReactiveState.ts +0 -572
  105. package/src/tools/DeveloperExperience.js +0 -376
  106. package/src/tools/DeveloperExperience.ts +0 -438
  107. package/src/traits/AIDriverTrait.js +0 -322
  108. package/src/traits/AIDriverTrait.test.js +0 -329
  109. package/src/traits/AIDriverTrait.test.ts +0 -357
  110. package/src/traits/AIDriverTrait.ts +0 -474
  111. package/src/traits/LightingTrait.js +0 -313
  112. package/src/traits/LightingTrait.test.js +0 -410
  113. package/src/traits/LightingTrait.test.ts +0 -462
  114. package/src/traits/LightingTrait.ts +0 -505
  115. package/src/traits/MaterialTrait.js +0 -194
  116. package/src/traits/MaterialTrait.test.js +0 -286
  117. package/src/traits/MaterialTrait.test.ts +0 -329
  118. package/src/traits/MaterialTrait.ts +0 -324
  119. package/src/traits/RenderingTrait.js +0 -356
  120. package/src/traits/RenderingTrait.test.js +0 -363
  121. package/src/traits/RenderingTrait.test.ts +0 -427
  122. package/src/traits/RenderingTrait.ts +0 -555
  123. package/src/traits/VRTraitSystem.js +0 -740
  124. package/src/traits/VRTraitSystem.ts +0 -1040
  125. package/src/traits/VoiceInputTrait.js +0 -284
  126. package/src/traits/VoiceInputTrait.test.js +0 -226
  127. package/src/traits/VoiceInputTrait.test.ts +0 -252
  128. package/src/traits/VoiceInputTrait.ts +0 -401
  129. package/src/types/AdvancedTypeSystem.js +0 -226
  130. package/src/types/AdvancedTypeSystem.ts +0 -494
  131. package/src/types/HoloScriptPlus.d.ts +0 -853
  132. package/src/types.js +0 -6
  133. package/src/types.ts +0 -369
  134. package/tsconfig.json +0 -23
  135. package/tsup.config.d.ts +0 -2
  136. package/tsup.config.js +0 -18
  137. package/tsup.config.ts +0 -19
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/traits/MaterialTrait.ts","../src/traits/LightingTrait.ts","../src/traits/RenderingTrait.ts","../src/HoloScript2DParser.ts","../src/HoloScriptParser.ts","../src/parser/HoloScriptPlusParser.ts","../src/HoloScriptPlusParser.ts","../src/state/ReactiveState.ts","../src/traits/VRTraitSystem.ts","../src/runtime/HoloScriptPlusRuntime.ts","../src/traits/VoiceInputTrait.ts","../src/traits/AIDriverTrait.ts","../src/index.ts","../src/runtime/PerformanceTelemetry.ts","../src/services/HololandGraphicsPipelineService.ts","../src/services/PlatformPerformanceOptimizer.ts"],"names":["__export","MATERIAL_PRESETS","MaterialTrait","__esm","LIGHTING_PRESETS","LightingTrait","RenderingTrait","logger","HoloScriptPlusParser","HoloScriptCodeParser","__toCommonJS","effect","nodePos","HoloScriptRuntime"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @holoscript/core Material Trait\r\n *\r\n * Enables advanced material and shader properties for photorealistic rendering\r\n * Supports PBR (Physically Based Rendering) workflows\r\n */\r\n\r\nexport type MaterialType = 'pbr' | 'standard' | 'unlit' | 'transparent' | 'custom';\r\nexport type TextureChannel = 'baseColor' | 'normalMap' | 'roughnessMap' | 'metallicMap' | 'ambientOcclusionMap' | 'emissionMap' | 'heightMap';\r\n\r\n/**\r\n * Texture map configuration\r\n */\r\nexport interface TextureMap {\r\n /** Texture path or URL */\r\n path: string;\r\n \r\n /** Channel this texture maps to */\r\n channel: TextureChannel;\r\n \r\n /** UV scale (tiling) */\r\n scale?: { x: number; y: number };\r\n \r\n /** UV offset */\r\n offset?: { x: number; y: number };\r\n \r\n /** Texture filtering: linear, nearest, anisotropic */\r\n filter?: 'linear' | 'nearest' | 'anisotropic';\r\n \r\n /** Anisotropic level (1-16) */\r\n anisotropy?: number;\r\n}\r\n\r\n/**\r\n * PBR Material properties\r\n */\r\nexport interface PBRMaterial {\r\n /** Base color in linear space [0-1] */\r\n baseColor: { r: number; g: number; b: number; a?: number };\r\n \r\n /** Metallic value 0-1 */\r\n metallic: number;\r\n \r\n /** Roughness value 0-1 */\r\n roughness: number;\r\n \r\n /** Ambient occlusion 0-1 */\r\n ambientOcclusion?: number;\r\n \r\n /** Emission color and intensity */\r\n emission?: {\r\n color: { r: number; g: number; b: number };\r\n intensity: number;\r\n };\r\n \r\n /** Normal map strength */\r\n normalStrength?: number;\r\n \r\n /** Parallax/height map strength */\r\n parallaxHeight?: number;\r\n \r\n /** Index of refraction for transmission */\r\n ior?: number;\r\n \r\n /** Transmission amount for transparent materials */\r\n transmission?: number;\r\n}\r\n\r\n/**\r\n * Material configuration\r\n */\r\nexport interface MaterialConfig {\r\n /** Material type */\r\n type: MaterialType;\r\n \r\n /** Material name for reuse */\r\n name?: string;\r\n \r\n /** PBR properties (for PBR materials) */\r\n pbr?: PBRMaterial;\r\n \r\n /** Texture maps */\r\n textures?: TextureMap[];\r\n \r\n /** Double-sided rendering */\r\n doubleSided?: boolean;\r\n \r\n /** Blend mode for transparency */\r\n blendMode?: 'opaque' | 'blend' | 'additive' | 'multiply';\r\n \r\n /** Custom shader code/reference */\r\n customShader?: {\r\n vertex?: string;\r\n fragment?: string;\r\n shaderLanguage?: 'glsl' | 'hlsl' | 'shadergraph';\r\n };\r\n \r\n /** GPU memory optimization hints */\r\n optimization?: {\r\n /** Stream textures if needed */\r\n streamTextures?: boolean;\r\n \r\n /** Compress textures */\r\n compression?: 'none' | 'dxt' | 'astc' | 'basis';\r\n \r\n /** Instance this material */\r\n instanced?: boolean;\r\n \r\n /** LOD bias for texture streaming */\r\n lodBias?: number;\r\n };\r\n}\r\n\r\n/**\r\n * MaterialTrait - Enables photorealistic material rendering\r\n */\r\nexport class MaterialTrait {\r\n private material: MaterialConfig;\r\n private textureCache: Map<string, any> = new Map();\r\n\r\n constructor(config: MaterialConfig) {\r\n this.material = {\r\n ...{ type: 'pbr' as const },\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Get material properties\r\n */\r\n public getMaterial(): MaterialConfig {\r\n return { ...this.material };\r\n }\r\n\r\n /**\r\n * Update material property\r\n */\r\n public setProperty<K extends keyof MaterialConfig>(key: K, value: MaterialConfig[K]): void {\r\n this.material[key] = value;\r\n }\r\n\r\n /**\r\n * Get PBR properties\r\n */\r\n public getPBRProperties(): PBRMaterial | undefined {\r\n return this.material.pbr;\r\n }\r\n\r\n /**\r\n * Update PBR material\r\n */\r\n public updatePBR(pbr: Partial<PBRMaterial>): void {\r\n if (!this.material.pbr) {\r\n this.material.pbr = {\r\n baseColor: { r: 1, g: 1, b: 1 },\r\n metallic: 0,\r\n roughness: 0.5,\r\n };\r\n }\r\n this.material.pbr = { ...this.material.pbr, ...pbr };\r\n }\r\n\r\n /**\r\n * Add texture map\r\n */\r\n public addTexture(texture: TextureMap): void {\r\n if (!this.material.textures) {\r\n this.material.textures = [];\r\n }\r\n this.material.textures.push(texture);\r\n }\r\n\r\n /**\r\n * Get all textures\r\n */\r\n public getTextures(): TextureMap[] {\r\n return [...(this.material.textures || [])];\r\n }\r\n\r\n /**\r\n * Clear texture cache (for memory optimization)\r\n */\r\n public clearTextureCache(): void {\r\n this.textureCache.clear();\r\n }\r\n\r\n /**\r\n * Get shader code if custom\r\n */\r\n public getCustomShader() {\r\n return this.material.customShader;\r\n }\r\n\r\n /**\r\n * Set custom shader\r\n */\r\n public setCustomShader(shader: MaterialConfig['customShader']): void {\r\n this.material.customShader = shader;\r\n }\r\n\r\n /**\r\n * Get optimization hints\r\n */\r\n public getOptimization(): MaterialConfig['optimization'] {\r\n return this.material.optimization;\r\n }\r\n\r\n /**\r\n * Enable/disable texture streaming\r\n */\r\n public setTextureStreaming(enabled: boolean): void {\r\n if (!this.material.optimization) {\r\n this.material.optimization = {};\r\n }\r\n this.material.optimization.streamTextures = enabled;\r\n }\r\n\r\n /**\r\n * Set texture compression\r\n */\r\n public setCompression(compression: 'none' | 'dxt' | 'astc' | 'basis'): void {\r\n if (!this.material.optimization) {\r\n this.material.optimization = {};\r\n }\r\n this.material.optimization.compression = compression;\r\n }\r\n\r\n /**\r\n * Enable material instancing for performance\r\n */\r\n public setInstanced(instanced: boolean): void {\r\n if (!this.material.optimization) {\r\n this.material.optimization = {};\r\n }\r\n this.material.optimization.instanced = instanced;\r\n }\r\n\r\n /**\r\n * Dispose and cleanup\r\n */\r\n public dispose(): void {\r\n this.textureCache.clear();\r\n }\r\n}\r\n\r\n/**\r\n * HoloScript+ @material trait factory\r\n */\r\nexport function createMaterialTrait(config: MaterialConfig): MaterialTrait {\r\n return new MaterialTrait(config);\r\n}\r\n\r\n/**\r\n * Preset materials for common use cases\r\n */\r\nexport const MATERIAL_PRESETS = {\r\n /** Shiny metal */\r\n chrome: (): MaterialConfig => ({\r\n type: 'pbr',\r\n pbr: {\r\n baseColor: { r: 0.77, g: 0.77, b: 0.77 },\r\n metallic: 1.0,\r\n roughness: 0.1,\r\n },\r\n }),\r\n\r\n /** Rough plastic */\r\n plastic: (): MaterialConfig => ({\r\n type: 'pbr',\r\n pbr: {\r\n baseColor: { r: 1, g: 1, b: 1 },\r\n metallic: 0,\r\n roughness: 0.8,\r\n },\r\n }),\r\n\r\n /** Wood texture */\r\n wood: (): MaterialConfig => ({\r\n type: 'pbr',\r\n pbr: {\r\n baseColor: { r: 0.6, g: 0.4, b: 0.2 },\r\n metallic: 0,\r\n roughness: 0.4,\r\n },\r\n }),\r\n\r\n /** Glass */\r\n glass: (): MaterialConfig => ({\r\n type: 'transparent',\r\n blendMode: 'blend',\r\n pbr: {\r\n baseColor: { r: 1, g: 1, b: 1, a: 0.3 },\r\n metallic: 0,\r\n roughness: 0.0,\r\n ior: 1.5,\r\n transmission: 0.9,\r\n },\r\n }),\r\n\r\n /** Emissive (glowing) */\r\n emissive: (): MaterialConfig => ({\r\n type: 'pbr',\r\n pbr: {\r\n baseColor: { r: 0, g: 1, b: 0 },\r\n metallic: 0,\r\n roughness: 1.0,\r\n emission: {\r\n color: { r: 0, g: 1, b: 0 },\r\n intensity: 2.0,\r\n },\r\n },\r\n }),\r\n\r\n /** Skin material */\r\n skin: (): MaterialConfig => ({\r\n type: 'pbr',\r\n pbr: {\r\n baseColor: { r: 1, g: 0.8, b: 0.7 },\r\n metallic: 0,\r\n roughness: 0.5,\r\n ambientOcclusion: 0.8,\r\n },\r\n }),\r\n};\r\n","/**\r\n * @holoscript/core Lighting Trait\r\n *\r\n * Enables dynamic lighting with support for multiple light types,\r\n * shadows, and global illumination\r\n */\r\n\r\nexport type LightType = 'directional' | 'point' | 'spot' | 'area' | 'probe';\r\nexport type ShadowType = 'none' | 'hard' | 'soft' | 'raytraced';\r\n\r\n/**\r\n * Color definition\r\n */\r\nexport interface Color {\r\n r: number;\r\n g: number;\r\n b: number;\r\n a?: number;\r\n}\r\n\r\n/**\r\n * Vector3 position or direction\r\n */\r\nexport interface Vector3 {\r\n x: number;\r\n y: number;\r\n z: number;\r\n}\r\n\r\n/**\r\n * Shadow configuration\r\n */\r\nexport interface ShadowConfig {\r\n /** Shadow type */\r\n type: ShadowType;\r\n \r\n /** Shadow map resolution */\r\n resolution?: number;\r\n \r\n /** Shadow bias to prevent artifacts */\r\n bias?: number;\r\n \r\n /** Softness/blur radius */\r\n softness?: number;\r\n \r\n /** Max shadow distance */\r\n maxDistance?: number;\r\n \r\n /** Cascade levels for directional lights */\r\n cascades?: number;\r\n}\r\n\r\n/**\r\n * Light source definition\r\n */\r\nexport interface LightSource {\r\n /** Light type */\r\n type: LightType;\r\n \r\n /** Light name */\r\n name?: string;\r\n \r\n /** Position in world space */\r\n position?: Vector3;\r\n \r\n /** Direction (for directional/spot) */\r\n direction?: Vector3;\r\n \r\n /** Color */\r\n color: Color;\r\n \r\n /** Intensity/brightness 0-1+ */\r\n intensity: number;\r\n \r\n /** Attenuation range (point/spot) */\r\n range?: number;\r\n \r\n /** Spot angle in degrees */\r\n spotAngle?: number;\r\n \r\n /** Inner spot angle */\r\n innerSpotAngle?: number;\r\n \r\n /** Shadow configuration */\r\n shadow?: ShadowConfig;\r\n \r\n /** Light cookie/projection */\r\n cookie?: string;\r\n \r\n /** Enable volumetric fog interaction */\r\n volumetric?: boolean;\r\n \r\n /** Light priority for batching */\r\n priority?: number;\r\n}\r\n\r\n/**\r\n * Global illumination configuration\r\n */\r\nexport interface GlobalIlluminationConfig {\r\n /** Enable global illumination */\r\n enabled: boolean;\r\n \r\n /** Intensity multiplier */\r\n intensity?: number;\r\n \r\n /** Sky color for ambient light */\r\n skyColor?: Color;\r\n \r\n /** Sky intensity */\r\n skyIntensity?: number;\r\n \r\n /** Ground color for ambient light */\r\n groundColor?: Color;\r\n \r\n /** Ground intensity */\r\n groundIntensity?: number;\r\n \r\n /** Use light probes */\r\n probes?: boolean;\r\n \r\n /** Indirect diffuse intensity */\r\n indirectDiffuse?: number;\r\n \r\n /** Indirect specular intensity */\r\n indirectSpecular?: number;\r\n \r\n /** Ambient occlusion intensity */\r\n aoIntensity?: number;\r\n \r\n /** Use screen-space AO */\r\n screenSpaceAO?: boolean;\r\n}\r\n\r\n/**\r\n * LightingTrait - Manages dynamic lighting and illumination\r\n */\r\nexport class LightingTrait {\r\n private lights: Map<string, LightSource> = new Map();\r\n private globalIllumination: GlobalIlluminationConfig;\r\n private lightIdCounter: number = 0;\r\n\r\n constructor(config?: GlobalIlluminationConfig) {\r\n this.globalIllumination = {\r\n enabled: true,\r\n intensity: 1.0,\r\n skyColor: { r: 0.5, g: 0.7, b: 1.0 },\r\n skyIntensity: 1.0,\r\n groundColor: { r: 0.4, g: 0.4, b: 0.4 },\r\n groundIntensity: 0.5,\r\n probes: true,\r\n indirectDiffuse: 1.0,\r\n indirectSpecular: 1.0,\r\n aoIntensity: 1.0,\r\n screenSpaceAO: true,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Add a light to the scene\r\n */\r\n public addLight(light: LightSource): string {\r\n const id = light.name || `light_${this.lightIdCounter++}`;\r\n this.lights.set(id, light);\r\n return id;\r\n }\r\n\r\n /**\r\n * Get light by ID\r\n */\r\n public getLight(id: string): LightSource | undefined {\r\n return this.lights.get(id);\r\n }\r\n\r\n /**\r\n * Get all lights\r\n */\r\n public getLights(): LightSource[] {\r\n return Array.from(this.lights.values());\r\n }\r\n\r\n /**\r\n * Get lights by type\r\n */\r\n public getLightsByType(type: LightType): LightSource[] {\r\n return Array.from(this.lights.values()).filter(l => l.type === type);\r\n }\r\n\r\n /**\r\n * Update light properties\r\n */\r\n public updateLight(id: string, updates: Partial<LightSource>): boolean {\r\n const light = this.lights.get(id);\r\n if (!light) return false;\r\n this.lights.set(id, { ...light, ...updates });\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove light\r\n */\r\n public removeLight(id: string): boolean {\r\n return this.lights.delete(id);\r\n }\r\n\r\n /**\r\n * Clear all lights\r\n */\r\n public clearLights(): void {\r\n this.lights.clear();\r\n }\r\n\r\n /**\r\n * Get global illumination config\r\n */\r\n public getGlobalIllumination(): GlobalIlluminationConfig {\r\n return { ...this.globalIllumination };\r\n }\r\n\r\n /**\r\n * Update global illumination\r\n */\r\n public updateGlobalIllumination(\r\n updates: Partial<GlobalIlluminationConfig>\r\n ): void {\r\n this.globalIllumination = {\r\n ...this.globalIllumination,\r\n ...updates,\r\n };\r\n }\r\n\r\n /**\r\n * Enable/disable GI\r\n */\r\n public setGIEnabled(enabled: boolean): void {\r\n this.globalIllumination.enabled = enabled;\r\n }\r\n\r\n /**\r\n * Set ambient light colors (skybox mode)\r\n */\r\n public setAmbientLight(\r\n skyColor: Color,\r\n groundColor: Color,\r\n intensity: number = 1.0\r\n ): void {\r\n this.globalIllumination.skyColor = skyColor;\r\n this.globalIllumination.groundColor = groundColor;\r\n this.globalIllumination.skyIntensity = intensity;\r\n this.globalIllumination.groundIntensity = intensity * 0.5;\r\n }\r\n\r\n /**\r\n * Enable/disable screen-space ambient occlusion\r\n */\r\n public setScreenSpaceAO(enabled: boolean, intensity: number = 1.0): void {\r\n this.globalIllumination.screenSpaceAO = enabled;\r\n this.globalIllumination.aoIntensity = intensity;\r\n }\r\n\r\n /**\r\n * Create directional light (sun)\r\n */\r\n public createDirectionalLight(\r\n direction: Vector3,\r\n color: Color,\r\n intensity: number = 1.0,\r\n castShadows: boolean = true\r\n ): string {\r\n const light: LightSource = {\r\n type: 'directional',\r\n name: `sun_${this.lightIdCounter}`,\r\n direction,\r\n color,\r\n intensity,\r\n shadow: castShadows\r\n ? {\r\n type: 'soft',\r\n resolution: 2048,\r\n cascades: 4,\r\n softness: 1.0,\r\n }\r\n : undefined,\r\n volumetric: true,\r\n priority: 100,\r\n };\r\n return this.addLight(light);\r\n }\r\n\r\n /**\r\n * Create point light\r\n */\r\n public createPointLight(\r\n position: Vector3,\r\n color: Color,\r\n intensity: number,\r\n range: number,\r\n castShadows: boolean = false\r\n ): string {\r\n const light: LightSource = {\r\n type: 'point',\r\n name: `point_${this.lightIdCounter}`,\r\n position,\r\n color,\r\n intensity,\r\n range,\r\n shadow: castShadows\r\n ? {\r\n type: 'soft',\r\n resolution: 512,\r\n softness: 0.5,\r\n }\r\n : undefined,\r\n priority: 50,\r\n };\r\n return this.addLight(light);\r\n }\r\n\r\n /**\r\n * Create spot light\r\n */\r\n public createSpotLight(\r\n position: Vector3,\r\n direction: Vector3,\r\n color: Color,\r\n intensity: number,\r\n range: number,\r\n spotAngle: number = 45,\r\n castShadows: boolean = true\r\n ): string {\r\n const light: LightSource = {\r\n type: 'spot',\r\n name: `spot_${this.lightIdCounter}`,\r\n position,\r\n direction,\r\n color,\r\n intensity,\r\n range,\r\n spotAngle,\r\n innerSpotAngle: spotAngle * 0.5,\r\n shadow: castShadows\r\n ? {\r\n type: 'soft',\r\n resolution: 1024,\r\n softness: 0.8,\r\n }\r\n : undefined,\r\n priority: 75,\r\n };\r\n return this.addLight(light);\r\n }\r\n\r\n /**\r\n * Create area light for soft lighting\r\n */\r\n public createAreaLight(\r\n position: Vector3,\r\n color: Color,\r\n intensity: number,\r\n width: number,\r\n height: number\r\n ): string {\r\n const light: LightSource = {\r\n type: 'area',\r\n name: `area_${this.lightIdCounter}`,\r\n position,\r\n color,\r\n intensity,\r\n range: Math.max(width, height) * 2,\r\n priority: 25,\r\n };\r\n return this.addLight(light);\r\n }\r\n\r\n /**\r\n * Get shadow-casting lights\r\n */\r\n public getShadowCastingLights(): LightSource[] {\r\n return Array.from(this.lights.values()).filter(l => l.shadow && l.shadow.type !== 'none');\r\n }\r\n\r\n /**\r\n * Get light count by type\r\n */\r\n public getLightCount(): { [key in LightType]: number } {\r\n const counts = {\r\n directional: 0,\r\n point: 0,\r\n spot: 0,\r\n area: 0,\r\n probe: 0,\r\n };\r\n for (const light of this.lights.values()) {\r\n counts[light.type]++;\r\n }\r\n return counts;\r\n }\r\n\r\n /**\r\n * Estimate light impact for performance optimization\r\n */\r\n public getPerformanceImpact(): {\r\n totalLights: number;\r\n shadowCasters: number;\r\n estimatedGPUCost: 'low' | 'medium' | 'high';\r\n } {\r\n const totalLights = this.lights.size;\r\n const shadowCasters = this.getShadowCastingLights().length;\r\n\r\n let estimatedGPUCost: 'low' | 'medium' | 'high' = 'low';\r\n if (totalLights > 16 || shadowCasters > 4) {\r\n estimatedGPUCost = 'high';\r\n } else if (totalLights > 8 || shadowCasters > 2) {\r\n estimatedGPUCost = 'medium';\r\n }\r\n\r\n return {\r\n totalLights,\r\n shadowCasters,\r\n estimatedGPUCost,\r\n };\r\n }\r\n\r\n /**\r\n * Get scene complexity info\r\n */\r\n public getSceneInfo(): string {\r\n const counts = this.getLightCount();\r\n const impact = this.getPerformanceImpact();\r\n return `Lighting: ${counts.directional} dir, ${counts.point} point, ${counts.spot} spot | ` +\r\n `Shadows: ${impact.shadowCasters} | GPU: ${impact.estimatedGPUCost}`;\r\n }\r\n\r\n /**\r\n * Dispose and cleanup\r\n */\r\n public dispose(): void {\r\n this.lights.clear();\r\n }\r\n}\r\n\r\n/**\r\n * HoloScript+ @lighting trait factory\r\n */\r\nexport function createLightingTrait(config?: GlobalIlluminationConfig): LightingTrait {\r\n return new LightingTrait(config);\r\n}\r\n\r\n/**\r\n * Preset lighting configurations\r\n */\r\nexport const LIGHTING_PRESETS = {\r\n /** Neutral studio lighting */\r\n studio: (): GlobalIlluminationConfig => ({\r\n enabled: true,\r\n intensity: 1.0,\r\n skyColor: { r: 0.5, g: 0.5, b: 0.5 },\r\n skyIntensity: 0.5,\r\n groundColor: { r: 0.3, g: 0.3, b: 0.3 },\r\n groundIntensity: 0.3,\r\n }),\r\n\r\n /** Bright outdoor lighting */\r\n outdoor: (): GlobalIlluminationConfig => ({\r\n enabled: true,\r\n intensity: 1.2,\r\n skyColor: { r: 0.7, g: 0.85, b: 1.0 },\r\n skyIntensity: 1.0,\r\n groundColor: { r: 0.4, g: 0.4, b: 0.35 },\r\n groundIntensity: 0.6,\r\n indirectDiffuse: 1.2,\r\n }),\r\n\r\n /** Dim interior lighting */\r\n interior: (): GlobalIlluminationConfig => ({\r\n enabled: true,\r\n intensity: 0.6,\r\n skyColor: { r: 0.3, g: 0.3, b: 0.35 },\r\n skyIntensity: 0.4,\r\n groundColor: { r: 0.2, g: 0.2, b: 0.2 },\r\n groundIntensity: 0.2,\r\n }),\r\n\r\n /** Night scene */\r\n night: (): GlobalIlluminationConfig => ({\r\n enabled: true,\r\n intensity: 0.3,\r\n skyColor: { r: 0.01, g: 0.01, b: 0.02 },\r\n skyIntensity: 0.1,\r\n groundColor: { r: 0.02, g: 0.02, b: 0.02 },\r\n groundIntensity: 0.05,\r\n screenSpaceAO: false,\r\n }),\r\n\r\n /** Sunset/golden hour */\r\n sunset: (): GlobalIlluminationConfig => ({\r\n enabled: true,\r\n intensity: 1.1,\r\n skyColor: { r: 1.0, g: 0.7, b: 0.3 },\r\n skyIntensity: 1.0,\r\n groundColor: { r: 0.6, g: 0.4, b: 0.2 },\r\n groundIntensity: 0.8,\r\n }),\r\n};\r\n","/**\r\n * @holoscript/core Rendering Trait\r\n *\r\n * Enables GPU optimization directives, level of detail management,\r\n * and rendering performance tuning\r\n */\r\n\r\nexport type CullingMode = 'none' | 'back' | 'front' | 'both';\r\nexport type LodStrategy = 'automatic' | 'manual' | 'disabled';\r\nexport type GPUResourceTier = 'low' | 'medium' | 'high' | 'ultra';\r\n\r\n/**\r\n * Level of Detail configuration\r\n */\r\nexport interface LODLevel {\r\n /** LOD level (0 = highest detail) */\r\n level: number;\r\n \r\n /** Screen-relative size threshold for this LOD */\r\n screenRelativeSize: number;\r\n \r\n /** Polygon reduction ratio (0-1) */\r\n polygonReduction?: number;\r\n \r\n /** Disable features at this LOD */\r\n disabledFeatures?: ('shadows' | 'normals' | 'specular' | 'animation')[];\r\n \r\n /** Texture resolution multiplier (0.25 = 1/4 resolution) */\r\n textureScale?: number;\r\n}\r\n\r\n/**\r\n * Culling configuration\r\n */\r\nexport interface CullingConfig {\r\n /** Face culling mode */\r\n mode: CullingMode;\r\n \r\n /** Frustum culling */\r\n frustum?: boolean;\r\n \r\n /** Occlusion culling */\r\n occlusion?: boolean;\r\n \r\n /** Occlusion query distance in units */\r\n occlusionDistance?: number;\r\n \r\n /** Hierarchical Z-buffer culling */\r\n hierarchicalZ?: boolean;\r\n}\r\n\r\n/**\r\n * Batching configuration\r\n */\r\nexport interface BatchingConfig {\r\n /** Static batching (for non-moving objects) */\r\n static?: boolean;\r\n \r\n /** Dynamic batching */\r\n dynamic?: boolean;\r\n \r\n /** Max batch size in vertices */\r\n maxBatchSize?: number;\r\n \r\n /** GPU instancing */\r\n instancing?: boolean;\r\n \r\n /** Instancing buffer size */\r\n maxInstanceCount?: number;\r\n}\r\n\r\n/**\r\n * Texture optimization\r\n */\r\nexport interface TextureOptimization {\r\n /** Enable texture streaming */\r\n streaming?: boolean;\r\n \r\n /** Streaming budget in MB */\r\n streamingBudget?: number;\r\n \r\n /** Virtual texture paging */\r\n virtualTexturing?: boolean;\r\n \r\n /** Texture compression */\r\n compression?: 'none' | 'dxt' | 'astc' | 'basis' | 'auto';\r\n \r\n /** Mipmap generation */\r\n mipmaps?: boolean;\r\n \r\n /** Max texture resolution */\r\n maxResolution?: 256 | 512 | 1024 | 2048 | 4096;\r\n}\r\n\r\n/**\r\n * Shader optimization\r\n */\r\nexport interface ShaderOptimization {\r\n /** Shader LOD bias */\r\n lodBias?: number;\r\n \r\n /** Use simplified shaders for distant objects */\r\n simplifiedShaders?: boolean;\r\n \r\n /** Compile shader variants for performance */\r\n variants?: {\r\n [key: string]: {\r\n enabled: boolean;\r\n cost?: 'low' | 'medium' | 'high';\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Rendering optimization hints\r\n */\r\nexport interface RenderingOptimization {\r\n /** LOD strategy */\r\n lodStrategy?: LodStrategy;\r\n \r\n /** LOD levels */\r\n lodLevels?: LODLevel[];\r\n \r\n /** Culling configuration */\r\n culling?: CullingConfig;\r\n \r\n /** Batching configuration */\r\n batching?: BatchingConfig;\r\n \r\n /** Texture optimization */\r\n textures?: TextureOptimization;\r\n \r\n /** Shader optimization */\r\n shaders?: ShaderOptimization;\r\n \r\n /** Target GPU tier */\r\n targetGPUTier?: GPUResourceTier;\r\n \r\n /** Fixed time-step rendering (for VR/AR) */\r\n fixedTimestep?: number;\r\n \r\n /** Enable adaptive quality */\r\n adaptiveQuality?: boolean;\r\n \r\n /** Target frame rate */\r\n targetFrameRate?: number;\r\n}\r\n\r\n/**\r\n * RenderingTrait - Manages GPU optimization and rendering performance\r\n */\r\nexport class RenderingTrait {\r\n private optimization: RenderingOptimization;\r\n\r\n constructor(config?: RenderingOptimization) {\r\n this.optimization = {\r\n lodStrategy: 'automatic',\r\n culling: {\r\n mode: 'back',\r\n frustum: true,\r\n occlusion: true,\r\n },\r\n batching: {\r\n static: true,\r\n dynamic: true,\r\n instancing: true,\r\n maxInstanceCount: 1000,\r\n },\r\n textures: {\r\n streaming: true,\r\n compression: 'auto',\r\n mipmaps: true,\r\n maxResolution: 2048,\r\n },\r\n shaders: {\r\n simplifiedShaders: true,\r\n lodBias: 0,\r\n },\r\n targetGPUTier: 'high',\r\n adaptiveQuality: true,\r\n targetFrameRate: 60,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Get rendering optimization config\r\n */\r\n public getOptimization(): RenderingOptimization {\r\n return JSON.parse(JSON.stringify(this.optimization));\r\n }\r\n\r\n /**\r\n * Update rendering configuration\r\n */\r\n public updateOptimization(updates: Partial<RenderingOptimization>): void {\r\n this.optimization = { ...this.optimization, ...updates };\r\n }\r\n\r\n /**\r\n * Setup LOD levels (3 levels is typical)\r\n */\r\n public setupLODLevels(strategy: LodStrategy = 'automatic'): void {\r\n const levels: LODLevel[] = [\r\n {\r\n level: 0,\r\n screenRelativeSize: 0.5,\r\n polygonReduction: 1.0,\r\n textureScale: 1.0,\r\n },\r\n {\r\n level: 1,\r\n screenRelativeSize: 0.25,\r\n polygonReduction: 0.6,\r\n disabledFeatures: ['specular'],\r\n textureScale: 0.5,\r\n },\r\n {\r\n level: 2,\r\n screenRelativeSize: 0.1,\r\n polygonReduction: 0.3,\r\n disabledFeatures: ['specular', 'normals'],\r\n textureScale: 0.25,\r\n },\r\n ];\r\n\r\n this.optimization.lodStrategy = strategy;\r\n this.optimization.lodLevels = levels;\r\n }\r\n\r\n /**\r\n * Get LOD levels\r\n */\r\n public getLODLevels(): LODLevel[] {\r\n return [...(this.optimization.lodLevels || [])];\r\n }\r\n\r\n /**\r\n * Configure culling\r\n */\r\n public setCulling(config: Partial<CullingConfig>): void {\r\n const defaultCulling: CullingConfig = { mode: 'back' };\r\n this.optimization.culling = {\r\n ...defaultCulling,\r\n ...this.optimization.culling,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Enable frustum culling\r\n */\r\n public setFrustumCulling(enabled: boolean): void {\r\n if (!this.optimization.culling) {\r\n this.optimization.culling = { mode: 'back' };\r\n }\r\n this.optimization.culling.frustum = enabled;\r\n }\r\n\r\n /**\r\n * Enable occlusion culling\r\n */\r\n public setOcclusionCulling(\r\n enabled: boolean,\r\n distance?: number\r\n ): void {\r\n if (!this.optimization.culling) {\r\n this.optimization.culling = { mode: 'back' };\r\n }\r\n this.optimization.culling.occlusion = enabled;\r\n if (distance) {\r\n this.optimization.culling.occlusionDistance = distance;\r\n }\r\n }\r\n\r\n /**\r\n * Configure batching\r\n */\r\n public setBatching(config: Partial<BatchingConfig>): void {\r\n this.optimization.batching = {\r\n ...this.optimization.batching,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Enable GPU instancing\r\n */\r\n public setInstancing(enabled: boolean, maxInstances?: number): void {\r\n if (!this.optimization.batching) {\r\n this.optimization.batching = {};\r\n }\r\n this.optimization.batching.instancing = enabled;\r\n if (maxInstances) {\r\n this.optimization.batching.maxInstanceCount = maxInstances;\r\n }\r\n }\r\n\r\n /**\r\n * Configure texture optimization\r\n */\r\n public setTextureOptimization(config: Partial<TextureOptimization>): void {\r\n this.optimization.textures = {\r\n ...this.optimization.textures,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Enable texture streaming\r\n */\r\n public setTextureStreaming(\r\n enabled: boolean,\r\n budgetMB?: number\r\n ): void {\r\n if (!this.optimization.textures) {\r\n this.optimization.textures = {};\r\n }\r\n this.optimization.textures.streaming = enabled;\r\n if (budgetMB) {\r\n this.optimization.textures.streamingBudget = budgetMB;\r\n }\r\n }\r\n\r\n /**\r\n * Set texture compression\r\n */\r\n public setTextureCompression(\r\n compression: 'none' | 'dxt' | 'astc' | 'basis' | 'auto'\r\n ): void {\r\n if (!this.optimization.textures) {\r\n this.optimization.textures = {};\r\n }\r\n this.optimization.textures.compression = compression;\r\n }\r\n\r\n /**\r\n * Set max texture resolution\r\n */\r\n public setMaxTextureResolution(\r\n resolution: 256 | 512 | 1024 | 2048 | 4096\r\n ): void {\r\n if (!this.optimization.textures) {\r\n this.optimization.textures = {};\r\n }\r\n this.optimization.textures.maxResolution = resolution;\r\n }\r\n\r\n /**\r\n * Configure shader optimization\r\n */\r\n public setShaderOptimization(config: Partial<ShaderOptimization>): void {\r\n this.optimization.shaders = {\r\n ...this.optimization.shaders,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Set target GPU tier\r\n */\r\n public setTargetGPUTier(tier: GPUResourceTier): void {\r\n this.optimization.targetGPUTier = tier;\r\n }\r\n\r\n /**\r\n * Enable adaptive quality (adjust based on frame rate)\r\n */\r\n public setAdaptiveQuality(\r\n enabled: boolean,\r\n targetFrameRate?: number\r\n ): void {\r\n this.optimization.adaptiveQuality = enabled;\r\n if (targetFrameRate) {\r\n this.optimization.targetFrameRate = targetFrameRate;\r\n }\r\n }\r\n\r\n /**\r\n * Set fixed timestep for VR/AR\r\n */\r\n public setFixedTimestep(timestep: number): void {\r\n this.optimization.fixedTimestep = timestep;\r\n }\r\n\r\n /**\r\n * Get rendering preset for quality level\r\n */\r\n public getPresetForQuality(\r\n quality: 'low' | 'medium' | 'high' | 'ultra'\r\n ): RenderingOptimization {\r\n const presets: Record<string, Partial<RenderingOptimization>> = {\r\n low: {\r\n targetGPUTier: 'low',\r\n lodStrategy: 'automatic',\r\n culling: { mode: 'back', frustum: true, occlusion: false },\r\n batching: { instancing: true, maxInstanceCount: 500 },\r\n textures: {\r\n compression: 'astc',\r\n maxResolution: 512,\r\n streaming: true,\r\n streamingBudget: 128,\r\n },\r\n adaptiveQuality: true,\r\n targetFrameRate: 30,\r\n },\r\n medium: {\r\n targetGPUTier: 'medium',\r\n lodStrategy: 'automatic',\r\n culling: { mode: 'back', frustum: true, occlusion: true },\r\n batching: { instancing: true, maxInstanceCount: 1000 },\r\n textures: {\r\n compression: 'basis',\r\n maxResolution: 1024,\r\n streaming: true,\r\n streamingBudget: 256,\r\n },\r\n adaptiveQuality: true,\r\n targetFrameRate: 60,\r\n },\r\n high: {\r\n targetGPUTier: 'high',\r\n lodStrategy: 'automatic',\r\n culling: { mode: 'back', frustum: true, occlusion: true },\r\n batching: { instancing: true, maxInstanceCount: 2000 },\r\n textures: {\r\n compression: 'dxt',\r\n maxResolution: 2048,\r\n streaming: true,\r\n streamingBudget: 512,\r\n },\r\n adaptiveQuality: false,\r\n targetFrameRate: 60,\r\n },\r\n ultra: {\r\n targetGPUTier: 'ultra',\r\n lodStrategy: 'manual',\r\n culling: {\r\n mode: 'back',\r\n frustum: true,\r\n occlusion: true,\r\n hierarchicalZ: true,\r\n },\r\n batching: { instancing: true, maxInstanceCount: 5000 },\r\n textures: {\r\n compression: 'none',\r\n maxResolution: 4096,\r\n virtualTexturing: true,\r\n streaming: true,\r\n streamingBudget: 1024,\r\n },\r\n adaptiveQuality: false,\r\n targetFrameRate: 120,\r\n },\r\n };\r\n\r\n return { ...this.optimization, ...presets[quality] };\r\n }\r\n\r\n /**\r\n * Apply quality preset\r\n */\r\n public applyQualityPreset(quality: 'low' | 'medium' | 'high' | 'ultra'): void {\r\n const preset = this.getPresetForQuality(quality);\r\n this.optimization = preset as RenderingOptimization;\r\n }\r\n\r\n /**\r\n * Estimate GPU memory usage\r\n */\r\n public estimateGPUMemory(): {\r\n textureMemory: number;\r\n vertexBuffers: number;\r\n estimatedTotal: number;\r\n } {\r\n let textureMemory = 0;\r\n let vertexBuffers = 0;\r\n\r\n // Estimate texture memory based on max resolution\r\n // Assuming RGBA format at 4 bytes per pixel\r\n const maxRes = this.optimization.textures?.maxResolution || 2048;\r\n textureMemory = (maxRes * maxRes * 4) / (1024 * 1024); // MB\r\n\r\n // Estimate based on instancing\r\n // Typical mesh: 10K vertices, position (12) + normal (12) + UV (8) + color (4) = 36 bytes\r\n const instanceCount = this.optimization.batching?.maxInstanceCount || 1000;\r\n const verticesPerMesh = 10000;\r\n vertexBuffers = ((verticesPerMesh * 36 * instanceCount) / (1024 * 1024)) * 0.1; // 10% for practical estimate\r\n\r\n return {\r\n textureMemory: Math.round(textureMemory),\r\n vertexBuffers: Math.max(1, Math.round(vertexBuffers)), // At least 1MB\r\n estimatedTotal: Math.round(textureMemory + Math.max(1, vertexBuffers)),\r\n };\r\n }\r\n\r\n /**\r\n * Get rendering statistics/info\r\n */\r\n public getInfo(): string {\r\n const tier = this.optimization.targetGPUTier;\r\n const lod = this.optimization.lodStrategy;\r\n const culling = this.optimization.culling?.mode;\r\n const instancing = this.optimization.batching?.instancing ? 'yes' : 'no';\r\n const memory = this.estimateGPUMemory();\r\n\r\n return `Rendering: tier=${tier} | LOD=${lod} | culling=${culling} | instancing=${instancing} | ` +\r\n `memory=${memory.estimatedTotal}MB`;\r\n }\r\n\r\n /**\r\n * Optimize for VR/AR (fixed timestep, fast culling)\r\n */\r\n public optimizeForVRAR(targetFPS: number = 90): void {\r\n this.optimization.fixedTimestep = 1 / targetFPS;\r\n this.optimization.targetFrameRate = targetFPS;\r\n this.setOcclusionCulling(true, 50);\r\n this.setInstancing(true, 5000);\r\n this.setAdaptiveQuality(true, targetFPS);\r\n }\r\n\r\n /**\r\n * Optimize for mobile (lower resources)\r\n */\r\n public optimizeForMobile(): void {\r\n this.applyQualityPreset('low');\r\n this.setTextureCompression('astc');\r\n this.setInstancing(true, 256);\r\n }\r\n\r\n /**\r\n * Optimize for desktop (higher resources)\r\n */\r\n public optimizeForDesktop(): void {\r\n this.applyQualityPreset('ultra');\r\n this.setTextureCompression('none');\r\n this.setInstancing(true, 5000);\r\n }\r\n\r\n /**\r\n * Dispose and cleanup\r\n */\r\n public dispose(): void {\r\n // Cleanup if needed\r\n }\r\n}\r\n\r\n/**\r\n * HoloScript+ @rendering trait factory\r\n */\r\nexport function createRenderingTrait(\r\n config?: RenderingOptimization\r\n): RenderingTrait {\r\n return new RenderingTrait(config);\r\n}\r\n","/**\n * HoloScript 2D Parser Extension\n *\n * Adds support for 2D UI elements to HoloScript for desktop/mobile apps.\n * Works alongside 3D VR syntax for hybrid applications.\n */\n\nimport { logger } from './logger';\nimport type { UI2DNode, UIElementType, Position2D } from './types';\n\nconst UI_SECURITY_CONFIG = {\n maxUIElements: 500,\n maxNestingDepth: 10,\n maxPropertyLength: 500,\n allowedEventHandlers: ['onClick', 'onChange', 'onSubmit', 'onFocus', 'onBlur', 'onHover'],\n};\n\nexport class HoloScript2DParser {\n private uiElements: Map<string, UI2DNode> = new Map();\n\n /**\n * Parse 2D UI element from HoloScript code\n */\n parse2DElement(code: string, depth: number = 0): UI2DNode | null {\n if (depth > UI_SECURITY_CONFIG.maxNestingDepth) {\n logger.warn('Max nesting depth exceeded', { depth });\n return null;\n }\n\n const trimmedCode = code.trim();\n const lines = trimmedCode.split('\\n');\n if (lines.length === 0) return null;\n\n const firstLine = lines[0].trim();\n const headerMatch = firstLine.match(/^([\\w-]+)\\s+(\\w+)\\s*\\{/);\n\n if (!headerMatch) {\n logger.warn('Invalid 2D element syntax', { line: firstLine });\n return null;\n }\n\n const [, elementType, name] = headerMatch;\n\n if (!this.isValidUIElementType(elementType)) {\n logger.warn('Invalid UI element type', { elementType });\n return null;\n }\n\n const startIndex = trimmedCode.indexOf('{');\n const endIndex = trimmedCode.lastIndexOf('}');\n if (startIndex === -1 || endIndex === -1 || endIndex <= startIndex) {\n return null;\n }\n\n const innerContent = trimmedCode.slice(startIndex + 1, endIndex).trim();\n const innerLines = this.splitIntoLogicalBlocks(innerContent);\n\n const properties: Record<string, unknown> = {};\n const events: Record<string, string> = {};\n const children: UI2DNode[] = [];\n\n for (const block of innerLines) {\n const line = block.trim();\n if (!line) continue;\n\n if (line.includes('{')) {\n const childNode = this.parse2DElement(line, depth + 1);\n if (childNode) children.push(childNode);\n continue;\n }\n\n const propMatch = line.match(/^(\\w+):\\s*(.+)$/);\n if (propMatch) {\n const [, key, rawValue] = propMatch;\n if (UI_SECURITY_CONFIG.allowedEventHandlers.includes(key)) {\n events[key] = rawValue.trim();\n } else {\n properties[key] = this.parsePropertyValue(rawValue);\n }\n }\n }\n\n const node: UI2DNode = {\n type: '2d-element',\n elementType: elementType as UIElementType,\n name,\n properties: { ...this.getDefaultProperties(elementType as UIElementType), ...properties },\n events: Object.keys(events).length > 0 ? events : undefined,\n children: children.length > 0 ? children : undefined,\n };\n\n if (depth === 0) {\n if (this.uiElements.size >= UI_SECURITY_CONFIG.maxUIElements) {\n logger.warn('Max UI elements limit reached');\n return null;\n }\n this.uiElements.set(name, node);\n }\n\n return node;\n }\n\n private splitIntoLogicalBlocks(content: string): string[] {\n const blocks: string[] = [];\n let currentBlock = '';\n let bracketDepth = 0;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n if (char === '{') bracketDepth++;\n if (char === '}') bracketDepth--;\n\n currentBlock += char;\n\n if (bracketDepth === 0) {\n if (char === '\\n' || i === content.length - 1) {\n const trimmed = currentBlock.trim();\n if (trimmed) blocks.push(trimmed);\n currentBlock = '';\n }\n }\n }\n\n const finalTrimmed = currentBlock.trim();\n if (finalTrimmed) blocks.push(finalTrimmed);\n\n return blocks;\n }\n\n /**\n * Parse voice command for 2D UI creation\n */\n parse2DVoiceCommand(command: string): UI2DNode | null {\n const tokens = command.toLowerCase().trim().split(/\\s+/);\n\n if (tokens.length < 3) return null;\n\n const action = tokens[0];\n const elementType = tokens[1];\n const name = tokens[2];\n\n if (action !== 'create' && action !== 'add') return null;\n if (!this.isValidUIElementType(elementType)) return null;\n\n const node: UI2DNode = {\n type: '2d-element',\n elementType: elementType as UIElementType,\n name,\n properties: this.getDefaultProperties(elementType as UIElementType),\n };\n\n this.uiElements.set(name, node);\n return node;\n }\n\n /**\n * Parse gesture for 2D UI interaction\n */\n parse2DGesture(gestureType: string, position: Position2D): UI2DNode | null {\n switch (gestureType) {\n case 'tap':\n return this.createQuick2DElement('button', `button_${Date.now()}`, position);\n case 'double-tap':\n return this.createQuick2DElement('textinput', `input_${Date.now()}`, position);\n case 'long-press':\n return this.createQuick2DElement('panel', `panel_${Date.now()}`, position);\n default:\n return null;\n }\n }\n\n private createQuick2DElement(elementType: UIElementType, name: string, position: Position2D): UI2DNode {\n const node: UI2DNode = {\n type: '2d-element',\n elementType,\n name,\n properties: {\n ...this.getDefaultProperties(elementType),\n x: position.x,\n y: position.y,\n },\n };\n\n this.uiElements.set(name, node);\n return node;\n }\n\n private isValidUIElementType(type: string): boolean {\n const validTypes: UIElementType[] = [\n 'canvas', 'button', 'textinput', 'panel', 'text', 'image',\n 'list', 'modal', 'slider', 'toggle', 'dropdown',\n 'flex-container', 'grid-container', 'scroll-view', 'tab-view'\n ];\n return validTypes.includes(type as UIElementType);\n }\n\n private parsePropertyValue(value: string): unknown {\n const trimmed = value.trim();\n\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n\n if (!isNaN(parseFloat(trimmed)) && isFinite(parseFloat(trimmed))) {\n return parseFloat(trimmed);\n }\n\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n const items = trimmed.slice(1, -1).split(',').map(item =>\n this.parsePropertyValue(item.trim())\n );\n return items;\n }\n\n return trimmed;\n }\n\n private getDefaultProperties(elementType: UIElementType): Record<string, unknown> {\n const defaults: Record<UIElementType, Record<string, unknown>> = {\n 'canvas': { width: 800, height: 600, backgroundColor: '#ffffff' },\n 'button': { text: 'Button', width: 120, height: 40, backgroundColor: '#007bff', color: '#ffffff', borderRadius: 4 },\n 'textinput': { placeholder: '', width: 200, height: 36, fontSize: 14, borderColor: '#cccccc', borderWidth: 1, borderRadius: 4 },\n 'panel': { width: 200, height: 200, backgroundColor: '#f0f0f0', borderRadius: 0 },\n 'text': { content: 'Text', fontSize: 16, color: '#000000', fontFamily: 'sans-serif' },\n 'image': { src: '', width: 100, height: 100, fit: 'cover' },\n 'list': { items: [], itemHeight: 40, width: 200, height: 300 },\n 'modal': { title: 'Modal', width: 400, height: 300, visible: false, backgroundColor: '#ffffff' },\n 'slider': { min: 0, max: 100, value: 50, width: 200 },\n 'toggle': { checked: false, width: 50, height: 24 },\n 'dropdown': { options: [], selected: null, width: 200 },\n 'flex-container': { direction: 'row', gap: 10, padding: 10 },\n 'grid-container': { columns: 3, gap: 10, padding: 10 },\n 'scroll-view': { width: 300, height: 400, scrollDirection: 'vertical' },\n 'tab-view': { tabs: [], activeTabId: null, tabPosition: 'top', width: 400, height: 300 },\n 'dashboard': { title: 'Dashboard', width: 1200, height: 800, layout: 'grid', columns: 4 },\n 'card': { title: '', width: 300, height: 200, backgroundColor: '#ffffff', elevation: 2 },\n 'metric': { label: '', value: 0, unit: '', fontSize: 24, color: '#000000' },\n 'row': { height: 'auto', gap: 10, alignItems: 'center' },\n 'col': { width: 'auto', gap: 10, alignItems: 'stretch' },\n };\n return { ...defaults[elementType] };\n }\n\n getUIElements(): Map<string, UI2DNode> {\n return new Map(this.uiElements);\n }\n\n findElement(name: string): UI2DNode | null {\n return this.uiElements.get(name) || null;\n }\n\n clear(): void {\n this.uiElements.clear();\n }\n}\n\nexport type { UI2DNode, UIElementType, Position2D };\n","/**\n * HoloScript Parser\n *\n * Parses voice commands, gestures, and code into HoloScript AST.\n * Supports both 3D VR and 2D UI elements.\n */\n\nimport { logger } from './logger';\nimport { HoloScript2DParser } from './HoloScript2DParser';\nimport type {\n ASTNode,\n OrbNode,\n ParameterNode,\n ConnectionNode,\n GateNode,\n StreamNode,\n GenericASTNode,\n SpatialPosition,\n VoiceCommand,\n GestureData,\n UI2DNode,\n HologramShape,\n} from './types';\n\nconst HOLOSCRIPT_SECURITY_CONFIG = {\n maxCommandLength: 1000,\n maxTokens: 100,\n maxHologramsPerUser: 50,\n suspiciousKeywords: [\n 'process', 'require', 'eval', 'import', 'constructor',\n 'prototype', '__proto__', 'fs', 'child_process', 'exec',\n 'spawn', 'fetch', 'xmlhttprequest',\n ],\n allowedShapes: ['orb', 'cube', 'cylinder', 'pyramid', 'sphere', 'function', 'gate', 'stream'],\n allowedUIElements: [\n 'canvas', 'button', 'textinput', 'panel', 'text', 'image',\n 'list', 'modal', 'slider', 'toggle', 'dropdown',\n 'flex-container', 'grid-container', 'scroll-view'\n ],\n};\n\nexport class HoloScriptParser {\n private ast: ASTNode[] = [];\n private parser2D: HoloScript2DParser;\n\n constructor() {\n this.parser2D = new HoloScript2DParser();\n }\n\n /**\n * Parse voice command into AST nodes\n */\n parseVoiceCommand(command: VoiceCommand): ASTNode[] {\n if (command.command.length > HOLOSCRIPT_SECURITY_CONFIG.maxCommandLength) {\n logger.warn('Command too long', {\n length: command.command.length,\n limit: HOLOSCRIPT_SECURITY_CONFIG.maxCommandLength,\n });\n return [];\n }\n\n const rawTokens = this.tokenizeCommand(command.command.toLowerCase());\n const tokens = this.sanitizeTokens(rawTokens);\n\n if (tokens.length === 0) return [];\n\n if (tokens.length > HOLOSCRIPT_SECURITY_CONFIG.maxTokens) {\n logger.warn('Too many tokens in command', {\n tokenCount: tokens.length,\n limit: HOLOSCRIPT_SECURITY_CONFIG.maxTokens,\n });\n return [];\n }\n\n const commandType = tokens[0];\n\n // Check if this is a 2D UI command\n if ((commandType === 'create' || commandType === 'add') && tokens.length > 1) {\n const elementType = tokens[1];\n if (HOLOSCRIPT_SECURITY_CONFIG.allowedUIElements.includes(elementType)) {\n return this.parse2DUICommand(command.command);\n }\n }\n\n switch (commandType) {\n case 'create':\n case 'summon':\n return this.parseCreateCommand(tokens.slice(1), command.spatialContext);\n case 'connect':\n return this.parseConnectCommand(tokens.slice(1));\n case 'execute':\n case 'run':\n return this.parseExecuteCommand(tokens.slice(1));\n case 'debug':\n return this.parseDebugCommand(tokens.slice(1));\n case 'visualize':\n return this.parseVisualizeCommand(tokens.slice(1));\n default:\n return this.parseGenericCommand(tokens);\n }\n }\n\n private parse2DUICommand(command: string): ASTNode[] {\n const ui2DNode = this.parser2D.parse2DVoiceCommand(command);\n if (!ui2DNode) return [];\n\n const astNode: GenericASTNode = {\n type: '2d-ui',\n uiElementType: ui2DNode.elementType,\n name: ui2DNode.name,\n properties: ui2DNode.properties,\n events: ui2DNode.events,\n children: ui2DNode.children,\n };\n\n return [astNode];\n }\n\n /**\n * Parse gesture input\n */\n parseGesture(gesture: GestureData): ASTNode[] {\n switch (gesture.type) {\n case 'pinch':\n return this.parsePinchGesture(gesture);\n case 'swipe':\n return this.parseSwipeGesture(gesture);\n case 'rotate':\n return this.parseRotateGesture(gesture);\n case 'grab':\n return this.parseGrabGesture(gesture);\n default:\n return [];\n }\n }\n\n private parseCreateCommand(tokens: string[], position?: SpatialPosition): ASTNode[] {\n if (tokens.length < 2) return [];\n\n const shape = tokens[0];\n const name = tokens[1];\n\n switch (shape) {\n case 'orb':\n case 'sphere':\n return [this.createOrbNode(name, position)];\n case 'function':\n return [this.createFunctionNode(name, tokens.slice(2), position)];\n case 'gate':\n return [this.createGateNode(name, tokens.slice(2), position)];\n case 'stream':\n return [this.createStreamNode(name, tokens.slice(2), position)];\n default:\n return [this.createGenericNode(shape, name, position)];\n }\n }\n\n private parseConnectCommand(tokens: string[]): ASTNode[] {\n if (tokens.length < 3) return [];\n\n const from = tokens[0];\n const to = tokens[2];\n const dataType = tokens.length > 3 ? tokens[3] : 'any';\n\n return [{\n type: 'connection',\n from,\n to,\n dataType,\n bidirectional: tokens.includes('bidirectional') || tokens.includes('both'),\n } as ConnectionNode];\n }\n\n private createOrbNode(name: string, position?: SpatialPosition): OrbNode {\n return {\n type: 'orb',\n name,\n position: position || { x: 0, y: 0, z: 0 },\n hologram: {\n shape: 'orb',\n color: '#00ffff',\n size: 1,\n glow: true,\n interactive: true,\n },\n properties: {},\n methods: [],\n };\n }\n\n private createFunctionNode(name: string, params: string[], position?: SpatialPosition): GenericASTNode {\n const parameters: ParameterNode[] = [];\n\n let inParams = false;\n for (const param of params) {\n if (param === 'with' || param === 'parameters') {\n inParams = true;\n continue;\n }\n if (inParams && param !== 'do' && param !== 'execute') {\n parameters.push({\n type: 'parameter',\n name: param,\n dataType: 'any',\n });\n }\n }\n\n return {\n type: 'function',\n name,\n parameters,\n body: [],\n position: position || { x: 0, y: 0, z: 0 },\n hologram: {\n shape: 'cube',\n color: '#ff6b35',\n size: 1.5,\n glow: true,\n interactive: true,\n },\n };\n }\n\n private createGateNode(_name: string, params: string[], position?: SpatialPosition): GateNode {\n const condition = params.join(' ').replace('condition', '').trim();\n\n return {\n type: 'gate',\n condition,\n truePath: [],\n falsePath: [],\n position: position || { x: 0, y: 0, z: 0 },\n hologram: {\n shape: 'pyramid',\n color: '#4ecdc4',\n size: 1,\n glow: true,\n interactive: true,\n },\n };\n }\n\n private createStreamNode(name: string, params: string[], position?: SpatialPosition): StreamNode {\n return {\n type: 'stream',\n name,\n source: params[0] || 'unknown',\n transformations: [],\n position: position || { x: 0, y: 0, z: 0 },\n hologram: {\n shape: 'cylinder',\n color: '#45b7d1',\n size: 2,\n glow: true,\n interactive: true,\n },\n };\n }\n\n private createGenericNode(shape: string, name: string, position?: SpatialPosition): GenericASTNode {\n return {\n type: shape,\n name,\n position: position || { x: 0, y: 0, z: 0 },\n hologram: {\n shape: shape as HologramShape,\n color: '#ffffff',\n size: 1,\n glow: false,\n interactive: true,\n },\n };\n }\n\n private parsePinchGesture(gesture: GestureData): ASTNode[] {\n return [{\n type: 'create',\n position: gesture.position,\n hologram: { shape: 'orb', color: '#ff0000', size: 0.5, glow: true, interactive: true },\n }];\n }\n\n private parseSwipeGesture(gesture: GestureData): ASTNode[] {\n if (!gesture.direction) return [];\n return [{\n type: 'connect',\n position: gesture.position,\n hologram: { shape: 'cylinder', color: '#00ff00', size: gesture.magnitude, glow: true, interactive: false },\n }];\n }\n\n private parseRotateGesture(gesture: GestureData): ASTNode[] {\n return [{\n type: 'modify',\n position: gesture.position,\n hologram: { shape: 'sphere', color: '#ffff00', size: 0.8, glow: true, interactive: true },\n }];\n }\n\n private parseGrabGesture(gesture: GestureData): ASTNode[] {\n return [{\n type: 'select',\n position: gesture.position,\n hologram: { shape: 'cube', color: '#ff00ff', size: 0.3, glow: true, interactive: true },\n }];\n }\n\n private tokenizeCommand(command: string): string[] {\n return command\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .filter(token => token.length > 0);\n }\n\n private sanitizeTokens(tokens: string[]): string[] {\n return tokens.filter(token => {\n const isSuspicious = HOLOSCRIPT_SECURITY_CONFIG.suspiciousKeywords.some(\n keyword => token.includes(keyword)\n );\n if (isSuspicious) {\n logger.warn('Suspicious token blocked', { token });\n return false;\n }\n return true;\n });\n }\n\n private parseExecuteCommand(tokens: string[]): GenericASTNode[] {\n return [{\n type: 'execute',\n target: tokens[0] || 'unknown',\n hologram: { shape: 'sphere', color: '#ff4500', size: 1.2, glow: true, interactive: false },\n }];\n }\n\n private parseDebugCommand(tokens: string[]): GenericASTNode[] {\n return [{\n type: 'debug',\n target: tokens[0] || 'program',\n hologram: { shape: 'pyramid', color: '#ff1493', size: 0.8, glow: true, interactive: true },\n }];\n }\n\n private parseVisualizeCommand(tokens: string[]): GenericASTNode[] {\n return [{\n type: 'visualize',\n target: tokens[0] || 'data',\n hologram: { shape: 'cylinder', color: '#32cd32', size: 1.5, glow: true, interactive: true },\n }];\n }\n\n private parseGenericCommand(tokens: string[]): GenericASTNode[] {\n return [{\n type: 'generic',\n command: tokens.join(' '),\n hologram: { shape: 'orb', color: '#808080', size: 0.5, glow: false, interactive: true },\n }];\n }\n\n getAST(): ASTNode[] {\n return [...this.ast];\n }\n\n addNode(node: ASTNode): void {\n this.ast.push(node);\n }\n\n clear(): void {\n this.ast = [];\n }\n\n findNode(name: string): ASTNode | null {\n return this.ast.find(node => 'name' in node && (node as { name?: string }).name === name) || null;\n }\n\n getNodesAtPosition(position: SpatialPosition, radius: number = 1): ASTNode[] {\n return this.ast.filter(node => {\n if (!node.position) return false;\n const distance = Math.sqrt(\n Math.pow(node.position.x - position.x, 2) +\n Math.pow(node.position.y - position.y, 2) +\n Math.pow(node.position.z - position.z, 2)\n );\n return distance <= radius;\n });\n }\n\n parse2DCode(code: string): UI2DNode | null {\n return this.parser2D.parse2DElement(code);\n }\n\n get2DParser(): HoloScript2DParser {\n return this.parser2D;\n }\n}\n","/**\r\n * HoloScript+ Parser\r\n *\r\n * Parses HoloScript+ source code into an AST with support for:\r\n * - Standard HoloScript syntax (backward compatible)\r\n * - @ directive parsing for VR traits, state, control flow\r\n * - Expression interpolation with ${...}\r\n * - TypeScript companion imports\r\n *\r\n * @version 1.0.0\r\n */\r\n\r\nimport type {\r\n HSPlusAST,\r\n HSPlusNode,\r\n HSPlusDirective,\r\n HSPlusCompileResult,\r\n HSPlusParserOptions,\r\n VRTraitName,\r\n} from '../types/AdvancedTypeSystem';\r\n\r\n// =============================================================================\r\n// TOKEN TYPES\r\n// =============================================================================\r\n\r\ntype TokenType =\r\n | 'IDENTIFIER'\r\n | 'STRING'\r\n | 'NUMBER'\r\n | 'BOOLEAN'\r\n | 'NULL'\r\n | 'LBRACE'\r\n | 'RBRACE'\r\n | 'LBRACKET'\r\n | 'RBRACKET'\r\n | 'LPAREN'\r\n | 'RPAREN'\r\n | 'COLON'\r\n | 'COMMA'\r\n | 'AT'\r\n | 'HASH'\r\n | 'DOT'\r\n | 'EQUALS'\r\n | 'ARROW'\r\n | 'PIPE'\r\n | 'EXPRESSION'\r\n | 'COMMENT'\r\n | 'NEWLINE'\r\n | 'INDENT'\r\n | 'DEDENT'\r\n | 'EOF';\r\n\r\ninterface Token {\r\n type: TokenType;\r\n value: string;\r\n line: number;\r\n column: number;\r\n}\r\n\r\n// =============================================================================\r\n// VR TRAITS\r\n// =============================================================================\r\n\r\nconst VR_TRAITS: VRTraitName[] = [\r\n 'grabbable',\r\n 'throwable',\r\n 'pointable',\r\n 'hoverable',\r\n 'scalable',\r\n 'rotatable',\r\n 'stackable',\r\n 'snappable',\r\n 'breakable',\r\n];\r\n\r\n// =============================================================================\r\n// LIFECYCLE HOOKS\r\n// =============================================================================\r\n\r\ntype HookName = string;\r\n\r\nconst LIFECYCLE_HOOKS: HookName[] = [\r\n // Standard lifecycle\r\n 'on_mount',\r\n 'on_unmount',\r\n 'on_update',\r\n 'on_data_update',\r\n // VR lifecycle\r\n 'on_grab',\r\n 'on_release',\r\n 'on_hover_enter',\r\n 'on_hover_exit',\r\n 'on_point_enter',\r\n 'on_point_exit',\r\n 'on_collision',\r\n 'on_trigger_enter',\r\n 'on_trigger_exit',\r\n 'on_click',\r\n 'on_double_click',\r\n // Controller hooks\r\n 'on_controller_button',\r\n 'on_trigger_hold',\r\n 'on_trigger_release',\r\n 'on_grip_hold',\r\n 'on_grip_release',\r\n];\r\n\r\n// =============================================================================\r\n// LEXER\r\n// =============================================================================\r\n\r\nclass Lexer {\r\n private source: string;\r\n private pos: number = 0;\r\n private line: number = 1;\r\n private column: number = 1;\r\n private indentStack: number[] = [0];\r\n private tokens: Token[] = [];\r\n private pendingDedents: number = 0;\r\n\r\n constructor(source: string) {\r\n this.source = source;\r\n }\r\n\r\n tokenize(): Token[] {\r\n while (this.pos < this.source.length) {\r\n // Handle pending dedents\r\n while (this.pendingDedents > 0) {\r\n this.tokens.push(this.createToken('DEDENT', ''));\r\n this.pendingDedents--;\r\n }\r\n\r\n const char = this.source[this.pos];\r\n\r\n // Skip whitespace (but track indentation at line start)\r\n if (char === ' ' || char === '\\t') {\r\n if (this.column === 1) {\r\n this.handleIndentation();\r\n } else {\r\n this.advance();\r\n }\r\n continue;\r\n }\r\n\r\n // Comments\r\n if (char === '/' && this.peek(1) === '/') {\r\n this.skipLineComment();\r\n continue;\r\n }\r\n if (char === '/' && this.peek(1) === '*') {\r\n this.skipBlockComment();\r\n continue;\r\n }\r\n if (char === '#' && this.peek(1) !== '#') {\r\n if (this.peek(1) === '#') {\r\n this.skipLineComment();\r\n continue;\r\n }\r\n }\r\n\r\n // Newlines\r\n if (char === '\\n') {\r\n this.tokens.push(this.createToken('NEWLINE', '\\n'));\r\n this.advance();\r\n this.line++;\r\n this.column = 1;\r\n continue;\r\n }\r\n if (char === '\\r') {\r\n this.advance();\r\n if (this.peek() === '\\n') {\r\n this.advance();\r\n }\r\n this.tokens.push(this.createToken('NEWLINE', '\\n'));\r\n this.line++;\r\n this.column = 1;\r\n continue;\r\n }\r\n\r\n // Symbols\r\n if (char === '{') {\r\n this.tokens.push(this.createToken('LBRACE', '{'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '}') {\r\n this.tokens.push(this.createToken('RBRACE', '}'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '[') {\r\n this.tokens.push(this.createToken('LBRACKET', '['));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === ']') {\r\n this.tokens.push(this.createToken('RBRACKET', ']'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '(') {\r\n this.tokens.push(this.createToken('LPAREN', '('));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === ')') {\r\n this.tokens.push(this.createToken('RPAREN', ')'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === ':') {\r\n this.tokens.push(this.createToken('COLON', ':'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === ',') {\r\n this.tokens.push(this.createToken('COMMA', ','));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '@') {\r\n this.tokens.push(this.createToken('AT', '@'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '#') {\r\n this.tokens.push(this.createToken('HASH', '#'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '.') {\r\n this.tokens.push(this.createToken('DOT', '.'));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '=') {\r\n if (this.peek(1) === '>') {\r\n this.tokens.push(this.createToken('ARROW', '=>'));\r\n this.advance();\r\n this.advance();\r\n continue;\r\n }\r\n this.tokens.push(this.createToken('EQUALS', '='));\r\n this.advance();\r\n continue;\r\n }\r\n if (char === '|') {\r\n this.tokens.push(this.createToken('PIPE', '|'));\r\n this.advance();\r\n continue;\r\n }\r\n\r\n // Strings\r\n if (char === '\"' || char === \"'\") {\r\n this.tokens.push(this.readString(char));\r\n continue;\r\n }\r\n\r\n // Numbers\r\n if (this.isDigit(char) || (char === '-' && this.isDigit(this.peek(1)))) {\r\n this.tokens.push(this.readNumber());\r\n continue;\r\n }\r\n\r\n // Expression interpolation ${...}\r\n if (char === '$' && this.peek(1) === '{') {\r\n this.tokens.push(this.readExpression());\r\n continue;\r\n }\r\n\r\n // Identifiers and keywords\r\n if (this.isIdentifierStart(char)) {\r\n this.tokens.push(this.readIdentifier());\r\n continue;\r\n }\r\n\r\n // Unknown character - skip\r\n this.advance();\r\n }\r\n\r\n // Handle remaining dedents\r\n while (this.indentStack.length > 1) {\r\n this.tokens.push(this.createToken('DEDENT', ''));\r\n this.indentStack.pop();\r\n }\r\n\r\n this.tokens.push(this.createToken('EOF', ''));\r\n return this.tokens;\r\n }\r\n\r\n private advance(): string {\r\n const char = this.source[this.pos];\r\n this.pos++;\r\n this.column++;\r\n return char;\r\n }\r\n\r\n private peek(offset: number = 0): string {\r\n const pos = this.pos + offset;\r\n return pos < this.source.length ? this.source[pos] : '';\r\n }\r\n\r\n private createToken(type: TokenType, value: string): Token {\r\n return {\r\n type,\r\n value,\r\n line: this.line,\r\n column: this.column - value.length,\r\n };\r\n }\r\n\r\n private handleIndentation(): void {\r\n let indent = 0;\r\n while (this.peek() === ' ' || this.peek() === '\\t') {\r\n indent += this.peek() === '\\t' ? 4 : 1;\r\n this.advance();\r\n }\r\n\r\n if (this.peek() === '\\n' || this.peek() === '\\r') {\r\n return;\r\n }\r\n\r\n const currentIndent = this.indentStack[this.indentStack.length - 1];\r\n\r\n if (indent > currentIndent) {\r\n this.indentStack.push(indent);\r\n this.tokens.push(this.createToken('INDENT', ''));\r\n } else if (indent < currentIndent) {\r\n while (\r\n this.indentStack.length > 1 &&\r\n indent < this.indentStack[this.indentStack.length - 1]\r\n ) {\r\n this.indentStack.pop();\r\n this.pendingDedents++;\r\n }\r\n }\r\n }\r\n\r\n private skipLineComment(): void {\r\n while (this.peek() !== '\\n' && this.pos < this.source.length) {\r\n this.advance();\r\n }\r\n }\r\n\r\n private skipBlockComment(): void {\r\n this.advance(); // /\r\n this.advance(); // *\r\n while (this.pos < this.source.length) {\r\n if (this.peek() === '*' && this.peek(1) === '/') {\r\n this.advance();\r\n this.advance();\r\n break;\r\n }\r\n if (this.peek() === '\\n') {\r\n this.line++;\r\n this.column = 0;\r\n }\r\n this.advance();\r\n }\r\n }\r\n\r\n private readString(quote: string): Token {\r\n const startLine = this.line;\r\n const startColumn = this.column;\r\n this.advance(); // Opening quote\r\n let value = '';\r\n\r\n while (this.peek() !== quote && this.pos < this.source.length) {\r\n if (this.peek() === '\\\\') {\r\n this.advance();\r\n const escaped = this.advance();\r\n switch (escaped) {\r\n case 'n':\r\n value += '\\n';\r\n break;\r\n case 't':\r\n value += '\\t';\r\n break;\r\n case 'r':\r\n value += '\\r';\r\n break;\r\n case '\\\\':\r\n value += '\\\\';\r\n break;\r\n case '\"':\r\n value += '\"';\r\n break;\r\n case \"'\":\r\n value += \"'\";\r\n break;\r\n default:\r\n value += escaped;\r\n }\r\n } else if (this.peek() === '\\n') {\r\n this.line++;\r\n this.column = 0;\r\n value += this.advance();\r\n } else {\r\n value += this.advance();\r\n }\r\n }\r\n\r\n this.advance(); // Closing quote\r\n return {\r\n type: 'STRING',\r\n value,\r\n line: startLine,\r\n column: startColumn,\r\n };\r\n }\r\n\r\n private readNumber(): Token {\r\n const startColumn = this.column;\r\n let value = '';\r\n\r\n if (this.peek() === '-') {\r\n value += this.advance();\r\n }\r\n\r\n while (this.isDigit(this.peek())) {\r\n value += this.advance();\r\n }\r\n\r\n if (this.peek() === '.' && this.isDigit(this.peek(1))) {\r\n value += this.advance(); // .\r\n while (this.isDigit(this.peek())) {\r\n value += this.advance();\r\n }\r\n }\r\n\r\n // Scientific notation\r\n if (this.peek() === 'e' || this.peek() === 'E') {\r\n value += this.advance();\r\n if (this.peek() === '+' || this.peek() === '-') {\r\n value += this.advance();\r\n }\r\n while (this.isDigit(this.peek())) {\r\n value += this.advance();\r\n }\r\n }\r\n\r\n // Unit suffix\r\n while (this.isAlpha(this.peek()) || this.peek() === '%') {\r\n value += this.advance();\r\n }\r\n\r\n return {\r\n type: 'NUMBER',\r\n value,\r\n line: this.line,\r\n column: startColumn,\r\n };\r\n }\r\n\r\n private readExpression(): Token {\r\n const startLine = this.line;\r\n const startColumn = this.column;\r\n this.advance(); // $\r\n this.advance(); // {\r\n\r\n let value = '';\r\n let braceDepth = 1;\r\n\r\n while (braceDepth > 0 && this.pos < this.source.length) {\r\n if (this.peek() === '{') {\r\n braceDepth++;\r\n } else if (this.peek() === '}') {\r\n braceDepth--;\r\n if (braceDepth === 0) {\r\n break;\r\n }\r\n }\r\n if (this.peek() === '\\n') {\r\n this.line++;\r\n this.column = 0;\r\n }\r\n value += this.advance();\r\n }\r\n\r\n this.advance(); // Closing }\r\n\r\n return {\r\n type: 'EXPRESSION',\r\n value: value.trim(),\r\n line: startLine,\r\n column: startColumn,\r\n };\r\n }\r\n\r\n private readIdentifier(): Token {\r\n const startColumn = this.column;\r\n let value = '';\r\n\r\n while (this.isIdentifierPart(this.peek())) {\r\n value += this.advance();\r\n }\r\n\r\n if (value === 'true' || value === 'false') {\r\n return {\r\n type: 'BOOLEAN',\r\n value,\r\n line: this.line,\r\n column: startColumn,\r\n };\r\n }\r\n if (value === 'null' || value === 'none') {\r\n return {\r\n type: 'NULL',\r\n value,\r\n line: this.line,\r\n column: startColumn,\r\n };\r\n }\r\n\r\n return {\r\n type: 'IDENTIFIER',\r\n value,\r\n line: this.line,\r\n column: startColumn,\r\n };\r\n }\r\n\r\n private isDigit(char: string): boolean {\r\n return char >= '0' && char <= '9';\r\n }\r\n\r\n private isAlpha(char: string): boolean {\r\n return (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z');\r\n }\r\n\r\n private isIdentifierStart(char: string): boolean {\r\n return this.isAlpha(char) || char === '_';\r\n }\r\n\r\n private isIdentifierPart(char: string): boolean {\r\n return this.isIdentifierStart(char) || this.isDigit(char) || char === '-';\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// PARSER\r\n// =============================================================================\r\n\r\nexport class HoloScriptPlusParser {\r\n private tokens: Token[] = [];\r\n private pos: number = 0;\r\n private options: HSPlusParserOptions;\r\n private errors: Array<{ message: string; line: number; column: number }> = [];\r\n private warnings: Array<{ message: string; line: number; column: number }> = [];\r\n private imports: Array<{ path: string; alias: string }> = [];\r\n private hasState: boolean = false;\r\n private hasVRTraits: boolean = false;\r\n private hasControlFlow: boolean = false;\r\n private compiledExpressions: Map<string, string> = new Map();\r\n\r\n constructor(options: HSPlusParserOptions = {}) {\r\n this.options = {\r\n enableVRTraits: true,\r\n enableTypeScriptImports: true,\r\n strict: false,\r\n ...options,\r\n };\r\n }\r\n\r\n parse(source: string): HSPlusCompileResult {\r\n // Reset state\r\n this.errors = [];\r\n this.warnings = [];\r\n this.imports = [];\r\n this.hasState = false;\r\n this.hasVRTraits = false;\r\n this.hasControlFlow = false;\r\n this.compiledExpressions = new Map();\r\n this.pos = 0;\r\n\r\n // Tokenize\r\n const lexer = new Lexer(source);\r\n this.tokens = lexer.tokenize();\r\n\r\n // Parse root node\r\n const root = this.parseDocument();\r\n\r\n // Build AST\r\n const ast: HSPlusAST = {\r\n type: 'Program',\r\n body: root.directives || [],\r\n version: '1.0',\r\n root,\r\n imports: this.imports,\r\n hasState: this.hasState,\r\n hasVRTraits: this.hasVRTraits,\r\n hasControlFlow: this.hasControlFlow,\r\n };\r\n\r\n return {\r\n success: true,\r\n ast,\r\n compiledExpressions: this.compiledExpressions,\r\n requiredCompanions: this.imports.map((i) => i.path),\r\n features: {\r\n state: this.hasState,\r\n vrTraits: this.hasVRTraits,\r\n loops: this.hasControlFlow,\r\n conditionals: this.hasControlFlow,\r\n lifecycleHooks: root.directives.some((d: any) => d.type === 'lifecycle'),\r\n },\r\n warnings: this.warnings,\r\n errors: this.errors,\r\n };\r\n }\r\n\r\n private parseDocument(): HSPlusNode {\r\n this.skipNewlines();\r\n\r\n const directives: HSPlusDirective[] = [];\r\n while (this.check('AT')) {\r\n const directive = this.parseDirective();\r\n if (directive) {\r\n directives.push(directive);\r\n }\r\n this.skipNewlines();\r\n }\r\n\r\n const root = this.parseNode();\r\n root.directives = [...directives, ...root.directives];\r\n\r\n return root;\r\n }\r\n\r\n private parseNode(): HSPlusNode {\r\n const startToken = this.current();\r\n\r\n const type = this.expect('IDENTIFIER', 'Expected element type').value;\r\n\r\n let id: string | undefined;\r\n if (this.check('HASH')) {\r\n this.advance();\r\n id = this.expect('IDENTIFIER', 'Expected ID after #').value;\r\n }\r\n\r\n const properties: Record<string, unknown> = {};\r\n const directives: HSPlusDirective[] = [];\r\n const traits = new Map<VRTraitName, unknown>();\r\n\r\n while (!this.check('LBRACE') && !this.check('NEWLINE') && !this.check('EOF')) {\r\n if (this.check('AT')) {\r\n const directive = this.parseDirective();\r\n if (directive) {\r\n if (directive.type === 'trait') {\r\n traits.set(directive.name as VRTraitName, (directive as any).config);\r\n this.hasVRTraits = true;\r\n } else {\r\n directives.push(directive);\r\n }\r\n }\r\n } else if (this.check('IDENTIFIER')) {\r\n const key = this.advance().value;\r\n if (this.check('COLON') || this.check('EQUALS')) {\r\n this.advance();\r\n properties[key] = this.parseValue();\r\n } else {\r\n properties[key] = true;\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const children: HSPlusNode[] = [];\r\n if (this.check('LBRACE')) {\r\n this.advance();\r\n this.skipNewlines();\r\n\r\n while (!this.check('RBRACE') && !this.check('EOF')) {\r\n if (this.check('AT')) {\r\n const directive = this.parseDirective();\r\n if (directive) {\r\n if (directive.type === 'trait') {\r\n traits.set(directive.name as VRTraitName, (directive as any).config);\r\n this.hasVRTraits = true;\r\n } else {\r\n directives.push(directive);\r\n }\r\n }\r\n } else if (this.check('IDENTIFIER')) {\r\n const saved = this.pos;\r\n const name = this.advance().value;\r\n\r\n if (this.check('COLON') || this.check('EQUALS')) {\r\n this.advance();\r\n properties[name] = this.parseValue();\r\n } else {\r\n this.pos = saved;\r\n children.push(this.parseNode());\r\n }\r\n } else {\r\n this.skipNewlines();\r\n if (this.check('RBRACE') || this.check('EOF')) break;\r\n this.advance();\r\n }\r\n this.skipNewlines();\r\n }\r\n\r\n this.expect('RBRACE', 'Expected }');\r\n }\r\n\r\n return {\r\n type: type as any,\r\n id,\r\n properties,\r\n directives,\r\n children,\r\n traits,\r\n loc: {\r\n start: { line: startToken.line, column: startToken.column },\r\n end: { line: this.current().line, column: this.current().column },\r\n },\r\n };\r\n }\r\n\r\n private parseDirective(): HSPlusDirective | null {\r\n this.expect('AT', 'Expected @');\r\n const name = this.expect('IDENTIFIER', 'Expected directive name').value;\r\n\r\n if (VR_TRAITS.includes(name as VRTraitName)) {\r\n if (!this.options.enableVRTraits) {\r\n this.warn(`VR trait @${name} is disabled`);\r\n return null;\r\n }\r\n const config = this.parseTraitConfig();\r\n return { type: 'trait' as const, name: name as VRTraitName, config } as any;\r\n }\r\n\r\n if (LIFECYCLE_HOOKS.includes(name)) {\r\n const params: string[] = [];\r\n if (this.check('LPAREN')) {\r\n this.advance();\r\n while (!this.check('RPAREN') && !this.check('EOF')) {\r\n params.push(this.expect('IDENTIFIER', 'Expected parameter name').value);\r\n if (this.check('COMMA')) this.advance();\r\n }\r\n this.expect('RPAREN', 'Expected )');\r\n }\r\n\r\n let body = '';\r\n if (this.check('ARROW')) {\r\n this.advance();\r\n body = this.parseInlineExpression();\r\n } else if (this.check('LBRACE')) {\r\n body = this.parseCodeBlock();\r\n }\r\n\r\n return {\r\n type: 'lifecycle' as const,\r\n hook: name,\r\n params,\r\n body,\r\n } as any;\r\n }\r\n\r\n if (name === 'state') {\r\n this.hasState = true;\r\n const body = this.parseStateBlock();\r\n return { type: 'state' as const, body } as any;\r\n }\r\n\r\n if (name === 'for') {\r\n this.hasControlFlow = true;\r\n const variable = this.expect('IDENTIFIER', 'Expected variable name').value;\r\n this.expect('IDENTIFIER', 'Expected \"in\"');\r\n const iterable = this.parseInlineExpression();\r\n const body = this.parseControlFlowBody();\r\n return { type: 'for' as const, variable, iterable, body } as any;\r\n }\r\n\r\n if (name === 'if') {\r\n this.hasControlFlow = true;\r\n const condition = this.parseInlineExpression();\r\n const body = this.parseControlFlowBody();\r\n let elseBody: HSPlusNode[] | undefined;\r\n\r\n this.skipNewlines();\r\n if (this.check('AT')) {\r\n const saved = this.pos;\r\n this.advance();\r\n if (this.check('IDENTIFIER') && this.current().value === 'else') {\r\n this.advance();\r\n elseBody = this.parseControlFlowBody();\r\n } else {\r\n this.pos = saved;\r\n }\r\n }\r\n\r\n return { type: 'if' as const, condition, body, else: elseBody } as any;\r\n }\r\n\r\n if (name === 'import') {\r\n if (!this.options.enableTypeScriptImports) {\r\n this.warn('@import is disabled');\r\n return null;\r\n }\r\n const path = this.expect('STRING', 'Expected import path').value;\r\n let alias = path.split('/').pop()?.replace(/\\.[^.]+$/, '') || 'import';\r\n if (this.check('IDENTIFIER') && this.current().value === 'as') {\r\n this.advance();\r\n alias = this.expect('IDENTIFIER', 'Expected alias').value;\r\n }\r\n this.imports.push({ path, alias });\r\n return { type: 'import' as const, path, alias } as any;\r\n }\r\n\r\n if (this.options.strict) {\r\n this.error(`Unknown directive @${name}`);\r\n } else {\r\n this.warn(`Unknown directive @${name}`);\r\n }\r\n return null;\r\n }\r\n\r\n private parseTraitConfig(): Record<string, unknown> {\r\n const config: Record<string, unknown> = {};\r\n\r\n if (this.check('LPAREN')) {\r\n this.advance();\r\n while (!this.check('RPAREN') && !this.check('EOF')) {\r\n const key = this.expect('IDENTIFIER', 'Expected property name').value;\r\n if (this.check('COLON') || this.check('EQUALS')) {\r\n this.advance();\r\n config[key] = this.parseValue();\r\n } else {\r\n config[key] = true;\r\n }\r\n if (this.check('COMMA')) this.advance();\r\n }\r\n this.expect('RPAREN', 'Expected )');\r\n }\r\n\r\n return config;\r\n }\r\n\r\n private parseStateBlock(): Record<string, any> {\r\n const state: Record<string, any> = {};\r\n\r\n if (this.check('LBRACE')) {\r\n this.advance();\r\n this.skipNewlines();\r\n\r\n while (!this.check('RBRACE') && !this.check('EOF')) {\r\n const key = this.expect('IDENTIFIER', 'Expected state variable name').value;\r\n if (this.check('COLON') || this.check('EQUALS')) {\r\n this.advance();\r\n state[key] = this.parseValue();\r\n } else {\r\n state[key] = null;\r\n }\r\n this.skipNewlines();\r\n }\r\n\r\n this.expect('RBRACE', 'Expected }');\r\n }\r\n\r\n return state;\r\n }\r\n\r\n private parseControlFlowBody(): HSPlusNode[] {\r\n const nodes: HSPlusNode[] = [];\r\n\r\n if (this.check('LBRACE')) {\r\n this.advance();\r\n this.skipNewlines();\r\n\r\n while (!this.check('RBRACE') && !this.check('EOF')) {\r\n if (this.check('AT')) {\r\n const directive = this.parseDirective();\r\n if (directive && directive.type === 'for') {\r\n nodes.push({\r\n type: 'fragment',\r\n properties: {},\r\n directives: [directive],\r\n children: [],\r\n traits: new Map(),\r\n });\r\n }\r\n } else if (this.check('IDENTIFIER')) {\r\n nodes.push(this.parseNode());\r\n }\r\n this.skipNewlines();\r\n }\r\n\r\n this.expect('RBRACE', 'Expected }');\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n private parseCodeBlock(): string {\r\n let code = '';\r\n let braceDepth = 0;\r\n\r\n if (this.check('LBRACE')) {\r\n this.advance();\r\n braceDepth = 1;\r\n\r\n while (braceDepth > 0 && !this.check('EOF')) {\r\n const token = this.advance();\r\n if (token.type === 'LBRACE') {\r\n braceDepth++;\r\n code += '{';\r\n } else if (token.type === 'RBRACE') {\r\n braceDepth--;\r\n if (braceDepth > 0) {\r\n code += '}';\r\n }\r\n } else {\r\n code += token.value;\r\n if (token.type === 'NEWLINE') {\r\n code += '\\n';\r\n } else {\r\n code += ' ';\r\n }\r\n }\r\n }\r\n }\r\n\r\n return code.trim();\r\n }\r\n\r\n private parseInlineExpression(): string {\r\n let expr = '';\r\n\r\n while (\r\n !this.check('NEWLINE') &&\r\n !this.check('LBRACE') &&\r\n !this.check('EOF')\r\n ) {\r\n const token = this.advance();\r\n expr += token.value + ' ';\r\n }\r\n\r\n return expr.trim();\r\n }\r\n\r\n private parseValue(): unknown {\r\n const token = this.current();\r\n\r\n if (token.type === 'STRING') {\r\n this.advance();\r\n return token.value;\r\n }\r\n\r\n if (token.type === 'NUMBER') {\r\n this.advance();\r\n const match = token.value.match(/^(-?\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)(.*)?$/i);\r\n if (match) {\r\n const num = parseFloat(match[1]);\r\n const unit = match[2];\r\n if (unit) {\r\n return `${num}${unit}`;\r\n }\r\n return num;\r\n }\r\n return parseFloat(token.value);\r\n }\r\n\r\n if (token.type === 'BOOLEAN') {\r\n this.advance();\r\n return token.value === 'true';\r\n }\r\n\r\n if (token.type === 'NULL') {\r\n this.advance();\r\n return null;\r\n }\r\n\r\n if (token.type === 'EXPRESSION') {\r\n this.advance();\r\n const exprId = `expr_${this.compiledExpressions.size}`;\r\n this.compiledExpressions.set(exprId, token.value);\r\n return { __expr: exprId, __raw: token.value };\r\n }\r\n\r\n if (token.type === 'LBRACKET') {\r\n return this.parseArray();\r\n }\r\n\r\n if (token.type === 'LBRACE') {\r\n return this.parseObject();\r\n }\r\n\r\n if (token.type === 'IDENTIFIER') {\r\n this.advance();\r\n return { __ref: token.value };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private parseArray(): unknown[] {\r\n const arr: unknown[] = [];\r\n this.expect('LBRACKET', 'Expected [');\r\n\r\n while (!this.check('RBRACKET') && !this.check('EOF')) {\r\n arr.push(this.parseValue());\r\n if (this.check('COMMA')) this.advance();\r\n this.skipNewlines();\r\n }\r\n\r\n this.expect('RBRACKET', 'Expected ]');\r\n return arr;\r\n }\r\n\r\n private parseObject(): Record<string, unknown> {\r\n const obj: Record<string, unknown> = {};\r\n this.expect('LBRACE', 'Expected {');\r\n this.skipNewlines();\r\n\r\n while (!this.check('RBRACE') && !this.check('EOF')) {\r\n const key = this.expect('IDENTIFIER', 'Expected property name').value;\r\n if (this.check('COLON') || this.check('EQUALS')) {\r\n this.advance();\r\n obj[key] = this.parseValue();\r\n } else {\r\n obj[key] = true;\r\n }\r\n if (this.check('COMMA')) this.advance();\r\n this.skipNewlines();\r\n }\r\n\r\n this.expect('RBRACE', 'Expected }');\r\n return obj;\r\n }\r\n\r\n private current(): Token {\r\n return this.tokens[this.pos] || { type: 'EOF', value: '', line: 0, column: 0 };\r\n }\r\n\r\n private check(type: TokenType): boolean {\r\n return this.current().type === type;\r\n }\r\n\r\n private advance(): Token {\r\n const token = this.current();\r\n if (this.pos < this.tokens.length) {\r\n this.pos++;\r\n }\r\n return token;\r\n }\r\n\r\n private expect(type: TokenType, message: string): Token {\r\n if (!this.check(type)) {\r\n this.error(`${message}. Got ${this.current().type} \"${this.current().value}\"`);\r\n return { type, value: '', line: this.current().line, column: this.current().column };\r\n }\r\n return this.advance();\r\n }\r\n\r\n private skipNewlines(): void {\r\n while (this.check('NEWLINE') || this.check('INDENT') || this.check('DEDENT')) {\r\n this.advance();\r\n }\r\n }\r\n\r\n private error(message: string): void {\r\n const token = this.current();\r\n this.errors.push({\r\n message,\r\n line: token.line,\r\n column: token.column,\r\n });\r\n }\r\n\r\n private warn(message: string): void {\r\n const token = this.current();\r\n this.warnings.push({\r\n message,\r\n line: token.line,\r\n column: token.column,\r\n });\r\n }\r\n}\r\n\r\nexport function createParser(options?: HSPlusParserOptions): HoloScriptPlusParser {\r\n return new HoloScriptPlusParser(options);\r\n}\r\n\r\nexport function parse(source: string, options?: HSPlusParserOptions): HSPlusCompileResult {\r\n const parser = createParser(options);\r\n return parser.parse(source);\r\n}\r\n","/**\r\n * HoloScriptPlus Parser - Extended DSL with Trait Annotations\r\n * \r\n * Extends HoloScript with support for:\r\n * - @material trait annotations for PBR materials\r\n * - @lighting trait annotations for dynamic lighting\r\n * - @rendering trait annotations for GPU optimization\r\n * \r\n * Syntax:\r\n * orb#sphere {\r\n * @material { type: pbr, metallic: 0.5, roughness: 0.4 }\r\n * @lighting { preset: studio, shadows: true }\r\n * @rendering { quality: high, lod: true }\r\n * }\r\n */\r\n\r\nimport { HoloScriptCodeParser } from './HoloScriptCodeParser';\r\nimport type {\r\n ASTNode,\r\n OrbNode,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// Trait Annotation Types\r\n// ============================================================================\r\n\r\nexport interface TraitAnnotation {\r\n type: 'material' | 'lighting' | 'rendering';\r\n config: Record<string, unknown>;\r\n line?: number;\r\n column?: number;\r\n}\r\n\r\nexport interface MaterialTraitAnnotation extends TraitAnnotation {\r\n type: 'material';\r\n config: {\r\n type?: string;\r\n pbr?: {\r\n baseColor?: { r: number; g: number; b: number };\r\n metallic?: number;\r\n roughness?: number;\r\n ambientOcclusion?: number;\r\n emission?: { r: number; g: number; b: number };\r\n emissionStrength?: number;\r\n };\r\n textures?: Array<{ path: string; channel: string }>;\r\n compression?: 'none' | 'dxt' | 'astc' | 'basis';\r\n instancing?: boolean;\r\n streaming?: boolean;\r\n };\r\n}\r\n\r\nexport interface LightingTraitAnnotation extends TraitAnnotation {\r\n type: 'lighting';\r\n config: {\r\n preset?: 'studio' | 'outdoor' | 'interior' | 'night' | 'sunset';\r\n lights?: Array<{\r\n type: 'directional' | 'point' | 'spot' | 'area' | 'ambient';\r\n position?: { x: number; y: number; z: number };\r\n direction?: { x: number; y: number; z: number };\r\n color?: { r: number; g: number; b: number };\r\n intensity?: number;\r\n range?: number;\r\n shadows?: boolean;\r\n }>;\r\n globalIllumination?: {\r\n skyColor?: { r: number; g: number; b: number };\r\n groundColor?: { r: number; g: number; b: number };\r\n probes?: number;\r\n };\r\n shadows?: boolean;\r\n ao?: boolean;\r\n };\r\n}\r\n\r\nexport interface RenderingTraitAnnotation extends TraitAnnotation {\r\n type: 'rendering';\r\n config: {\r\n quality?: 'low' | 'medium' | 'high' | 'ultra';\r\n platform?: 'mobile' | 'vr' | 'desktop';\r\n lod?: boolean;\r\n culling?: boolean;\r\n batching?: boolean;\r\n instancing?: boolean;\r\n maxTextureResolution?: number;\r\n compression?: 'none' | 'dxt' | 'astc' | 'basis';\r\n targetFPS?: number;\r\n };\r\n}\r\n\r\nexport type AnyTraitAnnotation =\r\n | MaterialTraitAnnotation\r\n | LightingTraitAnnotation\r\n | RenderingTraitAnnotation;\r\n\r\n// ============================================================================\r\n// Enhanced OrbNode with Graphics Traits\r\n// ============================================================================\r\n\r\nexport interface GraphicsConfiguration {\r\n material?: MaterialTraitAnnotation['config'];\r\n lighting?: LightingTraitAnnotation['config'];\r\n rendering?: RenderingTraitAnnotation['config'];\r\n}\r\n\r\nexport interface EnhancedOrbNode extends OrbNode {\r\n graphics?: GraphicsConfiguration;\r\n traits?: AnyTraitAnnotation[];\r\n}\r\n\r\n// ============================================================================\r\n// HoloScriptPlus Parser\r\n// ============================================================================\r\n\r\nexport class HoloScriptPlusParser {\r\n private baseParser: HoloScriptCodeParser;\r\n\r\n constructor() {\r\n this.baseParser = new HoloScriptCodeParser();\r\n }\r\n\r\n /**\r\n * Parse HoloScript+ code with trait annotations\r\n */\r\n parse(code: string): ASTNode[] {\r\n // First, parse with base parser\r\n const baseResult = this.baseParser.parse(code);\r\n const ast = (Array.isArray(baseResult) ? baseResult : [baseResult]) as ASTNode[];\r\n\r\n // Then enhance with trait annotations\r\n return this.enhanceWithTraits(ast, code);\r\n }\r\n\r\n /**\r\n * Enhance AST nodes with trait annotations\r\n */\r\n private enhanceWithTraits(ast: ASTNode[], code: string): ASTNode[] {\r\n return ast.map((node) => {\r\n if (node.type === 'orb') {\r\n return this.enhanceOrbNodeWithTraits(node, code);\r\n }\r\n return node;\r\n });\r\n }\r\n\r\n /**\r\n * Enhance OrbNode with trait annotations\r\n */\r\n private enhanceOrbNodeWithTraits(node: ASTNode, code: string): EnhancedOrbNode {\r\n const orbNode = node as OrbNode;\r\n const enhanced: EnhancedOrbNode = {\r\n ...orbNode,\r\n traits: [],\r\n graphics: {},\r\n };\r\n\r\n // Find trait annotations in the code near this node\r\n const traits = this.extractTraitAnnotations(code, node.line);\r\n\r\n enhanced.traits = traits;\r\n\r\n // Build graphics configuration from traits\r\n if (traits.length > 0) {\r\n enhanced.graphics = this.buildGraphicsConfig(traits);\r\n }\r\n\r\n return enhanced;\r\n }\r\n\r\n /**\r\n * Extract trait annotations from code\r\n */\r\n extractTraitAnnotations(code: string, _orbLine?: number): AnyTraitAnnotation[] {\r\n const traits: AnyTraitAnnotation[] = [];\r\n const traitRegex = /@(material|lighting|rendering)\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/g;\r\n\r\n let match;\r\n while ((match = traitRegex.exec(code)) !== null) {\r\n const type = match[1] as 'material' | 'lighting' | 'rendering';\r\n const configStr = match[2];\r\n\r\n try {\r\n const config = this.parseObjectLiteral(configStr);\r\n\r\n switch (type) {\r\n case 'material':\r\n traits.push({\r\n type: 'material',\r\n config: config as MaterialTraitAnnotation['config'],\r\n });\r\n break;\r\n\r\n case 'lighting':\r\n traits.push({\r\n type: 'lighting',\r\n config: config as LightingTraitAnnotation['config'],\r\n });\r\n break;\r\n\r\n case 'rendering':\r\n traits.push({\r\n type: 'rendering',\r\n config: config as RenderingTraitAnnotation['config'],\r\n });\r\n break;\r\n }\r\n } catch (e) {\r\n console.warn(`Failed to parse ${type} trait annotation:`, e);\r\n }\r\n }\r\n\r\n return traits;\r\n }\r\n\r\n /**\r\n * Parse object literal from string\r\n * Supports nested objects and arrays\r\n */\r\n parseObjectLiteral(str: string): Record<string, unknown> {\r\n const config: Record<string, unknown> = {};\r\n\r\n // Split by comma, but respect nested braces and brackets\r\n let depth = 0;\r\n let current = '';\r\n let pairs: string[] = [];\r\n\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str[i];\r\n\r\n if (char === '{' || char === '[') {\r\n depth++;\r\n } else if (char === '}' || char === ']') {\r\n depth--;\r\n } else if (char === ',' && depth === 0) {\r\n pairs.push(current.trim());\r\n current = '';\r\n continue;\r\n }\r\n\r\n current += char;\r\n }\r\n\r\n if (current.trim()) {\r\n pairs.push(current.trim());\r\n }\r\n\r\n // Parse each key:value pair\r\n for (const pair of pairs) {\r\n const colonIndex = pair.indexOf(':');\r\n if (colonIndex === -1) continue;\r\n\r\n const key = pair.substring(0, colonIndex).trim();\r\n const value = pair.substring(colonIndex + 1).trim();\r\n\r\n config[key] = this.parseValue(value);\r\n }\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * Parse individual values\r\n */\r\n parseValue(str: string): unknown {\r\n str = str.trim();\r\n\r\n // Boolean\r\n if (str === 'true') return true;\r\n if (str === 'false') return false;\r\n\r\n // Number\r\n if (/^-?\\d+(\\.\\d+)?$/.test(str)) return parseFloat(str);\r\n\r\n // String\r\n if ((str.startsWith('\"') && str.endsWith('\"')) || (str.startsWith(\"'\") && str.endsWith(\"'\"))) {\r\n return str.slice(1, -1);\r\n }\r\n\r\n // Color object: { r: 0.8, g: 0.2, b: 0.2 }\r\n if (str.startsWith('{') && str.endsWith('}')) {\r\n return this.parseObjectLiteral(str.slice(1, -1));\r\n }\r\n\r\n // Array: [1, 2, 3]\r\n if (str.startsWith('[') && str.endsWith(']')) {\r\n const items = str.slice(1, -1).split(',');\r\n return items.map((item) => this.parseValue(item));\r\n }\r\n\r\n return str;\r\n }\r\n\r\n /**\r\n * Build GraphicsConfiguration from trait annotations\r\n */\r\n buildGraphicsConfig(traits: AnyTraitAnnotation[]): GraphicsConfiguration {\r\n const config: GraphicsConfiguration = {};\r\n\r\n for (const trait of traits) {\r\n switch (trait.type) {\r\n case 'material':\r\n config.material = (trait as MaterialTraitAnnotation).config;\r\n break;\r\n\r\n case 'lighting':\r\n config.lighting = (trait as LightingTraitAnnotation).config;\r\n break;\r\n\r\n case 'rendering':\r\n config.rendering = (trait as RenderingTraitAnnotation).config;\r\n break;\r\n }\r\n }\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * Validate trait annotation configuration\r\n */\r\n validateTraitAnnotation(trait: AnyTraitAnnotation): { valid: boolean; errors: string[] } {\r\n const errors: string[] = [];\r\n\r\n switch (trait.type) {\r\n case 'material':\r\n errors.push(...this.validateMaterialTrait(trait as MaterialTraitAnnotation));\r\n break;\r\n\r\n case 'lighting':\r\n errors.push(...this.validateLightingTrait(trait as LightingTraitAnnotation));\r\n break;\r\n\r\n case 'rendering':\r\n errors.push(...this.validateRenderingTrait(trait as RenderingTraitAnnotation));\r\n break;\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n }\r\n\r\n /**\r\n * Validate material trait configuration\r\n */\r\n private validateMaterialTrait(trait: MaterialTraitAnnotation): string[] {\r\n const errors: string[] = [];\r\n const { config } = trait;\r\n\r\n if (config.pbr) {\r\n if (config.pbr.metallic !== undefined && (config.pbr.metallic < 0 || config.pbr.metallic > 1)) {\r\n errors.push('material.pbr.metallic must be between 0 and 1');\r\n }\r\n\r\n if (config.pbr.roughness !== undefined && (config.pbr.roughness < 0 || config.pbr.roughness > 1)) {\r\n errors.push('material.pbr.roughness must be between 0 and 1');\r\n }\r\n }\r\n\r\n if (config.compression && !['none', 'dxt', 'astc', 'basis'].includes(config.compression)) {\r\n errors.push(`material.compression must be one of: none, dxt, astc, basis`);\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * Validate lighting trait configuration\r\n */\r\n private validateLightingTrait(trait: LightingTraitAnnotation): string[] {\r\n const errors: string[] = [];\r\n const { config } = trait;\r\n\r\n if (config.preset && !['studio', 'outdoor', 'interior', 'night', 'sunset'].includes(config.preset)) {\r\n errors.push('lighting.preset must be one of: studio, outdoor, interior, night, sunset');\r\n }\r\n\r\n if (config.lights) {\r\n config.lights.forEach((light, index) => {\r\n if (!['directional', 'point', 'spot', 'area', 'ambient'].includes(light.type)) {\r\n errors.push(`lighting.lights[${index}].type must be a valid light type`);\r\n }\r\n\r\n if (light.intensity !== undefined && light.intensity < 0) {\r\n errors.push(`lighting.lights[${index}].intensity must be >= 0`);\r\n }\r\n });\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * Validate rendering trait configuration\r\n */\r\n private validateRenderingTrait(trait: RenderingTraitAnnotation): string[] {\r\n const errors: string[] = [];\r\n const { config } = trait;\r\n\r\n if (config.quality && !['low', 'medium', 'high', 'ultra'].includes(config.quality)) {\r\n errors.push('rendering.quality must be one of: low, medium, high, ultra');\r\n }\r\n\r\n if (config.platform && !['mobile', 'vr', 'desktop'].includes(config.platform)) {\r\n errors.push('rendering.platform must be one of: mobile, vr, desktop');\r\n }\r\n\r\n if (config.compression && !['none', 'dxt', 'astc', 'basis'].includes(config.compression)) {\r\n errors.push('rendering.compression must be one of: none, dxt, astc, basis');\r\n }\r\n\r\n if (config.maxTextureResolution && config.maxTextureResolution < 128) {\r\n errors.push('rendering.maxTextureResolution must be >= 128');\r\n }\r\n\r\n if (config.targetFPS && (config.targetFPS < 24 || config.targetFPS > 240)) {\r\n errors.push('rendering.targetFPS must be between 24 and 240');\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * Get trait annotations as graphics traits\r\n */\r\n createGraphicsTraits(config: GraphicsConfiguration): any {\r\n // This will be called by the runtime to create actual trait instances\r\n return {\r\n material: config.material ? this.createMaterialTrait(config.material) : null,\r\n lighting: config.lighting ? this.createLightingTrait(config.lighting) : null,\r\n rendering: config.rendering ? this.createRenderingTrait(config.rendering) : null,\r\n };\r\n }\r\n\r\n /**\r\n * Create MaterialTrait from config\r\n */\r\n private createMaterialTrait(config: any): any {\r\n // Lazy import to avoid circular dependencies\r\n const { MaterialTrait } = require('./traits/MaterialTrait');\r\n\r\n const material = new MaterialTrait({\r\n type: config.type || 'pbr',\r\n pbr: config.pbr,\r\n });\r\n\r\n if (config.compression) {\r\n material.setCompression(config.compression);\r\n }\r\n\r\n if (config.instancing) {\r\n material.setInstanced(true);\r\n }\r\n\r\n if (config.streaming) {\r\n material.setTextureStreaming(true);\r\n }\r\n\r\n if (config.textures) {\r\n config.textures.forEach((tex: any) => {\r\n material.addTexture(tex);\r\n });\r\n }\r\n\r\n return material;\r\n }\r\n\r\n /**\r\n * Create LightingTrait from config\r\n */\r\n private createLightingTrait(config: any): any {\r\n const { LightingTrait, LIGHTING_PRESETS } = require('./traits/LightingTrait');\r\n\r\n let lighting: any;\r\n\r\n if (config.preset) {\r\n const preset = LIGHTING_PRESETS[config.preset];\r\n lighting = new LightingTrait(preset);\r\n } else {\r\n lighting = new LightingTrait();\r\n }\r\n\r\n if (config.globalIllumination) {\r\n lighting.setGlobalIllumination(config.globalIllumination);\r\n }\r\n\r\n if (config.lights) {\r\n config.lights.forEach((light: any) => {\r\n lighting.addLight(light);\r\n });\r\n }\r\n\r\n return lighting;\r\n }\r\n\r\n /**\r\n * Create RenderingTrait from config\r\n */\r\n private createRenderingTrait(config: any): any {\r\n const { RenderingTrait } = require('./traits/RenderingTrait');\r\n\r\n const rendering = new RenderingTrait();\r\n\r\n if (config.quality) {\r\n rendering.applyQualityPreset(config.quality);\r\n }\r\n\r\n if (config.platform) {\r\n switch (config.platform) {\r\n case 'mobile':\r\n rendering.optimizeForMobile();\r\n break;\r\n case 'vr':\r\n rendering.optimizeForVRAR(config.targetFPS || 90);\r\n break;\r\n case 'desktop':\r\n rendering.optimizeForDesktop();\r\n break;\r\n }\r\n }\r\n\r\n if (config.lod !== false) {\r\n rendering.setupLODLevels('automatic');\r\n }\r\n\r\n if (config.culling !== false) {\r\n rendering.setFrustumCulling(true);\r\n }\r\n\r\n if (config.compression) {\r\n rendering.setTextureCompression(config.compression);\r\n }\r\n\r\n if (config.maxTextureResolution) {\r\n rendering.setMaxTextureResolution(config.maxTextureResolution);\r\n }\r\n\r\n return rendering;\r\n }\r\n}\r\n\r\nexport default HoloScriptPlusParser;\r\n","/**\r\n * Reactive State System for HoloScript+\r\n *\r\n * Provides reactive state management with:\r\n * - Proxy-based reactivity\r\n * - Computed properties\r\n * - Effect system for side effects\r\n * - Batched updates for performance\r\n *\r\n * @version 1.0.0\r\n */\r\n\r\nimport type { StateDeclaration, ReactiveState as IReactiveState } from '../types/HoloScriptPlus';\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\ntype Subscriber<T> = (state: T, changedKey?: keyof T) => void;\r\ntype UnsubscribeFunc = () => void;\r\ntype EffectFunc = () => void | (() => void);\r\ntype ComputedFunc<T> = () => T;\r\n\r\ninterface EffectOptions {\r\n immediate?: boolean;\r\n deep?: boolean;\r\n}\r\n\r\n// interface WatchOptions<T> extends EffectOptions {\r\n// handler: (newValue: T, oldValue: T) => void;\r\n// }\r\n\r\n// =============================================================================\r\n// DEPENDENCY TRACKING\r\n// =============================================================================\r\n\r\nlet activeEffect: EffectFunc | null = null;\r\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<EffectFunc>>>();\r\n\r\nfunction track(target: object, key: string | symbol): void {\r\n if (!activeEffect) return;\r\n\r\n let depsMap = targetMap.get(target);\r\n if (!depsMap) {\r\n depsMap = new Map();\r\n targetMap.set(target, depsMap);\r\n }\r\n\r\n let dep = depsMap.get(key);\r\n if (!dep) {\r\n dep = new Set();\r\n depsMap.set(key, dep);\r\n }\r\n\r\n dep.add(activeEffect);\r\n}\r\n\r\nfunction trigger(target: object, key: string | symbol): void {\r\n const depsMap = targetMap.get(target);\r\n if (!depsMap) return;\r\n\r\n const dep = depsMap.get(key);\r\n if (!dep) return;\r\n\r\n // Create a copy to avoid infinite loops if effects modify dependencies\r\n const effectsToRun = new Set(dep);\r\n effectsToRun.forEach((effect) => {\r\n // Avoid running effect if it's the active one\r\n if (effect !== activeEffect) {\r\n queueEffect(effect);\r\n }\r\n });\r\n}\r\n\r\n// =============================================================================\r\n// EFFECT BATCHING\r\n// =============================================================================\r\n\r\nconst pendingEffects = new Set<EffectFunc>();\r\nlet isFlushing = false;\r\n\r\nfunction queueEffect(effect: EffectFunc): void {\r\n pendingEffects.add(effect);\r\n if (!isFlushing) {\r\n isFlushing = true;\r\n Promise.resolve().then(flushEffects);\r\n }\r\n}\r\n\r\nfunction flushEffects(): void {\r\n pendingEffects.forEach((effect) => {\r\n try {\r\n runEffect(effect);\r\n } catch (error) {\r\n console.error('Error running effect:', error);\r\n }\r\n });\r\n pendingEffects.clear();\r\n isFlushing = false;\r\n}\r\n\r\nfunction runEffect(effect: EffectFunc): void {\r\n const prevEffect = activeEffect;\r\n activeEffect = effect;\r\n try {\r\n effect();\r\n } finally {\r\n activeEffect = prevEffect;\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// REACTIVE PROXY\r\n// =============================================================================\r\n\r\nfunction createReactiveProxy<T extends object>(target: T): T {\r\n return new Proxy(target, {\r\n get(obj, key: string | symbol) {\r\n track(obj, key);\r\n const value = Reflect.get(obj, key);\r\n\r\n // Deep reactivity for nested objects\r\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\r\n return createReactiveProxy(value);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n set(obj, key: string | symbol, value: unknown) {\r\n const oldValue = Reflect.get(obj, key);\r\n const result = Reflect.set(obj, key, value);\r\n\r\n if (oldValue !== value) {\r\n trigger(obj, key);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n deleteProperty(obj, key: string | symbol) {\r\n const hadKey = Reflect.has(obj, key);\r\n const result = Reflect.deleteProperty(obj, key);\r\n\r\n if (hadKey) {\r\n trigger(obj, key);\r\n }\r\n\r\n return result;\r\n },\r\n });\r\n}\r\n\r\n// =============================================================================\r\n// REACTIVE STATE CLASS\r\n// =============================================================================\r\n\r\nexport class ReactiveState<T extends StateDeclaration> implements IReactiveState<T> {\r\n private state: T;\r\n private proxy: T;\r\n private subscribers: Set<Subscriber<T>> = new Set();\r\n private computedCache: Map<string, { value: unknown; dirty: boolean }> = new Map();\r\n private watchCleanups: Map<string, () => void> = new Map();\r\n\r\n constructor(initialState: T) {\r\n this.state = { ...initialState };\r\n this.proxy = createReactiveProxy(this.state);\r\n }\r\n\r\n get<K extends keyof T>(key: K): T[K] {\r\n return this.proxy[key];\r\n }\r\n\r\n set<K extends keyof T>(key: K, value: T[K]): void {\r\n const oldValue = this.state[key];\r\n this.proxy[key] = value;\r\n\r\n if (oldValue !== value) {\r\n this.notifySubscribers(key);\r\n }\r\n }\r\n\r\n update(updates: Partial<T>): void {\r\n const changedKeys: (keyof T)[] = [];\r\n\r\n for (const key in updates) {\r\n if (Object.prototype.hasOwnProperty.call(updates, key)) {\r\n const oldValue = this.state[key];\r\n const newValue = updates[key];\r\n\r\n if (oldValue !== newValue) {\r\n this.proxy[key] = newValue as T[typeof key];\r\n changedKeys.push(key);\r\n }\r\n }\r\n }\r\n\r\n if (changedKeys.length > 0) {\r\n // Batch notify for all changes\r\n this.subscribers.forEach((callback) => {\r\n callback(this.state);\r\n });\r\n }\r\n }\r\n\r\n subscribe(callback: Subscriber<T>): UnsubscribeFunc {\r\n this.subscribers.add(callback);\r\n return () => {\r\n this.subscribers.delete(callback);\r\n };\r\n }\r\n\r\n private notifySubscribers(changedKey: keyof T): void {\r\n this.subscribers.forEach((callback) => {\r\n callback(this.state, changedKey);\r\n });\r\n }\r\n\r\n // ==========================================================================\r\n // COMPUTED PROPERTIES\r\n // ==========================================================================\r\n\r\n computed<R>(key: string, getter: ComputedFunc<R>): R {\r\n const cached = this.computedCache.get(key);\r\n\r\n if (cached && !cached.dirty) {\r\n return cached.value as R;\r\n }\r\n\r\n // Track dependencies\r\n const prevEffect = activeEffect;\r\n activeEffect = () => {\r\n // Mark cached value as dirty\r\n const entry = this.computedCache.get(key);\r\n if (entry) {\r\n entry.dirty = true;\r\n }\r\n };\r\n\r\n try {\r\n const value = getter();\r\n this.computedCache.set(key, { value, dirty: false });\r\n return value;\r\n } finally {\r\n activeEffect = prevEffect;\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // WATCHERS\r\n // ==========================================================================\r\n\r\n watch<K extends keyof T>(\r\n key: K,\r\n handler: (newValue: T[K], oldValue: T[K]) => void,\r\n options: EffectOptions = {}\r\n ): UnsubscribeFunc {\r\n let oldValue = this.state[key];\r\n\r\n const effect = () => {\r\n const newValue = this.proxy[key];\r\n if (newValue !== oldValue) {\r\n handler(newValue, oldValue);\r\n oldValue = newValue;\r\n }\r\n };\r\n\r\n // Run immediately if requested\r\n if (options.immediate) {\r\n handler(this.state[key], undefined as unknown as T[K]);\r\n }\r\n\r\n // Subscribe to changes\r\n return this.subscribe((_state, changedKey) => {\r\n if (changedKey === key) {\r\n effect();\r\n }\r\n });\r\n }\r\n\r\n watchEffect(effect: EffectFunc, _options: EffectOptions = {}): UnsubscribeFunc {\r\n let cleanup: (() => void) | void;\r\n\r\n const wrappedEffect = () => {\r\n // Run cleanup from previous run\r\n if (cleanup) {\r\n cleanup();\r\n }\r\n\r\n cleanup = effect();\r\n };\r\n\r\n // Run immediately\r\n runEffect(wrappedEffect);\r\n\r\n return () => {\r\n if (cleanup) {\r\n cleanup();\r\n }\r\n // Note: Would need to remove from dependency tracking\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // SNAPSHOT / RESET\r\n // ==========================================================================\r\n\r\n getSnapshot(): T {\r\n return { ...this.state };\r\n }\r\n\r\n reset(newState?: T): void {\r\n const stateToSet = newState || ({} as T);\r\n\r\n // Clear all keys\r\n for (const key in this.state) {\r\n if (Object.prototype.hasOwnProperty.call(this.state, key)) {\r\n delete this.state[key];\r\n }\r\n }\r\n\r\n // Set new state\r\n for (const key in stateToSet) {\r\n if (Object.prototype.hasOwnProperty.call(stateToSet, key)) {\r\n this.state[key] = stateToSet[key];\r\n }\r\n }\r\n\r\n // Notify all subscribers\r\n this.subscribers.forEach((callback) => {\r\n callback(this.state);\r\n });\r\n }\r\n\r\n // ==========================================================================\r\n // DESTROY\r\n // ==========================================================================\r\n\r\n destroy(): void {\r\n this.subscribers.clear();\r\n this.computedCache.clear();\r\n this.watchCleanups.forEach((cleanup) => cleanup());\r\n this.watchCleanups.clear();\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// FACTORY FUNCTIONS\r\n// =============================================================================\r\n\r\nexport function createState<T extends StateDeclaration>(initialState: T): ReactiveState<T> {\r\n return new ReactiveState(initialState);\r\n}\r\n\r\nexport function ref<T>(value: T): { value: T } {\r\n return createReactiveProxy({ value });\r\n}\r\n\r\nexport function reactive<T extends object>(target: T): T {\r\n return createReactiveProxy(target);\r\n}\r\n\r\nexport function effect(fn: EffectFunc, _options?: EffectOptions): UnsubscribeFunc {\r\n let cleanup: (() => void) | void;\r\n\r\n const wrappedEffect = () => {\r\n if (cleanup) {\r\n cleanup();\r\n }\r\n cleanup = fn();\r\n };\r\n\r\n runEffect(wrappedEffect);\r\n\r\n return () => {\r\n if (cleanup) {\r\n cleanup();\r\n }\r\n };\r\n}\r\n\r\nexport function computed<T>(getter: ComputedFunc<T>): { readonly value: T } {\r\n let value: T;\r\n let dirty = true;\r\n\r\n const runner = () => {\r\n dirty = true;\r\n };\r\n\r\n return {\r\n get value(): T {\r\n if (dirty) {\r\n const prevEffect = activeEffect;\r\n activeEffect = runner;\r\n try {\r\n value = getter();\r\n dirty = false;\r\n } finally {\r\n activeEffect = prevEffect;\r\n }\r\n }\r\n return value;\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// STATE BINDING UTILITIES\r\n// =============================================================================\r\n\r\nexport interface StateBinding<T> {\r\n get: () => T;\r\n set: (value: T) => void;\r\n subscribe: (callback: (value: T) => void) => UnsubscribeFunc;\r\n}\r\n\r\nexport function bind<T extends StateDeclaration, K extends keyof T>(\r\n state: ReactiveState<T>,\r\n key: K\r\n): StateBinding<T[K]> {\r\n return {\r\n get: () => state.get(key),\r\n set: (value: T[K]) => state.set(key, value),\r\n subscribe: (callback: (value: T[K]) => void) => {\r\n return state.subscribe((s, changedKey) => {\r\n if (changedKey === key || changedKey === undefined) {\r\n callback(s[key]);\r\n }\r\n });\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// EXPRESSION EVALUATOR\r\n// =============================================================================\r\n\r\nexport class ExpressionEvaluator {\r\n private context: Record<string, unknown>;\r\n private builtins: Record<string, unknown>;\r\n\r\n constructor(context: Record<string, unknown> = {}, builtins: Record<string, unknown> = {}) {\r\n this.context = context;\r\n this.builtins = {\r\n Math,\r\n parseInt,\r\n parseFloat,\r\n String,\r\n Number,\r\n Boolean,\r\n Array,\r\n Object,\r\n JSON,\r\n Date,\r\n ...builtins,\r\n };\r\n }\r\n\r\n evaluate(expression: string): unknown {\r\n // Security: Create safe evaluation context\r\n const contextKeys = Object.keys(this.context);\r\n const contextValues = Object.values(this.context);\r\n const builtinKeys = Object.keys(this.builtins);\r\n const builtinValues = Object.values(this.builtins);\r\n\r\n try {\r\n // Create function with context variables as parameters\r\n const fn = new Function(\r\n ...contextKeys,\r\n ...builtinKeys,\r\n `\"use strict\"; return (${expression})`\r\n );\r\n\r\n return fn(...contextValues, ...builtinValues);\r\n } catch (error) {\r\n console.error(`Error evaluating expression: ${expression}`, error);\r\n return undefined;\r\n }\r\n }\r\n\r\n updateContext(updates: Record<string, unknown>): void {\r\n Object.assign(this.context, updates);\r\n }\r\n\r\n setContext(context: Record<string, unknown>): void {\r\n this.context = context;\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// STATE-TO-DOM BINDING (for future renderer)\r\n// =============================================================================\r\n\r\nexport interface DOMBinding {\r\n element: unknown;\r\n property: string;\r\n expression: string;\r\n unsubscribe: UnsubscribeFunc;\r\n}\r\n\r\nexport class StateDOMBinder<T extends StateDeclaration> {\r\n private state: ReactiveState<T>;\r\n private evaluator: ExpressionEvaluator;\r\n private bindings: DOMBinding[] = [];\r\n\r\n constructor(state: ReactiveState<T>) {\r\n this.state = state;\r\n this.evaluator = new ExpressionEvaluator();\r\n }\r\n\r\n bind(element: unknown, property: string, expression: string): DOMBinding {\r\n // Update evaluator context with state\r\n this.evaluator.setContext(this.state.getSnapshot() as Record<string, unknown>);\r\n\r\n // Initial evaluation\r\n const value = this.evaluator.evaluate(expression);\r\n this.applyValue(element, property, value);\r\n\r\n // Subscribe to state changes\r\n const unsubscribe = this.state.subscribe((newState) => {\r\n this.evaluator.setContext(newState as Record<string, unknown>);\r\n const newValue = this.evaluator.evaluate(expression);\r\n this.applyValue(element, property, newValue);\r\n });\r\n\r\n const binding: DOMBinding = { element, property, expression, unsubscribe };\r\n this.bindings.push(binding);\r\n\r\n return binding;\r\n }\r\n\r\n unbind(binding: DOMBinding): void {\r\n binding.unsubscribe();\r\n const index = this.bindings.indexOf(binding);\r\n if (index > -1) {\r\n this.bindings.splice(index, 1);\r\n }\r\n }\r\n\r\n unbindAll(): void {\r\n this.bindings.forEach((binding) => binding.unsubscribe());\r\n this.bindings = [];\r\n }\r\n\r\n private applyValue(element: unknown, property: string, value: unknown): void {\r\n // Abstract - actual implementation depends on renderer (Three.js, DOM, etc.)\r\n if (element && typeof element === 'object') {\r\n const el = element as Record<string, unknown>;\r\n const props = property.split('.');\r\n let target = el;\r\n\r\n for (let i = 0; i < props.length - 1; i++) {\r\n target = target[props[i]] as Record<string, unknown>;\r\n if (!target) return;\r\n }\r\n\r\n target[props[props.length - 1]] = value;\r\n }\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// EXPORTS\r\n// =============================================================================\r\n\r\nexport {\r\n track,\r\n trigger,\r\n runEffect,\r\n flushEffects,\r\n createReactiveProxy,\r\n};\r\n","/**\r\n * VR Trait System\r\n *\r\n * Implements VR interaction traits for HoloScript+ objects:\r\n * - @grabbable - Hand grab interactions\r\n * - @throwable - Physics-based throwing\r\n * - @pointable - Laser pointer interactions\r\n * - @hoverable - Hover state and highlights\r\n * - @scalable - Two-handed scaling\r\n * - @rotatable - Rotation interactions\r\n * - @stackable - Stacking behavior\r\n * - @snappable - Snap-to-point behavior\r\n * - @breakable - Destruction on impact\r\n *\r\n * @version 1.0.0\r\n */\r\n\r\nimport type {\r\n VRTraitName,\r\n VRHand,\r\n ThrowVelocity,\r\n CollisionEvent,\r\n Vector3,\r\n GrabbableTrait,\r\n ThrowableTrait,\r\n PointableTrait,\r\n HoverableTrait,\r\n ScalableTrait,\r\n RotatableTrait,\r\n StackableTrait,\r\n SnappableTrait,\r\n BreakableTrait,\r\n HSPlusNode,\r\n} from '../types/HoloScriptPlus';\r\n\r\n// =============================================================================\r\n// TRAIT HANDLER TYPES\r\n// =============================================================================\r\n\r\nexport interface TraitHandler<TConfig = unknown> {\r\n name: VRTraitName;\r\n defaultConfig: TConfig;\r\n onAttach?: (node: HSPlusNode, config: TConfig, context: TraitContext) => void;\r\n onDetach?: (node: HSPlusNode, config: TConfig, context: TraitContext) => void;\r\n onUpdate?: (node: HSPlusNode, config: TConfig, context: TraitContext, delta: number) => void;\r\n onEvent?: (node: HSPlusNode, config: TConfig, context: TraitContext, event: TraitEvent) => void;\r\n}\r\n\r\nexport interface TraitContext {\r\n vr: VRContext;\r\n physics: PhysicsContext;\r\n audio: AudioContext;\r\n haptics: HapticsContext;\r\n emit: (event: string, payload?: unknown) => void;\r\n getState: () => Record<string, unknown>;\r\n setState: (updates: Record<string, unknown>) => void;\r\n}\r\n\r\nexport interface VRContext {\r\n hands: {\r\n left: VRHand | null;\r\n right: VRHand | null;\r\n };\r\n headset: {\r\n position: Vector3;\r\n rotation: Vector3;\r\n };\r\n getPointerRay: (hand: 'left' | 'right') => { origin: Vector3; direction: Vector3 } | null;\r\n getDominantHand: () => VRHand | null;\r\n}\r\n\r\nexport interface PhysicsContext {\r\n applyVelocity: (node: HSPlusNode, velocity: Vector3) => void;\r\n applyAngularVelocity: (node: HSPlusNode, angularVelocity: Vector3) => void;\r\n setKinematic: (node: HSPlusNode, kinematic: boolean) => void;\r\n raycast: (origin: Vector3, direction: Vector3, maxDistance: number) => RaycastHit | null;\r\n}\r\n\r\nexport interface RaycastHit {\r\n node: HSPlusNode;\r\n point: Vector3;\r\n normal: Vector3;\r\n distance: number;\r\n}\r\n\r\nexport interface AudioContext {\r\n playSound: (source: string, options?: { position?: Vector3; volume?: number; spatial?: boolean }) => void;\r\n}\r\n\r\nexport interface HapticsContext {\r\n pulse: (hand: 'left' | 'right', intensity: number, duration?: number) => void;\r\n rumble: (hand: 'left' | 'right', intensity: number) => void;\r\n}\r\n\r\nexport type TraitEvent =\r\n | { type: 'grab_start'; hand: VRHand }\r\n | { type: 'grab_end'; hand: VRHand; velocity: ThrowVelocity }\r\n | { type: 'hover_enter'; hand: VRHand }\r\n | { type: 'hover_exit'; hand: VRHand }\r\n | { type: 'point_enter'; hand: VRHand }\r\n | { type: 'point_exit'; hand: VRHand }\r\n | { type: 'collision'; data: CollisionEvent }\r\n | { type: 'trigger_enter'; other: HSPlusNode }\r\n | { type: 'trigger_exit'; other: HSPlusNode }\r\n | { type: 'click'; hand: VRHand }\r\n | { type: 'scale_start'; hands: { left: VRHand; right: VRHand } }\r\n | { type: 'scale_update'; scale: number }\r\n | { type: 'scale_end'; finalScale: number }\r\n | { type: 'rotate_start'; hand: VRHand }\r\n | { type: 'rotate_update'; rotation: Vector3 }\r\n | { type: 'rotate_end'; finalRotation: Vector3 };\r\n\r\n// =============================================================================\r\n// TRAIT STATE\r\n// =============================================================================\r\n\r\ninterface GrabState {\r\n isGrabbed: boolean;\r\n grabbingHand: VRHand | null;\r\n grabOffset: Vector3;\r\n grabRotationOffset: Vector3;\r\n previousHandPositions: Vector3[];\r\n previousHandTimes: number[];\r\n}\r\n\r\ninterface HoverState {\r\n isHovered: boolean;\r\n hoveringHand: VRHand | null;\r\n originalScale: number;\r\n originalColor: string | null;\r\n}\r\n\r\ninterface PointState {\r\n isPointed: boolean;\r\n pointingHand: VRHand | null;\r\n}\r\n\r\ninterface ScaleState {\r\n isScaling: boolean;\r\n initialDistance: number;\r\n initialScale: number;\r\n}\r\n\r\ninterface RotateState {\r\n isRotating: boolean;\r\n initialHandRotation: Vector3;\r\n initialObjectRotation: Vector3;\r\n}\r\n\r\ninterface StackState {\r\n stackedItems: HSPlusNode[];\r\n stackParent: HSPlusNode | null;\r\n}\r\n\r\n// =============================================================================\r\n// GRABBABLE TRAIT\r\n// =============================================================================\r\n\r\nconst grabbableHandler: TraitHandler<GrabbableTrait> = {\r\n name: 'grabbable',\r\n\r\n defaultConfig: {\r\n snap_to_hand: true,\r\n two_handed: false,\r\n haptic_on_grab: 0.5,\r\n grab_points: [],\r\n preserve_rotation: false,\r\n distance_grab: false,\r\n max_grab_distance: 3,\r\n },\r\n\r\n onAttach(node, config, context) {\r\n // Initialize grab state\r\n const state: GrabState = {\r\n isGrabbed: false,\r\n grabbingHand: null,\r\n grabOffset: [0, 0, 0],\r\n grabRotationOffset: [0, 0, 0],\r\n previousHandPositions: [],\r\n previousHandTimes: [],\r\n };\r\n (node as unknown as { __grabState: GrabState }).__grabState = state;\r\n },\r\n\r\n onDetach(node) {\r\n delete (node as unknown as { __grabState?: GrabState }).__grabState;\r\n },\r\n\r\n onUpdate(node, config, context, delta) {\r\n const state = (node as unknown as { __grabState: GrabState }).__grabState;\r\n if (!state?.isGrabbed || !state.grabbingHand) return;\r\n\r\n // Follow hand position\r\n const hand = state.grabbingHand;\r\n const newPosition: Vector3 = config.snap_to_hand\r\n ? hand.position\r\n : [\r\n hand.position[0] + state.grabOffset[0],\r\n hand.position[1] + state.grabOffset[1],\r\n hand.position[2] + state.grabOffset[2],\r\n ];\r\n\r\n // Update position\r\n node.properties.position = newPosition;\r\n\r\n // Track velocity for throw\r\n state.previousHandPositions.push([...hand.position]);\r\n state.previousHandTimes.push(Date.now());\r\n\r\n // Keep last 10 frames\r\n if (state.previousHandPositions.length > 10) {\r\n state.previousHandPositions.shift();\r\n state.previousHandTimes.shift();\r\n }\r\n\r\n // Update rotation if not preserving\r\n if (!config.preserve_rotation) {\r\n node.properties.rotation = hand.rotation;\r\n }\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n const state = (node as unknown as { __grabState: GrabState }).__grabState;\r\n\r\n if (event.type === 'grab_start') {\r\n // Check distance for distance grab\r\n if (!config.distance_grab) {\r\n const handPos = event.hand.position;\r\n const nodePos = node.properties.position as Vector3 || [0, 0, 0];\r\n const distance = Math.sqrt(\r\n Math.pow(handPos[0] - nodePos[0], 2) +\r\n Math.pow(handPos[1] - nodePos[1], 2) +\r\n Math.pow(handPos[2] - nodePos[2], 2)\r\n );\r\n if (distance > (config.max_grab_distance || 3)) return;\r\n }\r\n\r\n state.isGrabbed = true;\r\n state.grabbingHand = event.hand;\r\n\r\n // Calculate grab offset\r\n const nodePos = node.properties.position as Vector3 || [0, 0, 0];\r\n state.grabOffset = [\r\n nodePos[0] - event.hand.position[0],\r\n nodePos[1] - event.hand.position[1],\r\n nodePos[2] - event.hand.position[2],\r\n ];\r\n\r\n // Haptic feedback\r\n if (config.haptic_on_grab) {\r\n context.haptics.pulse(event.hand.id, config.haptic_on_grab);\r\n }\r\n\r\n // Make kinematic while grabbed\r\n context.physics.setKinematic(node, true);\r\n\r\n // Emit grab event\r\n context.emit('grab', { node, hand: event.hand });\r\n }\r\n\r\n if (event.type === 'grab_end') {\r\n state.isGrabbed = false;\r\n state.grabbingHand = null;\r\n\r\n // Re-enable physics\r\n context.physics.setKinematic(node, false);\r\n\r\n // Calculate throw velocity from tracked positions\r\n if (state.previousHandPositions.length >= 2) {\r\n const len = state.previousHandPositions.length;\r\n const dt = (state.previousHandTimes[len - 1] - state.previousHandTimes[0]) / 1000;\r\n if (dt > 0) {\r\n const velocity: Vector3 = [\r\n (state.previousHandPositions[len - 1][0] - state.previousHandPositions[0][0]) / dt,\r\n (state.previousHandPositions[len - 1][1] - state.previousHandPositions[0][1]) / dt,\r\n (state.previousHandPositions[len - 1][2] - state.previousHandPositions[0][2]) / dt,\r\n ];\r\n\r\n // Apply velocity if throwable trait exists\r\n if (node.traits.has('throwable')) {\r\n const throwConfig = node.traits.get('throwable') as ThrowableTrait;\r\n const multiplier = throwConfig.velocity_multiplier || 1;\r\n context.physics.applyVelocity(node, [\r\n velocity[0] * multiplier,\r\n velocity[1] * multiplier,\r\n velocity[2] * multiplier,\r\n ]);\r\n }\r\n }\r\n }\r\n\r\n // Clear tracking\r\n state.previousHandPositions = [];\r\n state.previousHandTimes = [];\r\n\r\n // Emit release event\r\n context.emit('release', { node, velocity: event.velocity });\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// THROWABLE TRAIT\r\n// =============================================================================\r\n\r\nconst throwableHandler: TraitHandler<ThrowableTrait> = {\r\n name: 'throwable',\r\n\r\n defaultConfig: {\r\n velocity_multiplier: 1,\r\n gravity: true,\r\n max_velocity: 50,\r\n spin: true,\r\n bounce: false,\r\n bounce_factor: 0.5,\r\n },\r\n\r\n onAttach(node, config, context) {\r\n // Throwable works with grabbable - just configures throw behavior\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n if (event.type === 'collision' && config.bounce) {\r\n const collision = event.data;\r\n const bounceFactor = config.bounce_factor || 0.5;\r\n\r\n // Reflect velocity\r\n const velocity = collision.relativeVelocity;\r\n const normal = collision.normal;\r\n const dot = velocity[0] * normal[0] + velocity[1] * normal[1] + velocity[2] * normal[2];\r\n const reflected: Vector3 = [\r\n (velocity[0] - 2 * dot * normal[0]) * bounceFactor,\r\n (velocity[1] - 2 * dot * normal[1]) * bounceFactor,\r\n (velocity[2] - 2 * dot * normal[2]) * bounceFactor,\r\n ];\r\n\r\n context.physics.applyVelocity(node, reflected);\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// POINTABLE TRAIT\r\n// =============================================================================\r\n\r\nconst pointableHandler: TraitHandler<PointableTrait> = {\r\n name: 'pointable',\r\n\r\n defaultConfig: {\r\n highlight_on_point: true,\r\n highlight_color: '#00ff00',\r\n cursor_style: 'pointer',\r\n },\r\n\r\n onAttach(node, config, context) {\r\n const state: PointState = {\r\n isPointed: false,\r\n pointingHand: null,\r\n };\r\n (node as unknown as { __pointState: PointState }).__pointState = state;\r\n },\r\n\r\n onDetach(node) {\r\n delete (node as unknown as { __pointState?: PointState }).__pointState;\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n const state = (node as unknown as { __pointState: PointState }).__pointState;\r\n\r\n if (event.type === 'point_enter') {\r\n state.isPointed = true;\r\n state.pointingHand = event.hand;\r\n\r\n if (config.highlight_on_point) {\r\n node.properties.__originalEmissive = node.properties.emissive;\r\n node.properties.emissive = config.highlight_color;\r\n }\r\n\r\n context.emit('point_enter', { node, hand: event.hand });\r\n }\r\n\r\n if (event.type === 'point_exit') {\r\n state.isPointed = false;\r\n state.pointingHand = null;\r\n\r\n if (config.highlight_on_point) {\r\n node.properties.emissive = node.properties.__originalEmissive || null;\r\n delete node.properties.__originalEmissive;\r\n }\r\n\r\n context.emit('point_exit', { node });\r\n }\r\n\r\n if (event.type === 'click') {\r\n context.emit('click', { node, hand: event.hand });\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// HOVERABLE TRAIT\r\n// =============================================================================\r\n\r\nconst hoverableHandler: TraitHandler<HoverableTrait> = {\r\n name: 'hoverable',\r\n\r\n defaultConfig: {\r\n highlight_color: '#ffffff',\r\n scale_on_hover: 1.1,\r\n show_tooltip: false,\r\n tooltip_offset: [0, 0.2, 0],\r\n glow: false,\r\n glow_intensity: 0.5,\r\n },\r\n\r\n onAttach(node, config, context) {\r\n const state: HoverState = {\r\n isHovered: false,\r\n hoveringHand: null,\r\n originalScale: typeof node.properties.scale === 'number' ? node.properties.scale : 1,\r\n originalColor: null,\r\n };\r\n (node as unknown as { __hoverState: HoverState }).__hoverState = state;\r\n },\r\n\r\n onDetach(node) {\r\n delete (node as unknown as { __hoverState?: HoverState }).__hoverState;\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n const state = (node as unknown as { __hoverState: HoverState }).__hoverState;\r\n\r\n if (event.type === 'hover_enter') {\r\n state.isHovered = true;\r\n state.hoveringHand = event.hand;\r\n\r\n // Scale up\r\n if (config.scale_on_hover && config.scale_on_hover !== 1) {\r\n state.originalScale = typeof node.properties.scale === 'number' ? node.properties.scale : 1;\r\n node.properties.scale = state.originalScale * config.scale_on_hover;\r\n }\r\n\r\n // Glow effect\r\n if (config.glow) {\r\n state.originalColor = (node.properties.emissive as string) || null;\r\n node.properties.emissive = config.highlight_color;\r\n node.properties.emissiveIntensity = config.glow_intensity;\r\n }\r\n\r\n // Tooltip\r\n if (config.show_tooltip) {\r\n const tooltipText = typeof config.show_tooltip === 'string'\r\n ? config.show_tooltip\r\n : node.properties.tooltip || node.id || node.type;\r\n context.emit('show_tooltip', {\r\n node,\r\n text: tooltipText,\r\n offset: config.tooltip_offset,\r\n });\r\n }\r\n\r\n context.emit('hover_enter', { node, hand: event.hand });\r\n }\r\n\r\n if (event.type === 'hover_exit') {\r\n state.isHovered = false;\r\n state.hoveringHand = null;\r\n\r\n // Restore scale\r\n if (config.scale_on_hover && config.scale_on_hover !== 1) {\r\n node.properties.scale = state.originalScale;\r\n }\r\n\r\n // Remove glow\r\n if (config.glow) {\r\n node.properties.emissive = state.originalColor;\r\n delete node.properties.emissiveIntensity;\r\n }\r\n\r\n // Hide tooltip\r\n if (config.show_tooltip) {\r\n context.emit('hide_tooltip', { node });\r\n }\r\n\r\n context.emit('hover_exit', { node });\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// SCALABLE TRAIT\r\n// =============================================================================\r\n\r\nconst scalableHandler: TraitHandler<ScalableTrait> = {\r\n name: 'scalable',\r\n\r\n defaultConfig: {\r\n min_scale: 0.1,\r\n max_scale: 10,\r\n uniform: true,\r\n pivot: [0, 0, 0],\r\n },\r\n\r\n onAttach(node, config, context) {\r\n const state: ScaleState = {\r\n isScaling: false,\r\n initialDistance: 0,\r\n initialScale: 1,\r\n };\r\n (node as unknown as { __scaleState: ScaleState }).__scaleState = state;\r\n },\r\n\r\n onDetach(node) {\r\n delete (node as unknown as { __scaleState?: ScaleState }).__scaleState;\r\n },\r\n\r\n onUpdate(node, config, context, delta) {\r\n const state = (node as unknown as { __scaleState: ScaleState }).__scaleState;\r\n if (!state?.isScaling) return;\r\n\r\n const { hands } = context.vr;\r\n if (!hands.left || !hands.right) return;\r\n\r\n // Calculate current distance between hands\r\n const currentDistance = Math.sqrt(\r\n Math.pow(hands.right.position[0] - hands.left.position[0], 2) +\r\n Math.pow(hands.right.position[1] - hands.left.position[1], 2) +\r\n Math.pow(hands.right.position[2] - hands.left.position[2], 2)\r\n );\r\n\r\n // Calculate scale factor\r\n const scaleFactor = currentDistance / state.initialDistance;\r\n let newScale = state.initialScale * scaleFactor;\r\n\r\n // Clamp scale\r\n newScale = Math.max(config.min_scale || 0.1, Math.min(config.max_scale || 10, newScale));\r\n\r\n node.properties.scale = newScale;\r\n\r\n context.emit('scale_update', { node, scale: newScale });\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n const state = (node as unknown as { __scaleState: ScaleState }).__scaleState;\r\n\r\n if (event.type === 'scale_start') {\r\n state.isScaling = true;\r\n state.initialScale = typeof node.properties.scale === 'number' ? node.properties.scale : 1;\r\n\r\n // Calculate initial distance between hands\r\n const { left, right } = event.hands;\r\n state.initialDistance = Math.sqrt(\r\n Math.pow(right.position[0] - left.position[0], 2) +\r\n Math.pow(right.position[1] - left.position[1], 2) +\r\n Math.pow(right.position[2] - left.position[2], 2)\r\n );\r\n\r\n context.emit('scale_start', { node });\r\n }\r\n\r\n if (event.type === 'scale_end') {\r\n state.isScaling = false;\r\n context.emit('scale_end', { node, finalScale: node.properties.scale });\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// ROTATABLE TRAIT\r\n// =============================================================================\r\n\r\nconst rotatableHandler: TraitHandler<RotatableTrait> = {\r\n name: 'rotatable',\r\n\r\n defaultConfig: {\r\n axis: 'all',\r\n snap_angles: [],\r\n speed: 1,\r\n },\r\n\r\n onAttach(node, _config, _context) {\r\n const state: RotateState = {\r\n isRotating: false,\r\n initialHandRotation: [0, 0, 0],\r\n initialObjectRotation: [0, 0, 0],\r\n };\r\n (node as unknown as { __rotateState: RotateState }).__rotateState = state;\r\n },\r\n\r\n onDetach(node) {\r\n delete (node as unknown as { __rotateState?: RotateState }).__rotateState;\r\n },\r\n\r\n onUpdate(node, config, context, _delta) {\r\n const state = (node as unknown as { __rotateState: RotateState }).__rotateState;\r\n if (!state?.isRotating) return;\r\n\r\n const hand = context.vr.getDominantHand();\r\n if (!hand) return;\r\n\r\n // Calculate rotation delta\r\n const deltaRotation: Vector3 = [\r\n (hand.rotation[0] - state.initialHandRotation[0]) * (config.speed || 1),\r\n (hand.rotation[1] - state.initialHandRotation[1]) * (config.speed || 1),\r\n (hand.rotation[2] - state.initialHandRotation[2]) * (config.speed || 1),\r\n ];\r\n\r\n // Apply axis constraint\r\n let newRotation: Vector3;\r\n switch (config.axis) {\r\n case 'x':\r\n newRotation = [\r\n state.initialObjectRotation[0] + deltaRotation[0],\r\n state.initialObjectRotation[1],\r\n state.initialObjectRotation[2],\r\n ];\r\n break;\r\n case 'y':\r\n newRotation = [\r\n state.initialObjectRotation[0],\r\n state.initialObjectRotation[1] + deltaRotation[1],\r\n state.initialObjectRotation[2],\r\n ];\r\n break;\r\n case 'z':\r\n newRotation = [\r\n state.initialObjectRotation[0],\r\n state.initialObjectRotation[1],\r\n state.initialObjectRotation[2] + deltaRotation[2],\r\n ];\r\n break;\r\n default:\r\n newRotation = [\r\n state.initialObjectRotation[0] + deltaRotation[0],\r\n state.initialObjectRotation[1] + deltaRotation[1],\r\n state.initialObjectRotation[2] + deltaRotation[2],\r\n ];\r\n }\r\n\r\n // Snap to angles if configured\r\n if (config.snap_angles && config.snap_angles.length > 0) {\r\n newRotation = newRotation.map((angle) => {\r\n let closest = config.snap_angles![0];\r\n let minDiff = Math.abs(angle - closest);\r\n for (const snapAngle of config.snap_angles!) {\r\n const diff = Math.abs(angle - snapAngle);\r\n if (diff < minDiff) {\r\n minDiff = diff;\r\n closest = snapAngle;\r\n }\r\n }\r\n // Only snap if close enough\r\n return minDiff < 10 ? closest : angle;\r\n }) as Vector3;\r\n }\r\n\r\n node.properties.rotation = newRotation;\r\n context.emit('rotate_update', { node, rotation: newRotation });\r\n },\r\n\r\n onEvent(node, _config, context, event) {\r\n const state = (node as unknown as { __rotateState: RotateState }).__rotateState;\r\n\r\n if (event.type === 'rotate_start') {\r\n state.isRotating = true;\r\n state.initialHandRotation = [...event.hand.rotation];\r\n state.initialObjectRotation = (node.properties.rotation as Vector3) || [0, 0, 0];\r\n\r\n context.emit('rotate_start', { node });\r\n }\r\n\r\n if (event.type === 'rotate_end') {\r\n state.isRotating = false;\r\n context.emit('rotate_end', { node, finalRotation: node.properties.rotation });\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// STACKABLE TRAIT\r\n// =============================================================================\r\n\r\nconst stackableHandler: TraitHandler<StackableTrait> = {\r\n name: 'stackable',\r\n\r\n defaultConfig: {\r\n stack_axis: 'y',\r\n stack_offset: 0,\r\n max_stack: 10,\r\n snap_distance: 0.5,\r\n },\r\n\r\n onAttach(node, _config, _context) {\r\n const state: StackState = {\r\n stackedItems: [],\r\n stackParent: null,\r\n };\r\n (node as unknown as { __stackState: StackState }).__stackState = state;\r\n },\r\n\r\n onDetach(node) {\r\n const state = (node as unknown as { __stackState: StackState }).__stackState;\r\n // Remove from parent stack\r\n if (state.stackParent) {\r\n const parentState = (state.stackParent as unknown as { __stackState: StackState }).__stackState;\r\n const index = parentState.stackedItems.indexOf(node);\r\n if (index > -1) {\r\n parentState.stackedItems.splice(index, 1);\r\n }\r\n }\r\n // Clear children\r\n state.stackedItems = [];\r\n delete (node as unknown as { __stackState?: StackState }).__stackState;\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n const state = (node as unknown as { __stackState: StackState }).__stackState;\r\n\r\n if (event.type === 'collision' || event.type === 'trigger_enter') {\r\n const other = event.type === 'collision' ? event.data.target : (event as { other: HSPlusNode }).other;\r\n\r\n // Check if other is stackable\r\n if (!other.traits.has('stackable')) return;\r\n\r\n const otherState = (other as unknown as { __stackState: StackState }).__stackState;\r\n if (!otherState) return;\r\n\r\n // Check stack limit\r\n if (state.stackedItems.length >= (config.max_stack || 10)) return;\r\n\r\n // Check if close enough\r\n const nodePos = node.properties.position as Vector3 || [0, 0, 0];\r\n const otherPos = other.properties.position as Vector3 || [0, 0, 0];\r\n\r\n const axisIndex = config.stack_axis === 'x' ? 0 : config.stack_axis === 'z' ? 2 : 1;\r\n const otherAxes = [0, 1, 2].filter((i) => i !== axisIndex);\r\n\r\n // Check alignment on other axes\r\n let aligned = true;\r\n for (const axis of otherAxes) {\r\n if (Math.abs(nodePos[axis] - otherPos[axis]) > (config.snap_distance || 0.5)) {\r\n aligned = false;\r\n break;\r\n }\r\n }\r\n\r\n if (aligned && otherPos[axisIndex] > nodePos[axisIndex]) {\r\n // Other is above - add to stack\r\n state.stackedItems.push(other);\r\n otherState.stackParent = node;\r\n\r\n // Snap position\r\n const stackOffset = config.stack_offset || 0;\r\n const newPos: Vector3 = [...nodePos];\r\n newPos[axisIndex] = nodePos[axisIndex] + stackOffset;\r\n\r\n other.properties.position = newPos;\r\n\r\n context.emit('stack', { parent: node, child: other });\r\n }\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// SNAPPABLE TRAIT\r\n// =============================================================================\r\n\r\nconst snappableHandler: TraitHandler<SnappableTrait> = {\r\n name: 'snappable',\r\n\r\n defaultConfig: {\r\n snap_points: [],\r\n snap_distance: 0.3,\r\n snap_rotation: false,\r\n magnetic: false,\r\n },\r\n\r\n onUpdate(node, config, _context, _delta) {\r\n if (!config.snap_points || config.snap_points.length === 0) return;\r\n if (!config.magnetic) return;\r\n\r\n const nodePos = node.properties.position as Vector3 || [0, 0, 0];\r\n\r\n // Find closest snap point\r\n let closestPoint: Vector3 | null = null;\r\n let closestDistance = config.snap_distance || 0.3;\r\n\r\n for (const snapPoint of config.snap_points) {\r\n const distance = Math.sqrt(\r\n Math.pow(nodePos[0] - snapPoint[0], 2) +\r\n Math.pow(nodePos[1] - snapPoint[1], 2) +\r\n Math.pow(nodePos[2] - snapPoint[2], 2)\r\n );\r\n\r\n if (distance < closestDistance) {\r\n closestDistance = distance;\r\n closestPoint = snapPoint;\r\n }\r\n }\r\n\r\n // Apply magnetic pull\r\n if (closestPoint) {\r\n const pullStrength = 0.1;\r\n node.properties.position = [\r\n nodePos[0] + (closestPoint[0] - nodePos[0]) * pullStrength,\r\n nodePos[1] + (closestPoint[1] - nodePos[1]) * pullStrength,\r\n nodePos[2] + (closestPoint[2] - nodePos[2]) * pullStrength,\r\n ];\r\n }\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n if (event.type !== 'grab_end') return;\r\n if (!config.snap_points || config.snap_points.length === 0) return;\r\n\r\n const nodePos = node.properties.position as Vector3 || [0, 0, 0];\r\n\r\n // Find closest snap point\r\n let closestPoint: Vector3 | null = null;\r\n let closestDistance = config.snap_distance || 0.3;\r\n\r\n for (const snapPoint of config.snap_points) {\r\n const distance = Math.sqrt(\r\n Math.pow(nodePos[0] - snapPoint[0], 2) +\r\n Math.pow(nodePos[1] - snapPoint[1], 2) +\r\n Math.pow(nodePos[2] - snapPoint[2], 2)\r\n );\r\n\r\n if (distance < closestDistance) {\r\n closestDistance = distance;\r\n closestPoint = snapPoint;\r\n }\r\n }\r\n\r\n // Snap to closest point\r\n if (closestPoint) {\r\n node.properties.position = closestPoint;\r\n context.emit('snap', { node, point: closestPoint });\r\n\r\n // Haptic feedback\r\n context.haptics.pulse(event.hand.id, 0.3);\r\n }\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// BREAKABLE TRAIT\r\n// =============================================================================\r\n\r\nconst breakableHandler: TraitHandler<BreakableTrait> = {\r\n name: 'breakable',\r\n\r\n defaultConfig: {\r\n break_velocity: 5,\r\n fragments: 8,\r\n fragment_mesh: undefined,\r\n sound_on_break: undefined,\r\n respawn: false,\r\n respawn_delay: '5s',\r\n },\r\n\r\n onEvent(node, config, context, event) {\r\n if (event.type !== 'collision') return;\r\n\r\n const collision = event.data;\r\n const impactVelocity = Math.sqrt(\r\n Math.pow(collision.relativeVelocity[0], 2) +\r\n Math.pow(collision.relativeVelocity[1], 2) +\r\n Math.pow(collision.relativeVelocity[2], 2)\r\n );\r\n\r\n if (impactVelocity < (config.break_velocity || 5)) return;\r\n\r\n // Play break sound\r\n if (config.sound_on_break) {\r\n context.audio.playSound(config.sound_on_break, {\r\n position: collision.point,\r\n spatial: true,\r\n });\r\n }\r\n\r\n // Spawn fragments\r\n const fragmentCount = config.fragments || 8;\r\n for (let i = 0; i < fragmentCount; i++) {\r\n const angle = (i / fragmentCount) * Math.PI * 2;\r\n const velocity: Vector3 = [\r\n Math.cos(angle) * 2,\r\n Math.random() * 3,\r\n Math.sin(angle) * 2,\r\n ];\r\n\r\n context.emit('spawn_fragment', {\r\n position: collision.point,\r\n velocity,\r\n mesh: config.fragment_mesh,\r\n });\r\n }\r\n\r\n // Emit break event\r\n context.emit('break', { node, impactVelocity, collision });\r\n\r\n // Handle respawn\r\n if (config.respawn) {\r\n const delay = parseDuration(config.respawn_delay || '5s');\r\n setTimeout(() => {\r\n context.emit('respawn', { node });\r\n }, delay);\r\n }\r\n\r\n // Mark for destruction\r\n node.properties.__destroyed = true;\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// UTILITIES\r\n// =============================================================================\r\n\r\nfunction parseDuration(duration: string): number {\r\n const match = duration.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m)$/);\r\n if (!match) return 0;\r\n\r\n const value = parseFloat(match[1]);\r\n const unit = match[2];\r\n\r\n switch (unit) {\r\n case 'ms':\r\n return value;\r\n case 's':\r\n return value * 1000;\r\n case 'm':\r\n return value * 60 * 1000;\r\n default:\r\n return value;\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// TRAIT REGISTRY\r\n// =============================================================================\r\n\r\nexport class VRTraitRegistry {\r\n private handlers: Map<VRTraitName, TraitHandler> = new Map();\r\n\r\n constructor() {\r\n // Register all built-in handlers\r\n this.register(grabbableHandler);\r\n this.register(throwableHandler);\r\n this.register(pointableHandler);\r\n this.register(hoverableHandler);\r\n this.register(scalableHandler);\r\n this.register(rotatableHandler);\r\n this.register(stackableHandler);\r\n this.register(snappableHandler);\r\n this.register(breakableHandler);\r\n }\r\n\r\n register<T>(handler: TraitHandler<T>): void {\r\n this.handlers.set(handler.name, handler as TraitHandler);\r\n }\r\n\r\n getHandler(name: VRTraitName): TraitHandler | undefined {\r\n return this.handlers.get(name);\r\n }\r\n\r\n attachTrait(node: HSPlusNode, traitName: VRTraitName, config: unknown, context: TraitContext): void {\r\n const handler = this.handlers.get(traitName);\r\n if (!handler) return;\r\n\r\n const mergedConfig = { ...(handler.defaultConfig as object), ...(config as object) };\r\n node.traits.set(traitName, mergedConfig);\r\n\r\n if (handler.onAttach) {\r\n handler.onAttach(node, mergedConfig, context);\r\n }\r\n }\r\n\r\n detachTrait(node: HSPlusNode, traitName: VRTraitName, context: TraitContext): void {\r\n const handler = this.handlers.get(traitName);\r\n if (!handler) return;\r\n\r\n const config = node.traits.get(traitName);\r\n if (config && handler.onDetach) {\r\n handler.onDetach(node, config, context);\r\n }\r\n\r\n node.traits.delete(traitName);\r\n }\r\n\r\n updateTrait(node: HSPlusNode, traitName: VRTraitName, context: TraitContext, delta: number): void {\r\n const handler = this.handlers.get(traitName);\r\n if (!handler || !handler.onUpdate) return;\r\n\r\n const config = node.traits.get(traitName);\r\n if (config) {\r\n handler.onUpdate(node, config, context, delta);\r\n }\r\n }\r\n\r\n handleEvent(node: HSPlusNode, traitName: VRTraitName, context: TraitContext, event: TraitEvent): void {\r\n const handler = this.handlers.get(traitName);\r\n if (!handler || !handler.onEvent) return;\r\n\r\n const config = node.traits.get(traitName);\r\n if (config) {\r\n handler.onEvent(node, config, context, event);\r\n }\r\n }\r\n\r\n updateAllTraits(node: HSPlusNode, context: TraitContext, delta: number): void {\r\n for (const traitName of node.traits.keys()) {\r\n this.updateTrait(node, traitName, context, delta);\r\n }\r\n }\r\n\r\n handleEventForAllTraits(node: HSPlusNode, context: TraitContext, event: TraitEvent): void {\r\n for (const traitName of node.traits.keys()) {\r\n this.handleEvent(node, traitName, context, event);\r\n }\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// EXPORTS\r\n// =============================================================================\r\n\r\nexport const vrTraitRegistry = new VRTraitRegistry();\r\n\r\nexport {\r\n grabbableHandler,\r\n throwableHandler,\r\n pointableHandler,\r\n hoverableHandler,\r\n scalableHandler,\r\n rotatableHandler,\r\n stackableHandler,\r\n snappableHandler,\r\n breakableHandler,\r\n};\r\n","/**\r\n * HoloScript+ Runtime Engine\r\n *\r\n * Executes parsed HoloScript+ AST with:\r\n * - Control flow (@for, @if) evaluation\r\n * - Lifecycle hook management\r\n * - VR trait integration\r\n * - Reactive state binding\r\n * - TypeScript companion integration\r\n *\r\n * @version 1.0.0\r\n */\r\n\r\nimport type {\r\n HSPlusAST,\r\n HSPlusNode,\r\n HSPlusDirective,\r\n HSPlusRuntime,\r\n HSPlusBuiltins,\r\n StateDeclaration,\r\n VRHand,\r\n Vector3,\r\n Color,\r\n} from '../types/HoloScriptPlus';\r\nimport { ReactiveState, createState, ExpressionEvaluator } from '../state/ReactiveState';\r\nimport { VRTraitRegistry, vrTraitRegistry, TraitContext, TraitEvent } from '../traits/VRTraitSystem';\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\ntype LifecycleHandler = (...args: unknown[]) => void;\r\n\r\ninterface NodeInstance {\r\n node: HSPlusNode;\r\n renderedNode: unknown; // Actual 3D object from renderer\r\n lifecycleHandlers: Map<string, LifecycleHandler[]>;\r\n children: NodeInstance[];\r\n parent: NodeInstance | null;\r\n destroyed: boolean;\r\n}\r\n\r\ninterface RuntimeOptions {\r\n renderer?: Renderer;\r\n vrEnabled?: boolean;\r\n companions?: Record<string, Record<string, (...args: unknown[]) => unknown>>;\r\n}\r\n\r\ninterface Renderer {\r\n createElement(type: string, properties: Record<string, unknown>): unknown;\r\n updateElement(element: unknown, properties: Record<string, unknown>): void;\r\n appendChild(parent: unknown, child: unknown): void;\r\n removeChild(parent: unknown, child: unknown): void;\r\n destroy(element: unknown): void;\r\n}\r\n\r\n// =============================================================================\r\n// BUILT-IN FUNCTIONS\r\n// =============================================================================\r\n\r\nfunction createBuiltins(runtime: HoloScriptPlusRuntimeImpl): HSPlusBuiltins {\r\n return {\r\n Math,\r\n\r\n range: (start: number, end: number, step: number = 1): number[] => {\r\n const result: number[] = [];\r\n if (step > 0) {\r\n for (let i = start; i < end; i += step) {\r\n result.push(i);\r\n }\r\n } else if (step < 0) {\r\n for (let i = start; i > end; i += step) {\r\n result.push(i);\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n interpolate_color: (t: number, from: Color, to: Color): Color => {\r\n // Parse hex colors\r\n const parseHex = (hex: string): [number, number, number] => {\r\n const clean = hex.replace('#', '');\r\n return [\r\n parseInt(clean.substring(0, 2), 16),\r\n parseInt(clean.substring(2, 4), 16),\r\n parseInt(clean.substring(4, 6), 16),\r\n ];\r\n };\r\n\r\n const toHex = (r: number, g: number, b: number): string => {\r\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\r\n return `#${clamp(r).toString(16).padStart(2, '0')}${clamp(g).toString(16).padStart(2, '0')}${clamp(b).toString(16).padStart(2, '0')}`;\r\n };\r\n\r\n const [r1, g1, b1] = parseHex(from);\r\n const [r2, g2, b2] = parseHex(to);\r\n\r\n return toHex(\r\n r1 + (r2 - r1) * t,\r\n g1 + (g2 - g1) * t,\r\n b1 + (b2 - b1) * t\r\n );\r\n },\r\n\r\n distance_to: (point: Vector3): number => {\r\n const viewer = runtime.vrContext.headset.position;\r\n return Math.sqrt(\r\n Math.pow(point[0] - viewer[0], 2) +\r\n Math.pow(point[1] - viewer[1], 2) +\r\n Math.pow(point[2] - viewer[2], 2)\r\n );\r\n },\r\n\r\n distance_to_viewer: (): number => {\r\n return 0; // Override in node context\r\n },\r\n\r\n hand_position: (handId: string): Vector3 => {\r\n const hand = handId === 'left' ? runtime.vrContext.hands.left : runtime.vrContext.hands.right;\r\n return hand?.position || [0, 0, 0];\r\n },\r\n\r\n hand_velocity: (handId: string): Vector3 => {\r\n const hand = handId === 'left' ? runtime.vrContext.hands.left : runtime.vrContext.hands.right;\r\n return hand?.velocity || [0, 0, 0];\r\n },\r\n\r\n dominant_hand: (): VRHand => {\r\n // Default to right hand\r\n return runtime.vrContext.hands.right || runtime.vrContext.hands.left || {\r\n id: 'right',\r\n position: [0, 0, 0],\r\n rotation: [0, 0, 0],\r\n velocity: [0, 0, 0],\r\n grip: 0,\r\n trigger: 0,\r\n };\r\n },\r\n\r\n play_sound: (source: string, options?: { volume?: number; spatial?: boolean }): void => {\r\n runtime.emit('play_sound', { source, ...options });\r\n },\r\n\r\n haptic_feedback: (hand: VRHand | string, intensity: number): void => {\r\n const handId = typeof hand === 'string' ? hand : hand.id;\r\n runtime.emit('haptic', { hand: handId, intensity });\r\n },\r\n\r\n haptic_pulse: (intensity: number): void => {\r\n runtime.emit('haptic', { hand: 'both', intensity });\r\n },\r\n\r\n apply_velocity: (node: HSPlusNode, velocity: Vector3): void => {\r\n runtime.emit('apply_velocity', { node, velocity });\r\n },\r\n\r\n spawn: (template: string, position: Vector3): HSPlusNode => {\r\n return runtime.spawnTemplate(template, position);\r\n },\r\n\r\n destroy: (node: HSPlusNode): void => {\r\n runtime.destroyNode(node);\r\n },\r\n\r\n api_call: async (url: string, method: string, body?: unknown): Promise<unknown> => {\r\n const response = await fetch(url, {\r\n method,\r\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n return response.json();\r\n },\r\n\r\n open_modal: (modalId: string): void => {\r\n runtime.emit('open_modal', { id: modalId });\r\n },\r\n\r\n close_modal: (modalId: string): void => {\r\n runtime.emit('close_modal', { id: modalId });\r\n },\r\n\r\n setTimeout: (callback: () => void, delay: number): number => {\r\n return window.setTimeout(callback, delay) as unknown as number;\r\n },\r\n\r\n clearTimeout: (id: number): void => {\r\n window.clearTimeout(id);\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// RUNTIME IMPLEMENTATION\r\n// =============================================================================\r\n\r\nclass HoloScriptPlusRuntimeImpl implements HSPlusRuntime {\r\n private ast: HSPlusAST;\r\n private options: RuntimeOptions;\r\n private state: ReactiveState<StateDeclaration>;\r\n private evaluator: ExpressionEvaluator;\r\n private builtins: HSPlusBuiltins;\r\n private traitRegistry: VRTraitRegistry;\r\n private rootInstance: NodeInstance | null = null;\r\n private eventHandlers: Map<string, Set<(payload: unknown) => void>> = new Map();\r\n private templates: Map<string, HSPlusNode> = new Map();\r\n private updateLoopId: number | null = null;\r\n private lastUpdateTime: number = 0;\r\n private companions: Record<string, Record<string, (...args: unknown[]) => unknown>>;\r\n private mounted: boolean = false;\r\n\r\n // VR context\r\n vrContext = {\r\n hands: {\r\n left: null as VRHand | null,\r\n right: null as VRHand | null,\r\n },\r\n headset: {\r\n position: [0, 1.6, 0] as Vector3,\r\n rotation: [0, 0, 0] as Vector3,\r\n },\r\n controllers: {\r\n left: null as unknown,\r\n right: null as unknown,\r\n },\r\n };\r\n\r\n constructor(ast: HSPlusAST, options: RuntimeOptions = {}) {\r\n this.ast = ast;\r\n this.options = options;\r\n this.state = createState({});\r\n this.traitRegistry = vrTraitRegistry;\r\n this.companions = options.companions || {};\r\n this.builtins = createBuiltins(this);\r\n\r\n // Create expression evaluator with context\r\n this.evaluator = new ExpressionEvaluator(\r\n this.state.getSnapshot(),\r\n this.builtins as unknown as Record<string, unknown>\r\n );\r\n\r\n // Initialize state from AST\r\n this.initializeState();\r\n\r\n // Load imports\r\n this.loadImports();\r\n }\r\n\r\n // ==========================================================================\r\n // INITIALIZATION\r\n // ==========================================================================\r\n\r\n private initializeState(): void {\r\n const stateDirective = this.ast.root.directives.find((d: HSPlusDirective) => d.type === 'state');\r\n if (stateDirective && stateDirective.type === 'state') {\r\n this.state.update(stateDirective.body);\r\n }\r\n }\r\n\r\n private loadImports(): void {\r\n for (const imp of this.ast.imports) {\r\n // Companions should be provided via options\r\n if (this.companions[imp.alias]) {\r\n // Already loaded\r\n continue;\r\n }\r\n console.warn(`Import ${imp.path} not found. Provide via companions option.`);\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // MOUNTING\r\n // ==========================================================================\r\n\r\n mount(container: unknown): void {\r\n if (this.mounted) {\r\n console.warn('Runtime already mounted');\r\n return;\r\n }\r\n\r\n this.mounted = true;\r\n\r\n // Build node tree\r\n this.rootInstance = this.instantiateNode(this.ast.root, null);\r\n\r\n // Mount to container\r\n if (this.options.renderer && this.rootInstance) {\r\n this.options.renderer.appendChild(container, this.rootInstance.renderedNode);\r\n }\r\n\r\n // Call mount lifecycle\r\n this.callLifecycle(this.rootInstance, 'on_mount');\r\n\r\n // Start update loop\r\n this.startUpdateLoop();\r\n }\r\n\r\n unmount(): void {\r\n if (!this.mounted) return;\r\n\r\n // Stop update loop\r\n this.stopUpdateLoop();\r\n\r\n // Call unmount lifecycle\r\n if (this.rootInstance) {\r\n this.callLifecycle(this.rootInstance, 'on_unmount');\r\n this.destroyInstance(this.rootInstance);\r\n }\r\n\r\n this.rootInstance = null;\r\n this.mounted = false;\r\n }\r\n\r\n // ==========================================================================\r\n // NODE INSTANTIATION\r\n // ==========================================================================\r\n\r\n private instantiateNode(node: HSPlusNode, parent: NodeInstance | null): NodeInstance {\r\n const instance: NodeInstance = {\r\n node,\r\n renderedNode: null,\r\n lifecycleHandlers: new Map(),\r\n children: [],\r\n parent,\r\n destroyed: false,\r\n };\r\n\r\n // Process directives\r\n this.processDirectives(instance);\r\n\r\n // Create rendered element\r\n if (this.options.renderer) {\r\n const properties = this.evaluateProperties(node.properties);\r\n instance.renderedNode = this.options.renderer.createElement(node.type, properties);\r\n }\r\n\r\n // Attach VR traits\r\n for (const [traitName, config] of node.traits) {\r\n this.traitRegistry.attachTrait(node, traitName, config, this.createTraitContext(instance));\r\n }\r\n\r\n // Process children with control flow\r\n const children = this.processControlFlow(node.children, node.directives);\r\n for (const childNode of children) {\r\n const childInstance = this.instantiateNode(childNode, instance);\r\n instance.children.push(childInstance);\r\n\r\n if (this.options.renderer && instance.renderedNode) {\r\n this.options.renderer.appendChild(instance.renderedNode, childInstance.renderedNode);\r\n }\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n private processDirectives(instance: NodeInstance): void {\r\n for (const directive of instance.node.directives) {\r\n if (directive.type === 'lifecycle') {\r\n this.registerLifecycleHandler(instance, directive);\r\n }\r\n }\r\n }\r\n\r\n private registerLifecycleHandler(instance: NodeInstance, directive: HSPlusDirective & { type: 'lifecycle' }): void {\r\n const { hook, params, body } = directive;\r\n\r\n // Create handler function\r\n const handler = (...args: unknown[]) => {\r\n // Build parameter context\r\n const paramContext: Record<string, unknown> = {};\r\n if (params) {\r\n params.forEach((param: string, i: number) => {\r\n paramContext[param] = args[i];\r\n });\r\n }\r\n\r\n // Evaluate body\r\n this.evaluator.updateContext({\r\n ...this.state.getSnapshot(),\r\n ...paramContext,\r\n node: instance.node,\r\n self: instance.node,\r\n });\r\n\r\n try {\r\n // Check if body looks like code or expression\r\n if (body.includes(';') || body.includes('{')) {\r\n // Execute as code block\r\n new Function(\r\n ...Object.keys(this.builtins),\r\n ...Object.keys(paramContext),\r\n 'state',\r\n 'node',\r\n body\r\n )(\r\n ...Object.values(this.builtins),\r\n ...Object.values(paramContext),\r\n this.state,\r\n instance.node\r\n );\r\n } else {\r\n // Evaluate as expression\r\n this.evaluator.evaluate(body);\r\n }\r\n } catch (error) {\r\n console.error(`Error in lifecycle handler ${hook}:`, error);\r\n }\r\n };\r\n\r\n // Register handler\r\n if (!instance.lifecycleHandlers.has(hook)) {\r\n instance.lifecycleHandlers.set(hook, []);\r\n }\r\n instance.lifecycleHandlers.get(hook)!.push(handler);\r\n }\r\n\r\n // ==========================================================================\r\n // CONTROL FLOW\r\n // ==========================================================================\r\n\r\n private processControlFlow(children: HSPlusNode[], directives: HSPlusDirective[]): HSPlusNode[] {\r\n const result: HSPlusNode[] = [];\r\n\r\n // Process @for directives\r\n for (const directive of directives) {\r\n if (directive.type === 'for') {\r\n const items = this.evaluateExpression(directive.iterable);\r\n if (Array.isArray(items)) {\r\n items.forEach((item, index) => {\r\n // Create context for each iteration\r\n const iterContext = {\r\n [directive.variable]: item,\r\n index,\r\n first: index === 0,\r\n last: index === items.length - 1,\r\n even: index % 2 === 0,\r\n odd: index % 2 !== 0,\r\n };\r\n\r\n // Clone and process body nodes\r\n for (const bodyNode of directive.body) {\r\n const cloned = this.cloneNodeWithContext(bodyNode, iterContext);\r\n result.push(cloned);\r\n }\r\n });\r\n }\r\n } else if (directive.type === 'if') {\r\n const condition = this.evaluateExpression(directive.condition);\r\n if (condition) {\r\n result.push(...directive.body);\r\n } else if (directive.else) {\r\n result.push(...directive.else);\r\n }\r\n }\r\n }\r\n\r\n // Add regular children\r\n result.push(...children);\r\n\r\n return result;\r\n }\r\n\r\n private cloneNodeWithContext(node: HSPlusNode, context: Record<string, unknown>): HSPlusNode {\r\n // Deep clone the node\r\n const cloned: HSPlusNode = {\r\n type: node.type,\r\n id: node.id ? this.interpolateString(node.id, context) : undefined,\r\n properties: this.interpolateProperties(node.properties, context),\r\n directives: [...node.directives],\r\n children: node.children.map((child: HSPlusNode) => this.cloneNodeWithContext(child, context)),\r\n traits: new Map(node.traits),\r\n loc: node.loc,\r\n };\r\n\r\n return cloned;\r\n }\r\n\r\n private interpolateString(str: string, context: Record<string, unknown>): string {\r\n return str.replace(/\\$\\{([^}]+)\\}/g, (_match, expr) => {\r\n this.evaluator.updateContext(context);\r\n const value = this.evaluator.evaluate(expr);\r\n return String(value ?? '');\r\n });\r\n }\r\n\r\n private interpolateProperties(\r\n properties: Record<string, unknown>,\r\n context: Record<string, unknown>\r\n ): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(properties)) {\r\n if (typeof value === 'string') {\r\n result[key] = this.interpolateString(value, context);\r\n } else if (value && typeof value === 'object' && '__expr' in (value as object)) {\r\n this.evaluator.updateContext(context);\r\n result[key] = this.evaluator.evaluate((value as { __raw: string }).__raw);\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // ==========================================================================\r\n // EXPRESSION EVALUATION\r\n // ==========================================================================\r\n\r\n private evaluateExpression(expr: string): unknown {\r\n this.evaluator.updateContext(this.state.getSnapshot());\r\n return this.evaluator.evaluate(expr);\r\n }\r\n\r\n private evaluateProperties(properties: Record<string, unknown>): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(properties)) {\r\n if (value && typeof value === 'object' && '__expr' in value) {\r\n result[key] = this.evaluateExpression((value as unknown as { __raw: string }).__raw);\r\n } else if (value && typeof value === 'object' && '__ref' in value) {\r\n // Reference to state or companion\r\n const ref = (value as { __ref: string }).__ref;\r\n result[key] = this.state.get(ref as keyof StateDeclaration) ?? ref;\r\n } else if (typeof value === 'string' && value.includes('${')) {\r\n // String interpolation\r\n result[key] = this.interpolateString(value, this.state.getSnapshot());\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // ==========================================================================\r\n // LIFECYCLE\r\n // ==========================================================================\r\n\r\n private callLifecycle(instance: NodeInstance | null, hook: string, ...args: unknown[]): void {\r\n if (!instance || instance.destroyed) return;\r\n\r\n const handlers = instance.lifecycleHandlers.get(hook);\r\n if (handlers) {\r\n handlers.forEach((handler) => {\r\n try {\r\n handler(...args);\r\n } catch (error) {\r\n console.error(`Error in lifecycle ${hook}:`, error);\r\n }\r\n });\r\n }\r\n\r\n // Recurse to children\r\n for (const child of instance.children) {\r\n this.callLifecycle(child, hook, ...args);\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // UPDATE LOOP\r\n // ==========================================================================\r\n\r\n private startUpdateLoop(): void {\r\n this.lastUpdateTime = performance.now();\r\n\r\n const update = () => {\r\n const now = performance.now();\r\n const delta = (now - this.lastUpdateTime) / 1000; // Convert to seconds\r\n this.lastUpdateTime = now;\r\n\r\n this.update(delta);\r\n\r\n this.updateLoopId = requestAnimationFrame(update);\r\n };\r\n\r\n this.updateLoopId = requestAnimationFrame(update);\r\n }\r\n\r\n private stopUpdateLoop(): void {\r\n if (this.updateLoopId !== null) {\r\n cancelAnimationFrame(this.updateLoopId);\r\n this.updateLoopId = null;\r\n }\r\n }\r\n\r\n private update(delta: number): void {\r\n if (!this.rootInstance) return;\r\n\r\n // Update all instances\r\n this.updateInstance(this.rootInstance, delta);\r\n\r\n // Call update lifecycle\r\n this.callLifecycle(this.rootInstance, 'on_update', delta);\r\n }\r\n\r\n private updateInstance(instance: NodeInstance, delta: number): void {\r\n if (instance.destroyed) return;\r\n\r\n // Update VR traits\r\n const traitContext = this.createTraitContext(instance);\r\n this.traitRegistry.updateAllTraits(instance.node, traitContext, delta);\r\n\r\n // Update rendered element if properties changed\r\n if (this.options.renderer && instance.renderedNode) {\r\n const properties = this.evaluateProperties(instance.node.properties);\r\n this.options.renderer.updateElement(instance.renderedNode, properties);\r\n }\r\n\r\n // Update children\r\n for (const child of instance.children) {\r\n this.updateInstance(child, delta);\r\n }\r\n }\r\n\r\n // ==========================================================================\r\n // TRAIT CONTEXT\r\n // ==========================================================================\r\n\r\n private createTraitContext(_instance: NodeInstance): TraitContext {\r\n return {\r\n vr: {\r\n hands: this.vrContext.hands,\r\n headset: this.vrContext.headset,\r\n getPointerRay: (hand) => {\r\n const vrHand = hand === 'left' ? this.vrContext.hands.left : this.vrContext.hands.right;\r\n if (!vrHand) return null;\r\n return {\r\n origin: vrHand.position,\r\n direction: [0, 0, -1], // Forward direction - should be calculated from rotation\r\n };\r\n },\r\n getDominantHand: () => this.vrContext.hands.right || this.vrContext.hands.left,\r\n },\r\n physics: {\r\n applyVelocity: (node, velocity) => {\r\n this.emit('apply_velocity', { node, velocity });\r\n },\r\n applyAngularVelocity: (node, angularVelocity) => {\r\n this.emit('apply_angular_velocity', { node, angularVelocity });\r\n },\r\n setKinematic: (node, kinematic) => {\r\n this.emit('set_kinematic', { node, kinematic });\r\n },\r\n raycast: (_origin, _direction, _maxDistance) => {\r\n // Would need physics engine integration\r\n return null;\r\n },\r\n },\r\n audio: {\r\n playSound: (source, options) => {\r\n this.emit('play_sound', { source, ...options });\r\n },\r\n },\r\n haptics: {\r\n pulse: (hand, intensity, duration) => {\r\n this.emit('haptic', { hand, intensity, duration, type: 'pulse' });\r\n },\r\n rumble: (hand, intensity) => {\r\n this.emit('haptic', { hand, intensity, type: 'rumble' });\r\n },\r\n },\r\n emit: this.emit.bind(this),\r\n getState: () => this.state.getSnapshot(),\r\n setState: (updates) => this.state.update(updates),\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // NODE DESTRUCTION\r\n // ==========================================================================\r\n\r\n private destroyInstance(instance: NodeInstance): void {\r\n if (instance.destroyed) return;\r\n\r\n instance.destroyed = true;\r\n\r\n // Destroy children first\r\n for (const child of instance.children) {\r\n this.destroyInstance(child);\r\n }\r\n\r\n // Detach traits\r\n const traitContext = this.createTraitContext(instance);\r\n for (const traitName of instance.node.traits.keys()) {\r\n this.traitRegistry.detachTrait(instance.node, traitName, traitContext);\r\n }\r\n\r\n // Destroy rendered element\r\n if (this.options.renderer && instance.renderedNode) {\r\n this.options.renderer.destroy(instance.renderedNode);\r\n }\r\n\r\n // Clear handlers\r\n instance.lifecycleHandlers.clear();\r\n instance.children = [];\r\n }\r\n\r\n // ==========================================================================\r\n // PUBLIC API\r\n // ==========================================================================\r\n\r\n updateData(data: unknown): void {\r\n this.state.set('data', data);\r\n this.callLifecycle(this.rootInstance, 'on_data_update', data);\r\n }\r\n\r\n getState(): StateDeclaration {\r\n return this.state.getSnapshot();\r\n }\r\n\r\n setState(updates: Partial<StateDeclaration>): void {\r\n this.state.update(updates);\r\n }\r\n\r\n emit(event: string, payload?: unknown): void {\r\n const handlers = this.eventHandlers.get(event);\r\n if (handlers) {\r\n handlers.forEach((handler) => {\r\n try {\r\n handler(payload);\r\n } catch (error) {\r\n console.error(`Error in event handler for ${event}:`, error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n on(event: string, handler: (payload: unknown) => void): () => void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n\r\n return () => {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n };\r\n }\r\n\r\n // ==========================================================================\r\n // VR INTEGRATION\r\n // ==========================================================================\r\n\r\n updateVRContext(context: typeof this.vrContext): void {\r\n this.vrContext = context;\r\n }\r\n\r\n handleVREvent(event: TraitEvent, node: HSPlusNode): void {\r\n // Find instance for node\r\n const instance = this.findInstance(node);\r\n if (!instance) return;\r\n\r\n // Dispatch to traits\r\n const traitContext = this.createTraitContext(instance);\r\n this.traitRegistry.handleEventForAllTraits(node, traitContext, event);\r\n\r\n // Call lifecycle hooks based on event type\r\n const hookMapping: Record<string, string> = {\r\n grab_start: 'on_grab',\r\n grab_end: 'on_release',\r\n hover_enter: 'on_hover_enter',\r\n hover_exit: 'on_hover_exit',\r\n point_enter: 'on_point_enter',\r\n point_exit: 'on_point_exit',\r\n collision: 'on_collision',\r\n trigger_enter: 'on_trigger_enter',\r\n trigger_exit: 'on_trigger_exit',\r\n click: 'on_click',\r\n };\r\n\r\n const hook = hookMapping[event.type];\r\n if (hook) {\r\n this.callLifecycle(instance, hook, event);\r\n }\r\n }\r\n\r\n private findInstance(node: HSPlusNode, root: NodeInstance | null = this.rootInstance): NodeInstance | null {\r\n if (!root) return null;\r\n if (root.node === node) return root;\r\n\r\n for (const child of root.children) {\r\n const found = this.findInstance(node, child);\r\n if (found) return found;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // ==========================================================================\r\n // TEMPLATES & SPAWNING\r\n // ==========================================================================\r\n\r\n registerTemplate(name: string, node: HSPlusNode): void {\r\n this.templates.set(name, node);\r\n }\r\n\r\n spawnTemplate(name: string, position: Vector3): HSPlusNode {\r\n const template = this.templates.get(name);\r\n if (!template) {\r\n throw new Error(`Template \"${name}\" not found`);\r\n }\r\n\r\n // Clone template\r\n const cloned = this.cloneNodeWithContext(template, { position });\r\n cloned.properties.position = position;\r\n\r\n // Instantiate\r\n if (this.rootInstance) {\r\n const instance = this.instantiateNode(cloned, this.rootInstance);\r\n this.rootInstance.children.push(instance);\r\n\r\n if (this.options.renderer && this.rootInstance.renderedNode) {\r\n this.options.renderer.appendChild(this.rootInstance.renderedNode, instance.renderedNode);\r\n }\r\n\r\n this.callLifecycle(instance, 'on_mount');\r\n }\r\n\r\n return cloned;\r\n }\r\n\r\n destroyNode(node: HSPlusNode): void {\r\n const instance = this.findInstance(node);\r\n if (!instance) return;\r\n\r\n // Call unmount\r\n this.callLifecycle(instance, 'on_unmount');\r\n\r\n // Remove from parent\r\n if (instance.parent) {\r\n const index = instance.parent.children.indexOf(instance);\r\n if (index > -1) {\r\n instance.parent.children.splice(index, 1);\r\n }\r\n\r\n if (this.options.renderer && instance.parent.renderedNode && instance.renderedNode) {\r\n this.options.renderer.removeChild(instance.parent.renderedNode, instance.renderedNode);\r\n }\r\n }\r\n\r\n // Destroy\r\n this.destroyInstance(instance);\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// FACTORY FUNCTION\r\n// =============================================================================\r\n\r\nexport function createRuntime(\r\n ast: HSPlusAST,\r\n options?: RuntimeOptions\r\n): HSPlusRuntime {\r\n return new HoloScriptPlusRuntimeImpl(ast, options);\r\n}\r\n\r\n// =============================================================================\r\n// EXPORTS\r\n// =============================================================================\r\n\r\nexport { HoloScriptPlusRuntimeImpl };\r\nexport type { RuntimeOptions, Renderer, NodeInstance };\r\n","/**\r\n * @holoscript/core VoiceInput Trait\r\n *\r\n * Enables voice-driven interactions for HoloScript+ objects\r\n * Integrates speech recognition with confidence-based command parsing\r\n */\r\n\r\nexport type VoiceInputMode = 'continuous' | 'push-to-talk' | 'always-listening';\r\nexport type ConfidenceThreshold = number; // 0.0 to 1.0\r\n\r\n/**\r\n * Voice input configuration for HoloScript+ objects\r\n */\r\nexport interface VoiceInputConfig {\r\n /** Speech recognition mode */\r\n mode: VoiceInputMode;\r\n \r\n /** Minimum confidence level (0-1) to trigger command */\r\n confidenceThreshold: ConfidenceThreshold;\r\n \r\n /** Languages supported (BCP 47 codes) */\r\n languages?: string[];\r\n \r\n /** Commands this object responds to */\r\n commands?: VoiceCommand[];\r\n \r\n /** Enable speech-to-text display */\r\n showTranscript?: boolean;\r\n \r\n /** Audio feedback (beep on recognition) */\r\n audioFeedback?: boolean;\r\n \r\n /** Max command processing time (ms) */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Voice command definition\r\n */\r\nexport interface VoiceCommand {\r\n /** Primary trigger phrase */\r\n phrase: string;\r\n \r\n /** Alternative phrases (fuzzy matching) */\r\n aliases?: string[];\r\n \r\n /** Confidence threshold for this specific command */\r\n confidence?: number;\r\n \r\n /** Action to execute */\r\n action: string;\r\n \r\n /** Parameters extracted from command */\r\n params?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Voice recognition result\r\n */\r\nexport interface VoiceRecognitionResult {\r\n /** Transcribed text */\r\n transcript: string;\r\n \r\n /** Confidence (0-1) */\r\n confidence: number;\r\n \r\n /** Is final result or interim? */\r\n isFinal: boolean;\r\n \r\n /** Language detected */\r\n language: string;\r\n \r\n /** Matched command if any */\r\n matchedCommand?: VoiceCommand;\r\n \r\n /** Timestamp */\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Voice input event\r\n */\r\nexport interface VoiceInputEvent {\r\n type: 'start' | 'interim' | 'final' | 'error' | 'timeout';\r\n result: VoiceRecognitionResult;\r\n hologramId: string;\r\n}\r\n\r\n/**\r\n * VoiceInputTrait - Enables speech recognition on HoloScript+ objects\r\n */\r\nexport class VoiceInputTrait {\r\n private config: VoiceInputConfig;\r\n private recognition: any = null;\r\n private isListening: boolean = false;\r\n private listeners: Set<(event: VoiceInputEvent) => void> = new Set();\r\n private interimTranscript: string = '';\r\n private commandCache: Map<string, VoiceCommand> = new Map();\r\n\r\n constructor(config: VoiceInputConfig) {\r\n this.config = {\r\n showTranscript: false,\r\n audioFeedback: true,\r\n timeout: 10000,\r\n ...config,\r\n };\r\n\r\n this.initializeRecognition();\r\n this.buildCommandCache();\r\n }\r\n\r\n /**\r\n * Initialize Web Speech API\r\n */\r\n private initializeRecognition(): void {\r\n // Use native Web Speech API or polyfill\r\n const SpeechRecognition = (globalThis as any).SpeechRecognition ||\r\n (globalThis as any).webkitSpeechRecognition;\r\n\r\n if (!SpeechRecognition) {\r\n console.error('Web Speech API not supported');\r\n return;\r\n }\r\n\r\n this.recognition = new SpeechRecognition();\r\n this.setupRecognitionHandlers();\r\n }\r\n\r\n /**\r\n * Setup Web Speech API event handlers\r\n */\r\n private setupRecognitionHandlers(): void {\r\n if (!this.recognition) return;\r\n\r\n this.recognition.continuous = this.config.mode === 'continuous';\r\n this.recognition.interimResults = true;\r\n this.recognition.lang = this.config.languages?.[0] || 'en-US';\r\n\r\n this.recognition.onstart = () => {\r\n this.isListening = true;\r\n this.interimTranscript = '';\r\n if (this.config.audioFeedback) {\r\n this.playBeep('start');\r\n }\r\n };\r\n\r\n this.recognition.onresult = (event: any) => {\r\n this.interimTranscript = '';\r\n\r\n for (let i = event.resultIndex; i < event.results.length; i++) {\r\n const transcript = event.results[i][0].transcript;\r\n const confidence = event.results[i][0].confidence;\r\n const isFinal = event.results[i].isFinal;\r\n\r\n if (isFinal) {\r\n this.processVoiceCommand(transcript, confidence);\r\n } else {\r\n this.interimTranscript += transcript;\r\n }\r\n }\r\n\r\n if (this.config.showTranscript) {\r\n this.emitEvent({\r\n type: 'interim',\r\n result: {\r\n transcript: this.interimTranscript,\r\n confidence: 0,\r\n isFinal: false,\r\n language: this.recognition.lang,\r\n timestamp: Date.now(),\r\n },\r\n hologramId: '',\r\n });\r\n }\r\n };\r\n\r\n this.recognition.onerror = (_event: any) => {\r\n this.emitEvent({\r\n type: 'error',\r\n result: {\r\n transcript: '',\r\n confidence: 0,\r\n isFinal: false,\r\n language: this.recognition.lang,\r\n timestamp: Date.now(),\r\n },\r\n hologramId: '',\r\n });\r\n };\r\n\r\n this.recognition.onend = () => {\r\n this.isListening = false;\r\n if (this.config.audioFeedback) {\r\n this.playBeep('end');\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Process voice command with fuzzy matching\r\n */\r\n private processVoiceCommand(\r\n transcript: string,\r\n confidence: number\r\n ): void {\r\n if (confidence < this.config.confidenceThreshold) {\r\n return;\r\n }\r\n\r\n const normalized = transcript.toLowerCase().trim();\r\n let bestMatch: VoiceCommand | null = null;\r\n let bestScore: number = 0;\r\n\r\n // Try to find matching command\r\n for (const command of this.config.commands || []) {\r\n const cmdConfidence = command.confidence || this.config.confidenceThreshold;\r\n\r\n // Exact match\r\n if (normalized === command.phrase.toLowerCase()) {\r\n if (confidence >= cmdConfidence) {\r\n bestMatch = command;\r\n bestScore = 1.0;\r\n break;\r\n }\r\n }\r\n\r\n // Fuzzy match with aliases\r\n const allPhrases = [command.phrase, ...(command.aliases || [])];\r\n for (const phrase of allPhrases) {\r\n const score = this.fuzzyMatch(normalized, phrase.toLowerCase());\r\n if (score > bestScore && score >= 0.7) {\r\n bestScore = score;\r\n bestMatch = command;\r\n }\r\n }\r\n }\r\n\r\n // Emit recognition result\r\n this.emitEvent({\r\n type: 'final',\r\n result: {\r\n transcript: normalized,\r\n confidence,\r\n isFinal: true,\r\n language: this.recognition.lang,\r\n matchedCommand: bestMatch || undefined,\r\n timestamp: Date.now(),\r\n },\r\n hologramId: '',\r\n });\r\n\r\n if (bestMatch) {\r\n if (this.config.audioFeedback) {\r\n this.playBeep('success');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Fuzzy string matching (simple Levenshtein-like approach)\r\n */\r\n private fuzzyMatch(input: string, target: string): number {\r\n if (input === target) return 1.0;\r\n if (input.length === 0 || target.length === 0) return 0;\r\n\r\n // Check if input is substring of target\r\n if (target.includes(input)) {\r\n return Math.min(1.0, input.length / target.length);\r\n }\r\n\r\n // Simple edit distance estimation\r\n const distance = Math.abs(input.length - target.length);\r\n const maxLen = Math.max(input.length, target.length);\r\n return Math.max(0, 1.0 - distance / maxLen);\r\n }\r\n\r\n /**\r\n * Build command index for faster lookup\r\n */\r\n private buildCommandCache(): void {\r\n for (const command of this.config.commands || []) {\r\n this.commandCache.set(command.phrase.toLowerCase(), command);\r\n for (const alias of command.aliases || []) {\r\n this.commandCache.set(alias.toLowerCase(), command);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Start listening for voice input\r\n */\r\n public startListening(): void {\r\n if (!this.recognition || this.isListening) return;\r\n\r\n try {\r\n this.recognition.start();\r\n } catch (error) {\r\n console.error('Failed to start speech recognition:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Stop listening for voice input\r\n */\r\n public stopListening(): void {\r\n if (!this.recognition || !this.isListening) return;\r\n\r\n try {\r\n this.recognition.stop();\r\n } catch (error) {\r\n console.error('Failed to stop speech recognition:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle listening state\r\n */\r\n public toggleListening(): void {\r\n if (this.isListening) {\r\n this.stopListening();\r\n } else {\r\n this.startListening();\r\n }\r\n }\r\n\r\n /**\r\n * Add command listener\r\n */\r\n public on(listener: (event: VoiceInputEvent) => void): void {\r\n this.listeners.add(listener);\r\n }\r\n\r\n /**\r\n * Remove command listener\r\n */\r\n public off(listener: (event: VoiceInputEvent) => void): void {\r\n this.listeners.delete(listener);\r\n }\r\n\r\n /**\r\n * Emit voice event to all listeners\r\n */\r\n private emitEvent(event: VoiceInputEvent): void {\r\n for (const listener of this.listeners) {\r\n listener(event);\r\n }\r\n }\r\n\r\n /**\r\n * Play audio feedback beep\r\n */\r\n private playBeep(type: 'start' | 'end' | 'success'): void {\r\n // AudioContext beep generation\r\n try {\r\n const audioContext = new (globalThis as any).AudioContext();\r\n const oscillator = audioContext.createOscillator();\r\n const gainNode = audioContext.createGain();\r\n\r\n oscillator.connect(gainNode);\r\n gainNode.connect(audioContext.destination);\r\n\r\n const now = audioContext.currentTime;\r\n const duration = 0.1;\r\n\r\n // Vary beep frequency by type\r\n oscillator.frequency.value = type === 'start' ? 800 : type === 'success' ? 1000 : 600;\r\n gainNode.gain.setValueAtTime(0.3, now);\r\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + duration);\r\n\r\n oscillator.start(now);\r\n oscillator.stop(now + duration);\r\n } catch (error) {\r\n // Silently fail if audio not available\r\n }\r\n }\r\n\r\n /**\r\n * Get current listening state\r\n */\r\n public isActive(): boolean {\r\n return this.isListening;\r\n }\r\n\r\n /**\r\n * Dispose and cleanup\r\n */\r\n public dispose(): void {\r\n if (this.recognition) {\r\n this.recognition.abort();\r\n }\r\n this.listeners.clear();\r\n this.commandCache.clear();\r\n }\r\n}\r\n\r\n/**\r\n * HoloScript+ @voice_input trait factory\r\n */\r\nexport function createVoiceInputTrait(config: VoiceInputConfig): VoiceInputTrait {\r\n return new VoiceInputTrait(config);\r\n}\r\n","/**\r\n * @holoscript/core AI-Driven NPC Trait\r\n *\r\n * Enables intelligent NPC behaviors using behavior trees and goal planning\r\n * Integrates with Infinity Assistant service for agent-based decision making\r\n */\r\n\r\nexport type BehaviorState = 'idle' | 'moving' | 'acting' | 'talking' | 'reacting';\r\nexport type DecisionMode = 'reactive' | 'goal-driven' | 'learning' | 'hybrid';\r\n\r\n/**\r\n * Behavior tree node\r\n */\r\nexport interface BehaviorNode {\r\n id: string;\r\n type: 'sequence' | 'selector' | 'parallel' | 'action' | 'condition';\r\n children?: BehaviorNode[];\r\n action?: (context: NPCContext) => Promise<boolean>;\r\n condition?: (context: NPCContext) => boolean;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * NPC Context for behavior execution\r\n */\r\nexport interface NPCContext {\r\n npcId: string;\r\n position: [number, number, number];\r\n rotation: [number, number, number];\r\n targetId?: string;\r\n targetPosition?: [number, number, number];\r\n memory: Map<string, unknown>;\r\n state: BehaviorState;\r\n energy: number; // 0-1\r\n mood: number; // -1 to 1 (negative = sad, positive = happy)\r\n perception: {\r\n nearbyEntities: string[];\r\n visibleEntities: string[];\r\n hearableVoice?: string;\r\n };\r\n dialogue?: {\r\n lastSaid?: string;\r\n lastHeard?: string;\r\n conversationHistory: Array<{ speaker: string; text: string }>;\r\n };\r\n}\r\n\r\n/**\r\n * Goal for GOAP-style planning\r\n */\r\nexport interface NPCGoal {\r\n id: string;\r\n name: string;\r\n priority: number; // 0-1\r\n preconditions: Map<string, unknown>;\r\n effects: Map<string, unknown>;\r\n cost: number;\r\n timeoutMs?: number;\r\n}\r\n\r\n/**\r\n * AI-Driven NPC configuration\r\n */\r\nexport interface AIDriverConfig {\r\n /** NPC identifier */\r\n npcId: string;\r\n \r\n /** Decision making mode */\r\n decisionMode: DecisionMode;\r\n \r\n /** Base behavior tree */\r\n behaviorTree?: BehaviorNode;\r\n \r\n /** Available goals */\r\n goals?: NPCGoal[];\r\n \r\n /** Personality traits */\r\n personality?: {\r\n sociability: number; // 0-1\r\n aggression: number; // 0-1\r\n curiosity: number; // 0-1\r\n loyalty: number; // 0-1\r\n };\r\n \r\n /** Response to stimuli */\r\n stimuliThresholds?: {\r\n hearing: number; // perception distance\r\n sight: number; // vision distance\r\n touch: number; // collision distance\r\n };\r\n \r\n /** Learning config */\r\n enableLearning?: boolean;\r\n learningRate?: number;\r\n \r\n /** Infinity Assistant integration */\r\n agentId?: string;\r\n}\r\n\r\n/**\r\n * Behavior tree runner\r\n */\r\nexport class BehaviorTreeRunner {\r\n private rootNode: BehaviorNode;\r\n\r\n constructor(rootNode: BehaviorNode) {\r\n this.rootNode = rootNode;\r\n }\r\n\r\n async tick(context: NPCContext): Promise<boolean> {\r\n return this.executeNode(this.rootNode, context);\r\n }\r\n\r\n private async executeNode(\r\n node: BehaviorNode,\r\n context: NPCContext\r\n ): Promise<boolean> {\r\n if (node.type === 'action') {\r\n if (node.action) {\r\n try {\r\n return await node.action(context);\r\n } catch (error) {\r\n console.error(`Action failed: ${node.id}`, error);\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n if (node.type === 'condition') {\r\n return node.condition ? node.condition(context) : true;\r\n }\r\n\r\n if (node.type === 'sequence') {\r\n for (const child of node.children || []) {\r\n const result = await this.executeNode(child, context);\r\n if (!result) return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (node.type === 'selector') {\r\n for (const child of node.children || []) {\r\n const result = await this.executeNode(child, context);\r\n if (result) return true;\r\n }\r\n return false;\r\n }\r\n\r\n if (node.type === 'parallel') {\r\n const results = await Promise.all(\r\n (node.children || []).map((child) => this.executeNode(child, context))\r\n );\r\n return results.every((r) => r);\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Goal-Oriented Action Planning (GOAP)\r\n */\r\nexport class GOAPPlanner {\r\n private goals: NPCGoal[];\r\n\r\n constructor(goals: NPCGoal[]) {\r\n this.goals = goals.sort((a, b) => b.priority - a.priority);\r\n }\r\n\r\n /**\r\n * Plan a sequence of actions to reach goal\r\n */\r\n planGoal(currentState: Map<string, unknown>, _goal: NPCGoal): NPCGoal[] {\r\n // Simple greedy planner: select highest-priority achievable goal\r\n for (const g of this.goals) {\r\n if (this.canAchieve(currentState, g)) {\r\n return [g];\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n private canAchieve(\r\n currentState: Map<string, unknown>,\r\n goal: NPCGoal\r\n ): boolean {\r\n for (const [key, value] of goal.preconditions) {\r\n if (currentState.get(key) !== value) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * AIDriverTrait - Enables intelligent NPC behaviors\r\n */\r\nexport class AIDriverTrait {\r\n private config: AIDriverConfig;\r\n private context: NPCContext;\r\n private behaviorRunner: BehaviorTreeRunner | null = null;\r\n private goapPlanner: GOAPPlanner | null = null;\r\n private updateInterval: ReturnType<typeof setInterval> | null = null;\r\n private learningModel: Map<string, number> = new Map();\r\n\r\n constructor(config: AIDriverConfig) {\r\n const defaults = {\r\n decisionMode: 'hybrid' as const,\r\n personality: {\r\n sociability: 0.5,\r\n aggression: 0.3,\r\n curiosity: 0.6,\r\n loyalty: 0.7,\r\n },\r\n stimuliThresholds: {\r\n hearing: 50,\r\n sight: 100,\r\n touch: 5,\r\n },\r\n enableLearning: true,\r\n learningRate: 0.1,\r\n };\r\n this.config = { ...defaults, ...config };\r\n\r\n this.context = {\r\n npcId: config.npcId,\r\n position: [0, 0, 0],\r\n rotation: [0, 0, 0],\r\n memory: new Map(),\r\n state: 'idle',\r\n energy: 1.0,\r\n mood: 0,\r\n perception: {\r\n nearbyEntities: [],\r\n visibleEntities: [],\r\n },\r\n };\r\n\r\n if (config.behaviorTree) {\r\n this.behaviorRunner = new BehaviorTreeRunner(config.behaviorTree);\r\n }\r\n\r\n if (config.goals && config.goals.length > 0) {\r\n this.goapPlanner = new GOAPPlanner(config.goals);\r\n }\r\n }\r\n\r\n /**\r\n * Start NPC AI loop\r\n */\r\n public startAI(): void {\r\n if (this.updateInterval) return;\r\n\r\n this.updateInterval = setInterval(() => {\r\n this.tick();\r\n }, 100); // 10 Hz update rate\r\n }\r\n\r\n /**\r\n * Stop NPC AI loop\r\n */\r\n public stopAI(): void {\r\n if (this.updateInterval) {\r\n clearInterval(this.updateInterval);\r\n this.updateInterval = null;\r\n }\r\n }\r\n\r\n /**\r\n * Main AI tick\r\n */\r\n private async tick(): Promise<void> {\r\n // Update energy (decreases over time)\r\n this.context.energy = Math.max(0, this.context.energy - 0.001);\r\n\r\n // Stress/mood changes\r\n if (this.context.perception.visibleEntities.length > 0) {\r\n this.context.mood += 0.1 * (Math.random() - 0.5);\r\n }\r\n\r\n // Execute appropriate decision mode\r\n switch (this.config.decisionMode) {\r\n case 'reactive':\r\n await this.reactiveDecision();\r\n break;\r\n case 'goal-driven':\r\n await this.goalDrivenDecision();\r\n break;\r\n case 'learning':\r\n await this.learningDecision();\r\n break;\r\n case 'hybrid':\r\n await this.hybridDecision();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Reactive decision: immediate response to stimuli\r\n */\r\n private async reactiveDecision(): Promise<void> {\r\n if (this.behaviorRunner) {\r\n await this.behaviorRunner.tick(this.context);\r\n }\r\n }\r\n\r\n /**\r\n * Goal-driven decision: plan towards objectives\r\n */\r\n private async goalDrivenDecision(): Promise<void> {\r\n if (!this.goapPlanner) return;\r\n\r\n const worldState = this.buildWorldState();\r\n // Select highest priority goal\r\n const plan = this.goapPlanner.planGoal(\r\n worldState,\r\n this.config.goals?.[0] || { id: 'idle', name: 'Idle', priority: 0, preconditions: new Map(), effects: new Map(), cost: 0 }\r\n );\r\n\r\n if (plan.length > 0) {\r\n // Execute plan\r\n this.context.state = 'moving';\r\n }\r\n }\r\n\r\n /**\r\n * Learning decision: adapt behavior from experience\r\n */\r\n private async learningDecision(): Promise<void> {\r\n // Composite reactive + learning\r\n await this.reactiveDecision();\r\n\r\n // Learn from interactions\r\n if (this.config.enableLearning) {\r\n this.updateLearningModel();\r\n }\r\n }\r\n\r\n /**\r\n * Hybrid decision: combination of reactive and goal-driven\r\n */\r\n private async hybridDecision(): Promise<void> {\r\n // Execute behavior tree (reactive)\r\n if (this.behaviorRunner) {\r\n const treeResult = await this.behaviorRunner.tick(this.context);\r\n\r\n // If no immediate action, pursue goals\r\n if (!treeResult && this.goapPlanner) {\r\n await this.goalDrivenDecision();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Build world state for planning\r\n */\r\n private buildWorldState(): Map<string, unknown> {\r\n const state = new Map<string, unknown>();\r\n state.set('position', this.context.position);\r\n state.set('energy', this.context.energy);\r\n state.set('mood', this.context.mood);\r\n state.set('nearbyEntities', this.context.perception.nearbyEntities.length);\r\n return state;\r\n }\r\n\r\n /**\r\n * Update learning model from interactions\r\n */\r\n private updateLearningModel(): void {\r\n // Simple Q-learning-like update\r\n const currentReward = this.calculateReward();\r\n const learningRate = this.config.learningRate || 0.1;\r\n\r\n // Update learned value estimates\r\n const stateKey = `state_${this.context.state}`;\r\n const currentValue = this.learningModel.get(stateKey) || 0;\r\n const newValue = currentValue + learningRate * (currentReward - currentValue);\r\n this.learningModel.set(stateKey, newValue);\r\n }\r\n\r\n /**\r\n * Calculate immediate reward\r\n */\r\n private calculateReward(): number {\r\n let reward = 0;\r\n\r\n // Reward based on energy maintenance\r\n if (this.context.energy > 0.5) reward += 1;\r\n\r\n // Reward based on social interaction (if sociable)\r\n if (\r\n this.config.personality?.sociability || 0 > 0.5 &&\r\n this.context.perception.nearbyEntities.length > 0\r\n ) {\r\n reward += 1;\r\n }\r\n\r\n // Reward based on goal progress\r\n if (this.context.state !== 'idle') reward += 0.5;\r\n\r\n return reward;\r\n }\r\n\r\n /**\r\n * Set NPC position\r\n */\r\n public setPosition(position: [number, number, number]): void {\r\n this.context.position = position;\r\n }\r\n\r\n /**\r\n * Update perception (nearby entities, visible targets)\r\n */\r\n public updatePerception(\r\n nearbyEntities: string[],\r\n visibleEntities: string[]\r\n ): void {\r\n this.context.perception.nearbyEntities = nearbyEntities;\r\n this.context.perception.visibleEntities = visibleEntities;\r\n }\r\n\r\n /**\r\n * Add dialogue to conversation history\r\n */\r\n public speak(text: string): void {\r\n if (!this.context.dialogue) {\r\n this.context.dialogue = { conversationHistory: [] };\r\n }\r\n this.context.dialogue.lastSaid = text;\r\n this.context.dialogue.conversationHistory.push({\r\n speaker: this.config.npcId,\r\n text,\r\n });\r\n }\r\n\r\n /**\r\n * Receive dialogue from another entity\r\n */\r\n public hear(speaker: string, text: string): void {\r\n if (!this.context.dialogue) {\r\n this.context.dialogue = { conversationHistory: [] };\r\n }\r\n this.context.dialogue.lastHeard = text;\r\n this.context.dialogue.conversationHistory.push({\r\n speaker,\r\n text,\r\n });\r\n }\r\n\r\n /**\r\n * Get current NPC context\r\n */\r\n public getContext(): Readonly<NPCContext> {\r\n return { ...this.context };\r\n }\r\n\r\n /**\r\n * Dispose and cleanup\r\n */\r\n public dispose(): void {\r\n this.stopAI();\r\n this.context.memory.clear();\r\n this.learningModel.clear();\r\n }\r\n}\r\n\r\n/**\r\n * HoloScript+ @ai_driven trait factory\r\n */\r\nexport function createAIDriverTrait(config: AIDriverConfig): AIDriverTrait {\r\n return new AIDriverTrait(config);\r\n}\r\n","/**\r\n * @holoscript/core\r\n *\r\n * HoloScript+ - VR language with declarative syntax, state management, and VR interactions.\r\n * Enhanced version of HoloScript with:\r\n * - VR interaction traits (@grabbable, @throwable, @hoverable, etc.)\r\n * - Reactive state management (@state { ... })\r\n * - Control flow (@for, @if directives)\r\n * - TypeScript companion imports\r\n * - Expression interpolation ${...}\r\n *\r\n * Fully backward compatible with original HoloScript syntax.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { HoloScriptPlusParser, HoloScriptPlusRuntime } from '@holoscript/core';\r\n *\r\n * const parser = new HoloScriptPlusParser();\r\n * const result = parser.parse(`\r\n * orb#myOrb {\r\n * position: [0, 0, 0]\r\n * @grabbable(snap_to_hand: true)\r\n * @throwable(bounce: true)\r\n * }\r\n * `);\r\n *\r\n * const runtime = new HoloScriptPlusRuntime(result.ast);\r\n * await runtime.mount(document.body);\r\n * ```\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// Import for use in utility functions\r\nimport { HoloScriptParser } from './HoloScriptParser';\r\nimport { HoloScriptRuntime } from './HoloScriptRuntime';\r\n\r\n// Parser\r\nexport { HoloScriptParser } from './HoloScriptParser';\r\nexport { HoloScript2DParser } from './HoloScript2DParser';\r\nexport { HoloScriptCodeParser, type ParseResult, type ParseError } from './HoloScriptCodeParser';\r\n\r\n// HoloScript+ Parser (NEW)\r\nexport { HoloScriptPlusParser, createParser, parse as parseHoloScriptPlus } from './parser/HoloScriptPlusParser';\r\n\r\n// HoloScript+ Enhanced Parser with Trait Annotations (NEW - Phase 3)\r\nexport {\r\n HoloScriptPlusParser as HoloScriptTraitAnnotationParser,\r\n type MaterialTraitAnnotation,\r\n type LightingTraitAnnotation,\r\n type RenderingTraitAnnotation,\r\n type GraphicsConfiguration,\r\n} from './HoloScriptPlusParser';\r\n\r\n// Runtime\r\nexport { HoloScriptRuntime } from './HoloScriptRuntime';\r\n\r\n// HoloScript+ Runtime (NEW)\r\nexport { HoloScriptPlusRuntimeImpl } from './runtime/HoloScriptPlusRuntime';\r\n\r\n// HoloScript+ State Management (NEW)\r\nexport { ReactiveState, createState, reactive, effect, computed, bind } from './state/ReactiveState';\r\n\r\n// HoloScript+ VR Traits (NEW)\r\nexport { VRTraitRegistry } from './traits/VRTraitSystem';\r\n\r\n// HoloScript+ Voice Input Trait (NEW - Phase 1)\r\nexport {\r\n VoiceInputTrait,\r\n createVoiceInputTrait,\r\n type VoiceInputConfig,\r\n type VoiceInputMode,\r\n type VoiceRecognitionResult,\r\n type VoiceInputEvent,\r\n} from './traits/VoiceInputTrait';\r\n\r\n// HoloScript+ AI Driver NPC Trait (NEW - Phase 1)\r\nexport {\r\n AIDriverTrait,\r\n createAIDriverTrait,\r\n BehaviorTreeRunner,\r\n GOAPPlanner,\r\n type AIDriverConfig,\r\n type DecisionMode,\r\n type BehaviorNode,\r\n type NPCContext,\r\n type NPCGoal,\r\n type BehaviorState,\r\n} from './traits/AIDriverTrait';\r\n\r\n// HoloScript+ Material Trait (NEW - Phase 2: Graphics)\r\nexport {\r\n MaterialTrait,\r\n createMaterialTrait,\r\n MATERIAL_PRESETS,\r\n type MaterialType,\r\n type TextureChannel,\r\n type TextureMap,\r\n type PBRMaterial,\r\n type MaterialConfig,\r\n} from './traits/MaterialTrait';\r\n\r\n// HoloScript+ Lighting Trait (NEW - Phase 2: Graphics)\r\nexport {\r\n LightingTrait,\r\n createLightingTrait,\r\n LIGHTING_PRESETS,\r\n type LightType,\r\n type ShadowType,\r\n type ShadowConfig,\r\n type LightSource,\r\n type GlobalIlluminationConfig,\r\n} from './traits/LightingTrait';\r\n\r\n// HoloScript+ Rendering Trait (NEW - Phase 2: Graphics)\r\nexport {\r\n RenderingTrait,\r\n createRenderingTrait,\r\n type CullingMode,\r\n type LodStrategy,\r\n type GPUResourceTier,\r\n type LODLevel,\r\n type CullingConfig,\r\n type BatchingConfig,\r\n type TextureOptimization,\r\n type ShaderOptimization,\r\n type RenderingOptimization,\r\n} from './traits/RenderingTrait';\r\n\r\n// Performance Telemetry (NEW - Phase 1)\r\nexport {\r\n PerformanceTelemetry,\r\n getPerformanceTelemetry,\r\n type Metric,\r\n type MetricType,\r\n type SeverityLevel,\r\n type PerformanceBudget,\r\n type FrameTiming,\r\n type MemorySnapshot,\r\n type AnalyticsExporter,\r\n} from './runtime/PerformanceTelemetry';\r\n\r\n// Hololand Graphics Pipeline Service (NEW - Phase 4)\r\nexport {\r\n HololandGraphicsPipelineService,\r\n type MaterialAsset,\r\n type TextureAsset,\r\n type ShaderProgram,\r\n type PlatformConfig,\r\n type GPUMemoryEstimate,\r\n type PerformanceMetrics,\r\n} from './services/HololandGraphicsPipelineService';\r\n\r\n// Platform Performance Optimizer (NEW - Phase 5)\r\nexport {\r\n PlatformPerformanceOptimizer,\r\n type DeviceInfo,\r\n type PerformanceProfile,\r\n type AdaptiveQualitySettings,\r\n type BenchmarkResult,\r\n type DeviceCapabilities,\r\n type CompressionFormat,\r\n type PerformanceRecommendation,\r\n} from './services/PlatformPerformanceOptimizer';\r\n\r\n// Type Checker\r\nexport {\r\n HoloScriptTypeChecker,\r\n createTypeChecker,\r\n type TypeCheckResult,\r\n type TypeInfo,\r\n type TypeDiagnostic,\r\n} from './HoloScriptTypeChecker';\r\n\r\n// Debugger\r\nexport {\r\n HoloScriptDebugger,\r\n createDebugger,\r\n type Breakpoint,\r\n type StackFrame,\r\n type DebugState,\r\n type DebugEvent,\r\n type StepMode,\r\n} from './HoloScriptDebugger';\r\n\r\n// Logger\r\nexport {\r\n logger,\r\n setHoloScriptLogger,\r\n enableConsoleLogging,\r\n resetLogger,\r\n NoOpLogger,\r\n ConsoleLogger,\r\n type HoloScriptLogger,\r\n} from './logger';\r\n\r\n// Types\r\nexport type {\r\n // Spatial\r\n SpatialPosition,\r\n Position2D,\r\n Size2D,\r\n\r\n // Hologram\r\n HologramShape,\r\n HologramProperties,\r\n\r\n // Input\r\n VoiceCommand,\r\n GestureType,\r\n HandType,\r\n GestureData,\r\n\r\n // AST Nodes\r\n ASTNode,\r\n OrbNode,\r\n MethodNode,\r\n ParameterNode,\r\n ConnectionNode,\r\n GateNode,\r\n StreamNode,\r\n TransformationNode,\r\n GenericASTNode,\r\n\r\n // VR Types\r\n Vector3,\r\n Vector2,\r\n Color,\r\n Duration,\r\n Transform,\r\n VRHand,\r\n ThrowVelocity,\r\n CollisionEvent,\r\n\r\n // VR Traits\r\n GrabbableTrait,\r\n ThrowableTrait,\r\n PointableTrait,\r\n HoverableTrait,\r\n ScalableTrait,\r\n RotatableTrait,\r\n\r\n // Phase 2: Loop Nodes\r\n ForLoopNode,\r\n WhileLoopNode,\r\n ForEachLoopNode,\r\n\r\n // Phase 2: Module Nodes\r\n ImportNode,\r\n ExportNode,\r\n ImportLoader,\r\n\r\n // Phase 2: Variable Nodes\r\n VariableDeclarationNode,\r\n\r\n // 2D UI\r\n UIElementType,\r\n UI2DNode,\r\n UIStyle,\r\n\r\n // Runtime\r\n RuntimeContext,\r\n ExecutionResult,\r\n ParticleSystem,\r\n\r\n // Config\r\n SecurityConfig,\r\n RuntimeSecurityLimits,\r\n} from './types';\r\n\r\n// Version\r\nexport const HOLOSCRIPT_VERSION = '1.0.0-alpha.1';\r\n\r\n// Supported Platforms\r\nexport const HOLOSCRIPT_SUPPORTED_PLATFORMS = [\r\n 'WebXR',\r\n 'Oculus Quest',\r\n 'HTC Vive',\r\n 'Valve Index',\r\n 'Apple Vision Pro',\r\n 'Windows Mixed Reality',\r\n] as const;\r\n\r\n// Voice Commands Reference\r\nexport const HOLOSCRIPT_VOICE_COMMANDS = [\r\n // 3D VR Commands\r\n 'create orb [name]',\r\n 'summon function [name]',\r\n 'connect [from] to [to]',\r\n 'execute [function]',\r\n 'debug program',\r\n 'visualize [data]',\r\n 'gate [condition]',\r\n 'stream [source] through [transformations]',\r\n // 2D UI Commands\r\n 'create button [name]',\r\n 'add textinput [name]',\r\n 'create panel [name]',\r\n 'add slider [name]',\r\n] as const;\r\n\r\n// Gesture Reference\r\nexport const HOLOSCRIPT_GESTURES = [\r\n 'pinch - create object',\r\n 'swipe - connect objects',\r\n 'rotate - modify properties',\r\n 'grab - select object',\r\n 'spread - expand view',\r\n 'fist - execute action',\r\n] as const;\r\n\r\n// Demo Scripts\r\nexport const HOLOSCRIPT_DEMO_SCRIPTS = {\r\n helloWorld: `orb greeting {\r\n message: \"Hello, HoloScript World!\"\r\n color: \"#00ffff\"\r\n glow: true\r\n}\r\n\r\nfunction displayGreeting() {\r\n show greeting\r\n}`,\r\n\r\n aiAgent: `orb agentCore {\r\n personality: \"helpful\"\r\n capabilities: [\"conversation\", \"problem_solving\", \"learning\"]\r\n energy: 100\r\n}\r\n\r\nfunction processQuery(query: string): string {\r\n analyze query\r\n generate response\r\n return response\r\n}`,\r\n\r\n neuralNetwork: `orb inputLayer { neurons: 784 }\r\norb hiddenLayer { neurons: 128 }\r\norb outputLayer { neurons: 10 }\r\n\r\nconnect inputLayer to hiddenLayer as \"weights\"\r\nconnect hiddenLayer to outputLayer as \"weights\"\r\n\r\nfunction trainNetwork(data: array): object {\r\n forward_pass data\r\n calculate_loss\r\n backward_pass\r\n update_weights\r\n return metrics\r\n}`,\r\n\r\n loginForm: `button loginBtn {\r\n text: \"Login\"\r\n x: 100\r\n y: 150\r\n width: 200\r\n height: 40\r\n onClick: handleLogin\r\n}\r\n\r\ntextinput usernameInput {\r\n placeholder: \"Username\"\r\n x: 100\r\n y: 50\r\n width: 200\r\n height: 36\r\n}\r\n\r\ntextinput passwordInput {\r\n placeholder: \"Password\"\r\n x: 100\r\n y: 100\r\n width: 200\r\n height: 36\r\n}`,\r\n\r\n dashboard: `panel sidebar {\r\n x: 0\r\n y: 0\r\n width: 200\r\n height: 600\r\n backgroundColor: \"#2c3e50\"\r\n}\r\n\r\ntext title {\r\n content: \"Dashboard\"\r\n x: 220\r\n y: 20\r\n fontSize: 24\r\n color: \"#34495e\"\r\n}\r\n\r\nbutton refreshBtn {\r\n text: \"Refresh Data\"\r\n x: 220\r\n y: 60\r\n onClick: refreshData\r\n}`,\r\n} as const;\r\n\r\n// Utility Functions\r\n\r\n/**\r\n * Create a pre-configured HoloScript environment\r\n */\r\nexport function createHoloScriptEnvironment() {\r\n return {\r\n parser: new HoloScriptParser(),\r\n runtime: new HoloScriptRuntime(),\r\n version: HOLOSCRIPT_VERSION,\r\n };\r\n}\r\n\r\n/**\r\n * Check if the current environment supports VR/XR\r\n */\r\nexport function isHoloScriptSupported(): boolean {\r\n if (typeof globalThis === 'undefined') return false;\r\n const win = globalThis as { window?: { navigator?: { xr?: unknown; getVRDisplays?: unknown }; webkitGetUserMedia?: unknown } };\r\n if (!win.window) return false;\r\n\r\n return !!(\r\n win.window.navigator?.xr ||\r\n win.window.navigator?.getVRDisplays ||\r\n win.window.webkitGetUserMedia\r\n );\r\n}\r\n","/**\r\n * @holoscript/core Performance Telemetry\r\n *\r\n * Real-time performance monitoring, profiling, and metrics collection\r\n * Exports metrics to analytics platforms and provides performance budgets\r\n */\r\n\r\nexport type MetricType = 'gauge' | 'counter' | 'histogram' | 'timer';\r\nexport type SeverityLevel = 'info' | 'warning' | 'critical';\r\n\r\n/**\r\n * Performance metric\r\n */\r\nexport interface Metric {\r\n name: string;\r\n type: MetricType;\r\n value: number;\r\n timestamp: number;\r\n tags?: Record<string, string>;\r\n unit?: string;\r\n}\r\n\r\n/**\r\n * Performance budget threshold\r\n */\r\nexport interface PerformanceBudget {\r\n metricName: string;\r\n maxValue: number;\r\n severity: SeverityLevel;\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * Frame timing information\r\n */\r\nexport interface FrameTiming {\r\n frameNumber: number;\r\n fps: number;\r\n frameDuration: number; // ms\r\n cpuTime: number; // ms\r\n gpuTime: number; // ms\r\n renderTime: number; // ms\r\n logicTime: number; // ms\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Memory snapshot\r\n */\r\nexport interface MemorySnapshot {\r\n usedJSHeapSize: number;\r\n totalJSHeapSize: number;\r\n jsHeapSizeLimit: number;\r\n objectCount: number;\r\n gcEventsSinceLastSnapshot: number;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Performance analytics exporter\r\n */\r\nexport interface AnalyticsExporter {\r\n export(metrics: Metric[]): Promise<void>;\r\n flush(): Promise<void>;\r\n}\r\n\r\n/**\r\n * PerformanceTelemetry - Monitor and analyze runtime performance\r\n */\r\nexport class PerformanceTelemetry {\r\n private metrics: Metric[] = [];\r\n private budgets: Map<string, PerformanceBudget> = new Map();\r\n private frameTimings: FrameTiming[] = [];\r\n private memorySnapshots: MemorySnapshot[] = [];\r\n private exporters: AnalyticsExporter[] = [];\r\n \r\n private frameCounter: number = 0;\r\n private lastFrameTime: number = Date.now();\r\n private frameTimes: number[] = [];\r\n private maxFrameHistory: number = 300; // ~5s at 60fps\r\n \r\n private monitoringEnabled: boolean = false;\r\n private exportInterval: ReturnType<typeof setInterval> | null = null;\r\n private exportIntervalMs: number = 10000; // Export every 10s\r\n\r\n constructor() {\r\n this.initializeDefaultBudgets();\r\n }\r\n\r\n /**\r\n * Initialize default performance budgets\r\n */\r\n private initializeDefaultBudgets(): void {\r\n // Frame budget: 16.67ms target (60fps)\r\n this.setBudget({\r\n metricName: 'frame_duration',\r\n maxValue: 16.67,\r\n severity: 'warning',\r\n enabled: true,\r\n });\r\n\r\n // Memory budget: 100MB\r\n this.setBudget({\r\n metricName: 'heap_used',\r\n maxValue: 100 * 1024 * 1024,\r\n severity: 'warning',\r\n enabled: true,\r\n });\r\n\r\n // Render time budget: 10ms\r\n this.setBudget({\r\n metricName: 'render_time',\r\n maxValue: 10,\r\n severity: 'warning',\r\n enabled: true,\r\n });\r\n }\r\n\r\n /**\r\n * Start performance monitoring\r\n */\r\n public startMonitoring(): void {\r\n if (this.monitoringEnabled) return;\r\n\r\n this.monitoringEnabled = true;\r\n this.lastFrameTime = performance.now();\r\n\r\n // Setup auto-export\r\n if (this.exporters.length > 0) {\r\n this.exportInterval = setInterval(() => {\r\n this.exportMetrics();\r\n }, this.exportIntervalMs);\r\n }\r\n\r\n console.log('Performance monitoring started');\r\n }\r\n\r\n /**\r\n * Stop performance monitoring\r\n */\r\n public stopMonitoring(): void {\r\n if (!this.monitoringEnabled) return;\r\n\r\n this.monitoringEnabled = false;\r\n\r\n if (this.exportInterval) {\r\n clearInterval(this.exportInterval);\r\n this.exportInterval = null;\r\n }\r\n\r\n console.log('Performance monitoring stopped');\r\n }\r\n\r\n /**\r\n * Record frame timing\r\n */\r\n public recordFrame(\r\n cpuTime: number,\r\n gpuTime: number,\r\n renderTime: number,\r\n logicTime: number\r\n ): void {\r\n if (!this.monitoringEnabled) return;\r\n\r\n const now = performance.now();\r\n const frameDuration = now - this.lastFrameTime;\r\n const fps = Math.round(1000 / frameDuration);\r\n\r\n this.frameTimes.push(frameDuration);\r\n if (this.frameTimes.length > this.maxFrameHistory) {\r\n this.frameTimes.shift();\r\n }\r\n\r\n const timing: FrameTiming = {\r\n frameNumber: this.frameCounter++,\r\n fps,\r\n frameDuration,\r\n cpuTime,\r\n gpuTime,\r\n renderTime,\r\n logicTime,\r\n timestamp: now,\r\n };\r\n\r\n this.frameTimings.push(timing);\r\n\r\n // Record metrics\r\n this.recordMetric({\r\n name: 'frame_duration',\r\n type: 'gauge',\r\n value: frameDuration,\r\n unit: 'ms',\r\n timestamp: now,\r\n });\r\n\r\n this.recordMetric({\r\n name: 'fps',\r\n type: 'gauge',\r\n value: fps,\r\n timestamp: now,\r\n });\r\n\r\n this.recordMetric({\r\n name: 'render_time',\r\n type: 'gauge',\r\n value: renderTime,\r\n unit: 'ms',\r\n timestamp: now,\r\n });\r\n\r\n this.checkBudgets(timing);\r\n this.lastFrameTime = now;\r\n }\r\n\r\n /**\r\n * Record custom metric\r\n */\r\n public recordMetric(metric: Omit<Metric, 'timestamp'> & { timestamp?: number }): void {\r\n this.metrics.push({\r\n ...metric,\r\n timestamp: metric.timestamp ?? Date.now(),\r\n });\r\n }\r\n\r\n /**\r\n * Record memory snapshot\r\n */\r\n public recordMemorySnapshot(): void {\r\n if (!this.monitoringEnabled) return;\r\n\r\n const perf = (performance as any).memory;\r\n\r\n if (!perf) {\r\n console.warn('Memory profiling not available');\r\n return;\r\n }\r\n\r\n const snapshot: MemorySnapshot = {\r\n usedJSHeapSize: perf.usedJSHeapSize,\r\n totalJSHeapSize: perf.totalJSHeapSize,\r\n jsHeapSizeLimit: perf.jsHeapSizeLimit,\r\n objectCount: 0, // Would require additional instrumentation\r\n gcEventsSinceLastSnapshot: 0,\r\n timestamp: Date.now(),\r\n };\r\n\r\n this.memorySnapshots.push(snapshot);\r\n\r\n // Record as metrics\r\n this.recordMetric({\r\n name: 'heap_used',\r\n type: 'gauge',\r\n value: snapshot.usedJSHeapSize,\r\n unit: 'bytes',\r\n timestamp: snapshot.timestamp,\r\n });\r\n\r\n this.recordMetric({\r\n name: 'heap_total',\r\n type: 'gauge',\r\n value: snapshot.totalJSHeapSize,\r\n unit: 'bytes',\r\n timestamp: snapshot.timestamp,\r\n });\r\n\r\n // Check memory budget\r\n const budget = this.budgets.get('heap_used');\r\n if (budget && budget.enabled && snapshot.usedJSHeapSize > budget.maxValue) {\r\n this.emitBudgetViolation(\r\n 'heap_used',\r\n snapshot.usedJSHeapSize,\r\n budget.maxValue,\r\n budget.severity\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Check frame metrics against budgets\r\n */\r\n private checkBudgets(timing: FrameTiming): void {\r\n // Check frame duration budget\r\n const frameBudget = this.budgets.get('frame_duration');\r\n if (\r\n frameBudget &&\r\n frameBudget.enabled &&\r\n timing.frameDuration > frameBudget.maxValue\r\n ) {\r\n this.emitBudgetViolation(\r\n 'frame_duration',\r\n timing.frameDuration,\r\n frameBudget.maxValue,\r\n frameBudget.severity\r\n );\r\n }\r\n\r\n // Check render time budget\r\n const renderBudget = this.budgets.get('render_time');\r\n if (\r\n renderBudget &&\r\n renderBudget.enabled &&\r\n timing.renderTime > renderBudget.maxValue\r\n ) {\r\n this.emitBudgetViolation(\r\n 'render_time',\r\n timing.renderTime,\r\n renderBudget.maxValue,\r\n renderBudget.severity\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Emit budget violation warning\r\n */\r\n private emitBudgetViolation(\r\n metric: string,\r\n actual: number,\r\n budget: number,\r\n severity: SeverityLevel\r\n ): void {\r\n const message = `Budget violation: ${metric} = ${actual.toFixed(2)} (budget: ${budget.toFixed(2)})`;\r\n\r\n if (severity === 'critical') {\r\n console.error(`❌ ${message}`);\r\n } else if (severity === 'warning') {\r\n console.warn(`⚠️ ${message}`);\r\n } else {\r\n console.log(`ℹ️ ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Set or update performance budget\r\n */\r\n public setBudget(budget: PerformanceBudget): void {\r\n this.budgets.set(budget.metricName, budget);\r\n }\r\n\r\n /**\r\n * Get average FPS over recent frames\r\n */\r\n public getAverageFPS(): number {\r\n if (this.frameTimes.length === 0) return 0;\r\n\r\n const avgFrameTime =\r\n this.frameTimes.reduce((a, b) => a + b, 0) / this.frameTimes.length;\r\n return Math.round(1000 / avgFrameTime);\r\n }\r\n\r\n /**\r\n * Get memory usage stats\r\n */\r\n public getMemoryStats(): {\r\n used: number;\r\n total: number;\r\n limit: number;\r\n percentage: number;\r\n } {\r\n if (this.memorySnapshots.length === 0) {\r\n return { used: 0, total: 0, limit: 0, percentage: 0 };\r\n }\r\n\r\n const latest = this.memorySnapshots[this.memorySnapshots.length - 1];\r\n return {\r\n used: latest.usedJSHeapSize,\r\n total: latest.totalJSHeapSize,\r\n limit: latest.jsHeapSizeLimit,\r\n percentage: (latest.usedJSHeapSize / latest.jsHeapSizeLimit) * 100,\r\n };\r\n }\r\n\r\n /**\r\n * Get recent frame timings\r\n */\r\n public getRecentFrameTimings(count: number = 60): FrameTiming[] {\r\n return this.frameTimings.slice(-count);\r\n }\r\n\r\n /**\r\n * Add analytics exporter\r\n */\r\n public addExporter(exporter: AnalyticsExporter): void {\r\n this.exporters.push(exporter);\r\n }\r\n\r\n /**\r\n * Export all metrics to registered exporters\r\n */\r\n public async exportMetrics(): Promise<void> {\r\n if (this.metrics.length === 0) return;\r\n\r\n const metricsToExport = [...this.metrics];\r\n this.metrics = []; // Clear after export\r\n\r\n for (const exporter of this.exporters) {\r\n try {\r\n await exporter.export(metricsToExport);\r\n } catch (error) {\r\n console.error('Failed to export metrics:', error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generate performance report\r\n */\r\n public generateReport(): string {\r\n const avgFps = this.getAverageFPS();\r\n const memStats = this.getMemoryStats();\r\n const recentFrames = this.getRecentFrameTimings(60);\r\n\r\n let report = '=== Performance Report ===\\n\\n';\r\n\r\n report += `Average FPS: ${avgFps}\\n`;\r\n report += `Recent Frame Count: ${recentFrames.length}\\n`;\r\n\r\n if (recentFrames.length > 0) {\r\n const avgFrameTime =\r\n recentFrames.reduce((sum, f) => sum + f.frameDuration, 0) /\r\n recentFrames.length;\r\n const maxFrameTime = Math.max(...recentFrames.map((f) => f.frameDuration));\r\n const minFrameTime = Math.min(...recentFrames.map((f) => f.frameDuration));\r\n\r\n report += `Frame Time: min=${minFrameTime.toFixed(2)}ms, avg=${avgFrameTime.toFixed(2)}ms, max=${maxFrameTime.toFixed(2)}ms\\n`;\r\n }\r\n\r\n report += `\\nMemory Usage:\\n`;\r\n report += ` Used: ${(memStats.used / 1024 / 1024).toFixed(2)} MB\\n`;\r\n report += ` Total: ${(memStats.total / 1024 / 1024).toFixed(2)} MB\\n`;\r\n report += ` Limit: ${(memStats.limit / 1024 / 1024).toFixed(2)} MB\\n`;\r\n report += ` Percentage: ${memStats.percentage.toFixed(1)}%\\n`;\r\n\r\n report += `\\nMetrics Recorded: ${this.metrics.length}\\n`;\r\n report += `Memory Snapshots: ${this.memorySnapshots.length}\\n`;\r\n\r\n return report;\r\n }\r\n\r\n /**\r\n * Dispose and cleanup\r\n */\r\n public dispose(): void {\r\n this.stopMonitoring();\r\n this.metrics = [];\r\n this.frameTimings = [];\r\n this.memorySnapshots = [];\r\n this.frameTimes = [];\r\n this.budgets.clear();\r\n this.exporters = [];\r\n }\r\n}\r\n\r\n/**\r\n * Singleton instance\r\n */\r\nlet telemetryInstance: PerformanceTelemetry | null = null;\r\n\r\n/**\r\n * Get or create telemetry instance\r\n */\r\nexport function getPerformanceTelemetry(): PerformanceTelemetry {\r\n if (!telemetryInstance) {\r\n telemetryInstance = new PerformanceTelemetry();\r\n }\r\n return telemetryInstance;\r\n}\r\n","/**\r\n * Hololand Graphics Pipeline Service\r\n *\r\n * Core service for managing graphics rendering pipeline in Hololand.\r\n * Integrates HoloScript graphics traits with Hololand's rendering backend.\r\n *\r\n * Responsibilities:\r\n * - Material management and asset pipeline\r\n * - Light management and shadow mapping\r\n * - GPU memory optimization\r\n * - Performance monitoring and profiling\r\n * - Cross-platform optimization (mobile/VR/desktop)\r\n */\r\n\r\nimport type { GraphicsConfiguration } from '../HoloScriptPlusParser';\r\nimport type { MaterialTrait } from '../traits/MaterialTrait';\r\n\r\n// ============================================================================\r\n// GPU Memory Estimation\r\n// ============================================================================\r\n\r\nexport interface GPUMemoryEstimate {\r\n textureMemory: number; // MB\r\n geometryMemory: number; // MB\r\n bufferMemory: number; // MB\r\n estimatedTotal: number; // MB\r\n budget: number; // MB (allocated limit)\r\n utilization: number; // percentage\r\n}\r\n\r\n// ============================================================================\r\n// Material Asset Pipeline\r\n// ============================================================================\r\n\r\nexport interface MaterialAsset {\r\n id: string;\r\n name: string;\r\n material: MaterialTrait;\r\n shaders: ShaderProgram[];\r\n textures: TextureAsset[];\r\n instances: number;\r\n gpuMemory: number;\r\n lastUsed: number;\r\n}\r\n\r\nexport interface TextureAsset {\r\n id: string;\r\n path: string;\r\n format: 'RGBA8' | 'RGB565' | 'BC1' | 'BC3' | 'ASTC' | 'PVRTC';\r\n width: number;\r\n height: number;\r\n mipLevels: number;\r\n gpuMemory: number;\r\n loaded: boolean;\r\n}\r\n\r\nexport interface ShaderProgram {\r\n id: string;\r\n name: string;\r\n vertexShader: string;\r\n fragmentShader: string;\r\n uniforms: Record<string, string>;\r\n compiled: boolean;\r\n compilationTime: number;\r\n}\r\n\r\n// ============================================================================\r\n// Performance Metrics\r\n// ============================================================================\r\n\r\nexport interface PerformanceMetrics {\r\n drawCalls: number;\r\n trianglesRendered: number;\r\n gpuFrameTime: number; // ms\r\n cpuFrameTime: number; // ms\r\n fps: number;\r\n gpuMemoryUsed: number; // MB\r\n textureBinds: number;\r\n shaderSwitches: number;\r\n batchCount: number;\r\n}\r\n\r\n// ============================================================================\r\n// Platform Configuration\r\n// ============================================================================\r\n\r\nexport type Platform = 'mobile' | 'vr' | 'desktop';\r\n\r\nexport interface PlatformConfig {\r\n platform: Platform;\r\n maxGPUMemory: number; // MB\r\n maxDrawCalls: number;\r\n maxTextureResolution: number;\r\n targetFPS: number;\r\n shadowQuality: 'none' | 'low' | 'medium' | 'high';\r\n textureCompression: 'none' | 'dxt' | 'astc' | 'basis';\r\n instancingEnabled: boolean;\r\n maxLights: number;\r\n maxShadowCasters: number;\r\n}\r\n\r\n// ============================================================================\r\n// Hololand Graphics Pipeline Service\r\n// ============================================================================\r\n\r\nexport class HololandGraphicsPipelineService {\r\n private materialCache: Map<string, MaterialAsset> = new Map();\r\n private textureCache: Map<string, TextureAsset> = new Map();\r\n private shaderCache: Map<string, ShaderProgram> = new Map();\r\n\r\n private platformConfig: PlatformConfig;\r\n private metrics: PerformanceMetrics;\r\n\r\n // private _memoryBudget: number = 512; // MB default - unused\r\n private memoryUsed: number = 0;\r\n\r\n constructor(platform: Platform = 'desktop') {\r\n this.platformConfig = this.getPlatformConfig(platform);\r\n this.metrics = this.initializeMetrics();\r\n }\r\n\r\n /**\r\n * Initialize graphics pipeline with configuration\r\n */\r\n initialize(config: GraphicsConfiguration): void {\r\n if (config.material) {\r\n this.initializeMaterials(config.material);\r\n }\r\n\r\n if (config.lighting) {\r\n this.initializeLighting(config.lighting);\r\n }\r\n\r\n if (config.rendering) {\r\n this.initializeRendering(config.rendering);\r\n }\r\n }\r\n\r\n /**\r\n * Initialize materials from configuration\r\n */\r\n private initializeMaterials(materialConfig: any): void {\r\n // Create material assets\r\n const material = this.createMaterialAsset(materialConfig);\r\n this.materialCache.set(material.id, material);\r\n\r\n // Pre-compile shaders\r\n material.shaders.forEach((shader) => {\r\n this.compileShader(shader);\r\n });\r\n\r\n // Load textures\r\n material.textures.forEach((texture) => {\r\n this.loadTexture(texture);\r\n });\r\n }\r\n\r\n /**\r\n * Initialize lighting from configuration\r\n */\r\n private initializeLighting(lightingConfig: any): void {\r\n // Configure shadow mapping\r\n if (lightingConfig.shadows) {\r\n this.setupShadowMapping(lightingConfig);\r\n }\r\n\r\n // Configure global illumination\r\n if (lightingConfig.globalIllumination) {\r\n this.setupGlobalIllumination(lightingConfig.globalIllumination);\r\n }\r\n }\r\n\r\n /**\r\n * Initialize rendering from configuration\r\n */\r\n private initializeRendering(renderingConfig: any): void {\r\n // Apply quality preset\r\n if (renderingConfig.quality) {\r\n this.applyQualityPreset(renderingConfig.quality);\r\n }\r\n\r\n // Configure platform-specific settings\r\n if (renderingConfig.platform) {\r\n this.platformConfig = this.getPlatformConfig(renderingConfig.platform);\r\n }\r\n\r\n // Enable optimizations\r\n if (renderingConfig.lod !== false) {\r\n this.enableLOD();\r\n }\r\n\r\n if (renderingConfig.culling !== false) {\r\n this.enableCulling();\r\n }\r\n\r\n if (renderingConfig.instancing !== false) {\r\n this.platformConfig.instancingEnabled = true;\r\n }\r\n }\r\n\r\n /**\r\n * Create material asset from configuration\r\n */\r\n private createMaterialAsset(config: any): MaterialAsset {\r\n const id = `mat_${Date.now()}_${Math.random()}`;\r\n\r\n const asset: MaterialAsset = {\r\n id,\r\n name: config.name || 'Material',\r\n material: null as any, // Would be actual MaterialTrait\r\n shaders: this.generateShaders(config),\r\n textures: this.loadTexturesFromConfig(config),\r\n instances: 0,\r\n gpuMemory: 0,\r\n lastUsed: Date.now(),\r\n };\r\n\r\n // Estimate GPU memory\r\n asset.gpuMemory = this.estimateMaterialMemory(asset);\r\n this.memoryUsed += asset.gpuMemory;\r\n\r\n return asset;\r\n }\r\n\r\n /**\r\n * Generate shaders from material configuration\r\n */\r\n private generateShaders(config: any): ShaderProgram[] {\r\n const shaders: ShaderProgram[] = [];\r\n\r\n // Generate PBR shader\r\n if (config.type === 'pbr' || config.pbr) {\r\n shaders.push(this.generatePBRShader(config));\r\n }\r\n\r\n return shaders;\r\n }\r\n\r\n /**\r\n * Generate PBR shader program\r\n */\r\n private generatePBRShader(_config: any): ShaderProgram {\r\n const vertexShader = `\r\n #version 300 es\r\n precision highp float;\r\n\r\n in vec3 aPosition;\r\n in vec3 aNormal;\r\n in vec2 aTexCoord;\r\n in vec3 aTangent;\r\n\r\n uniform mat4 uMatrix;\r\n uniform mat4 uNormalMatrix;\r\n uniform mat4 uProjectionMatrix;\r\n\r\n out vec3 vPosition;\r\n out vec3 vNormal;\r\n out vec2 vTexCoord;\r\n out mat3 vTBN;\r\n\r\n void main() {\r\n vPosition = (uMatrix * vec4(aPosition, 1.0)).xyz;\r\n vNormal = normalize((uNormalMatrix * vec4(aNormal, 0.0)).xyz);\r\n vTexCoord = aTexCoord;\r\n\r\n vec3 T = normalize((uNormalMatrix * vec4(aTangent, 0.0)).xyz);\r\n vec3 B = cross(vNormal, T);\r\n vTBN = mat3(T, B, vNormal);\r\n\r\n gl_Position = uProjectionMatrix * uMatrix * vec4(aPosition, 1.0);\r\n }\r\n `;\r\n\r\n const fragmentShader = `\r\n #version 300 es\r\n precision highp float;\r\n\r\n in vec3 vPosition;\r\n in vec3 vNormal;\r\n in vec2 vTexCoord;\r\n in mat3 vTBN;\r\n\r\n uniform sampler2D uBaseColorMap;\r\n uniform sampler2D uNormalMap;\r\n uniform sampler2D uRoughnessMap;\r\n uniform sampler2D uMetallicMap;\r\n uniform sampler2D uAOMap;\r\n\r\n uniform vec3 uViewPos;\r\n uniform float uMetallic;\r\n uniform float uRoughness;\r\n\r\n out vec4 FragColor;\r\n\r\n const float PI = 3.14159265359;\r\n\r\n vec3 fresnelSchlick(float cosTheta, vec3 F0) {\r\n return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);\r\n }\r\n\r\n void main() {\r\n vec3 baseColor = texture(uBaseColorMap, vTexCoord).rgb;\r\n vec3 normal = normalize(vTBN * (texture(uNormalMap, vTexCoord).rgb * 2.0 - 1.0));\r\n float roughness = texture(uRoughnessMap, vTexCoord).r;\r\n float metallic = texture(uMetallicMap, vTexCoord).r;\r\n float ao = texture(uAOMap, vTexCoord).r;\r\n\r\n vec3 N = normalize(normal);\r\n vec3 V = normalize(uViewPos - vPosition);\r\n\r\n vec3 F0 = vec3(0.04);\r\n F0 = mix(F0, baseColor, metallic);\r\n\r\n // Simplified lighting (full PBR in production)\r\n vec3 lightDir = normalize(vec3(0.5, 1.0, 0.5));\r\n float NdotL = max(dot(N, lightDir), 0.0);\r\n\r\n vec3 result = baseColor * NdotL * ao;\r\n\r\n // Tone mapping\r\n result = result / (result + vec3(1.0));\r\n result = pow(result, vec3(1.0 / 2.2));\r\n\r\n FragColor = vec4(result, 1.0);\r\n }\r\n `;\r\n\r\n return {\r\n id: `shader_pbr_${Date.now()}`,\r\n name: 'PBRShader',\r\n vertexShader,\r\n fragmentShader,\r\n uniforms: {\r\n uMatrix: 'mat4',\r\n uNormalMatrix: 'mat4',\r\n uProjectionMatrix: 'mat4',\r\n uViewPos: 'vec3',\r\n uMetallic: 'float',\r\n uRoughness: 'float',\r\n uBaseColorMap: 'sampler2D',\r\n uNormalMap: 'sampler2D',\r\n uRoughnessMap: 'sampler2D',\r\n uMetallicMap: 'sampler2D',\r\n uAOMap: 'sampler2D',\r\n },\r\n compiled: false,\r\n compilationTime: 0,\r\n };\r\n }\r\n\r\n /**\r\n * Load textures from configuration\r\n */\r\n private loadTexturesFromConfig(config: any): TextureAsset[] {\r\n const textures: TextureAsset[] = [];\r\n\r\n if (config.textures) {\r\n config.textures.forEach((tex: any) => {\r\n textures.push({\r\n id: `tex_${Date.now()}_${Math.random()}`,\r\n path: tex.path,\r\n format: this.selectTextureFormat(config.compression),\r\n width: 2048,\r\n height: 2048,\r\n mipLevels: 8,\r\n gpuMemory: this.estimateTextureMemory(2048, 2048, this.selectTextureFormat(config.compression)),\r\n loaded: false,\r\n });\r\n });\r\n }\r\n\r\n return textures;\r\n }\r\n\r\n /**\r\n * Select appropriate texture format based on compression type\r\n */\r\n private selectTextureFormat(compression?: string): TextureAsset['format'] {\r\n switch (compression) {\r\n case 'dxt':\r\n return 'BC3';\r\n case 'astc':\r\n return 'ASTC';\r\n case 'basis':\r\n return 'PVRTC';\r\n default:\r\n return 'RGBA8';\r\n }\r\n }\r\n\r\n /**\r\n * Estimate texture memory usage\r\n */\r\n private estimateTextureMemory(width: number, height: number, format: TextureAsset['format']): number {\r\n const pixels = width * height;\r\n let bytesPerPixel = 4; // RGBA8\r\n\r\n switch (format) {\r\n case 'RGB565':\r\n bytesPerPixel = 2;\r\n break;\r\n case 'BC1':\r\n case 'BC3':\r\n case 'ASTC':\r\n bytesPerPixel = 0.5; // Compressed\r\n break;\r\n case 'PVRTC':\r\n bytesPerPixel = 0.25; // Highly compressed\r\n break;\r\n }\r\n\r\n // Account for mipmaps (roughly 1.33x base size)\r\n return (pixels * bytesPerPixel * 1.33) / (1024 * 1024);\r\n }\r\n\r\n /**\r\n * Estimate material GPU memory\r\n */\r\n private estimateMaterialMemory(asset: MaterialAsset): number {\r\n let total = 0;\r\n\r\n // Shader memory (typically negligible, but count)\r\n total += 0.1; // 100KB per shader\r\n\r\n // Texture memory\r\n asset.textures.forEach((tex) => {\r\n total += tex.gpuMemory;\r\n });\r\n\r\n return total;\r\n }\r\n\r\n /**\r\n * Compile shader program\r\n */\r\n private compileShader(shader: ShaderProgram): void {\r\n const start = performance.now();\r\n\r\n // In real implementation, this would compile to WebGL/WebGPU\r\n // For now, just mark as compiled\r\n shader.compiled = true;\r\n shader.compilationTime = performance.now() - start;\r\n\r\n this.shaderCache.set(shader.id, shader);\r\n }\r\n\r\n /**\r\n * Load texture into GPU memory\r\n */\r\n private loadTexture(texture: TextureAsset): void {\r\n // In real implementation, this would load from disk/network\r\n // For now, just mark as loaded\r\n texture.loaded = true;\r\n this.textureCache.set(texture.id, texture);\r\n }\r\n\r\n /**\r\n * Setup shadow mapping\r\n */\r\n private setupShadowMapping(_config: any): void {\r\n // Configure shadow map resolution and filtering\r\n // const shadowQuality = this.platformConfig.shadowQuality;\r\n // const _shadowResolution = this.shadowResolutionForQuality(shadowQuality);\r\n\r\n // Create shadow map textures\r\n // This would allocate GPU memory for shadow maps\r\n }\r\n\r\n /**\r\n * Get shadow map resolution for quality level\r\n */\r\n // private shadowResolutionForQuality(quality: string): number {\r\n // switch (quality) {\r\n // case 'none':\r\n // return 0;\r\n // case 'low':\r\n // return 512;\r\n // case 'medium':\r\n // return 1024;\r\n // case 'high':\r\n // return 2048;\r\n // default:\r\n // return 1024;\r\n // }\r\n // }\r\n\r\n /**\r\n * Setup global illumination\r\n */\r\n private setupGlobalIllumination(__config: any): void {\r\n // Create light probes for indirect lighting\r\n // const _probeCount = __config.probes || 16;\r\n\r\n // Allocate GPU memory for probes\r\n // Each probe stores 6 faces of cubemap\r\n }\r\n\r\n /**\r\n * Apply quality preset\r\n */\r\n private applyQualityPreset(quality: string): void {\r\n switch (quality) {\r\n case 'low':\r\n this.platformConfig.maxTextureResolution = 512;\r\n this.platformConfig.shadowQuality = 'none';\r\n this.platformConfig.targetFPS = 30;\r\n break;\r\n\r\n case 'medium':\r\n this.platformConfig.maxTextureResolution = 1024;\r\n this.platformConfig.shadowQuality = 'low';\r\n this.platformConfig.targetFPS = 60;\r\n break;\r\n\r\n case 'high':\r\n this.platformConfig.maxTextureResolution = 2048;\r\n this.platformConfig.shadowQuality = 'medium';\r\n this.platformConfig.targetFPS = 60;\r\n break;\r\n\r\n case 'ultra':\r\n this.platformConfig.maxTextureResolution = 4096;\r\n this.platformConfig.shadowQuality = 'high';\r\n this.platformConfig.targetFPS = 120;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Enable LOD system\r\n */\r\n private enableLOD(): void {\r\n // Configure automatic LOD switching based on screen coverage\r\n }\r\n\r\n /**\r\n * Enable culling\r\n */\r\n private enableCulling(): void {\r\n // Enable frustum culling and occlusion culling\r\n }\r\n\r\n /**\r\n * Get platform-specific configuration\r\n */\r\n private getPlatformConfig(platform: Platform): PlatformConfig {\r\n switch (platform) {\r\n case 'mobile':\r\n return {\r\n platform: 'mobile',\r\n maxGPUMemory: 256,\r\n maxDrawCalls: 200,\r\n maxTextureResolution: 512,\r\n targetFPS: 30,\r\n shadowQuality: 'none',\r\n textureCompression: 'astc',\r\n instancingEnabled: true,\r\n maxLights: 2,\r\n maxShadowCasters: 0,\r\n };\r\n\r\n case 'vr':\r\n return {\r\n platform: 'vr',\r\n maxGPUMemory: 512,\r\n maxDrawCalls: 500,\r\n maxTextureResolution: 2048,\r\n targetFPS: 90,\r\n shadowQuality: 'low',\r\n textureCompression: 'basis',\r\n instancingEnabled: true,\r\n maxLights: 4,\r\n maxShadowCasters: 2,\r\n };\r\n\r\n case 'desktop':\r\n return {\r\n platform: 'desktop',\r\n maxGPUMemory: 2048,\r\n maxDrawCalls: 2000,\r\n maxTextureResolution: 4096,\r\n targetFPS: 120,\r\n shadowQuality: 'high',\r\n textureCompression: 'none',\r\n instancingEnabled: true,\r\n maxLights: 8,\r\n maxShadowCasters: 4,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Initialize performance metrics\r\n */\r\n private initializeMetrics(): PerformanceMetrics {\r\n return {\r\n drawCalls: 0,\r\n trianglesRendered: 0,\r\n gpuFrameTime: 0,\r\n cpuFrameTime: 0,\r\n fps: 60,\r\n gpuMemoryUsed: 0,\r\n textureBinds: 0,\r\n shaderSwitches: 0,\r\n batchCount: 0,\r\n };\r\n }\r\n\r\n /**\r\n * Get current GPU memory estimate\r\n */\r\n getGPUMemoryEstimate(): GPUMemoryEstimate {\r\n let textureMemory = 0;\r\n let geometryMemory = 0;\r\n let bufferMemory = 0;\r\n\r\n this.textureCache.forEach((tex) => {\r\n if (tex.loaded) {\r\n textureMemory += tex.gpuMemory;\r\n }\r\n });\r\n\r\n this.materialCache.forEach((mat) => {\r\n geometryMemory += mat.gpuMemory;\r\n });\r\n\r\n const total = textureMemory + geometryMemory + bufferMemory;\r\n\r\n return {\r\n textureMemory,\r\n geometryMemory,\r\n bufferMemory,\r\n estimatedTotal: total,\r\n budget: this.platformConfig.maxGPUMemory,\r\n utilization: (total / this.platformConfig.maxGPUMemory) * 100,\r\n };\r\n }\r\n\r\n /**\r\n * Get performance metrics\r\n */\r\n getPerformanceMetrics(): PerformanceMetrics {\r\n return { ...this.metrics };\r\n }\r\n\r\n /**\r\n * Set memory budget\r\n */\r\n setMemoryBudget(budget: number): void {\r\n // this._memoryBudget = budget; // field removed\r\n this.platformConfig.maxGPUMemory = budget;\r\n }\r\n\r\n /**\r\n * Optimize for specific platform\r\n */\r\n optimizePlatform(platform: Platform): void {\r\n this.platformConfig = this.getPlatformConfig(platform);\r\n }\r\n}\r\n\r\nexport default HololandGraphicsPipelineService;\r\n","/**\r\n * Platform Performance Optimization System\r\n *\r\n * Provides adaptive quality and performance tuning for:\r\n * - Mobile devices (battery/bandwidth constrained)\r\n * - VR/AR platforms (latency-critical, 90 FPS required)\r\n * - Desktop (quality-focused, high resolution)\r\n *\r\n * Features:\r\n * - Automatic quality adjustment based on device\r\n * - Performance profiling and analysis\r\n * - Bottleneck detection and mitigation\r\n * - Cross-platform benchmark testing\r\n */\r\n\r\n// ============================================================================\r\n// Device Capabilities\r\n// ============================================================================\r\n\r\nexport interface DeviceInfo {\r\n platform: 'mobile' | 'vr' | 'desktop';\r\n gpuVendor: string;\r\n gpuModel: string;\r\n gpuMemory: number; // MB\r\n cpuCores: number;\r\n ramTotal: number; // MB\r\n screenResolution: { width: number; height: number };\r\n refreshRate: number;\r\n isLowPowerMode?: boolean;\r\n}\r\n\r\nexport interface DeviceCapabilities {\r\n maxTextureResolution: number;\r\n supportsCompression: boolean;\r\n compressionFormats: string[];\r\n maxSimultaneousLights: number;\r\n shadowsSupported: boolean;\r\n computeShaderSupported: boolean;\r\n rayTracingSupported: boolean;\r\n estimatedMemory: number;\r\n}\r\n\r\n// ============================================================================\r\n// Performance Profile\r\n// ============================================================================\r\n\r\nexport interface PerformanceProfile {\r\n device: DeviceInfo;\r\n capabilities: DeviceCapabilities;\r\n targetFPS: number;\r\n qualityLevel: 'low' | 'medium' | 'high' | 'ultra';\r\n adaptiveQuality: boolean;\r\n fpsTarget: number;\r\n fpsMin: number;\r\n cpuBudget: number; // ms per frame\r\n gpuBudget: number; // ms per frame\r\n}\r\n\r\n// ============================================================================\r\n// Performance Benchmark\r\n// ============================================================================\r\n\r\nexport interface BenchmarkResult {\r\n testName: string;\r\n platform: string;\r\n fps: number;\r\n gpuFrameTime: number; // ms\r\n cpuFrameTime: number; // ms\r\n gpuMemoryUsed: number; // MB\r\n trianglesPerSecond: number;\r\n drawCallsPerSecond: number;\r\n qualityLevel: string;\r\n passed: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Adaptive Quality System\r\n// ============================================================================\r\n\r\nexport interface AdaptiveQualitySettings {\r\n enabled: boolean;\r\n checkInterval: number; // ms\r\n fpsDeltaThreshold: number; // FPS change to trigger adjustment\r\n memoryThreshold: number; // % of max allowed\r\n temperatureThreshold?: number; // celsius (mobile)\r\n}\r\n\r\n// ============================================================================\r\n// Compression & Recommendations\r\n// ============================================================================\r\n\r\nexport type CompressionFormat =\r\n | 'none'\r\n | 'lz4'\r\n | 'zstd'\r\n | 'bc1'\r\n | 'bc7'\r\n | 'astc'\r\n | 'etc2'\r\n | 'pvrtc';\r\n\r\nexport interface PerformanceRecommendation {\r\n category: 'texture' | 'geometry' | 'shader' | 'memory' | 'rendering';\r\n priority: 'low' | 'medium' | 'high' | 'critical';\r\n recommendation: string;\r\n expectedImprovement: number; // percentage\r\n estimatedCost: string; // complexity of implementation\r\n}\r\n\r\n// ============================================================================\r\n// Platform Performance Optimizer\r\n// ============================================================================\r\n\r\nexport class PlatformPerformanceOptimizer {\r\n private deviceInfo: DeviceInfo;\r\n private capabilities: DeviceCapabilities;\r\n private profile: PerformanceProfile;\r\n private adaptiveSettings: AdaptiveQualitySettings;\r\n\r\n private currentFPS: number = 60;\r\n private frameHistory: number[] = [];\r\n private lastAdaptTime: number = 0;\r\n\r\n constructor(device: DeviceInfo) {\r\n this.deviceInfo = device;\r\n this.capabilities = this.detectCapabilities(device);\r\n this.profile = this.createProfile(device);\r\n this.adaptiveSettings = this.getAdaptiveSettings(device.platform);\r\n }\r\n\r\n /**\r\n * Detect device capabilities\r\n */\r\n private detectCapabilities(device: DeviceInfo): DeviceCapabilities {\r\n let maxTexture = 2048;\r\n let supportsCompression = true;\r\n let compressionFormats: string[] = ['dxt', 'basis'];\r\n let maxLights = 4;\r\n let shadowsSupported = true;\r\n let computeSupported = false;\r\n let rayTracingSupported = false;\r\n\r\n // Mobile capabilities\r\n if (device.platform === 'mobile') {\r\n maxTexture = 512;\r\n maxLights = 2;\r\n shadowsSupported = false;\r\n compressionFormats = ['astc', 'pvrtc'];\r\n\r\n // Check for low memory\r\n if (device.gpuMemory < 1024) {\r\n maxTexture = 256;\r\n maxLights = 1;\r\n supportsCompression = true;\r\n }\r\n }\r\n\r\n // VR capabilities\r\n if (device.platform === 'vr') {\r\n maxTexture = 2048;\r\n maxLights = 4;\r\n shadowsSupported = true;\r\n compressionFormats = ['basis', 'dxt'];\r\n computeSupported = true;\r\n }\r\n\r\n // Desktop capabilities\r\n if (device.platform === 'desktop') {\r\n maxTexture = 4096;\r\n maxLights = 8;\r\n shadowsSupported = true;\r\n compressionFormats = ['none', 'dxt', 'basis'];\r\n computeSupported = true;\r\n rayTracingSupported = true;\r\n }\r\n\r\n return {\r\n maxTextureResolution: maxTexture,\r\n supportsCompression,\r\n compressionFormats,\r\n maxSimultaneousLights: maxLights,\r\n shadowsSupported,\r\n computeShaderSupported: computeSupported,\r\n rayTracingSupported,\r\n estimatedMemory: Math.min(device.gpuMemory, 2048),\r\n };\r\n }\r\n\r\n /**\r\n * Create performance profile for device\r\n */\r\n private createProfile(device: DeviceInfo): PerformanceProfile {\r\n let qualityLevel: 'low' | 'medium' | 'high' | 'ultra' = 'high';\r\n let fpsTarget = 60;\r\n let fpsMin = 30;\r\n let cpuBudget = 16.67; // ms for 60 FPS\r\n let gpuBudget = 16.67; // ms for 60 FPS\r\n\r\n // Mobile\r\n if (device.platform === 'mobile') {\r\n qualityLevel = 'low';\r\n fpsTarget = 30;\r\n fpsMin = 24;\r\n cpuBudget = 33.33; // ms for 30 FPS\r\n gpuBudget = 33.33; // ms for 30 FPS\r\n }\r\n\r\n // VR (more demanding)\r\n if (device.platform === 'vr') {\r\n qualityLevel = 'high';\r\n fpsTarget = 90;\r\n fpsMin = 75;\r\n cpuBudget = 11.11; // ms for 90 FPS\r\n gpuBudget = 11.11; // ms for 90 FPS\r\n }\r\n\r\n // Desktop (quality-focused)\r\n if (device.platform === 'desktop') {\r\n qualityLevel = 'ultra';\r\n fpsTarget = device.refreshRate || 120;\r\n fpsMin = 60;\r\n cpuBudget = 1000 / fpsTarget;\r\n gpuBudget = 1000 / fpsTarget;\r\n }\r\n\r\n return {\r\n device,\r\n capabilities: this.capabilities,\r\n targetFPS: fpsTarget,\r\n qualityLevel,\r\n adaptiveQuality: device.platform === 'mobile' || device.platform === 'vr',\r\n fpsTarget,\r\n fpsMin,\r\n cpuBudget,\r\n gpuBudget,\r\n };\r\n }\r\n\r\n /**\r\n * Get adaptive quality settings for platform\r\n */\r\n private getAdaptiveSettings(platform: string): AdaptiveQualitySettings {\r\n if (platform === 'mobile') {\r\n return {\r\n enabled: true,\r\n checkInterval: 500, // Check every 500ms\r\n fpsDeltaThreshold: 5, // Adjust if FPS changes by 5+\r\n memoryThreshold: 80, // Adjust if above 80% memory\r\n temperatureThreshold: 45, // Adjust if above 45C\r\n };\r\n }\r\n\r\n if (platform === 'vr') {\r\n return {\r\n enabled: true,\r\n checkInterval: 300, // Check every 300ms\r\n fpsDeltaThreshold: 3, // Adjust if FPS changes by 3+\r\n memoryThreshold: 85, // Adjust if above 85% memory\r\n };\r\n }\r\n\r\n // Desktop\r\n return {\r\n enabled: false, // No adaptive quality needed\r\n checkInterval: 1000,\r\n fpsDeltaThreshold: 0,\r\n memoryThreshold: 90,\r\n };\r\n }\r\n\r\n /**\r\n * Optimize for device - returns recommended rendering settings\r\n */\r\n optimizeForDevice(): any {\r\n const { platform, gpuMemory, isLowPowerMode } = this.deviceInfo;\r\n const quality = this.profile.qualityLevel;\r\n\r\n const settings = {\r\n quality,\r\n platform,\r\n textureResolution: this.capabilities.maxTextureResolution,\r\n compression: this.selectCompression(platform),\r\n maxLights: this.capabilities.maxSimultaneousLights,\r\n shadowsEnabled: this.capabilities.shadowsSupported,\r\n lodEnabled: true,\r\n cullingEnabled: true,\r\n instancingEnabled: true,\r\n gpuMemoryBudget: gpuMemory > 2048 ? 1024 : gpuMemory / 2,\r\n };\r\n\r\n // Mobile low power adjustments\r\n if (isLowPowerMode && platform === 'mobile') {\r\n settings.quality = 'low';\r\n settings.textureResolution = 256;\r\n settings.compression = 'astc';\r\n settings.maxLights = 1;\r\n settings.shadowsEnabled = false;\r\n settings.lodEnabled = true;\r\n settings.cullingEnabled = true;\r\n }\r\n\r\n return settings;\r\n }\r\n\r\n /**\r\n * Select best compression format for platform\r\n */\r\n private selectCompression(platform: string): string {\r\n const formats = this.capabilities.compressionFormats;\r\n\r\n if (platform === 'mobile') {\r\n return formats.includes('astc') ? 'astc' : formats[0];\r\n }\r\n\r\n if (platform === 'vr') {\r\n return formats.includes('basis') ? 'basis' : formats[0];\r\n }\r\n\r\n // Desktop\r\n return formats.includes('none') ? 'none' : formats[0];\r\n }\r\n\r\n /**\r\n * Update frame metrics for adaptive quality\r\n */\r\n updateFrameMetrics(fps: number, gpuMemoryUsed: number, gpuFrameTime: number): void {\r\n this.currentFPS = fps;\r\n this.frameHistory.push(fps);\r\n\r\n // Keep only last 30 frames\r\n if (this.frameHistory.length > 30) {\r\n this.frameHistory.shift();\r\n }\r\n\r\n // Check if adaptation is needed\r\n if (this.adaptiveSettings.enabled) {\r\n const now = Date.now();\r\n if (now - this.lastAdaptTime > this.adaptiveSettings.checkInterval) {\r\n this.checkAndAdapt(fps, gpuMemoryUsed);\r\n this.lastAdaptTime = now;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check and adapt quality settings\r\n */\r\n private checkAndAdapt(fps: number, gpuMemoryUsed: number): void {\r\n const avgFps = this.getAverageFPS();\r\n const memoryPercent = (gpuMemoryUsed / this.profile.capabilities.estimatedMemory) * 100;\r\n\r\n let shouldDegrade = false;\r\n let shouldImprove = false;\r\n\r\n // Check FPS\r\n if (avgFps < this.profile.fpsMin) {\r\n shouldDegrade = true;\r\n } else if (avgFps > this.profile.fpsTarget + this.adaptiveSettings.fpsDeltaThreshold) {\r\n shouldImprove = true;\r\n }\r\n\r\n // Check memory\r\n if (memoryPercent > this.adaptiveSettings.memoryThreshold) {\r\n shouldDegrade = true;\r\n }\r\n\r\n if (shouldDegrade) {\r\n this.degradeQuality();\r\n } else if (shouldImprove) {\r\n this.improveQuality();\r\n }\r\n }\r\n\r\n /**\r\n * Degrade quality for better performance\r\n */\r\n private degradeQuality(): void {\r\n switch (this.profile.qualityLevel) {\r\n case 'ultra':\r\n this.profile.qualityLevel = 'high';\r\n break;\r\n case 'high':\r\n this.profile.qualityLevel = 'medium';\r\n break;\r\n case 'medium':\r\n this.profile.qualityLevel = 'low';\r\n break;\r\n case 'low':\r\n // Already at minimum\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Improve quality for better visuals\r\n */\r\n private improveQuality(): void {\r\n switch (this.profile.qualityLevel) {\r\n case 'low':\r\n this.profile.qualityLevel = 'medium';\r\n break;\r\n case 'medium':\r\n this.profile.qualityLevel = 'high';\r\n break;\r\n case 'high':\r\n if (this.profile.device.platform === 'desktop') {\r\n this.profile.qualityLevel = 'ultra';\r\n }\r\n break;\r\n case 'ultra':\r\n // Already at maximum\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Get average FPS from history\r\n */\r\n private getAverageFPS(): number {\r\n if (this.frameHistory.length === 0) {\r\n return this.currentFPS;\r\n }\r\n\r\n const sum = this.frameHistory.reduce((a, b) => a + b, 0);\r\n return sum / this.frameHistory.length;\r\n }\r\n\r\n /**\r\n * Run performance benchmark\r\n */\r\n async runBenchmark(\r\n name: string,\r\n renderFunc: (iterations: number) => Promise<{ fps: number; gpuTime: number; cpuTime: number; triangles: number; drawCalls: number }>\r\n ): Promise<BenchmarkResult> {\r\n const iterations = this.getBenchmarkIterations();\r\n\r\n console.log(`Running benchmark: ${name} (${iterations} iterations)...`);\r\n\r\n const result = await renderFunc(iterations);\r\n\r\n const fps = result.fps;\r\n const passed = fps >= this.profile.fpsMin;\r\n\r\n return {\r\n testName: name,\r\n platform: this.deviceInfo.platform,\r\n fps,\r\n gpuFrameTime: result.gpuTime,\r\n cpuFrameTime: result.cpuTime,\r\n gpuMemoryUsed: 0, // Would be populated from actual measurement\r\n trianglesPerSecond: result.triangles * fps,\r\n drawCallsPerSecond: result.drawCalls * fps,\r\n qualityLevel: this.profile.qualityLevel,\r\n passed,\r\n };\r\n }\r\n\r\n /**\r\n * Get benchmark iterations based on platform\r\n */\r\n private getBenchmarkIterations(): number {\r\n switch (this.deviceInfo.platform) {\r\n case 'mobile':\r\n return 100;\r\n case 'vr':\r\n return 200;\r\n case 'desktop':\r\n return 300;\r\n }\r\n }\r\n\r\n /**\r\n * Get current performance profile\r\n */\r\n getProfile(): PerformanceProfile {\r\n return { ...this.profile };\r\n }\r\n\r\n /**\r\n * Get optimization recommendations\r\n */\r\n getRecommendations(): string[] {\r\n const recommendations: string[] = [];\r\n const avgFps = this.getAverageFPS();\r\n\r\n if (avgFps < this.profile.fpsMin) {\r\n recommendations.push(`FPS below target (${Math.round(avgFps)} < ${this.profile.fpsMin})`);\r\n recommendations.push('Consider reducing quality preset');\r\n recommendations.push('Enable texture compression');\r\n recommendations.push('Reduce shadow quality');\r\n }\r\n\r\n if (this.profile.device.isLowPowerMode) {\r\n recommendations.push('Device in low power mode');\r\n recommendations.push('Consider reducing quality');\r\n recommendations.push('Disable shadows and lights');\r\n }\r\n\r\n return recommendations;\r\n }\r\n}\r\n\r\nexport default PlatformPerformanceOptimizer;\r\n"]}