@selvajs/compute 1.5.2-beta.1 → 1.5.2-beta.3

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 (42) hide show
  1. package/dist/{chunk-2D74PNQU.cjs → chunk-C2VFZAMO.cjs} +2 -2
  2. package/dist/{chunk-2D74PNQU.cjs.map → chunk-C2VFZAMO.cjs.map} +1 -1
  3. package/dist/chunk-DM7RXPP6.js +2 -0
  4. package/dist/chunk-DM7RXPP6.js.map +1 -0
  5. package/dist/chunk-DSI6FKBA.cjs +2 -0
  6. package/dist/chunk-DSI6FKBA.cjs.map +1 -0
  7. package/dist/{chunk-XIBQV4XW.js → chunk-R7E2XNH4.js} +2 -2
  8. package/dist/core.d.cts +3 -2
  9. package/dist/core.d.ts +3 -2
  10. package/dist/errors-CEy4nM1J.d.cts +149 -0
  11. package/dist/errors-CEy4nM1J.d.ts +149 -0
  12. package/dist/grasshopper.cjs +1 -1
  13. package/dist/grasshopper.d.cts +4 -27
  14. package/dist/grasshopper.d.ts +4 -27
  15. package/dist/grasshopper.js +1 -1
  16. package/dist/index.cjs +1 -1
  17. package/dist/index.d.cts +3 -1
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.js +1 -1
  20. package/dist/types-COCuQEMk.d.cts +93 -0
  21. package/dist/types-COCuQEMk.d.ts +93 -0
  22. package/dist/{errors-CiA83qw2.d.cts → types-Dfeei0dD.d.cts} +1 -149
  23. package/dist/{errors-CiA83qw2.d.ts → types-Dfeei0dD.d.ts} +1 -149
  24. package/dist/visualization-HV5EMX2F.cjs +2 -0
  25. package/dist/visualization-HV5EMX2F.cjs.map +1 -0
  26. package/dist/visualization-S47O7BLV.js +2 -0
  27. package/dist/visualization-S47O7BLV.js.map +1 -0
  28. package/dist/visualization.cjs +1 -1
  29. package/dist/visualization.cjs.map +1 -1
  30. package/dist/visualization.d.cts +75 -1
  31. package/dist/visualization.d.ts +75 -1
  32. package/dist/visualization.js +1 -1
  33. package/package.json +1 -1
  34. package/dist/chunk-5465MDT4.cjs +0 -2
  35. package/dist/chunk-5465MDT4.cjs.map +0 -1
  36. package/dist/chunk-DADFXYBV.js +0 -2
  37. package/dist/chunk-DADFXYBV.js.map +0 -1
  38. package/dist/visualization-3HFOMXUY.cjs +0 -2
  39. package/dist/visualization-3HFOMXUY.cjs.map +0 -1
  40. package/dist/visualization-XXHESVUI.js +0 -2
  41. package/dist/visualization-XXHESVUI.js.map +0 -1
  42. /package/dist/{chunk-XIBQV4XW.js.map → chunk-R7E2XNH4.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/selva-compute/selva-compute/dist/chunk-DSI6FKBA.cjs","../src/features/visualization/threejs/three-initializer.ts","../src/features/visualization/threejs/three-helpers.ts"],"names":["defaultUp","getScaleValue","scale","mmVal","cmVal","mVal","initThree","canvas","options","config","applyDefaults","scene","createScene","camera","createCamera","renderer","setupRenderer","controls","setupControls","setupEnvironment","setupLighting","addFloor","eventHandlers","setupEventHandlers","parent","getCanvasSize","animate","disposeAnimation","createAnimationLoop","sceneUp","object","material","defaults","bgColor","animateCameraTo","toPosition","toTarget","durationMs","fromPosition","fromTarget","startTime","easeOut","t","tick","elapsed","onFrame","animationId","lastTime","checkResize","width","height","pixelRatio","newW","newH","now","delta","HDRLoader","envMap","error","getLogger","ambientLight","sunlight","pos","shadowSize","shadowNear","shadowFar","floorSize","floorGeometry","floorColor","floorMaterial","floor","selectedObjects","originalMaterials","raycaster","mouse","mouseDownPosition","isFullyVisible","current","fitToView","box","center","size","maxDim","fov","distance","direction","selectionColorObj","clearSelection","obj","handleMouseDown","event","handleCanvasClick","currentMousePosition","rect","intersects","i","clickedObject","clonedMaterial","handleDoubleClick","target","targetPosition","handleKeydown","OrbitControls","CAMERA_CONFIG","updateScene","meshes","initialPositionSet","clearScene","mesh","unionBoundingBox","computeCombinedBoundingBox","parseColor","colorString","trimmed","hex"],"mappings":"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","file":"/home/runner/work/selva-compute/selva-compute/dist/chunk-DSI6FKBA.cjs","sourcesContent":[null,"import * as THREE from 'three';\nimport { OrbitControls } from 'three/addons/controls/OrbitControls.js';\nimport { HDRLoader } from 'three/addons/loaders/HDRLoader.js';\n\nimport { getLogger } from '@/core';\nimport { ThreeInitializerOptions } from '../types';\n\nconst defaultUp = new THREE.Vector3(0, 0, 1);\n\n// Returns scale-specific values for mm, cm, and m scales\nconst getScaleValue = (scale: string, mmVal: number, cmVal: number, mVal: number): number => {\n\tswitch (scale) {\n\t\tcase 'mm':\n\t\t\treturn mmVal;\n\t\tcase 'cm':\n\t\t\treturn cmVal;\n\t\tdefault:\n\t\t\treturn mVal;\n\t}\n};\n\n/**\n * Initializes a Three.js environment with scene, camera, renderer, and event handling.\n */\nexport const initThree = function (\n\tcanvas: HTMLCanvasElement,\n\toptions?: ThreeInitializerOptions\n): {\n\tscene: THREE.Scene;\n\tcamera: THREE.PerspectiveCamera;\n\tcontrols: OrbitControls;\n\trenderer: THREE.WebGLRenderer;\n\tdispose: () => void;\n\tfitToView: () => void;\n\tclearSelection: () => void;\n} {\n\tconst config = applyDefaults(options || {});\n\n\tconst scene = createScene(config);\n\tconst camera = createCamera(config, canvas);\n\tconst renderer = setupRenderer(canvas, config);\n\tconst controls = setupControls(camera, canvas, config);\n\n\tsetupEnvironment(scene, config);\n\tsetupLighting(scene, config);\n\n\tif (config.floor?.enabled) {\n\t\taddFloor(scene, config);\n\t}\n\n\tconst eventHandlers =\n\t\tconfig.events.enableEventHandlers !== false\n\t\t\t? setupEventHandlers(canvas, scene, camera, controls, config)\n\t\t\t: { dispose: () => {}, fitToView: () => {}, clearSelection: () => {} };\n\n\tconst parent = canvas.parentElement;\n\tconst getCanvasSize = () =>\n\t\tparent\n\t\t\t? { width: parent.clientWidth, height: parent.clientHeight }\n\t\t\t: { width: window.innerWidth, height: window.innerHeight };\n\n\t// Resize checked every frame so buffer resize and render happen in the same frame,\n\t// preventing visible blank frames on resize\n\tconst { animate, dispose: disposeAnimation } = createAnimationLoop(\n\t\trenderer,\n\t\tscene,\n\t\tcamera,\n\t\tcontrols,\n\t\tgetCanvasSize,\n\t\tconfig.events.onFrame\n\t);\n\tanimate();\n\n\tconst sceneUp = config.environment?.sceneUp || defaultUp;\n\tscene.up.set(sceneUp.x, sceneUp.y, sceneUp.z);\n\n\tconst dispose = () => {\n\t\tdisposeAnimation();\n\t\teventHandlers.dispose();\n\t\tcontrols.dispose();\n\t\trenderer.dispose();\n\n\t\tscene.traverse((object) => {\n\t\t\tif (object instanceof THREE.Mesh) {\n\t\t\t\tobject.geometry?.dispose();\n\t\t\t\tif (Array.isArray(object.material)) {\n\t\t\t\t\tobject.material.forEach((material) => material.dispose());\n\t\t\t\t} else {\n\t\t\t\t\tobject.material?.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\treturn {\n\t\tscene,\n\t\tcamera,\n\t\tcontrols,\n\t\trenderer,\n\t\tdispose,\n\t\tfitToView: eventHandlers.fitToView,\n\t\tclearSelection: eventHandlers.clearSelection\n\t};\n};\n\nfunction applyDefaults(options: ThreeInitializerOptions): Required<ThreeInitializerOptions> {\n\tconst scale = options.sceneScale || 'm';\n\n\t// All Rhino geometry is normalized to METERS (1 unit = 1 meter), sceneScale just changes the viewing perspective\n\tconst scaleDefaults = {\n\t\tmm: {\n\t\t\tcameraDistance: 20,\n\t\t\tnear: 0.1,\n\t\t\tfar: 2000,\n\t\t\tfloorSize: 100,\n\t\t\tlightDistance: 10,\n\t\t\tlightHeight: 20,\n\t\t\tminDistance: 0.1,\n\t\t\tshadowSize: 100,\n\t\t\tscaleFactor: 1000\n\t\t},\n\t\tcm: {\n\t\t\tcameraDistance: 20,\n\t\t\tnear: 0.1,\n\t\t\tfar: 2000,\n\t\t\tfloorSize: 100,\n\t\t\tlightDistance: 25,\n\t\t\tlightHeight: 50,\n\t\t\tminDistance: 0.1,\n\t\t\tshadowSize: 100,\n\t\t\tscaleFactor: 100\n\t\t},\n\t\tm: {\n\t\t\tcameraDistance: 10,\n\t\t\tnear: 0.01,\n\t\t\tfar: 2000,\n\t\t\tfloorSize: 50,\n\t\t\tlightDistance: 25,\n\t\t\tlightHeight: 50,\n\t\t\tminDistance: 0.001,\n\t\t\tshadowSize: 100,\n\t\t\tscaleFactor: 1\n\t\t},\n\t\tinches: {\n\t\t\tcameraDistance: 15,\n\t\t\tnear: 0.1,\n\t\t\tfar: 2000,\n\t\t\tfloorSize: 80,\n\t\t\tlightDistance: 20,\n\t\t\tlightHeight: 40,\n\t\t\tminDistance: 0.1,\n\t\t\tshadowSize: 80,\n\t\t\tscaleFactor: 39.37\n\t\t},\n\t\tfeet: {\n\t\t\tcameraDistance: 8,\n\t\t\tnear: 0.1,\n\t\t\tfar: 2000,\n\t\t\tfloorSize: 40,\n\t\t\tlightDistance: 15,\n\t\t\tlightHeight: 30,\n\t\t\tminDistance: 0.1,\n\t\t\tshadowSize: 60,\n\t\t\tscaleFactor: 3.28084\n\t\t}\n\t};\n\n\tconst defaults = scaleDefaults[scale];\n\n\treturn {\n\t\tsceneScale: scale,\n\t\tcamera: {\n\t\t\tposition:\n\t\t\t\toptions.camera?.position ||\n\t\t\t\tnew THREE.Vector3(\n\t\t\t\t\t-defaults.cameraDistance,\n\t\t\t\t\tdefaults.cameraDistance,\n\t\t\t\t\tdefaults.cameraDistance\n\t\t\t\t),\n\t\t\tfov: options.camera?.fov || 20,\n\t\t\tnear: options.camera?.near || defaults.near,\n\t\t\tfar: options.camera?.far || defaults.far,\n\t\t\ttarget: options.camera?.target || new THREE.Vector3(0, 0, 0)\n\t\t},\n\t\tlighting: {\n\t\t\tenableSunlight: options.lighting?.enableSunlight ?? true,\n\t\t\tsunlightIntensity: options.lighting?.sunlightIntensity || 1,\n\t\t\tsunlightPosition:\n\t\t\t\toptions.lighting?.sunlightPosition ||\n\t\t\t\tnew THREE.Vector3(defaults.lightDistance, defaults.lightHeight, defaults.lightDistance),\n\t\t\tambientLightColor: options.lighting?.ambientLightColor || new THREE.Color(0x404040),\n\t\t\tambientLightIntensity: options.lighting?.ambientLightIntensity || 1,\n\t\t\tsunlightColor: options.lighting?.sunlightColor || 0xffffff // Default to white sunlight\n\t\t},\n\t\tenvironment: {\n\t\t\thdrPath: options.environment?.hdrPath || '/baseHDR.hdr',\n\t\t\tbackgroundColor: options.environment?.backgroundColor || new THREE.Color(0xf0f0f0),\n\t\t\tenableEnvironmentLighting: options.environment?.enableEnvironmentLighting ?? true,\n\t\t\tsceneUp: options.environment?.sceneUp || defaultUp,\n\t\t\tshowEnvironment: options.environment?.showEnvironment ?? false\n\t\t},\n\t\tfloor: {\n\t\t\tenabled: options.floor?.enabled ?? false,\n\t\t\tsize: options.floor?.size || defaults.floorSize,\n\t\t\tcolor: options.floor?.color || new THREE.Color(0x808080),\n\t\t\troughness: options.floor?.roughness || 0.7,\n\t\t\tmetalness: options.floor?.metalness || 0.0,\n\t\t\treceiveShadow: options.floor?.receiveShadow ?? true\n\t\t},\n\t\trender: {\n\t\t\tenableShadows: options.render?.enableShadows ?? true,\n\t\t\tshadowMapSize: options.render?.shadowMapSize || 2048,\n\t\t\tantialias: options.render?.antialias ?? true,\n\t\t\tpixelRatio: options.render?.pixelRatio || Math.min(window.devicePixelRatio, 2),\n\t\t\ttoneMapping: options.render?.toneMapping || THREE.NeutralToneMapping,\n\t\t\ttoneMappingExposure: options.render?.toneMappingExposure || 1,\n\t\t\tpreserveDrawingBuffer: options.render?.preserveDrawingBuffer ?? false\n\t\t},\n\t\tcontrols: {\n\t\t\tenableDamping: options.controls?.enableDamping ?? false,\n\t\t\tdampingFactor: options.controls?.dampingFactor || 0.05,\n\t\t\tautoRotate: options.controls?.autoRotate ?? false,\n\t\t\tautoRotateSpeed: options.controls?.autoRotateSpeed || 0.5,\n\t\t\tenableZoom: options.controls?.enableZoom ?? true,\n\t\t\tenablePan: options.controls?.enablePan ?? true,\n\t\t\tminDistance: options.controls?.minDistance || defaults.minDistance,\n\t\t\tmaxDistance: options.controls?.maxDistance || Infinity\n\t\t},\n\t\tevents: {\n\t\t\tonBackgroundClicked: options.events?.onBackgroundClicked,\n\t\t\tonObjectSelected: options.events?.onObjectSelected,\n\t\t\tonMeshMetadataClicked: options.events?.onMeshMetadataClicked,\n\t\t\tonMeshDoubleClicked: options.events?.onMeshDoubleClicked,\n\t\t\tselectionColor: options.events?.selectionColor || '#ff0000', // Default to red\n\t\t\tenableEventHandlers: options.events?.enableEventHandlers ?? true,\n\t\t\tenableKeyboardControls: options.events?.enableKeyboardControls ?? true,\n\t\t\tenableClickToFocus: options.events?.enableClickToFocus ?? true,\n\t\t\tenableDoubleClickZoom: options.events?.enableDoubleClickZoom ?? true,\n\t\t\tonReady: options.events?.onReady,\n\t\t\tonFrame: options.events?.onFrame\n\t\t}\n\t};\n}\n\nfunction createScene(config: Required<ThreeInitializerOptions>): THREE.Scene {\n\tconst scene = new THREE.Scene();\n\n\tconst bgColor =\n\t\ttypeof config.environment.backgroundColor === 'string'\n\t\t\t? new THREE.Color(config.environment.backgroundColor)\n\t\t\t: config.environment.backgroundColor;\n\tscene.background = bgColor || null;\n\n\treturn scene;\n}\n\nfunction animateCameraTo(\n\tcamera: THREE.PerspectiveCamera,\n\tcontrols: OrbitControls,\n\ttoPosition: THREE.Vector3,\n\ttoTarget: THREE.Vector3,\n\tdurationMs = 200\n): void {\n\tconst fromPosition = camera.position.clone();\n\tconst fromTarget = controls.target.clone();\n\tconst startTime = performance.now();\n\n\tconst easeOut = (t: number) => 1 - Math.pow(1 - t, 3);\n\n\tconst tick = () => {\n\t\tconst elapsed = performance.now() - startTime;\n\t\tconst t = easeOut(Math.min(elapsed / durationMs, 1));\n\n\t\tcamera.position.lerpVectors(fromPosition, toPosition, t);\n\t\tcontrols.target.lerpVectors(fromTarget, toTarget, t);\n\t\tcontrols.update();\n\n\t\tif (t < 1) requestAnimationFrame(tick);\n\t};\n\n\trequestAnimationFrame(tick);\n}\n\n// Resize applied before render so buffer clear and draw happen in the same frame,\n// preventing visible blank frames when the canvas is resized\nfunction createAnimationLoop(\n\trenderer: THREE.WebGLRenderer,\n\tscene: THREE.Scene,\n\tcamera: THREE.PerspectiveCamera,\n\tcontrols: OrbitControls,\n\tgetCanvasSize: () => { width: number; height: number },\n\tonFrame?: (delta: number) => void\n): { animate: () => void; dispose: () => void } {\n\tlet animationId: number | null = null;\n\tlet lastTime = performance.now();\n\n\tconst checkResize = () => {\n\t\tconst { width, height } = getCanvasSize();\n\t\tif (width === 0 || height === 0) return;\n\n\t\tconst pixelRatio = Math.min(window.devicePixelRatio, 2);\n\t\tconst newW = Math.round(width * pixelRatio);\n\t\tconst newH = Math.round(height * pixelRatio);\n\n\t\tif (renderer.domElement.width !== newW || renderer.domElement.height !== newH) {\n\t\t\trenderer.setPixelRatio(pixelRatio);\n\t\t\trenderer.setSize(width, height, false);\n\t\t\tcamera.aspect = width / height;\n\t\t\tcamera.updateProjectionMatrix();\n\t\t}\n\t};\n\n\tconst animate = function () {\n\t\tanimationId = requestAnimationFrame(animate);\n\n\t\tconst now = performance.now();\n\t\tconst delta = (now - lastTime) / 1000;\n\t\tlastTime = now;\n\n\t\tcheckResize();\n\n\t\tif (controls.enableDamping || controls.autoRotate) {\n\t\t\tcontrols.update();\n\t\t}\n\n\t\tonFrame?.(delta);\n\n\t\trenderer.render(scene, camera);\n\t};\n\n\tconst dispose = () => {\n\t\tif (animationId !== null) {\n\t\t\tcancelAnimationFrame(animationId);\n\t\t\tanimationId = null;\n\t\t}\n\t};\n\n\treturn { animate, dispose };\n}\n\nfunction setupEnvironment(scene: THREE.Scene, config: Required<ThreeInitializerOptions>) {\n\tif (config.environment.enableEnvironmentLighting) {\n\t\tnew HDRLoader().load(\n\t\t\tconfig.environment.hdrPath || '/baseHDR.hdr',\n\t\t\tfunction (envMap) {\n\t\t\t\tenvMap.mapping = THREE.EquirectangularReflectionMapping;\n\t\t\t\tscene.environment = envMap;\n\t\t\t\tif (config.environment.showEnvironment) {\n\t\t\t\t\tscene.background = envMap;\n\t\t\t\t}\n\t\t\t\tconfig.events.onReady?.();\n\t\t\t},\n\t\t\tundefined,\n\t\t\tfunction (error) {\n\t\t\t\tgetLogger().warn('HDR texture could not be loaded, falling back to basic lighting:', error);\n\t\t\t\tconfig.events.onReady?.();\n\t\t\t}\n\t\t);\n\t} else {\n\t\tconfig.events.onReady?.();\n\t}\n}\n\nfunction setupLighting(scene: THREE.Scene, config: Required<ThreeInitializerOptions>) {\n\tconst ambientLight = new THREE.AmbientLight(\n\t\tconfig.lighting.ambientLightColor,\n\t\tconfig.lighting.ambientLightIntensity\n\t);\n\tscene.add(ambientLight);\n\n\tif (config.lighting.enableSunlight) {\n\t\tconst sunlight = new THREE.DirectionalLight(\n\t\t\tconfig.lighting.sunlightColor ?? 0xffffff,\n\t\t\tconfig.lighting.sunlightIntensity\n\t\t);\n\t\tconst pos = config.lighting.sunlightPosition;\n\t\tif (pos) {\n\t\t\tsunlight.position.set(pos.x, pos.y, pos.z);\n\t\t}\n\n\t\tif (config.render.enableShadows) {\n\t\t\tsunlight.castShadow = true;\n\t\t\tconst shadowSize = getScaleValue(config.sceneScale, 0.1, 10, 100);\n\n\t\t\tsunlight.shadow.camera.left = -shadowSize;\n\t\t\tsunlight.shadow.camera.right = shadowSize;\n\t\t\tsunlight.shadow.camera.top = shadowSize;\n\t\t\tsunlight.shadow.camera.bottom = -shadowSize;\n\n\t\t\tconst shadowNear = getScaleValue(config.sceneScale, 0.001, 0.1, 0.5);\n\t\t\tconst shadowFar = getScaleValue(config.sceneScale, 1, 100, 500);\n\n\t\t\tsunlight.shadow.camera.near = shadowNear;\n\t\t\tsunlight.shadow.camera.far = shadowFar;\n\n\t\t\tsunlight.shadow.mapSize.width = config.render.shadowMapSize || 2048;\n\t\t\tsunlight.shadow.mapSize.height = config.render.shadowMapSize || 2048;\n\n\t\t\tsunlight.shadow.bias = -0.0001;\n\t\t\tsunlight.shadow.normalBias = 0.02;\n\t\t}\n\n\t\tscene.add(sunlight);\n\t}\n}\n\nfunction addFloor(scene: THREE.Scene, config: Required<ThreeInitializerOptions>) {\n\tconst floorSize = config.floor.size;\n\tconst floorGeometry = new THREE.PlaneGeometry(floorSize, floorSize);\n\n\tconst floorColor =\n\t\ttypeof config.floor.color === 'string'\n\t\t\t? new THREE.Color(config.floor.color)\n\t\t\t: config.floor.color;\n\n\tconst floorMaterial = new THREE.MeshStandardMaterial({\n\t\tcolor: floorColor,\n\t\troughness: config.floor.roughness,\n\t\tmetalness: config.floor.metalness,\n\t\tside: THREE.DoubleSide\n\t});\n\n\tconst floor = new THREE.Mesh(floorGeometry, floorMaterial);\n\tfloor.userData.id = 'floor';\n\tfloor.name = 'floor';\n\tfloor.rotation.x = -Math.PI / 2;\n\tfloor.position.y = 0;\n\n\tif (config.floor.receiveShadow && config.render.enableShadows) {\n\t\tfloor.receiveShadow = true;\n\t}\n\n\tscene.add(floor);\n}\n\nfunction createCamera(\n\tconfig: Required<ThreeInitializerOptions>,\n\tcanvas: HTMLCanvasElement\n): THREE.PerspectiveCamera {\n\tconst parent = canvas.parentElement;\n\tconst width = parent ? parent.clientWidth : window.innerWidth;\n\tconst height = parent ? parent.clientHeight : window.innerHeight;\n\n\tconst camera = new THREE.PerspectiveCamera(\n\t\tconfig.camera.fov,\n\t\twidth / height,\n\t\tconfig.camera.near,\n\t\tconfig.camera.far\n\t);\n\n\tconst pos = config.camera.position;\n\tif (pos) {\n\t\tcamera.position.set(pos.x, pos.y, pos.z);\n\t}\n\n\treturn camera;\n}\n\n// Logarithmic depth buffer improves depth precision for mixed scales (mm to km)\nfunction setupRenderer(\n\tcanvas: HTMLCanvasElement,\n\tconfig: Required<ThreeInitializerOptions>\n): THREE.WebGLRenderer {\n\tconst renderer = new THREE.WebGLRenderer({\n\t\tantialias: config.render.antialias,\n\t\tcanvas,\n\t\talpha: true,\n\t\tpowerPreference: 'high-performance',\n\t\tpreserveDrawingBuffer: config.render.preserveDrawingBuffer,\n\t\tlogarithmicDepthBuffer: true\n\t});\n\n\tconst parent = canvas.parentElement;\n\tconst width = parent ? parent.clientWidth : window.innerWidth;\n\tconst height = parent ? parent.clientHeight : window.innerHeight;\n\n\tif (parent) {\n\t\tcanvas.style.width = '100%';\n\t\tcanvas.style.height = '100%';\n\t\tcanvas.style.display = 'block';\n\t}\n\n\trenderer.setSize(width, height, false);\n\trenderer.setPixelRatio(config.render.pixelRatio || Math.min(window.devicePixelRatio, 2));\n\n\tif (config.render.enableShadows) {\n\t\trenderer.shadowMap.enabled = true;\n\t\trenderer.shadowMap.type = THREE.VSMShadowMap;\n\t}\n\n\trenderer.toneMapping = config.render.toneMapping!;\n\trenderer.toneMappingExposure = config.render.toneMappingExposure || 1.0;\n\trenderer.outputColorSpace = THREE.SRGBColorSpace;\n\n\trenderer.sortObjects = true;\n\n\treturn renderer;\n}\n\nfunction setupEventHandlers(\n\tcanvas: HTMLCanvasElement,\n\tscene: THREE.Scene,\n\tcamera: THREE.PerspectiveCamera,\n\tcontrols: OrbitControls,\n\tconfig: Required<ThreeInitializerOptions>\n): {\n\tdispose: () => void;\n\tfitToView: () => void;\n\tclearSelection: () => void;\n} {\n\tconst selectedObjects = new Set<THREE.Object3D>();\n\tconst originalMaterials = new Map<THREE.Object3D, THREE.Material | THREE.Material[]>();\n\tconst raycaster = new THREE.Raycaster();\n\tconst mouse = new THREE.Vector2();\n\tconst mouseDownPosition = new THREE.Vector2();\n\n\t// An object is hittable only if every ancestor is also visible. Three.js's\n\t// recursive intersect doesn't enforce that — it can hit a visible Mesh inside\n\t// a hidden Group.\n\tconst isFullyVisible = (object: THREE.Object3D): boolean => {\n\t\tlet current: THREE.Object3D | null = object;\n\t\twhile (current) {\n\t\t\tif (!current.visible) return false;\n\t\t\tcurrent = current.parent;\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst fitToView = () => {\n\t\tconst box = new THREE.Box3();\n\n\t\tscene.traverse((object) => {\n\t\t\tif (object.visible && object.userData.id !== 'floor' && object instanceof THREE.Mesh) {\n\t\t\t\tbox.expandByObject(object);\n\t\t\t}\n\t\t});\n\n\t\tif (box.isEmpty()) {\n\t\t\tgetLogger().warn('No objects to fit to view');\n\t\t\treturn;\n\t\t}\n\n\t\tconst center = box.getCenter(new THREE.Vector3());\n\t\tconst size = box.getSize(new THREE.Vector3());\n\n\t\tconst maxDim = Math.max(size.x, size.y, size.z);\n\t\tconst fov = camera.fov * (Math.PI / 180);\n\t\tlet distance = maxDim / (2 * Math.tan(fov / 2));\n\n\t\tdistance *= 1.5;\n\n\t\tconst direction = camera.position.clone().sub(controls.target).normalize();\n\t\tcamera.position.copy(center.clone().add(direction.multiplyScalar(distance)));\n\n\t\tcontrols.target.copy(center);\n\t\tcontrols.update();\n\t};\n\n\tconst selectionColorObj =\n\t\ttypeof config.events.selectionColor === 'string'\n\t\t\t? new THREE.Color(config.events.selectionColor)\n\t\t\t: config.events.selectionColor instanceof THREE.Color\n\t\t\t\t? config.events.selectionColor\n\t\t\t\t: new THREE.Color('#ff0000');\n\n\tconst clearSelection = () => {\n\t\tselectedObjects.forEach((obj) => {\n\t\t\tif (obj instanceof THREE.Mesh && originalMaterials.has(obj)) {\n\t\t\t\tobj.material = originalMaterials.get(obj)!;\n\t\t\t\toriginalMaterials.delete(obj);\n\t\t\t}\n\t\t});\n\t\tselectedObjects.clear();\n\t};\n\n\tconst handleMouseDown = (event: MouseEvent) => {\n\t\tmouseDownPosition.set(event.clientX, event.clientY);\n\t};\n\n\tconst handleCanvasClick = (event: MouseEvent) => {\n\t\t// Ignore if mouse has moved (drag)\n\t\tconst currentMousePosition = new THREE.Vector2(event.clientX, event.clientY);\n\t\tif (mouseDownPosition.distanceTo(currentMousePosition) > 5) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rect = canvas.getBoundingClientRect();\n\t\tmouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n\t\tmouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n\n\t\traycaster.setFromCamera(mouse, camera);\n\t\tconst intersects = raycaster\n\t\t\t.intersectObjects(scene.children, true)\n\t\t\t.filter((i) => isFullyVisible(i.object));\n\n\t\tif (intersects.length > 0) {\n\t\t\tconst clickedObject = intersects[0].object;\n\n\t\t\tif (!selectedObjects.has(clickedObject)) {\n\t\t\t\tclearSelection();\n\t\t\t\tselectedObjects.add(clickedObject);\n\n\t\t\t\t// Clone material so we don't affect other meshes\n\t\t\t\tif (\n\t\t\t\t\tclickedObject instanceof THREE.Mesh &&\n\t\t\t\t\tclickedObject.material instanceof THREE.Material\n\t\t\t\t) {\n\t\t\t\t\toriginalMaterials.set(clickedObject, clickedObject.material);\n\n\t\t\t\t\tconst clonedMaterial = clickedObject.material.clone();\n\t\t\t\t\t(clonedMaterial as any).emissive = selectionColorObj.clone();\n\t\t\t\t\tclickedObject.material = clonedMaterial;\n\t\t\t\t}\n\n\t\t\t\tconfig.events?.onObjectSelected?.(clickedObject);\n\n\t\t\t\tif (clickedObject instanceof THREE.Mesh && Object.keys(clickedObject.userData).length > 0) {\n\t\t\t\t\tconfig.events?.onMeshMetadataClicked?.(clickedObject.userData);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tclearSelection();\n\t\t\tconfig.events?.onBackgroundClicked?.({ x: mouse.x, y: mouse.y });\n\t\t}\n\t};\n\n\tconst handleDoubleClick = (event: MouseEvent) => {\n\t\tconst rect = canvas.getBoundingClientRect();\n\t\tmouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n\t\tmouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n\n\t\traycaster.setFromCamera(mouse, camera);\n\t\tconst intersects = raycaster\n\t\t\t.intersectObjects(scene.children, true)\n\t\t\t.filter((i) => isFullyVisible(i.object));\n\n\t\tif (intersects.length === 0) return;\n\n\t\tconst target = intersects[0].object;\n\t\tconfig.events?.onMeshDoubleClicked?.(target);\n\n\t\tif (!config.events?.enableDoubleClickZoom) return;\n\n\t\tconst box = new THREE.Box3().setFromObject(target);\n\t\tif (box.isEmpty()) return;\n\n\t\tconst center = box.getCenter(new THREE.Vector3());\n\t\tconst size = box.getSize(new THREE.Vector3());\n\t\tconst maxDim = Math.max(size.x, size.y, size.z);\n\t\tconst fov = camera.fov * (Math.PI / 180);\n\t\tconst distance = (maxDim / (2 * Math.tan(fov / 2))) * 1.5;\n\n\t\tconst direction = camera.position.clone().sub(controls.target).normalize();\n\t\tconst targetPosition = center.clone().add(direction.multiplyScalar(distance));\n\n\t\tanimateCameraTo(camera, controls, targetPosition, center);\n\t};\n\n\tconst handleKeydown = (event: KeyboardEvent) => {\n\t\tif (!config.events?.enableKeyboardControls) return;\n\n\t\tswitch (event.key.toLowerCase()) {\n\t\t\tcase 'f':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tfitToView();\n\t\t\t\tbreak;\n\t\t\tcase 'escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearSelection();\n\t\t\t\tbreak;\n\t\t\tcase ' ':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tfitToView();\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tif (config.events?.enableClickToFocus) {\n\t\tcanvas.addEventListener('mousedown', handleMouseDown);\n\t\tcanvas.addEventListener('click', handleCanvasClick);\n\t\tcanvas.addEventListener('dblclick', handleDoubleClick);\n\t}\n\n\tif (config.events?.enableKeyboardControls) {\n\t\tcanvas.setAttribute('tabindex', '0');\n\t\tcanvas.addEventListener('keydown', handleKeydown);\n\t}\n\n\tconst dispose = () => {\n\t\tcanvas.removeEventListener('mousedown', handleMouseDown);\n\t\tcanvas.removeEventListener('click', handleCanvasClick);\n\t\tcanvas.removeEventListener('dblclick', handleDoubleClick);\n\t\tcanvas.removeEventListener('keydown', handleKeydown);\n\t\tclearSelection();\n\t};\n\n\treturn { dispose, fitToView, clearSelection };\n}\n\nfunction setupControls(\n\tcamera: THREE.PerspectiveCamera,\n\tcanvas: HTMLCanvasElement,\n\tconfig: Required<ThreeInitializerOptions>\n): OrbitControls {\n\tconst controls = new OrbitControls(camera, canvas);\n\n\tconst target = config.camera.target;\n\tif (target) {\n\t\tcontrols.target.set(target.x, target.y, target.z);\n\t}\n\n\tcontrols.enableDamping = config.controls.enableDamping || false;\n\tcontrols.dampingFactor = config.controls.dampingFactor || 0.05;\n\n\tcontrols.autoRotate = config.controls.autoRotate || false;\n\tcontrols.autoRotateSpeed = config.controls.autoRotateSpeed || 0.5;\n\n\tcontrols.enableZoom = config.controls.enableZoom ?? true;\n\tcontrols.enablePan = config.controls.enablePan ?? true;\n\tcontrols.minDistance = config.controls.minDistance || 0.001;\n\tcontrols.maxDistance = config.controls.maxDistance || Infinity;\n\n\tcontrols.screenSpacePanning = false;\n\tcontrols.maxPolarAngle = Math.PI;\n\n\tcontrols.update();\n\treturn controls;\n}\n","import * as THREE from 'three';\nimport { OrbitControls } from 'three/addons/controls/OrbitControls.js';\nimport { getLogger } from '@/core';\n\n// Camera configuration constants\nconst CAMERA_CONFIG = {\n\tHUGE_THRESHOLD: 10000,\n\tLARGE_THRESHOLD: 1000,\n\tSCALE_RATIO_THRESHOLD: 100,\n\tNEAR_PLANE_FACTOR: {\n\t\tTINY: 0.0001,\n\t\tSMALL: 0.001,\n\t\tNORMAL: 0.01\n\t},\n\tFAR_PLANE_FACTOR: {\n\t\tHUGE: 100,\n\t\tLARGE: 50,\n\t\tNORMAL: 20\n\t},\n\tINITIAL_DISTANCE_MULTIPLIER: 4\n};\n\n/**\n * Updates the scene with the given meshes and camera settings.\n * If initialPositionSet is false, it positions the camera and sets the controls target based on the bounding boxes of the meshes.\n * @param scene - The THREE.Scene object to update.\n * @param meshes - An array of THREE.Mesh objects to add to the scene.\n * @param camera - The THREE.PerspectiveCamera object to position.\n * @param controls - The OrbitControls object to update.\n * @param initialPositionSet - A boolean indicating whether the initial position of the camera and controls have been set.\n */\nexport function updateScene(\n\tscene: THREE.Scene,\n\tmeshes: THREE.Mesh[],\n\tcamera: THREE.PerspectiveCamera,\n\tcontrols: OrbitControls,\n\tinitialPositionSet: boolean\n) {\n\tclearScene(scene);\n\n\tif (meshes.length === 0) return;\n\n\t// Add new meshes to scene\n\tmeshes.forEach((mesh) => {\n\t\tscene.add(mesh);\n\t});\n\n\t// Calculate bounds of the new content\n\tconst unionBoundingBox = computeCombinedBoundingBox(meshes);\n\n\t// Get the center of the union bounding box\n\tconst center = unionBoundingBox.getCenter(new THREE.Vector3());\n\tconst size = unionBoundingBox.getSize(new THREE.Vector3());\n\n\t// Calculate a distance that is slightly larger than the largest dimension of the union bounding box\n\tconst maxDim = Math.max(size.x, size.y, size.z);\n\n\t// Always update camera frustum to ensure geometry is visible\n\t// This prevents clipping when geometry size changes significantly\n\tconst scaleRatio = maxDim / Math.min(size.x || 1, size.y || 1, size.z || 1);\n\n\tif (scaleRatio > CAMERA_CONFIG.SCALE_RATIO_THRESHOLD || maxDim > CAMERA_CONFIG.HUGE_THRESHOLD) {\n\t\t// Large scale range detected - use logarithmic depth buffer approach\n\t\tcamera.near = maxDim * CAMERA_CONFIG.NEAR_PLANE_FACTOR.TINY;\n\t\tcamera.far = maxDim * CAMERA_CONFIG.FAR_PLANE_FACTOR.HUGE;\n\t} else if (maxDim > CAMERA_CONFIG.LARGE_THRESHOLD) {\n\t\t// Large scene\n\t\tcamera.near = maxDim * CAMERA_CONFIG.NEAR_PLANE_FACTOR.SMALL;\n\t\tcamera.far = maxDim * CAMERA_CONFIG.FAR_PLANE_FACTOR.LARGE;\n\t} else {\n\t\t// Normal scene\n\t\tcamera.near = Math.max(0.01, maxDim * CAMERA_CONFIG.NEAR_PLANE_FACTOR.NORMAL);\n\t\tcamera.far = Math.max(2000, maxDim * CAMERA_CONFIG.FAR_PLANE_FACTOR.NORMAL);\n\t}\n\n\tcamera.updateProjectionMatrix();\n\n\t// Only reposition camera and controls on first frame\n\tif (!initialPositionSet) {\n\t\tconst distance = maxDim * CAMERA_CONFIG.INITIAL_DISTANCE_MULTIPLIER;\n\n\t\tcamera.position.set(center.x + distance * 0.8, center.y + distance, center.z + distance * 1.2);\n\t\tcontrols.target.copy(center);\n\t\tcontrols.minDistance = camera.near * 2;\n\t\tcontrols.maxDistance = camera.far * 0.9;\n\n\t\tcontrols.update();\n\t} else {\n\t\t// Update control constraints to match new frustum\n\t\tcontrols.minDistance = camera.near * 2;\n\t\tcontrols.maxDistance = camera.far * 0.9;\n\t}\n}\n\n// =========================\n// Helper functions\n// =========================\n\n/**\n * Parses a color string in multiple formats to a THREE.Color object.\n * Supported formats:\n * - Hex: \"#C7A5A5\", \"C7A5A5\"\n * - RGB: \"199, 165, 165\"\n * - CSS named colors: \"red\", \"blue\", etc.\n * @param colorString - The color string to parse.\n * @returns A THREE.Color object.\n */\nexport function parseColor(colorString: string): THREE.Color {\n\tif (!colorString || typeof colorString !== 'string') {\n\t\tgetLogger().warn(`Invalid color input: ${colorString}, using white`);\n\t\treturn new THREE.Color(0xffffff);\n\t}\n\n\tconst trimmed = colorString.trim();\n\n\t// Try hex format (#C7A5A5 or C7A5A5) — require exactly 6 hex chars\n\tif (/^#?[0-9A-Fa-f]{6}$/.test(trimmed)) {\n\t\ttry {\n\t\t\tconst hex = trimmed.startsWith('#') ? trimmed : `#${trimmed}`;\n\t\t\treturn new THREE.Color(hex);\n\t\t} catch {\n\t\t\tgetLogger().warn(`Invalid hex color: ${colorString}, using white`);\n\t\t\treturn new THREE.Color(0xffffff);\n\t\t}\n\t}\n\n\t// Try RGB format (R, G, B)\n\tif (trimmed.includes(',')) {\n\t\tconst rgb = trimmed.split(',').map((c) => parseInt(c.trim(), 10));\n\t\tif (rgb.length === 3 && rgb.every((n) => !isNaN(n) && n >= 0 && n <= 255)) {\n\t\t\treturn new THREE.Color(rgb[0] / 255, rgb[1] / 255, rgb[2] / 255);\n\t\t}\n\t}\n\n\t// Try CSS named color\n\ttry {\n\t\treturn new THREE.Color(trimmed.toLowerCase());\n\t} catch {\n\t\tgetLogger().warn(`Invalid color string: ${colorString}, using white`);\n\t\treturn new THREE.Color(0xffffff);\n\t}\n}\n\nexport function applyOffset(meshes: THREE.Mesh[], offsetY: number): void {\n\tmeshes.forEach((mesh) => {\n\t\tmesh.position.y -= offsetY;\n\t});\n}\n\n/**\n * Computes the combined world-axis-aligned bounding box of a set of meshes.\n * Correctly accounts for mesh transformations (rotation, position, scale).\n */\nexport function computeCombinedBoundingBox(meshes: THREE.Mesh[]): THREE.Box3 {\n\tconst combinedBoundingBox = new THREE.Box3();\n\tif (meshes.length === 0) return combinedBoundingBox;\n\tmeshes.forEach((mesh) => {\n\t\t// Ensure the world matrix is up to date before calculating the box\n\t\tmesh.updateMatrixWorld(true);\n\t\tconst bbox = new THREE.Box3().setFromObject(mesh);\n\t\tcombinedBoundingBox.union(bbox);\n\t});\n\treturn combinedBoundingBox;\n}\n\n/**\n * Clears the given THREE.Scene by removing all non-floor top-level children and\n * recursively disposing of their geometry and materials.\n *\n * Removes at the top level rather than traversing for meshes, so parent Groups\n * don't accumulate as ghost nodes after their mesh children are disposed.\n */\nfunction clearScene(scene: THREE.Scene): void {\n\t// Snapshot children — we mutate the array via removeFromParent during iteration\n\tconst topLevel = [...scene.children];\n\n\ttopLevel.forEach((object) => {\n\t\tif (object.userData.id === 'floor') return;\n\n\t\t// Recursively dispose all meshes in this subtree\n\t\tobject.traverse((child) => {\n\t\t\tif (!(child instanceof THREE.Mesh)) return;\n\n\t\t\tchild.geometry?.dispose();\n\n\t\t\tconst materials = Array.isArray(child.material) ? child.material : [child.material];\n\t\t\tmaterials.forEach((material) => {\n\t\t\t\t// Walk only own enumerable properties — `for...in` on a Three.js material\n\t\t\t\t// also iterates the prototype chain, which is needlessly expensive.\n\t\t\t\tfor (const value of Object.values(material)) {\n\t\t\t\t\tif (value instanceof THREE.Texture) {\n\t\t\t\t\t\tvalue.dispose();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmaterial.dispose();\n\t\t\t});\n\t\t});\n\n\t\tobject.removeFromParent();\n\t});\n}\n"]}
@@ -1,2 +1,2 @@
1
- import{a as W,b as $,c as z,d as q}from"./chunk-XLHA5YPH.js";import{b as p,c as f,d as l,e as m,h as v,i as U,k as j}from"./chunk-RHULSS7S.js";function L(r){let e=new WeakSet,t=n=>{if(n==null)return JSON.stringify(n);if(typeof n=="number")return Number.isFinite(n)?String(n):JSON.stringify(null);if(typeof n=="string"||typeof n=="boolean")return JSON.stringify(n);if(typeof n=="bigint")return JSON.stringify(n.toString());if(n instanceof Uint8Array){let s=n.length>64?Array.from(n.slice(0,32)).concat(Array.from(n.slice(-32))):Array.from(n);return JSON.stringify({__u8:!0,len:n.length,sample:s})}return Array.isArray(n)?`[${n.map(t).join(",")}]`:typeof n=="object"?e.has(n)?JSON.stringify("[Circular]"):(e.add(n),`{${Object.keys(n).sort().map(a=>`${JSON.stringify(a)}:${t(n[a])}`).join(",")}}`):JSON.stringify(null)};return t(r)}function _(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=e+((e<<1)+(e<<4)+(e<<7)+(e<<8)+(e<<24))>>>0;return e.toString(16).padStart(8,"0")}function R(r,e){let t=typeof r=="string"?r:L({__u8:!0,len:r.length});return _(`${t}|${L(e)}`)}var b=class{constructor(e,t,n={}){p(this,"executor");p(this,"baseConfig");p(this,"mode");p(this,"maxConcurrent");p(this,"timeoutMs");p(this,"retry");p(this,"cacheEnabled");p(this,"cacheMax");p(this,"cacheTtl");p(this,"cache",new Map);p(this,"onStart");p(this,"onSettle");p(this,"onSuperseded");p(this,"subscribers",new Set);p(this,"inFlight",new Set);p(this,"pendingForLatestWins",null);p(this,"fifoQueue",[]);p(this,"_lastResult",null);p(this,"_lastError",null);p(this,"_lastDurationMs",null);p(this,"disposed",!1);this.executor=e,this.baseConfig=t,this.mode=n.mode??"latest-wins",this.maxConcurrent=Math.max(1,n.maxConcurrent??(this.mode==="parallel"?4:1)),this.timeoutMs=n.timeoutMs,this.retry=n.retry;let s=n.cache;this.cacheEnabled=s!==void 0&&s!==!1;let o=typeof s=="object"?s:{};this.cacheMax=o.maxEntries??50,this.cacheTtl=o.ttlMs??0,this.onStart=n.onStart,this.onSettle=n.onSettle,this.onSuperseded=n.onSuperseded}get isSolving(){return this.inFlight.size>0}get hasPending(){return this.pendingForLatestWins!==null||this.fifoQueue.length>0}get inFlightCount(){return this.inFlight.size}get queueDepth(){return this.fifoQueue.length+(this.pendingForLatestWins?1:0)}get lastResult(){return this._lastResult}get lastError(){return this._lastError}get lastDurationMs(){return this._lastDurationMs}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}notify(){for(let e of this.subscribers)try{e()}catch(t){m().error("[SolveScheduler] subscriber threw:",t)}}solve(e,t,n){if(this.disposed)return Promise.reject(new l("SolveScheduler has been disposed and cannot be used",f.INVALID_STATE));let s=R(e,t),o={key:s,enqueuedAt:Date.now(),startedAt:null};if(this.cacheEnabled){let a=this.readCache(s);if(a){let u={status:"success",response:a,durationMs:0,fromCache:!0};return this._lastResult=a,this._lastError=null,this._lastDurationMs=0,this.runHook(this.onStart,o),this.runHook(this.onSettle,o,u),this.notify(),Promise.resolve(a)}}return new Promise((a,u)=>{let i={definition:e,dataTree:t,ctx:o,resolve:a,reject:u,externalSignal:n?.signal};if(i.externalSignal?.aborted){let c=this.makeAbortError(o);i.settled={error:c},u(c);return}this.enqueue(i)})}enqueue(e){switch(this.mode){case"latest-wins":{this.pendingForLatestWins&&(this.supersede(this.pendingForLatestWins),this.pendingForLatestWins=null);for(let t of this.inFlight)this.supersede(t),t.controller.abort();this.inFlight.size===0?this.execute(e):this.pendingForLatestWins=e;break}case"queue":case"parallel":{this.inFlight.size<this.maxConcurrent?this.execute(e):this.fifoQueue.push(e);break}}this.notify()}async execute(e){let t=new AbortController,n={...e,controller:t};this.inFlight.add(n),e.ctx.startedAt=Date.now();let s=()=>t.abort();e.externalSignal?.addEventListener("abort",s,{once:!0}),this.runHook(this.onStart,e.ctx),this.notify();let o=performance.now();try{let a={...this.baseConfig,signal:t.signal,...this.timeoutMs!==void 0&&{timeoutMs:this.timeoutMs},...this.retry!==void 0&&{retry:this.retry}},u=await this.executor(e.definition,e.dataTree,a),i=performance.now()-o;if(this.cacheEnabled&&this.writeCache(e.ctx.key,u),e.settled)return;e.settled={ok:!0},this._lastResult=u,this._lastError=null,this._lastDurationMs=i,e.resolve(u),this.runHook(this.onSettle,e.ctx,{status:"success",response:u,durationMs:i,fromCache:!1})}catch(a){let u=performance.now()-o,i=this.normalizeExecutionError(a,n),c=!!n.settled;this._lastError=i,this._lastDurationMs=u,c||(n.settled={error:i},e.reject(i),this.runHook(this.onSettle,e.ctx,{status:"error",error:i,durationMs:u}))}finally{e.externalSignal?.removeEventListener("abort",s),this.inFlight.delete(n),this.drainNext(),this.notify()}}drainNext(){if(!this.disposed){if(this.mode==="latest-wins"){if(this.pendingForLatestWins&&this.inFlight.size===0){let e=this.pendingForLatestWins;this.pendingForLatestWins=null,this.execute(e)}return}for(;this.fifoQueue.length>0&&this.inFlight.size<this.maxConcurrent;){let e=this.fifoQueue.shift();this.execute(e)}}}supersede(e){if(e.settled)return;let t=new l("Superseded by newer solve",f.SUPERSEDED,{context:{key:e.ctx.key,enqueuedAt:e.ctx.enqueuedAt}});e.settled={error:t},e.reject(t),this.runHook(this.onSuperseded,e.ctx)}makeAbortError(e){return new l("Request aborted by caller",f.ABORTED,{context:{key:e.key,enqueuedAt:e.enqueuedAt}})}isAbortLikeError(e){if(e instanceof Error){if(e.name==="AbortError")return!0;if(typeof DOMException<"u"&&e instanceof DOMException)return e.name==="AbortError"}return!1}normalizeExecutionError(e,t){return t.settled&&"error"in t.settled?t.settled.error:e instanceof l?e:this.isAbortLikeError(e)?this.makeAbortError(t.ctx):new l(e instanceof Error?e.message:String(e),f.UNKNOWN_ERROR,{originalError:e instanceof Error?e:new Error(String(e))})}cancelAll(){for(this.pendingForLatestWins&&(this.rejectAsAborted(this.pendingForLatestWins),this.pendingForLatestWins=null);this.fifoQueue.length>0;){let e=this.fifoQueue.shift();this.rejectAsAborted(e)}for(let e of this.inFlight){if(!e.settled){let t=this.makeAbortError(e.ctx);e.settled={error:t},e.reject(t),this.runHook(this.onSettle,e.ctx,{status:"error",error:t,durationMs:e.ctx.startedAt?performance.now()-e.ctx.startedAt:0})}e.controller.abort()}this.notify()}rejectAsAborted(e){if(e.settled)return;let t=this.makeAbortError(e.ctx);e.settled={error:t},e.reject(t)}readCache(e){if(!this.cacheEnabled)return null;let t=this.cache.get(e);return t?this.cacheTtl>0&&Date.now()-t.insertedAt>this.cacheTtl?(this.cache.delete(e),null):(this.cache.delete(e),this.cache.set(e,t),t.response):null}writeCache(e,t){if(this.cacheEnabled)for(this.cache.set(e,{response:t,insertedAt:Date.now()});this.cache.size>this.cacheMax;){let n=this.cache.keys().next().value;if(n===void 0)break;this.cache.delete(n)}}clearCache(){this.cache.clear()}dispose(){this.disposed||(this.disposed=!0,this.cancelAll(),this.subscribers.clear(),this.cache.clear())}runHook(e,...t){if(e)try{e(...t)}catch(n){m().error("[SolveScheduler] hook threw:",n)}}};var x=class r{constructor(e){p(this,"config");p(this,"serverStats");p(this,"disposed",!1);this.config=this.normalizeComputeConfig(e),this.serverStats=new U(this.config.serverUrl,this.config.apiKey)}static async create(e){let t=new r(e);if(!await t.serverStats.isServerOnline())throw new l("Rhino Compute server is not online",f.NETWORK_ERROR,{context:{serverUrl:t.config.serverUrl}});return t}getConfig(){return this.ensureNotDisposed(),{...this.config}}async getIO(e){return this.ensureNotDisposed(),E(e,this.config)}async getRawIO(e){return this.ensureNotDisposed(),I(e,this.config)}async solve(e,t,n){this.ensureNotDisposed();try{if(typeof e=="string"&&!e?.trim())throw new l("Definition URL/content is required",f.INVALID_INPUT,{context:{receivedUrl:e}});if(e instanceof Uint8Array&&e.length===0)throw new l("Definition content is empty",f.INVALID_INPUT);let s={...this.config,...n?.signal!==void 0&&{signal:n.signal},...n?.timeoutMs!==void 0&&{timeoutMs:n.timeoutMs},...n?.retry!==void 0&&{retry:n.retry}},o=await C(t,e,s);if(o?.errors&&o.errors.length>0)throw new l(o.errors.join("; ")||"Computation failed",f.COMPUTATION_ERROR,{context:{definition:typeof e=="string"&&e.length<200?e:"...content...",inputs:t,errors:o.errors,warnings:o.warnings}});return o}catch(s){throw this.config.debug&&m().error("Compute failed:",s),s instanceof l?s:new l(s instanceof Error?s.message:String(s),f.COMPUTATION_ERROR,{context:{definition:typeof e=="string"&&e.length<200?e:"...content...",inputs:t},originalError:s instanceof Error?s:new Error(String(s))})}}createScheduler(e){this.ensureNotDisposed();let t=(n,s,o)=>C(s,n,o);return new b(t,this.config,e)}async dispose(){this.disposed||(this.disposed=!0,await this.serverStats.dispose())}ensureNotDisposed(){if(this.disposed)throw new l("GrasshopperClient has been disposed and cannot be used",f.INVALID_STATE)}normalizeComputeConfig(e){if(!e.serverUrl?.trim())throw new l("serverUrl is required",f.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}});try{new URL(e.serverUrl)}catch{throw new l("serverUrl must be a valid URL",f.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}})}if(e.serverUrl===""||e.serverUrl==="https://compute.rhino3d.com/")throw new l("serverUrl must be set to your Compute server URL. The default public endpoint is not allowed.",f.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}});return{...e,serverUrl:e.serverUrl.replace(/\/+$/,""),apiKey:e.apiKey,authToken:e.authToken,debug:e.debug??!1,suppressBrowserWarning:e.suppressBrowserWarning??e.suppressClientSideWarning}}};var J=async(r,e=null)=>{try{return await H(r,e)}catch(t){throw new l("Failed to extract files from compute response",f.INVALID_STATE,{context:{originalError:t instanceof Error?t.message:String(t)},originalError:t instanceof Error?t:void 0})}},w=async(r,e,t=null)=>{if(typeof document>"u"||typeof Blob>"u")throw new l("File download functionality is only available in browser environments. This function requires the DOM API (document, Blob).",f.BROWSER_ONLY,{context:{environment:typeof window<"u"?"browser (SSR)":"Node.js",documentAvailable:typeof document<"u",blobAvailable:typeof Blob<"u"}});try{let n=await H(r,t);await le(n,e)}catch(n){throw n instanceof l?n:new l("Failed to download files from compute response",f.INVALID_STATE,{context:{originalError:n instanceof Error?n.message:String(n)},originalError:n instanceof Error?n:void 0})}},H=async(r,e)=>{let t=[];if(r.forEach(n=>{let s=`${n.fileName}${n.fileType}`;if(n.subFolder&&n.subFolder.trim()!==""&&(s=`${n.subFolder}/${s}`),n.isBase64Encoded===!0&&n.data){let o=z(n.data);t.push({fileName:`${n.fileName}${n.fileType}`,content:new Uint8Array(o.buffer),path:s})}else n.isBase64Encoded===!1&&n.data&&t.push({fileName:`${n.fileName}${n.fileType}`,content:n.data,path:s})}),e){let n=Array.isArray(e)?e:[e],s=await Promise.all(n.map(async o=>{try{let a=await fetch(o.filePath);if(!a.ok)return m().warn(`Failed to fetch additional file from URL: ${o.filePath}`),null;let i=await(await a.blob()).arrayBuffer();return{fileName:o.fileName,content:new Uint8Array(i),path:o.fileName}}catch(a){return m().error(`Error fetching additional file from URL: ${o.filePath}`,a),null}}));t.push(...s.filter(o=>o!==null))}return t};async function le(r,e){let{zipSync:t,strToU8:n}=await import("fflate"),s={};r.forEach(u=>{s[u.path]=typeof u.content=="string"?n(u.content):u.content});let o=t(s,{level:6}),a=new Blob([o],{type:"application/zip"});pe(a,`${e}.zip`)}function pe(r,e){if(typeof document>"u")throw new l("saveFile requires a browser environment with DOM API access.",f.BROWSER_ONLY,{context:{function:"saveFile",requiredAPI:"document"}});let t=document.createElement("a");t.href=URL.createObjectURL(r),t.download=e,t.click(),URL.revokeObjectURL(t.href)}var A=new Map;function K(r,e){A.set(r,e)}K("Rhino.Geometry.Point3d",(r,e)=>{let t=e;return!t||typeof t.X!="number"?null:new r.Point([t.X,t.Y,t.Z])});K("Rhino.Geometry.Line",(r,e)=>{let t=e;return!t||!t.From||!t.To?null:new r.Line([t.From.X,t.From.Y,t.From.Z],[t.To.X,t.To.Y,t.To.Z])});function ce(r){if(A.has(r))return A.get(r);for(let[e,t]of A)if(r.startsWith(e))return t}function fe(r){return!r||typeof r!="object"?null:r.data??r.value??null}function Y(r,e,t){let n=ce(e);if(n)try{return n(t,r)}catch(s){m().warn(`Failed to decode Rhino type ${e}:`,s)}try{let s=fe(r);if(s)return t.CommonObject.decode(s)}catch(s){return m().warn(`Failed to decode ${e} with CommonObject:`,s),{__decodeError:!0,type:e,raw:r}}return r}var T={STRING:"System.String",INT:"System.Int32",DOUBLE:"System.Double",BOOL:"System.Boolean"},me="Rhino.Geometry.",de=["WebDisplay"],he="FileData";function Q(r){return de.some(e=>r.includes(e))}function X(r){if(typeof r!="string")return r;let e=r.trim();if(!(e.startsWith("{")||e.startsWith("[")||e.startsWith('"')))return r;try{let n=JSON.parse(e);if(typeof n=="string")try{return JSON.parse(n)}catch{return n}return n}catch{return r}}function ye(r,e,t){switch(e){case T.STRING:return typeof r!="string"?r:r.replace(/^"(.*)"$/,"$1");case T.INT:return Number.parseInt(r,10);case T.DOUBLE:return Number.parseFloat(r);case T.BOOL:return String(r).toLowerCase()==="true";default:return t&&e.startsWith(me)?Y(r,e,t):r}}function Z(r,e,t,n){if(typeof r!="string")return r;let s=t?X(r):r;return ye(s,e,n)}function ge(r){if(!r||typeof r!="object")return!1;let e=r;return typeof e.fileName=="string"&&typeof e.fileType=="string"&&"data"in e&&typeof e.isBase64Encoded=="boolean"&&typeof e.subFolder=="string"}function F(r,e){for(let t of Object.values(r))if(Array.isArray(t))for(let n of t)e(n)}function ee(r,e=!1,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a={};for(let u of r.values)F(u.InnerTree,i=>{if(Q(i.type)||o&&i.type!==T.STRING)return;let c=e?i.id:u.ParamName;if(!c)return;let d=Z(i.data,i.type,n,s);a[c]===void 0?a[c]=d:Array.isArray(a[c])?a[c].push(d):a[c]=[a[c],d]});return{values:a}}function re(r){let e=[];for(let t of r.values)F(t.InnerTree,n=>{if(!n.type.includes(he))return;let s=X(n.data);ge(s)&&e.push(s)});return e}function O(r,e,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a;if("byName"in e?a=r.values.find(i=>i.ParamName===e.byName):a=r.values.find(i=>{let c=!1;return F(i.InnerTree,d=>{d.id===e.byId&&(c=!0)}),c}),!a)return;let u=[];if(F(a.InnerTree,i=>{if("byId"in e&&i.id!==e.byId||Q(i.type)||o&&i.type!==T.STRING)return;let c=Z(i.data,i.type,n,s);u.push(c)}),u.length!==0)return u.length===1?u[0]:u}var D=class{constructor(e,t=!1){this.response=e;this.debug=t}getValues(e=!1,t={}){return ee(this.response,e,t)}getValue(e,t){return O(this.response,e,t)}getValueByParamName(e,t){return O(this.response,{byName:e},t)}getValueByParamId(e,t){return O(this.response,{byId:e},t)}async extractMeshesFromResponse(e){let t={debug:this.debug,...e},n;try{({getThreeMeshesFromComputeResponse:n}=await import("./visualization-XXHESVUI.js"))}catch(s){throw new l("Failed to load three.js visualization module. Ensure three.js is installed as a peer dependency.",f.INVALID_STATE,{context:{originalError:s instanceof Error?s.message:String(s)}})}return n(this.response,t)}getFileData(){return re(this.response)}getAndDownloadFiles(e,t){let n=this.getFileData();w(n,e,t)}};function N(r,e){e||typeof window<"u"&&m().warn(`Warning: ${r} is running on the client side. For better performance and security, consider running this on the server side.`)}async function C(r,e,t){t.debug&&N("solveGrasshopperDefinition",t.suppressBrowserWarning??t.suppressClientSideWarning);let n=M(e,r);be(n,t);let s=await v("grasshopper",n,t);if("pointer"in s){let{pointer:o,...a}=s;return a}return s}function M(r,e){let t={algo:null,pointer:null,values:e};return r instanceof Uint8Array?t.algo=q(r):/^https?:\/\//i.test(r)?t.pointer=r:$(r)?t.algo=r:t.algo=W(r),t}function be(r,e){e.cachesolve!=null&&(r.cachesolve=e.cachesolve),e.modelunits!=null&&(r.modelunits=e.modelunits),e.angletolerance!=null&&(r.angletolerance=e.angletolerance),e.absolutetolerance!=null&&(r.absolutetolerance=e.absolutetolerance),e.dataversion!=null&&(r.dataversion=e.dataversion)}function te(r){if(typeof r.default!="object"||r.default===null)return;if(!("innerTree"in r.default)){m().warn("Unexpected structure in input.default:",r.default),r.default=null;return}let e=r.default.innerTree;if(Object.keys(e).length===0){r.default=void 0;return}if(r.treeAccess||r.atMost&&r.atMost>1){let n={};for(let[s,o]of Object.entries(e))n[s]=o.map(a=>{if(typeof a.data=="string"){if(a.type==="System.Double"||a.type==="System.Int32"){let u=Number(a.data);return Number.isNaN(u)?a.data:u}if(a.type==="System.Boolean")return a.data.toLowerCase()==="true";if(a.type.startsWith("Rhino.Geometry")||a.type==="System.String")try{return JSON.parse(a.data)}catch{return a.data}}return a.data});r.default=n;return}let t=[];for(let n of Object.values(e))Array.isArray(n)&&n.forEach(s=>{s&&typeof s=="object"&&"data"in s&&t.push(s.data)});t.length===0?r.default=void 0:t.length===1?r.default=t[0]:r.default=t}function P(r,e){let{transform:t,setUndefinedOnEmpty:n=!0}=e;if(!(r.default===void 0||r.default===null))if(Array.isArray(r.default)){let s=r.default.map(t).filter(o=>o!==null);r.default=s.length>0?s:void 0}else{let s=t(r.default);s!==null?r.default=s:n&&(r.default=void 0)}}function Te(){return r=>{if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r.trim());return Number.isNaN(e)?null:e}return null}}function Se(){return r=>{if(typeof r=="boolean")return r;if(typeof r=="string"){let e=r.toLowerCase();if(e==="true")return!0;if(e==="false")return!1;throw new Error(`Invalid boolean string: "${r}"`)}return null}}function xe(){return r=>typeof r=="string"?r.startsWith('"')&&r.endsWith('"')||r.startsWith('"')?r.slice(1,-1):r:null}function Ce(){return r=>{if(typeof r=="string"){let e=r.trim();return e.startsWith('"')&&e.endsWith('"')&&(e=e.slice(1,-1).trim()),e}return null}}function Ie(r){P(r,{transform:Ce(),setUndefinedOnEmpty:!1})}function De(r="unknown"){return e=>{if(typeof e=="object"&&e!==null)return e;if(typeof e=="string"&&e.trim()!=="")try{let t=JSON.parse(e);return typeof t=="object"&&t!==null?t:(m().warn(`Parsed value for input ${r} is not an object`),null)}catch(t){return m().warn(`Failed to parse object value "${e}" for input ${r}`,t),null}return null}}function ne(r,e,t){let n=Number(r.toFixed(e));return Math.abs(r-n)<t?n:r}function Pe(r,e=1e-8){if(!Number.isFinite(r)||r===0)return .1;let t=Math.abs(r);if(t>=1){let h=String(r).split(".")[1];if(h&&h.length>0){let y=Math.min(h.length,12),g=Math.pow(10,-y),B=Number(g.toFixed(y));return Math.abs(B-g)<e?B:g}return 1}let n=String(r),s=n.toLowerCase().match(/e(-?\d+)/);if(s){let S=Number(s[1]);if(S<0||n.toLowerCase().includes("e-")){let h=Math.abs(S),y=Math.pow(10,-h),g=Number(y.toFixed(h));return Math.abs(g-y)<e?g:y}return .1}let o=12,u=t.toFixed(o).replace(/0+$/,""),i=Math.min((u.split(".")[1]||"").length,o);if(i===0)return .1;let c=Math.pow(10,-i),d=Number(c.toFixed(i));return Math.abs(d-c)<e?d:c}function se(r,e=1e-8){let t=r.paramType==="Integer";if(P(r,{transform:Te()}),t){Array.isArray(r.default)?r.default=r.default.map(o=>typeof o=="number"?Math.round(o):o):typeof r.default=="number"&&(r.default=Math.round(r.default)),r.stepSize=1;return}let n=Array.isArray(r.default)?r.default[0]:r.default,s;if(typeof n=="number"&&Number.isFinite(n)&&n!==0?s=n:typeof r.minimum=="number"&&Number.isFinite(r.minimum)&&r.minimum!==0?s=r.minimum:typeof r.maximum=="number"&&Number.isFinite(r.maximum)&&r.maximum!==0&&(s=r.maximum),s!==void 0?r.stepSize=Pe(s,e):r.stepSize=.1,typeof r.stepSize=="number"){let o=0,a=String(r.stepSize),u=a.toLowerCase().match(/e(-?\d+)/);if(u?o=Math.abs(Number(u[1])):o=a.split(".")[1]?.length??0,o===0&&typeof n=="number"&&n!==0&&Math.abs(n)<1){let i=Math.ceil(-Math.log10(Math.abs(n)));Number.isFinite(i)&&i>0&&(o=i)}o=Math.min(Math.max(o,0),12),Array.isArray(r.default)?r.default=r.default.map(i=>typeof i=="number"?ne(i,o,e):i):typeof r.default=="number"&&(r.default=ne(r.default,o,e))}}function ve(r){try{P(r,{transform:Se(),setUndefinedOnEmpty:!1})}catch(e){throw e instanceof Error?new l(e.message):e}}function Re(r){P(r,{transform:xe(),setUndefinedOnEmpty:!1})}function oe(r){P(r,{transform:De(r.nickname||"unnamed"),setUndefinedOnEmpty:!0})}function Ee(r){if(!r.values||typeof r.values!="object"||Object.keys(r.values).length===0)throw l.missingValues(r.nickname||"unnamed","ValueList");if(r.default!==void 0&&r.default!==null){let e=String(r.default).toLowerCase();Object.keys(r.values).some(n=>n.toLowerCase()===e)||m().warn(`ValueList input "${r.nickname||"unnamed"}" default value "${r.default}" is not in available values`)}}var ae={Number:se,Integer:se,Boolean:ve,Text:Re,ValueList:Ee,Geometry:oe,File:oe,Color:Ie};function we(r,e){let t=(r.atMost??1)>1;switch(r.paramType){case"Number":case"Integer":return{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,default:t?[0]:0};case"Boolean":return{...e,paramType:"Boolean",default:t?[!1]:!1};case"Text":return{...e,paramType:"Text",default:t?[""]:""};case"ValueList":return{...e,paramType:"ValueList",values:r.values??{},default:t?[r.default]:r.default};case"File":return{...e,paramType:"File",default:t?[null]:null};case"Color":return{...e,paramType:"Color",default:t?["0, 0, 0"]:"0, 0, 0"};default:return{...e,paramType:"Geometry",default:t?[null]:null}}}function ie(r){return k(r).input}function k(r){let e={description:r.description,name:r.name,nickname:r.nickname,treeAccess:r.treeAccess,groupName:r.groupName??"",id:r.id};try{te(r);let t=ae[r.paramType];if(!t)throw l.unknownParamType(r.paramType,r.name);switch(t(r),r.paramType){case"Number":case"Integer":return{input:{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,stepSize:r.stepSize,default:r.default}};case"Boolean":return{input:{...e,paramType:"Boolean",default:r.default}};case"Text":return{input:{...e,paramType:"Text",default:r.default}};case"ValueList":return{input:{...e,paramType:"ValueList",values:r.values,default:r.default}};case"Geometry":return{input:{...e,paramType:r.paramType,default:r.default}};case"File":return{input:{...e,paramType:r.paramType,acceptedFormats:r.acceptedFormats,default:r.default}};case"Color":return{input:{...e,paramType:"Color",default:r.default}};default:throw l.unknownParamType(r.paramType,r.name)}}catch(t){if(t instanceof l)return m().error(`Validation error for input ${r.name||"unknown"}:`,t.message),{input:we(r,e),error:{inputName:r.name||"unknown",paramType:r.paramType,message:t.message,code:t.code}};throw new l(t instanceof Error?t.message:String(t),"VALIDATION_ERROR",{context:{paramName:r.name,paramType:r.paramType},originalError:t instanceof Error?t:new Error(String(t))})}}function ue(r){return V(r).inputs}function V(r){let e=[],t=[];for(let n of r){let{input:s,error:o}=k(n);e.push(s),o&&t.push(o)}return{inputs:e,parseErrors:t}}async function I(r,e){let t=M(r,[]),n={};if(t.algo&&(n.algo=t.algo),t.pointer&&(n.pointer=t.pointer),!n.algo&&!n.pointer)throw new l("Definition must resolve to either a URL pointer or base64 algo",f.INVALID_INPUT,{context:{definition:r}});let s=await v("io",n,e);if(!s||typeof s!="object")throw new l("Invalid IO response structure",f.INVALID_INPUT,{context:{response:s,definition:r}});let o=j(s,{deep:!0});return{inputs:o.inputs,outputs:o.outputs}}async function E(r,e){N("fetchParsedDefinitionIO",e.suppressBrowserWarning??e.suppressClientSideWarning);let{inputs:t,outputs:n}=await I(r,e),{inputs:s,parseErrors:o}=V(t);return o.length>0?{inputs:s,outputs:n,parseErrors:o}:{inputs:s,outputs:n}}var G=class r{constructor(e){p(this,"innerTree");p(this,"paramName");this.paramName=e,this.innerTree={}}append(e,t){let n=r.formatPathString(e);this.innerTree[n]||(this.innerTree[n]=[]);let s=t.map(o=>({data:r.serializeValue(o)}));return this.innerTree[n].push(...s),this}appendSingle(e,t){return this.append(e,[t])}fromDataTreeDefault(e){this.innerTree={};for(let[t,n]of Object.entries(e)){if(!Array.isArray(n))continue;let s=r.parsePathString(t);this.append(s,n)}return this}appendFlat(e){let t=Array.isArray(e)?e:[e];return this.append([0],t)}flatten(){let e=[];for(let t of Object.values(this.innerTree))if(Array.isArray(t))for(let n of t)e.push(r.deserializeValue(n.data));return e}getPaths(){return Object.keys(this.innerTree)}getPath(e){let t=r.formatPathString(e),n=this.innerTree[t];if(n)return n.map(s=>r.deserializeValue(s.data))}toComputeFormat(){return{ParamName:this.paramName,InnerTree:this.innerTree}}getInnerTree(){return this.innerTree}getParamName(){return this.paramName}static fromInputParams(e){return e.filter(t=>r.hasValidValue(t.default)).map(t=>{let n=new r(t.nickname||"unnamed"),s=t.default;if(t.treeAccess&&r.isDataTreeStructure(s))n.fromDataTreeDefault(s),r.isNumericInput(t)&&n.applyNumericConstraints(t.minimum,t.maximum,t.nickname||"unnamed");else{let o=Array.isArray(s)?s:[s],a=r.processValues(o,t);n.appendFlat(a)}return n.toComputeFormat()})}static fromInputParam(e){return r.hasValidValue(e.default)?r.fromInputParams([e])[0]:void 0}static replaceTreeValue(e,t,n){let s=e.length>0&&e[0]instanceof r,o=r.buildFromValue(t,n);if(s){let c=e,d=c.findIndex(S=>S.getParamName()===t);return d!==-1?c[d]=o:c.push(o),c}let a=e,u=o.toComputeFormat(),i=a.findIndex(c=>c.ParamName===t);return i!==-1?a[i]=u:a.push(u),a}static buildFromValue(e,t){let n=new r(e);return typeof t=="object"&&t!==null&&!Array.isArray(t)&&r.isDataTreeStructure(t)?n.fromDataTreeDefault(t):n.appendFlat(t),n}static getTreeValue(e,t){let s=e.length>0&&e[0]instanceof r?r.readFromBuilders(e,t):r.readFromDataTrees(e,t);return s===null||s.length===0?null:s.length===1?s[0]:s}static readFromBuilders(e,t){let n=e.find(s=>s.getParamName()===t);return n?n.flatten():null}static readFromDataTrees(e,t){let n=e.find(a=>a.ParamName===t);if(!n?.InnerTree)return null;let s=Object.keys(n.InnerTree)[0];if(!s)return null;let o=n.InnerTree[s];return Array.isArray(o)?o.map(a=>a?.data!==void 0?r.deserializeValue(a.data):null).filter(a=>a!==null):o?.data!==void 0?[r.deserializeValue(o.data)]:o!==void 0?[o]:null}static parsePathString(e){let t=e.match(/^\{([\d;]*)\}$/);return t?t[1]===""?[]:t[1].split(";").map(Number):(m().warn(`Invalid TreeBuilder path format: ${e}, using [0]`),[0])}static formatPathString(e){return`{${e.join(";")}}`}applyNumericConstraints(e,t,n){for(let s of Object.values(this.innerTree))if(Array.isArray(s))for(let o of s){let a=r.deserializeValue(o.data);if(typeof a=="number"){let u=r.clampValue(a,e,t,n);o.data=r.serializeValue(u)}}}static serializeValue(e){return typeof e=="boolean"||typeof e=="number"||typeof e=="string"?e:typeof e=="object"&&e!==null?JSON.stringify(e):String(e)}static deserializeValue(e){if(typeof e=="boolean"||typeof e=="number"||typeof e!="string")return e;if(e.startsWith("{")||e.startsWith("["))try{return JSON.parse(e)}catch{return e}return isNaN(Number(e))?e==="true"?!0:e==="false"?!1:e:Number(e)}static hasValidValue(e){return e==null?!1:typeof e=="string"?!0:!(Array.isArray(e)&&e.length===0||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0)}static isDataTreeStructure(e){return typeof e!="object"||e===null||Array.isArray(e)?!1:Object.entries(e).every(([t,n])=>typeof t=="string"&&/^\{[\d;]+\}$/.test(t)&&Array.isArray(n))}static isNumericInput(e){return e.paramType==="Number"||e.paramType==="Integer"}static processValues(e,t){return e.map(n=>r.isNumericInput(t)&&typeof n=="number"?r.clampValue(n,t.minimum,t.maximum,t.nickname||"unnamed"):n).filter(n=>n!=null)}static clampValue(e,t,n,s){let o=e;return t!=null&&o<t&&(m().warn(`${s}: ${e} below min ${t}, clamping`),o=t),n!=null&&o>n&&(m().warn(`${s}: ${e} above max ${n}, clamping`),o=n),o}};export{R as a,b,x as c,J as d,w as e,D as f,C as g,ie as h,ue as i,I as j,E as k,G as l};
2
- //# sourceMappingURL=chunk-XIBQV4XW.js.map
1
+ import{a as W,b as $,c as z,d as q}from"./chunk-XLHA5YPH.js";import{b as p,c as f,d as l,e as m,h as v,i as U,k as j}from"./chunk-RHULSS7S.js";function L(r){let e=new WeakSet,t=n=>{if(n==null)return JSON.stringify(n);if(typeof n=="number")return Number.isFinite(n)?String(n):JSON.stringify(null);if(typeof n=="string"||typeof n=="boolean")return JSON.stringify(n);if(typeof n=="bigint")return JSON.stringify(n.toString());if(n instanceof Uint8Array){let s=n.length>64?Array.from(n.slice(0,32)).concat(Array.from(n.slice(-32))):Array.from(n);return JSON.stringify({__u8:!0,len:n.length,sample:s})}return Array.isArray(n)?`[${n.map(t).join(",")}]`:typeof n=="object"?e.has(n)?JSON.stringify("[Circular]"):(e.add(n),`{${Object.keys(n).sort().map(a=>`${JSON.stringify(a)}:${t(n[a])}`).join(",")}}`):JSON.stringify(null)};return t(r)}function _(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=e+((e<<1)+(e<<4)+(e<<7)+(e<<8)+(e<<24))>>>0;return e.toString(16).padStart(8,"0")}function R(r,e){let t=typeof r=="string"?r:L({__u8:!0,len:r.length});return _(`${t}|${L(e)}`)}var b=class{constructor(e,t,n={}){p(this,"executor");p(this,"baseConfig");p(this,"mode");p(this,"maxConcurrent");p(this,"timeoutMs");p(this,"retry");p(this,"cacheEnabled");p(this,"cacheMax");p(this,"cacheTtl");p(this,"cache",new Map);p(this,"onStart");p(this,"onSettle");p(this,"onSuperseded");p(this,"subscribers",new Set);p(this,"inFlight",new Set);p(this,"pendingForLatestWins",null);p(this,"fifoQueue",[]);p(this,"_lastResult",null);p(this,"_lastError",null);p(this,"_lastDurationMs",null);p(this,"disposed",!1);this.executor=e,this.baseConfig=t,this.mode=n.mode??"latest-wins",this.maxConcurrent=Math.max(1,n.maxConcurrent??(this.mode==="parallel"?4:1)),this.timeoutMs=n.timeoutMs,this.retry=n.retry;let s=n.cache;this.cacheEnabled=s!==void 0&&s!==!1;let o=typeof s=="object"?s:{};this.cacheMax=o.maxEntries??50,this.cacheTtl=o.ttlMs??0,this.onStart=n.onStart,this.onSettle=n.onSettle,this.onSuperseded=n.onSuperseded}get isSolving(){return this.inFlight.size>0}get hasPending(){return this.pendingForLatestWins!==null||this.fifoQueue.length>0}get inFlightCount(){return this.inFlight.size}get queueDepth(){return this.fifoQueue.length+(this.pendingForLatestWins?1:0)}get lastResult(){return this._lastResult}get lastError(){return this._lastError}get lastDurationMs(){return this._lastDurationMs}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}notify(){for(let e of this.subscribers)try{e()}catch(t){m().error("[SolveScheduler] subscriber threw:",t)}}solve(e,t,n){if(this.disposed)return Promise.reject(new l("SolveScheduler has been disposed and cannot be used",f.INVALID_STATE));let s=R(e,t),o={key:s,enqueuedAt:Date.now(),startedAt:null};if(this.cacheEnabled){let a=this.readCache(s);if(a){let u={status:"success",response:a,durationMs:0,fromCache:!0};return this._lastResult=a,this._lastError=null,this._lastDurationMs=0,this.runHook(this.onStart,o),this.runHook(this.onSettle,o,u),this.notify(),Promise.resolve(a)}}return new Promise((a,u)=>{let i={definition:e,dataTree:t,ctx:o,resolve:a,reject:u,externalSignal:n?.signal};if(i.externalSignal?.aborted){let c=this.makeAbortError(o);i.settled={error:c},u(c);return}this.enqueue(i)})}enqueue(e){switch(this.mode){case"latest-wins":{this.pendingForLatestWins&&(this.supersede(this.pendingForLatestWins),this.pendingForLatestWins=null);for(let t of this.inFlight)this.supersede(t),t.controller.abort();this.inFlight.size===0?this.execute(e):this.pendingForLatestWins=e;break}case"queue":case"parallel":{this.inFlight.size<this.maxConcurrent?this.execute(e):this.fifoQueue.push(e);break}}this.notify()}async execute(e){let t=new AbortController,n={...e,controller:t};this.inFlight.add(n),e.ctx.startedAt=Date.now();let s=()=>t.abort();e.externalSignal?.addEventListener("abort",s,{once:!0}),this.runHook(this.onStart,e.ctx),this.notify();let o=performance.now();try{let a={...this.baseConfig,signal:t.signal,...this.timeoutMs!==void 0&&{timeoutMs:this.timeoutMs},...this.retry!==void 0&&{retry:this.retry}},u=await this.executor(e.definition,e.dataTree,a),i=performance.now()-o;if(this.cacheEnabled&&this.writeCache(e.ctx.key,u),e.settled)return;e.settled={ok:!0},this._lastResult=u,this._lastError=null,this._lastDurationMs=i,e.resolve(u),this.runHook(this.onSettle,e.ctx,{status:"success",response:u,durationMs:i,fromCache:!1})}catch(a){let u=performance.now()-o,i=this.normalizeExecutionError(a,n),c=!!n.settled;this._lastError=i,this._lastDurationMs=u,c||(n.settled={error:i},e.reject(i),this.runHook(this.onSettle,e.ctx,{status:"error",error:i,durationMs:u}))}finally{e.externalSignal?.removeEventListener("abort",s),this.inFlight.delete(n),this.drainNext(),this.notify()}}drainNext(){if(!this.disposed){if(this.mode==="latest-wins"){if(this.pendingForLatestWins&&this.inFlight.size===0){let e=this.pendingForLatestWins;this.pendingForLatestWins=null,this.execute(e)}return}for(;this.fifoQueue.length>0&&this.inFlight.size<this.maxConcurrent;){let e=this.fifoQueue.shift();this.execute(e)}}}supersede(e){if(e.settled)return;let t=new l("Superseded by newer solve",f.SUPERSEDED,{context:{key:e.ctx.key,enqueuedAt:e.ctx.enqueuedAt}});e.settled={error:t},e.reject(t),this.runHook(this.onSuperseded,e.ctx)}makeAbortError(e){return new l("Request aborted by caller",f.ABORTED,{context:{key:e.key,enqueuedAt:e.enqueuedAt}})}isAbortLikeError(e){if(e instanceof Error){if(e.name==="AbortError")return!0;if(typeof DOMException<"u"&&e instanceof DOMException)return e.name==="AbortError"}return!1}normalizeExecutionError(e,t){return t.settled&&"error"in t.settled?t.settled.error:e instanceof l?e:this.isAbortLikeError(e)?this.makeAbortError(t.ctx):new l(e instanceof Error?e.message:String(e),f.UNKNOWN_ERROR,{originalError:e instanceof Error?e:new Error(String(e))})}cancelAll(){for(this.pendingForLatestWins&&(this.rejectAsAborted(this.pendingForLatestWins),this.pendingForLatestWins=null);this.fifoQueue.length>0;){let e=this.fifoQueue.shift();this.rejectAsAborted(e)}for(let e of this.inFlight){if(!e.settled){let t=this.makeAbortError(e.ctx);e.settled={error:t},e.reject(t),this.runHook(this.onSettle,e.ctx,{status:"error",error:t,durationMs:e.ctx.startedAt?performance.now()-e.ctx.startedAt:0})}e.controller.abort()}this.notify()}rejectAsAborted(e){if(e.settled)return;let t=this.makeAbortError(e.ctx);e.settled={error:t},e.reject(t)}readCache(e){if(!this.cacheEnabled)return null;let t=this.cache.get(e);return t?this.cacheTtl>0&&Date.now()-t.insertedAt>this.cacheTtl?(this.cache.delete(e),null):(this.cache.delete(e),this.cache.set(e,t),t.response):null}writeCache(e,t){if(this.cacheEnabled)for(this.cache.set(e,{response:t,insertedAt:Date.now()});this.cache.size>this.cacheMax;){let n=this.cache.keys().next().value;if(n===void 0)break;this.cache.delete(n)}}clearCache(){this.cache.clear()}dispose(){this.disposed||(this.disposed=!0,this.cancelAll(),this.subscribers.clear(),this.cache.clear())}runHook(e,...t){if(e)try{e(...t)}catch(n){m().error("[SolveScheduler] hook threw:",n)}}};var x=class r{constructor(e){p(this,"config");p(this,"serverStats");p(this,"disposed",!1);this.config=this.normalizeComputeConfig(e),this.serverStats=new U(this.config.serverUrl,this.config.apiKey)}static async create(e){let t=new r(e);if(!await t.serverStats.isServerOnline())throw new l("Rhino Compute server is not online",f.NETWORK_ERROR,{context:{serverUrl:t.config.serverUrl}});return t}getConfig(){return this.ensureNotDisposed(),{...this.config}}async getIO(e){return this.ensureNotDisposed(),E(e,this.config)}async getRawIO(e){return this.ensureNotDisposed(),I(e,this.config)}async solve(e,t,n){this.ensureNotDisposed();try{if(typeof e=="string"&&!e?.trim())throw new l("Definition URL/content is required",f.INVALID_INPUT,{context:{receivedUrl:e}});if(e instanceof Uint8Array&&e.length===0)throw new l("Definition content is empty",f.INVALID_INPUT);let s={...this.config,...n?.signal!==void 0&&{signal:n.signal},...n?.timeoutMs!==void 0&&{timeoutMs:n.timeoutMs},...n?.retry!==void 0&&{retry:n.retry}},o=await C(t,e,s);if(o?.errors&&o.errors.length>0)throw new l(o.errors.join("; ")||"Computation failed",f.COMPUTATION_ERROR,{context:{definition:typeof e=="string"&&e.length<200?e:"...content...",inputs:t,errors:o.errors,warnings:o.warnings}});return o}catch(s){throw this.config.debug&&m().error("Compute failed:",s),s instanceof l?s:new l(s instanceof Error?s.message:String(s),f.COMPUTATION_ERROR,{context:{definition:typeof e=="string"&&e.length<200?e:"...content...",inputs:t},originalError:s instanceof Error?s:new Error(String(s))})}}createScheduler(e){this.ensureNotDisposed();let t=(n,s,o)=>C(s,n,o);return new b(t,this.config,e)}async dispose(){this.disposed||(this.disposed=!0,await this.serverStats.dispose())}ensureNotDisposed(){if(this.disposed)throw new l("GrasshopperClient has been disposed and cannot be used",f.INVALID_STATE)}normalizeComputeConfig(e){if(!e.serverUrl?.trim())throw new l("serverUrl is required",f.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}});try{new URL(e.serverUrl)}catch{throw new l("serverUrl must be a valid URL",f.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}})}if(e.serverUrl===""||e.serverUrl==="https://compute.rhino3d.com/")throw new l("serverUrl must be set to your Compute server URL. The default public endpoint is not allowed.",f.INVALID_CONFIG,{context:{receivedServerUrl:e.serverUrl}});return{...e,serverUrl:e.serverUrl.replace(/\/+$/,""),apiKey:e.apiKey,authToken:e.authToken,debug:e.debug??!1,suppressBrowserWarning:e.suppressBrowserWarning??e.suppressClientSideWarning}}};var J=async(r,e=null)=>{try{return await H(r,e)}catch(t){throw new l("Failed to extract files from compute response",f.INVALID_STATE,{context:{originalError:t instanceof Error?t.message:String(t)},originalError:t instanceof Error?t:void 0})}},w=async(r,e,t=null)=>{if(typeof document>"u"||typeof Blob>"u")throw new l("File download functionality is only available in browser environments. This function requires the DOM API (document, Blob).",f.BROWSER_ONLY,{context:{environment:typeof window<"u"?"browser (SSR)":"Node.js",documentAvailable:typeof document<"u",blobAvailable:typeof Blob<"u"}});try{let n=await H(r,t);await le(n,e)}catch(n){throw n instanceof l?n:new l("Failed to download files from compute response",f.INVALID_STATE,{context:{originalError:n instanceof Error?n.message:String(n)},originalError:n instanceof Error?n:void 0})}},H=async(r,e)=>{let t=[];if(r.forEach(n=>{let s=`${n.fileName}${n.fileType}`;if(n.subFolder&&n.subFolder.trim()!==""&&(s=`${n.subFolder}/${s}`),n.isBase64Encoded===!0&&n.data){let o=z(n.data);t.push({fileName:`${n.fileName}${n.fileType}`,content:new Uint8Array(o.buffer),path:s})}else n.isBase64Encoded===!1&&n.data&&t.push({fileName:`${n.fileName}${n.fileType}`,content:n.data,path:s})}),e){let n=Array.isArray(e)?e:[e],s=await Promise.all(n.map(async o=>{try{let a=await fetch(o.filePath);if(!a.ok)return m().warn(`Failed to fetch additional file from URL: ${o.filePath}`),null;let i=await(await a.blob()).arrayBuffer();return{fileName:o.fileName,content:new Uint8Array(i),path:o.fileName}}catch(a){return m().error(`Error fetching additional file from URL: ${o.filePath}`,a),null}}));t.push(...s.filter(o=>o!==null))}return t};async function le(r,e){let{zipSync:t,strToU8:n}=await import("fflate"),s={};r.forEach(u=>{s[u.path]=typeof u.content=="string"?n(u.content):u.content});let o=t(s,{level:6}),a=new Blob([o],{type:"application/zip"});pe(a,`${e}.zip`)}function pe(r,e){if(typeof document>"u")throw new l("saveFile requires a browser environment with DOM API access.",f.BROWSER_ONLY,{context:{function:"saveFile",requiredAPI:"document"}});let t=document.createElement("a");t.href=URL.createObjectURL(r),t.download=e,t.click(),URL.revokeObjectURL(t.href)}var A=new Map;function K(r,e){A.set(r,e)}K("Rhino.Geometry.Point3d",(r,e)=>{let t=e;return!t||typeof t.X!="number"?null:new r.Point([t.X,t.Y,t.Z])});K("Rhino.Geometry.Line",(r,e)=>{let t=e;return!t||!t.From||!t.To?null:new r.Line([t.From.X,t.From.Y,t.From.Z],[t.To.X,t.To.Y,t.To.Z])});function ce(r){if(A.has(r))return A.get(r);for(let[e,t]of A)if(r.startsWith(e))return t}function fe(r){return!r||typeof r!="object"?null:r.data??r.value??null}function Y(r,e,t){let n=ce(e);if(n)try{return n(t,r)}catch(s){m().warn(`Failed to decode Rhino type ${e}:`,s)}try{let s=fe(r);if(s)return t.CommonObject.decode(s)}catch(s){return m().warn(`Failed to decode ${e} with CommonObject:`,s),{__decodeError:!0,type:e,raw:r}}return r}var T={STRING:"System.String",INT:"System.Int32",DOUBLE:"System.Double",BOOL:"System.Boolean"},me="Rhino.Geometry.",de=["WebDisplay"],he="FileData";function Q(r){return de.some(e=>r.includes(e))}function X(r){if(typeof r!="string")return r;let e=r.trim();if(!(e.startsWith("{")||e.startsWith("[")||e.startsWith('"')))return r;try{let n=JSON.parse(e);if(typeof n=="string")try{return JSON.parse(n)}catch{return n}return n}catch{return r}}function ye(r,e,t){switch(e){case T.STRING:return typeof r!="string"?r:r.replace(/^"(.*)"$/,"$1");case T.INT:return Number.parseInt(r,10);case T.DOUBLE:return Number.parseFloat(r);case T.BOOL:return String(r).toLowerCase()==="true";default:return t&&e.startsWith(me)?Y(r,e,t):r}}function Z(r,e,t,n){if(typeof r!="string")return r;let s=t?X(r):r;return ye(s,e,n)}function ge(r){if(!r||typeof r!="object")return!1;let e=r;return typeof e.fileName=="string"&&typeof e.fileType=="string"&&"data"in e&&typeof e.isBase64Encoded=="boolean"&&typeof e.subFolder=="string"}function F(r,e){for(let t of Object.values(r))if(Array.isArray(t))for(let n of t)e(n)}function ee(r,e=!1,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a={};for(let u of r.values)F(u.InnerTree,i=>{if(Q(i.type)||o&&i.type!==T.STRING)return;let c=e?i.id:u.ParamName;if(!c)return;let d=Z(i.data,i.type,n,s);a[c]===void 0?a[c]=d:Array.isArray(a[c])?a[c].push(d):a[c]=[a[c],d]});return{values:a}}function re(r){let e=[];for(let t of r.values)F(t.InnerTree,n=>{if(!n.type.includes(he))return;let s=X(n.data);ge(s)&&e.push(s)});return e}function O(r,e,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a;if("byName"in e?a=r.values.find(i=>i.ParamName===e.byName):a=r.values.find(i=>{let c=!1;return F(i.InnerTree,d=>{d.id===e.byId&&(c=!0)}),c}),!a)return;let u=[];if(F(a.InnerTree,i=>{if("byId"in e&&i.id!==e.byId||Q(i.type)||o&&i.type!==T.STRING)return;let c=Z(i.data,i.type,n,s);u.push(c)}),u.length!==0)return u.length===1?u[0]:u}var D=class{constructor(e,t=!1){this.response=e;this.debug=t}getValues(e=!1,t={}){return ee(this.response,e,t)}getValue(e,t){return O(this.response,e,t)}getValueByParamName(e,t){return O(this.response,{byName:e},t)}getValueByParamId(e,t){return O(this.response,{byId:e},t)}async extractMeshesFromResponse(e){let t={debug:this.debug,...e},n;try{({getThreeMeshesFromComputeResponse:n}=await import("./visualization-S47O7BLV.js"))}catch(s){throw new l("Failed to load three.js visualization module. Ensure three.js is installed as a peer dependency.",f.INVALID_STATE,{context:{originalError:s instanceof Error?s.message:String(s)}})}return n(this.response,t)}getFileData(){return re(this.response)}getAndDownloadFiles(e,t){let n=this.getFileData();w(n,e,t)}};function N(r,e){e||typeof window<"u"&&m().warn(`Warning: ${r} is running on the client side. For better performance and security, consider running this on the server side.`)}async function C(r,e,t){t.debug&&N("solveGrasshopperDefinition",t.suppressBrowserWarning??t.suppressClientSideWarning);let n=M(e,r);be(n,t);let s=await v("grasshopper",n,t);if("pointer"in s){let{pointer:o,...a}=s;return a}return s}function M(r,e){let t={algo:null,pointer:null,values:e};return r instanceof Uint8Array?t.algo=q(r):/^https?:\/\//i.test(r)?t.pointer=r:$(r)?t.algo=r:t.algo=W(r),t}function be(r,e){e.cachesolve!=null&&(r.cachesolve=e.cachesolve),e.modelunits!=null&&(r.modelunits=e.modelunits),e.angletolerance!=null&&(r.angletolerance=e.angletolerance),e.absolutetolerance!=null&&(r.absolutetolerance=e.absolutetolerance),e.dataversion!=null&&(r.dataversion=e.dataversion)}function te(r){if(typeof r.default!="object"||r.default===null)return;if(!("innerTree"in r.default)){m().warn("Unexpected structure in input.default:",r.default),r.default=null;return}let e=r.default.innerTree;if(Object.keys(e).length===0){r.default=void 0;return}if(r.treeAccess||r.atMost&&r.atMost>1){let n={};for(let[s,o]of Object.entries(e))n[s]=o.map(a=>{if(typeof a.data=="string"){if(a.type==="System.Double"||a.type==="System.Int32"){let u=Number(a.data);return Number.isNaN(u)?a.data:u}if(a.type==="System.Boolean")return a.data.toLowerCase()==="true";if(a.type.startsWith("Rhino.Geometry")||a.type==="System.String")try{return JSON.parse(a.data)}catch{return a.data}}return a.data});r.default=n;return}let t=[];for(let n of Object.values(e))Array.isArray(n)&&n.forEach(s=>{s&&typeof s=="object"&&"data"in s&&t.push(s.data)});t.length===0?r.default=void 0:t.length===1?r.default=t[0]:r.default=t}function P(r,e){let{transform:t,setUndefinedOnEmpty:n=!0}=e;if(!(r.default===void 0||r.default===null))if(Array.isArray(r.default)){let s=r.default.map(t).filter(o=>o!==null);r.default=s.length>0?s:void 0}else{let s=t(r.default);s!==null?r.default=s:n&&(r.default=void 0)}}function Te(){return r=>{if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r.trim());return Number.isNaN(e)?null:e}return null}}function Se(){return r=>{if(typeof r=="boolean")return r;if(typeof r=="string"){let e=r.toLowerCase();if(e==="true")return!0;if(e==="false")return!1;throw new Error(`Invalid boolean string: "${r}"`)}return null}}function xe(){return r=>typeof r=="string"?r.startsWith('"')&&r.endsWith('"')||r.startsWith('"')?r.slice(1,-1):r:null}function Ce(){return r=>{if(typeof r=="string"){let e=r.trim();return e.startsWith('"')&&e.endsWith('"')&&(e=e.slice(1,-1).trim()),e}return null}}function Ie(r){P(r,{transform:Ce(),setUndefinedOnEmpty:!1})}function De(r="unknown"){return e=>{if(typeof e=="object"&&e!==null)return e;if(typeof e=="string"&&e.trim()!=="")try{let t=JSON.parse(e);return typeof t=="object"&&t!==null?t:(m().warn(`Parsed value for input ${r} is not an object`),null)}catch(t){return m().warn(`Failed to parse object value "${e}" for input ${r}`,t),null}return null}}function ne(r,e,t){let n=Number(r.toFixed(e));return Math.abs(r-n)<t?n:r}function Pe(r,e=1e-8){if(!Number.isFinite(r)||r===0)return .1;let t=Math.abs(r);if(t>=1){let h=String(r).split(".")[1];if(h&&h.length>0){let y=Math.min(h.length,12),g=Math.pow(10,-y),B=Number(g.toFixed(y));return Math.abs(B-g)<e?B:g}return 1}let n=String(r),s=n.toLowerCase().match(/e(-?\d+)/);if(s){let S=Number(s[1]);if(S<0||n.toLowerCase().includes("e-")){let h=Math.abs(S),y=Math.pow(10,-h),g=Number(y.toFixed(h));return Math.abs(g-y)<e?g:y}return .1}let o=12,u=t.toFixed(o).replace(/0+$/,""),i=Math.min((u.split(".")[1]||"").length,o);if(i===0)return .1;let c=Math.pow(10,-i),d=Number(c.toFixed(i));return Math.abs(d-c)<e?d:c}function se(r,e=1e-8){let t=r.paramType==="Integer";if(P(r,{transform:Te()}),t){Array.isArray(r.default)?r.default=r.default.map(o=>typeof o=="number"?Math.round(o):o):typeof r.default=="number"&&(r.default=Math.round(r.default)),r.stepSize=1;return}let n=Array.isArray(r.default)?r.default[0]:r.default,s;if(typeof n=="number"&&Number.isFinite(n)&&n!==0?s=n:typeof r.minimum=="number"&&Number.isFinite(r.minimum)&&r.minimum!==0?s=r.minimum:typeof r.maximum=="number"&&Number.isFinite(r.maximum)&&r.maximum!==0&&(s=r.maximum),s!==void 0?r.stepSize=Pe(s,e):r.stepSize=.1,typeof r.stepSize=="number"){let o=0,a=String(r.stepSize),u=a.toLowerCase().match(/e(-?\d+)/);if(u?o=Math.abs(Number(u[1])):o=a.split(".")[1]?.length??0,o===0&&typeof n=="number"&&n!==0&&Math.abs(n)<1){let i=Math.ceil(-Math.log10(Math.abs(n)));Number.isFinite(i)&&i>0&&(o=i)}o=Math.min(Math.max(o,0),12),Array.isArray(r.default)?r.default=r.default.map(i=>typeof i=="number"?ne(i,o,e):i):typeof r.default=="number"&&(r.default=ne(r.default,o,e))}}function ve(r){try{P(r,{transform:Se(),setUndefinedOnEmpty:!1})}catch(e){throw e instanceof Error?new l(e.message):e}}function Re(r){P(r,{transform:xe(),setUndefinedOnEmpty:!1})}function oe(r){P(r,{transform:De(r.nickname||"unnamed"),setUndefinedOnEmpty:!0})}function Ee(r){if(!r.values||typeof r.values!="object"||Object.keys(r.values).length===0)throw l.missingValues(r.nickname||"unnamed","ValueList");if(r.default!==void 0&&r.default!==null){let e=String(r.default).toLowerCase();Object.keys(r.values).some(n=>n.toLowerCase()===e)||m().warn(`ValueList input "${r.nickname||"unnamed"}" default value "${r.default}" is not in available values`)}}var ae={Number:se,Integer:se,Boolean:ve,Text:Re,ValueList:Ee,Geometry:oe,File:oe,Color:Ie};function we(r,e){let t=(r.atMost??1)>1;switch(r.paramType){case"Number":case"Integer":return{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,default:t?[0]:0};case"Boolean":return{...e,paramType:"Boolean",default:t?[!1]:!1};case"Text":return{...e,paramType:"Text",default:t?[""]:""};case"ValueList":return{...e,paramType:"ValueList",values:r.values??{},default:t?[r.default]:r.default};case"File":return{...e,paramType:"File",default:t?[null]:null};case"Color":return{...e,paramType:"Color",default:t?["0, 0, 0"]:"0, 0, 0"};default:return{...e,paramType:"Geometry",default:t?[null]:null}}}function ie(r){return k(r).input}function k(r){let e={description:r.description,name:r.name,nickname:r.nickname,treeAccess:r.treeAccess,groupName:r.groupName??"",id:r.id};try{te(r);let t=ae[r.paramType];if(!t)throw l.unknownParamType(r.paramType,r.name);switch(t(r),r.paramType){case"Number":case"Integer":return{input:{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,stepSize:r.stepSize,default:r.default}};case"Boolean":return{input:{...e,paramType:"Boolean",default:r.default}};case"Text":return{input:{...e,paramType:"Text",default:r.default}};case"ValueList":return{input:{...e,paramType:"ValueList",values:r.values,default:r.default}};case"Geometry":return{input:{...e,paramType:r.paramType,default:r.default}};case"File":return{input:{...e,paramType:r.paramType,acceptedFormats:r.acceptedFormats,default:r.default}};case"Color":return{input:{...e,paramType:"Color",default:r.default}};default:throw l.unknownParamType(r.paramType,r.name)}}catch(t){if(t instanceof l)return m().error(`Validation error for input ${r.name||"unknown"}:`,t.message),{input:we(r,e),error:{inputName:r.name||"unknown",paramType:r.paramType,message:t.message,code:t.code}};throw new l(t instanceof Error?t.message:String(t),"VALIDATION_ERROR",{context:{paramName:r.name,paramType:r.paramType},originalError:t instanceof Error?t:new Error(String(t))})}}function ue(r){return V(r).inputs}function V(r){let e=[],t=[];for(let n of r){let{input:s,error:o}=k(n);e.push(s),o&&t.push(o)}return{inputs:e,parseErrors:t}}async function I(r,e){let t=M(r,[]),n={};if(t.algo&&(n.algo=t.algo),t.pointer&&(n.pointer=t.pointer),!n.algo&&!n.pointer)throw new l("Definition must resolve to either a URL pointer or base64 algo",f.INVALID_INPUT,{context:{definition:r}});let s=await v("io",n,e);if(!s||typeof s!="object")throw new l("Invalid IO response structure",f.INVALID_INPUT,{context:{response:s,definition:r}});let o=j(s,{deep:!0});return{inputs:o.inputs,outputs:o.outputs}}async function E(r,e){N("fetchParsedDefinitionIO",e.suppressBrowserWarning??e.suppressClientSideWarning);let{inputs:t,outputs:n}=await I(r,e),{inputs:s,parseErrors:o}=V(t);return o.length>0?{inputs:s,outputs:n,parseErrors:o}:{inputs:s,outputs:n}}var G=class r{constructor(e){p(this,"innerTree");p(this,"paramName");this.paramName=e,this.innerTree={}}append(e,t){let n=r.formatPathString(e);this.innerTree[n]||(this.innerTree[n]=[]);let s=t.map(o=>({data:r.serializeValue(o)}));return this.innerTree[n].push(...s),this}appendSingle(e,t){return this.append(e,[t])}fromDataTreeDefault(e){this.innerTree={};for(let[t,n]of Object.entries(e)){if(!Array.isArray(n))continue;let s=r.parsePathString(t);this.append(s,n)}return this}appendFlat(e){let t=Array.isArray(e)?e:[e];return this.append([0],t)}flatten(){let e=[];for(let t of Object.values(this.innerTree))if(Array.isArray(t))for(let n of t)e.push(r.deserializeValue(n.data));return e}getPaths(){return Object.keys(this.innerTree)}getPath(e){let t=r.formatPathString(e),n=this.innerTree[t];if(n)return n.map(s=>r.deserializeValue(s.data))}toComputeFormat(){return{ParamName:this.paramName,InnerTree:this.innerTree}}getInnerTree(){return this.innerTree}getParamName(){return this.paramName}static fromInputParams(e){return e.filter(t=>r.hasValidValue(t.default)).map(t=>{let n=new r(t.nickname||"unnamed"),s=t.default;if(t.treeAccess&&r.isDataTreeStructure(s))n.fromDataTreeDefault(s),r.isNumericInput(t)&&n.applyNumericConstraints(t.minimum,t.maximum,t.nickname||"unnamed");else{let o=Array.isArray(s)?s:[s],a=r.processValues(o,t);n.appendFlat(a)}return n.toComputeFormat()})}static fromInputParam(e){return r.hasValidValue(e.default)?r.fromInputParams([e])[0]:void 0}static replaceTreeValue(e,t,n){let s=e.length>0&&e[0]instanceof r,o=r.buildFromValue(t,n);if(s){let c=e,d=c.findIndex(S=>S.getParamName()===t);return d!==-1?c[d]=o:c.push(o),c}let a=e,u=o.toComputeFormat(),i=a.findIndex(c=>c.ParamName===t);return i!==-1?a[i]=u:a.push(u),a}static buildFromValue(e,t){let n=new r(e);return typeof t=="object"&&t!==null&&!Array.isArray(t)&&r.isDataTreeStructure(t)?n.fromDataTreeDefault(t):n.appendFlat(t),n}static getTreeValue(e,t){let s=e.length>0&&e[0]instanceof r?r.readFromBuilders(e,t):r.readFromDataTrees(e,t);return s===null||s.length===0?null:s.length===1?s[0]:s}static readFromBuilders(e,t){let n=e.find(s=>s.getParamName()===t);return n?n.flatten():null}static readFromDataTrees(e,t){let n=e.find(a=>a.ParamName===t);if(!n?.InnerTree)return null;let s=Object.keys(n.InnerTree)[0];if(!s)return null;let o=n.InnerTree[s];return Array.isArray(o)?o.map(a=>a?.data!==void 0?r.deserializeValue(a.data):null).filter(a=>a!==null):o?.data!==void 0?[r.deserializeValue(o.data)]:o!==void 0?[o]:null}static parsePathString(e){let t=e.match(/^\{([\d;]*)\}$/);return t?t[1]===""?[]:t[1].split(";").map(Number):(m().warn(`Invalid TreeBuilder path format: ${e}, using [0]`),[0])}static formatPathString(e){return`{${e.join(";")}}`}applyNumericConstraints(e,t,n){for(let s of Object.values(this.innerTree))if(Array.isArray(s))for(let o of s){let a=r.deserializeValue(o.data);if(typeof a=="number"){let u=r.clampValue(a,e,t,n);o.data=r.serializeValue(u)}}}static serializeValue(e){return typeof e=="boolean"||typeof e=="number"||typeof e=="string"?e:typeof e=="object"&&e!==null?JSON.stringify(e):String(e)}static deserializeValue(e){if(typeof e=="boolean"||typeof e=="number"||typeof e!="string")return e;if(e.startsWith("{")||e.startsWith("["))try{return JSON.parse(e)}catch{return e}return isNaN(Number(e))?e==="true"?!0:e==="false"?!1:e:Number(e)}static hasValidValue(e){return e==null?!1:typeof e=="string"?!0:!(Array.isArray(e)&&e.length===0||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0)}static isDataTreeStructure(e){return typeof e!="object"||e===null||Array.isArray(e)?!1:Object.entries(e).every(([t,n])=>typeof t=="string"&&/^\{[\d;]+\}$/.test(t)&&Array.isArray(n))}static isNumericInput(e){return e.paramType==="Number"||e.paramType==="Integer"}static processValues(e,t){return e.map(n=>r.isNumericInput(t)&&typeof n=="number"?r.clampValue(n,t.minimum,t.maximum,t.nickname||"unnamed"):n).filter(n=>n!=null)}static clampValue(e,t,n,s){let o=e;return t!=null&&o<t&&(m().warn(`${s}: ${e} below min ${t}, clamping`),o=t),n!=null&&o>n&&(m().warn(`${s}: ${e} above max ${n}, clamping`),o=n),o}};export{R as a,b,x as c,J as d,w as e,D as f,C as g,ie as h,ue as i,I as j,E as k,G as l};
2
+ //# sourceMappingURL=chunk-R7E2XNH4.js.map
package/dist/core.d.cts CHANGED
@@ -1,5 +1,6 @@
1
- import { C as ComputeConfig, g as GrasshopperComputeConfig, h as GrasshopperComputeResponse, q as IoResponseSchema } from './errors-CiA83qw2.cjs';
2
- export { a as ComputeServerStats, E as ErrorCode, f as ErrorCodes, R as RetryPolicy, o as RhinoComputeError, p as RhinoModelUnit } from './errors-CiA83qw2.cjs';
1
+ import { C as ComputeConfig, e as GrasshopperComputeConfig, f as GrasshopperComputeResponse, n as IoResponseSchema } from './types-Dfeei0dD.cjs';
2
+ export { R as RetryPolicy, m as RhinoModelUnit } from './types-Dfeei0dD.cjs';
3
+ export { C as ComputeServerStats, E as ErrorCode, a as ErrorCodes, R as RhinoComputeError } from './errors-CEy4nM1J.cjs';
3
4
 
4
5
  /**
5
6
  * Valid endpoints for Rhino Compute (improved response type handling).
package/dist/core.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { C as ComputeConfig, g as GrasshopperComputeConfig, h as GrasshopperComputeResponse, q as IoResponseSchema } from './errors-CiA83qw2.js';
2
- export { a as ComputeServerStats, E as ErrorCode, f as ErrorCodes, R as RetryPolicy, o as RhinoComputeError, p as RhinoModelUnit } from './errors-CiA83qw2.js';
1
+ import { C as ComputeConfig, e as GrasshopperComputeConfig, f as GrasshopperComputeResponse, n as IoResponseSchema } from './types-Dfeei0dD.js';
2
+ export { R as RetryPolicy, m as RhinoModelUnit } from './types-Dfeei0dD.js';
3
+ export { C as ComputeServerStats, E as ErrorCode, a as ErrorCodes, R as RhinoComputeError } from './errors-CEy4nM1J.js';
3
4
 
4
5
  /**
5
6
  * Valid endpoints for Rhino Compute (improved response type handling).
@@ -0,0 +1,149 @@
1
+ /**
2
+ * ComputeServerStats provides methods to query Rhino Compute server statistics.
3
+ *
4
+ * @public Use this for server health monitoring and statistics.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * const stats = new ComputeServerStats('http://localhost:6500', 'your-api-key');
9
+ *
10
+ * try {
11
+ * const isOnline = await stats.isServerOnline();
12
+ * const children = await stats.getActiveChildren();
13
+ * const version = await stats.getVersion();
14
+ *
15
+ * // Or get everything at once
16
+ * const allStats = await stats.getServerStats();
17
+ * } finally {
18
+ * await stats.dispose(); // Clean up resources
19
+ * }
20
+ * ```
21
+ */
22
+ declare class ComputeServerStats {
23
+ private readonly serverUrl;
24
+ private readonly apiKey?;
25
+ private disposed;
26
+ private activeMonitors;
27
+ private activeTimeouts;
28
+ /**
29
+ * @param serverUrl - Base URL of the Rhino Compute server with http:// or https:// scheme (e.g., 'http://localhost:6500')
30
+ * @param apiKey - Optional API key for authentication
31
+ */
32
+ constructor(serverUrl: string, apiKey?: string);
33
+ /**
34
+ * Build request headers with optional API key.
35
+ */
36
+ private buildHeaders;
37
+ /**
38
+ * Check if the server is online.
39
+ */
40
+ isServerOnline(): Promise<boolean>;
41
+ /**
42
+ * Get the number of active child processes on the server.
43
+ *
44
+ * @returns Number of active children, or null if unavailable
45
+ */
46
+ getActiveChildren(): Promise<number | null>;
47
+ /**
48
+ * Get the server version information.
49
+ *
50
+ * @returns Version object with rhino, compute, and git_sha, or null if unavailable
51
+ */
52
+ getVersion(): Promise<{
53
+ rhino: string;
54
+ compute: string;
55
+ git_sha: string | null;
56
+ } | null>;
57
+ /**
58
+ * Get comprehensive server statistics.
59
+ * Fetches all available server information in parallel.
60
+ *
61
+ * @returns Object containing server status and available stats
62
+ */
63
+ getServerStats(): Promise<{
64
+ isOnline: boolean;
65
+ version?: {
66
+ rhino: string;
67
+ compute: string;
68
+ git_sha: string | null;
69
+ };
70
+ activeChildren?: number;
71
+ }>;
72
+ /**
73
+ * Continuously monitor server stats at specified interval.
74
+ *
75
+ * @param callback - Function called with stats on each interval
76
+ * @param intervalMs - Milliseconds between checks (default: 5000)
77
+ * @returns Function to stop monitoring
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const stopMonitoring = stats.monitor((data) => {
82
+ * console.log('Server stats:', data);
83
+ * }, 3000);
84
+ *
85
+ * // Later...
86
+ * stopMonitoring();
87
+ * ```
88
+ */
89
+ monitor(callback: (stats: Awaited<ReturnType<typeof this.getServerStats>>) => void, intervalMs?: number): () => void;
90
+ /**
91
+ * Disposes of all resources and stops all active monitors.
92
+ * Call this when you're done using the stats instance.
93
+ */
94
+ dispose(): Promise<void>;
95
+ /**
96
+ * Ensures the instance hasn't been disposed.
97
+ */
98
+ private ensureNotDisposed;
99
+ }
100
+
101
+ /**
102
+ * Error types and codes for `@selvajs/compute`.
103
+ */
104
+ declare const ErrorCodes: {
105
+ readonly NETWORK_ERROR: "NETWORK_ERROR";
106
+ readonly AUTH_ERROR: "AUTH_ERROR";
107
+ readonly VALIDATION_ERROR: "VALIDATION_ERROR";
108
+ readonly COMPUTATION_ERROR: "COMPUTATION_ERROR";
109
+ readonly TIMEOUT_ERROR: "TIMEOUT_ERROR";
110
+ readonly CORS_ERROR: "CORS_ERROR";
111
+ readonly UNKNOWN_ERROR: "UNKNOWN_ERROR";
112
+ readonly INVALID_STATE: "INVALID_STATE";
113
+ readonly INVALID_INPUT: "INVALID_INPUT";
114
+ readonly INVALID_CONFIG: "INVALID_CONFIG";
115
+ readonly BROWSER_ONLY: "BROWSER_ONLY";
116
+ readonly ENVIRONMENT_ERROR: "ENVIRONMENT_ERROR";
117
+ readonly ENCODING_ERROR: "ENCODING_ERROR";
118
+ /** Scheduler latest-wins: this call was replaced by a newer one. */
119
+ readonly SUPERSEDED: "SUPERSEDED";
120
+ /** Scheduler / caller-supplied AbortSignal: this call was aborted. */
121
+ readonly ABORTED: "ABORTED";
122
+ };
123
+ type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
124
+ /**
125
+ * Simplified error for Rhino Compute operations
126
+ *
127
+ * @public Use this for error handling with error codes and context.
128
+ */
129
+ declare class RhinoComputeError extends Error {
130
+ readonly code: string;
131
+ readonly statusCode?: number;
132
+ readonly context?: Record<string, unknown>;
133
+ readonly originalError?: Error;
134
+ constructor(message: string, code?: string, options?: {
135
+ statusCode?: number;
136
+ context?: Record<string, unknown>;
137
+ originalError?: Error;
138
+ });
139
+ /**
140
+ * Create an error for missing/empty values
141
+ */
142
+ static missingValues(inputName: string, expectedType?: string, context?: Record<string, unknown>): RhinoComputeError;
143
+ /**
144
+ * Create an error for unknown parameter type
145
+ */
146
+ static unknownParamType(paramType: string, paramName?: string, context?: Record<string, unknown>): RhinoComputeError;
147
+ }
148
+
149
+ export { ComputeServerStats as C, type ErrorCode as E, RhinoComputeError as R, ErrorCodes as a };
@@ -0,0 +1,149 @@
1
+ /**
2
+ * ComputeServerStats provides methods to query Rhino Compute server statistics.
3
+ *
4
+ * @public Use this for server health monitoring and statistics.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * const stats = new ComputeServerStats('http://localhost:6500', 'your-api-key');
9
+ *
10
+ * try {
11
+ * const isOnline = await stats.isServerOnline();
12
+ * const children = await stats.getActiveChildren();
13
+ * const version = await stats.getVersion();
14
+ *
15
+ * // Or get everything at once
16
+ * const allStats = await stats.getServerStats();
17
+ * } finally {
18
+ * await stats.dispose(); // Clean up resources
19
+ * }
20
+ * ```
21
+ */
22
+ declare class ComputeServerStats {
23
+ private readonly serverUrl;
24
+ private readonly apiKey?;
25
+ private disposed;
26
+ private activeMonitors;
27
+ private activeTimeouts;
28
+ /**
29
+ * @param serverUrl - Base URL of the Rhino Compute server with http:// or https:// scheme (e.g., 'http://localhost:6500')
30
+ * @param apiKey - Optional API key for authentication
31
+ */
32
+ constructor(serverUrl: string, apiKey?: string);
33
+ /**
34
+ * Build request headers with optional API key.
35
+ */
36
+ private buildHeaders;
37
+ /**
38
+ * Check if the server is online.
39
+ */
40
+ isServerOnline(): Promise<boolean>;
41
+ /**
42
+ * Get the number of active child processes on the server.
43
+ *
44
+ * @returns Number of active children, or null if unavailable
45
+ */
46
+ getActiveChildren(): Promise<number | null>;
47
+ /**
48
+ * Get the server version information.
49
+ *
50
+ * @returns Version object with rhino, compute, and git_sha, or null if unavailable
51
+ */
52
+ getVersion(): Promise<{
53
+ rhino: string;
54
+ compute: string;
55
+ git_sha: string | null;
56
+ } | null>;
57
+ /**
58
+ * Get comprehensive server statistics.
59
+ * Fetches all available server information in parallel.
60
+ *
61
+ * @returns Object containing server status and available stats
62
+ */
63
+ getServerStats(): Promise<{
64
+ isOnline: boolean;
65
+ version?: {
66
+ rhino: string;
67
+ compute: string;
68
+ git_sha: string | null;
69
+ };
70
+ activeChildren?: number;
71
+ }>;
72
+ /**
73
+ * Continuously monitor server stats at specified interval.
74
+ *
75
+ * @param callback - Function called with stats on each interval
76
+ * @param intervalMs - Milliseconds between checks (default: 5000)
77
+ * @returns Function to stop monitoring
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const stopMonitoring = stats.monitor((data) => {
82
+ * console.log('Server stats:', data);
83
+ * }, 3000);
84
+ *
85
+ * // Later...
86
+ * stopMonitoring();
87
+ * ```
88
+ */
89
+ monitor(callback: (stats: Awaited<ReturnType<typeof this.getServerStats>>) => void, intervalMs?: number): () => void;
90
+ /**
91
+ * Disposes of all resources and stops all active monitors.
92
+ * Call this when you're done using the stats instance.
93
+ */
94
+ dispose(): Promise<void>;
95
+ /**
96
+ * Ensures the instance hasn't been disposed.
97
+ */
98
+ private ensureNotDisposed;
99
+ }
100
+
101
+ /**
102
+ * Error types and codes for `@selvajs/compute`.
103
+ */
104
+ declare const ErrorCodes: {
105
+ readonly NETWORK_ERROR: "NETWORK_ERROR";
106
+ readonly AUTH_ERROR: "AUTH_ERROR";
107
+ readonly VALIDATION_ERROR: "VALIDATION_ERROR";
108
+ readonly COMPUTATION_ERROR: "COMPUTATION_ERROR";
109
+ readonly TIMEOUT_ERROR: "TIMEOUT_ERROR";
110
+ readonly CORS_ERROR: "CORS_ERROR";
111
+ readonly UNKNOWN_ERROR: "UNKNOWN_ERROR";
112
+ readonly INVALID_STATE: "INVALID_STATE";
113
+ readonly INVALID_INPUT: "INVALID_INPUT";
114
+ readonly INVALID_CONFIG: "INVALID_CONFIG";
115
+ readonly BROWSER_ONLY: "BROWSER_ONLY";
116
+ readonly ENVIRONMENT_ERROR: "ENVIRONMENT_ERROR";
117
+ readonly ENCODING_ERROR: "ENCODING_ERROR";
118
+ /** Scheduler latest-wins: this call was replaced by a newer one. */
119
+ readonly SUPERSEDED: "SUPERSEDED";
120
+ /** Scheduler / caller-supplied AbortSignal: this call was aborted. */
121
+ readonly ABORTED: "ABORTED";
122
+ };
123
+ type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
124
+ /**
125
+ * Simplified error for Rhino Compute operations
126
+ *
127
+ * @public Use this for error handling with error codes and context.
128
+ */
129
+ declare class RhinoComputeError extends Error {
130
+ readonly code: string;
131
+ readonly statusCode?: number;
132
+ readonly context?: Record<string, unknown>;
133
+ readonly originalError?: Error;
134
+ constructor(message: string, code?: string, options?: {
135
+ statusCode?: number;
136
+ context?: Record<string, unknown>;
137
+ originalError?: Error;
138
+ });
139
+ /**
140
+ * Create an error for missing/empty values
141
+ */
142
+ static missingValues(inputName: string, expectedType?: string, context?: Record<string, unknown>): RhinoComputeError;
143
+ /**
144
+ * Create an error for unknown parameter type
145
+ */
146
+ static unknownParamType(paramType: string, paramName?: string, context?: Record<string, unknown>): RhinoComputeError;
147
+ }
148
+
149
+ export { ComputeServerStats as C, type ErrorCode as E, RhinoComputeError as R, ErrorCodes as a };
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk2D74PNQUcjs = require('./chunk-2D74PNQU.cjs');require('./chunk-MZGKJZVP.cjs');var _chunkVWOEUM7Ccjs = require('./chunk-VWOEUM7C.cjs');exports.GrasshopperClient = _chunk2D74PNQUcjs.c; exports.GrasshopperResponseProcessor = _chunk2D74PNQUcjs.f; exports.RhinoComputeError = _chunkVWOEUM7Ccjs.d; exports.SolveScheduler = _chunk2D74PNQUcjs.b; exports.TreeBuilder = _chunk2D74PNQUcjs.l; exports.downloadFileData = _chunk2D74PNQUcjs.e; exports.extractFilesFromComputeResponse = _chunk2D74PNQUcjs.d; exports.fetchDefinitionIO = _chunk2D74PNQUcjs.j; exports.fetchParsedDefinitionIO = _chunk2D74PNQUcjs.k; exports.hashSolveInput = _chunk2D74PNQUcjs.a; exports.processInput = _chunk2D74PNQUcjs.h; exports.processInputs = _chunk2D74PNQUcjs.i; exports.solveGrasshopperDefinition = _chunk2D74PNQUcjs.g;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkC2VFZAMOcjs = require('./chunk-C2VFZAMO.cjs');require('./chunk-MZGKJZVP.cjs');var _chunkVWOEUM7Ccjs = require('./chunk-VWOEUM7C.cjs');exports.GrasshopperClient = _chunkC2VFZAMOcjs.c; exports.GrasshopperResponseProcessor = _chunkC2VFZAMOcjs.f; exports.RhinoComputeError = _chunkVWOEUM7Ccjs.d; exports.SolveScheduler = _chunkC2VFZAMOcjs.b; exports.TreeBuilder = _chunkC2VFZAMOcjs.l; exports.downloadFileData = _chunkC2VFZAMOcjs.e; exports.extractFilesFromComputeResponse = _chunkC2VFZAMOcjs.d; exports.fetchDefinitionIO = _chunkC2VFZAMOcjs.j; exports.fetchParsedDefinitionIO = _chunkC2VFZAMOcjs.k; exports.hashSolveInput = _chunkC2VFZAMOcjs.a; exports.processInput = _chunkC2VFZAMOcjs.h; exports.processInputs = _chunkC2VFZAMOcjs.i; exports.solveGrasshopperDefinition = _chunkC2VFZAMOcjs.g;
2
2
  //# sourceMappingURL=grasshopper.cjs.map