@selvajs/compute 2.0.0-beta.2 → 2.0.0-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.
@@ -1,2 +1,2 @@
1
- import{b as p,c as d,d as c,e as f,h as A,i as _,j as q,m as J,n as H,p as Y,r as N}from"./chunk-GTTKNF4G.js";function h(r,e){if(!r||typeof r!="object")return;let t=r;if(e in t)return t[e];let n=e.toLowerCase();for(let s of Object.keys(t))if(s.toLowerCase()===n)return t[s]}function j(r,e){if(!r||typeof r!="object")return!1;let t=r;if(e in t)return!0;let n=e.toLowerCase();return Object.keys(t).some(s=>s.toLowerCase()===n)}function T(r,e){e||typeof window<"u"&&f().warn(`Warning: ${r} is running on the client side. For better performance and security, consider running this on the server side.`)}var Ce="Unable to load grasshopper definition";function Ie(r){return r instanceof c&&r.message.includes(Ce)}function Q(r,e){if(!e)return;let t=h(r,"values");if(!Array.isArray(t)||t.length===0)return;let n=[];for(let o of t){let a=h(o,"innerTree");(!a||Object.keys(a).length===0)&&n.push(h(o,"paramName")??"<unnamed>")}if(n.length===0)return;let s=n.length===t.length?"all":`${n.length}/${t.length}`;f().warn(`Solve returned empty output(s) (${s}): ${n.join(", ")}. These parameters produced no data \u2014 check the definition's inputs and the branch feeding each.`)}async function D(r,e,t){t.debug&&T("solveGrasshopperDefinition",t.suppressBrowserWarning??t.suppressClientSideWarning);let{response:n}=await O(P(e,r),t);return n}async function X(r,e,t){return t.debug&&T("solveGrasshopperDefinitionWithCacheKey",t.suppressBrowserWarning??t.suppressClientSideWarning),O(P(e,r),t)}async function Z(r,e,t,n){n.debug&&T("solveByCacheKey",n.suppressBrowserWarning??n.suppressClientSideWarning);let s={algo:null,pointer:e,values:r};try{return{...await O(s,n),missed:!1}}catch(o){if(!Ie(o))throw o;return{...await O(P(t,r),n),missed:!0}}}async function O(r,e){Se(r,e);let t=await A("grasshopper",r,e);if("pointer"in t){let{pointer:n,...s}=t,o=s;return Q(o,e.debug),{response:o,cacheKey:typeof n=="string"?n:null}}return Q(t,e.debug),{response:t,cacheKey:null}}function P(r,e){let t={algo:null,pointer:null,values:e};return r instanceof Uint8Array?t.algo=Y(r):/^https?:\/\//i.test(r)?t.pointer=r:H(r)?t.algo=r:t.algo=J(r),t}function Se(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 ee(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 re(r,e){let t=2166136261;for(let n=0;n<r;n++)t^=e(n),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t.toString(16).padStart(8,"0")}function te(r){return re(r.length,e=>r.charCodeAt(e))}function ne(r){return re(r.length,e=>r[e])}function G(r,e){return te(`${F(r)}|${ee(e)}`)}function F(r){return typeof r=="string"?r:`u8:${r.length}:${ne(r)}`}function xe(r){return r instanceof Uint8Array?!0:!/^https?:\/\//i.test(r)}var C=class{constructor(e,t,n={},s){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,"cacheKeyExecutor");p(this,"reuseServerDefinitionCache");p(this,"serverCacheKeys",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.cacheKeyExecutor=s,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 o=n.cache;this.cacheEnabled=o!==void 0&&o!==!1;let a=typeof o=="object"?o:{};this.cacheMax=a.maxEntries??50,this.cacheTtl=a.ttlMs??0,this.reuseServerDefinitionCache=!!s&&(n.reuseServerDefinitionCache??!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){f().error("[SolveScheduler] subscriber threw:",t)}}solve(e,t,n){if(this.disposed)return Promise.reject(new c("SolveScheduler has been disposed and cannot be used",d.INVALID_STATE));let s=G(e,t),o={key:s,enqueuedAt:Date.now(),startedAt:null};if(this.cacheEnabled){let a=this.readCache(s);if(a){let i={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,i),this.notify(),Promise.resolve(a)}}return new Promise((a,i)=>{let u={definition:e,dataTree:t,ctx:o,resolve:a,reject:i,externalSignal:n?.signal};if(u.externalSignal?.aborted){this.settleError(u,this.makeAbortError(o));return}this.enqueue(u)})}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}},i=await this.runExecutor(e.definition,e.dataTree,a),u=performance.now()-o;if(this.cacheEnabled&&this.writeCache(e.ctx.key,i),!this.settleSuccess(e,i))return;this._lastResult=i,this._lastError=null,this._lastDurationMs=u,this.runHook(this.onSettle,e.ctx,{status:"success",response:i,durationMs:u,fromCache:!1})}catch(a){let i=performance.now()-o,u=this.normalizeExecutionError(a,n);this._lastError=u,this._lastDurationMs=i,this.settleError(e,u)&&this.runHook(this.onSettle,e.ctx,{status:"error",error:u,durationMs:i})}finally{e.externalSignal?.removeEventListener("abort",s),this.inFlight.delete(n),this.drainNext(),this.notify()}}async runExecutor(e,t,n){if(!this.cacheKeyExecutor||!this.reuseServerDefinitionCache||!xe(e))return this.executor(e,t,n);let s=F(e),o=this.serverCacheKeys.get(s)??null,a=await this.cacheKeyExecutor(e,t,o,n);return a.cacheKey?this.serverCacheKeys.set(s,a.cacheKey):this.serverCacheKeys.delete(s),a.response}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){let t=new c("Superseded by newer solve",d.SUPERSEDED,{context:{key:e.ctx.key,enqueuedAt:e.ctx.enqueuedAt}});this.settleError(e,t)&&this.runHook(this.onSuperseded,e.ctx)}makeAbortError(e){return new c("Request aborted by caller",d.ABORTED,{context:{key:e.key,enqueuedAt:e.enqueuedAt}})}settleError(e,t){return e.settled?!1:(e.settled={error:t},e.reject(t),!0)}settleSuccess(e,t){return e.settled?!1:(e.settled={ok:!0},e.resolve(t),!0)}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 c?e:this.isAbortLikeError(e)?this.makeAbortError(t.ctx):new c(e instanceof Error?e.message:String(e),d.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){let t=this.makeAbortError(e.ctx);this.settleError(e,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){this.settleError(e,this.makeAbortError(e.ctx))}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){f().error("[SolveScheduler] hook threw:",n)}}};var w=class r{constructor(e){p(this,"config");p(this,"serverStats");p(this,"disposed",!1);this.config=this.normalizeComputeConfig(e),this.serverStats=new q(this.config.serverUrl,this.config.apiKey)}static async create(e){let t=new r(e);if(!await t.serverStats.isServerOnline())throw new c("Rhino Compute server is not online",d.NETWORK_ERROR,{context:{serverUrl:t.config.serverUrl}});return t}getConfig(){return this.ensureNotDisposed(),{...this.config}}async getIO(e){return this.ensureNotDisposed(),V(e,this.config)}async getRawIO(e){return this.ensureNotDisposed(),R(e,this.config)}async solve(e,t,n){this.ensureNotDisposed();try{if(typeof e=="string"&&!e?.trim())throw new c("Definition URL/content is required",d.INVALID_INPUT,{context:{receivedUrl:e}});if(e instanceof Uint8Array&&e.length===0)throw new c("Definition content is empty",d.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 D(t,e,s);if(o?.errors&&o.errors.length>0)throw new c(o.errors.join("; ")||"Computation failed",d.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&&f().error("Compute failed:",s),s instanceof c?s:new c(s instanceof Error?s.message:String(s),d.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=(s,o,a)=>D(o,s,a),n=(s,o,a,i)=>a===null?X(o,s,i).then(u=>({...u,missed:!1})):Z(o,a,s,i);return new C(t,this.config,e,n)}async dispose(){this.disposed||(this.disposed=!0,await this.serverStats.dispose())}ensureNotDisposed(){if(this.disposed)throw new c("GrasshopperClient has been disposed and cannot be used",d.INVALID_STATE)}normalizeComputeConfig(e){return{...e,serverUrl:_(e.serverUrl),apiKey:e.apiKey,authToken:e.authToken,debug:e.debug??!1,suppressBrowserWarning:e.suppressBrowserWarning??e.suppressClientSideWarning}}};var k=new Map;function se(r,e){k.set(r,e)}se("Rhino.Geometry.Point3d",(r,e)=>{let t=e;return!t||typeof t.X!="number"?null:new r.Point([t.X,t.Y,t.Z])});se("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 De(r){if(k.has(r))return k.get(r);for(let[e,t]of k)if(r.startsWith(e))return t}function Pe(r){return!r||typeof r!="object"?null:r.data??r.value??null}function oe(r,e,t){let n=De(e);if(n)try{return n(t,r)}catch(s){f().warn(`Failed to decode Rhino type ${e}:`,s)}try{let s=Pe(r);if(s)return t.CommonObject.decode(s)}catch(s){return f().warn(`Failed to decode ${e} with CommonObject:`,s),{__decodeError:!0,type:e,raw:r}}return r}var I={STRING:"System.String",INT:"System.Int32",DOUBLE:"System.Double",BOOL:"System.Boolean"},we="Rhino.Geometry.",Re=["WebDisplay"],Ee="FileData";function ae(r){return Re.some(e=>r.includes(e))}function ie(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 ve(r,e,t){switch(e){case I.STRING:return typeof r!="string"?r:r.replace(/^"(.*)"$/,"$1");case I.INT:return Number.parseInt(r,10);case I.DOUBLE:return Number.parseFloat(r);case I.BOOL:return String(r).toLowerCase()==="true";default:return t&&e.startsWith(we)?oe(r,e,t):r}}function ue(r,e,t,n){if(typeof r!="string")return r;let s=t?ie(r):r;return ve(s,e,n)}function Ae(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 M(r,e){for(let t of Object.values(r))if(Array.isArray(t))for(let n of t)e(n)}function pe(r,e=!1,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a={};for(let i of r.values)M(i.InnerTree,u=>{if(ae(u.type)||o&&u.type!==I.STRING)return;let l=e?u.id:i.ParamName;if(!l)return;let m=ue(u.data,u.type,n,s);a[l]===void 0?a[l]=m:Array.isArray(a[l])?a[l].push(m):a[l]=[a[l],m]});return{values:a}}function le(r){let e=[];for(let t of r.values)M(t.InnerTree,n=>{if(!n.type.includes(Ee))return;let s=ie(n.data);Ae(s)&&e.push(s)});return e}function L(r,e,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a;if("byName"in e?a=r.values.find(u=>u.ParamName===e.byName):a=r.values.find(u=>{let l=!1;return M(u.InnerTree,m=>{m.id===e.byId&&(l=!0)}),l}),!a)return;let i=[];if(M(a.InnerTree,u=>{if("byId"in e&&u.id!==e.byId||ae(u.type)||o&&u.type!==I.STRING)return;let l=ue(u.data,u.type,n,s);i.push(l)}),i.length!==0)return i.length===1?i[0]:i}var E=class{constructor(e,t=!1){this.response=e;this.debug=t}getValues(e=!1,t={}){return pe(this.response,e,t)}getValue(e,t){return L(this.response,e,t)}getValueByParamName(e,t){return L(this.response,{byName:e},t)}getValueByParamId(e,t){return L(this.response,{byId:e},t)}async extractMeshesFromResponse(e){let t={debug:this.debug,...e},n;try{({getThreeMeshesFromComputeResponse:n}=await import("./visualization-WIUVT2FZ.js"))}catch(s){throw new c("Failed to load three.js visualization module. Ensure three.js is installed as a peer dependency.",d.INVALID_STATE,{context:{originalError:s instanceof Error?s.message:String(s)}})}return n(this.response,t)}getFileData(){return le(this.response)}getAndDownloadFiles(e,t){let n=this.getFileData();N(n,e,t)}};function ce(r){return h(r,"data")}function Ne(r){return h(r,"type")}function fe(r){if(typeof r.default!="object"||r.default===null)return{schema:r};if(!j(r.default,"innerTree")){let n=`Input "${r.name??"unknown"}" default had an unrecognized shape (no innerTree key); the default was dropped.`;return f().warn("Unexpected structure in input.default:",r.default),{schema:{...r,default:null},warning:{code:"MALFORMED_DEFAULT",message:n}}}let e=h(r.default,"innerTree")??{};if(Object.keys(e).length===0)return{schema:{...r,default:void 0}};if(r.treeAccess||r.atMost&&r.atMost>1){let n={};for(let[s,o]of Object.entries(e))n[s]=o.map(a=>{let i=ce(a),u=Ne(a);if(typeof i=="string"){if(u==="System.Double"||u==="System.Int32"){let l=Number(i);return Number.isNaN(l)?i:l}if(u==="System.Boolean")return i.toLowerCase()==="true";if(u?.startsWith("Rhino.Geometry")||u==="System.String")try{return JSON.parse(i)}catch{return i}}return i});return{schema:{...r,default:n}}}let t=[];for(let n of Object.values(e))Array.isArray(n)&&n.forEach(s=>{s&&typeof s=="object"&&j(s,"data")&&t.push(ce(s))});return t.length===0?{schema:{...r,default:void 0}}:t.length===1?{schema:{...r,default:t[0]}}:{schema:{...r,default:t}}}var U=/^\{([\d;]*)\}$/;function v(r){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let e=Object.entries(r);return e.length>0&&e.every(([t,n])=>U.test(t)&&Array.isArray(n))}function S(r,e,t){if(r==null)return r;if(Array.isArray(r)){let s=r.map(e).filter(o=>o!==null);return s.length>0?s:void 0}let n=e(r);return n!==null?n:t?void 0:r}var Oe=r=>{if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r.trim());return Number.isNaN(e)?null:e}return null},Ge=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},Fe=r=>typeof r=="string"?r.startsWith('"')&&r.endsWith('"')||r.startsWith('"')?r.slice(1,-1):r:null,Ve=r=>{if(typeof r=="string"){let e=r.trim();return e.startsWith('"')&&e.endsWith('"')&&(e=e.slice(1,-1).trim()),e}return null};function de(r){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:(f().warn(`Parsed value for input ${r} is not an object`),null)}catch(t){return f().warn(`Failed to parse object value "${e}" for input ${r}`,t),null}return null}}function me(r,e,t){let n=Number(r.toFixed(e));return Math.abs(r-n)<t?n:r}function ke(r,e){if(!Number.isFinite(r)||r===0)return .1;let t=Math.abs(r);if(t>=1){let y=String(r).split(".")[1];if(y&&y.length>0){let g=Math.min(y.length,12),b=Math.pow(10,-g),$=Number(b.toFixed(g));return Math.abs($-b)<e?$:b}return 1}let n=String(r),s=n.toLowerCase().match(/e(-?\d+)/);if(s){let x=Number(s[1]);if(x<0||n.toLowerCase().includes("e-")){let y=Math.abs(x),g=Math.pow(10,-y),b=Number(g.toFixed(y));return Math.abs(b-g)<e?b:g}return .1}let o=12,i=t.toFixed(o).replace(/0+$/,""),u=Math.min((i.split(".")[1]||"").length,o);if(u===0)return .1;let l=Math.pow(10,-u),m=Number(l.toFixed(u));return Math.abs(m-l)<e?m:l}function Me(r,e=1e-8){let t=r.paramType==="Integer";if(v(r.default))return{default:r.default,stepSize:t?1:.1};let n=S(r.default,Oe,!0);if(t)return Array.isArray(n)?n=n.map(m=>typeof m=="number"?Math.round(m):m):typeof n=="number"&&(n=Math.round(n)),{default:n,stepSize:1};let s=Array.isArray(n)?n[0]:n,o;typeof s=="number"&&Number.isFinite(s)&&s!==0?o=s:typeof r.minimum=="number"&&Number.isFinite(r.minimum)&&r.minimum!==0?o=r.minimum:typeof r.maximum=="number"&&Number.isFinite(r.maximum)&&r.maximum!==0&&(o=r.maximum);let a=o!==void 0?ke(o,e):.1,i=0,u=String(a),l=u.toLowerCase().match(/e(-?\d+)/);if(l?i=Math.abs(Number(l[1])):i=u.split(".")[1]?.length??0,i===0&&typeof s=="number"&&s!==0&&Math.abs(s)<1){let m=Math.ceil(-Math.log10(Math.abs(s)));Number.isFinite(m)&&m>0&&(i=m)}return i=Math.min(Math.max(i,0),12),Array.isArray(n)?n=n.map(m=>typeof m=="number"?me(m,i,e):m):typeof n=="number"&&(n=me(n,i,e)),{default:n,stepSize:a}}var Le={types:["Number","Integer"],parse(r,e){let{default:t,stepSize:n}=Me(r);return{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,stepSize:n,default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,default:t?[0]:0}}},We={types:["Boolean"],parse(r,e){let t;try{t=S(r.default,Ge,!1)}catch(n){throw n instanceof Error?new c(n.message):n}return{...e,paramType:"Boolean",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Boolean",default:t?[!1]:!1}}},Be={types:["Text"],parse(r,e){let t=S(r.default,Fe,!1);return{...e,paramType:"Text",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Text",default:t?[""]:""}}},je={types:["ValueList"],parse(r,e){if(!r.values||typeof r.values!="object"||Object.keys(r.values).length===0)throw c.missingValues(r.nickname||"unnamed","ValueList");if(r.default!==void 0&&r.default!==null){let t=String(r.default).toLowerCase();Object.keys(r.values).some(s=>s.toLowerCase()===t)||f().warn(`ValueList input "${r.nickname||"unnamed"}" default value "${r.default}" is not in available values`)}return{...e,paramType:"ValueList",values:r.values,default:r.default}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"ValueList",values:r.values??{},default:t?[r.default]:r.default}}},he={types:["Geometry"],parse(r,e){let t=S(r.default,de(r.nickname||"unnamed"),!0);return{...e,paramType:"Geometry",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Geometry",default:t?[null]:null}}},Ue={types:["File"],parse(r,e){let t=S(r.default,de(r.nickname||"unnamed"),!0);return{...e,paramType:"File",acceptedFormats:r.acceptedFormats,default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"File",default:t?[null]:null}}},Ke={types:["Color"],parse(r,e){let t=S(r.default,Ve,!1);return{...e,paramType:"Color",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Color",default:t?["0, 0, 0"]:"0, 0, 0"}}},ze=[Le,We,Be,je,he,Ue,Ke],K=new Map(ze.flatMap(r=>r.types.map(e=>[e,r]))),ye=he;var $e=new Map([...K.keys()].map(r=>[r.toLowerCase(),r]));function _e(r){return $e.get(r?.toLowerCase())??r}function ge(r){return z(r).input}function z(r){let e={description:r.description,name:r.name,nickname:r.nickname,treeAccess:r.treeAccess,groupName:r.groupName??"",id:r.id},t=_e(r.paramType),{schema:n,warning:s}=fe({...r,paramType:t}),o=s&&{inputName:r.name||"unknown",paramType:t,message:s.message,code:s.code},a=K.get(t);try{if(!a)throw c.unknownParamType(t,r.name);return{input:a.parse(n,e),error:o}}catch(i){if(i instanceof c)return f().error(`Validation error for input ${r.name||"unknown"}:`,i.message),{input:(a??ye).fallback(n,e),error:{inputName:r.name||"unknown",paramType:t,message:i.message,code:i.code}};throw new c(i instanceof Error?i.message:String(i),"VALIDATION_ERROR",{context:{paramName:r.name,paramType:t},originalError:i instanceof Error?i:new Error(String(i))})}}function be(r){return W(r).inputs}function W(r){let e=[],t=[];for(let n of r){let{input:s,error:o}=z(n);e.push(s),o&&t.push(o)}return{inputs:e,parseErrors:t}}async function R(r,e){let t=P(r,[]),n={};if(t.algo&&(n.algo=t.algo),t.pointer&&(n.pointer=t.pointer),!n.algo&&!n.pointer)throw new c("Definition must resolve to either a URL pointer or base64 algo",d.INVALID_INPUT,{context:{definition:r}});let s=await A("io",n,e);if(!s||typeof s!="object")throw new c("Invalid IO response structure",d.INVALID_INPUT,{context:{response:s,definition:r}});let o=Te(s.warnings),a=Te(s.errors);return{inputs:s.inputs,outputs:s.outputs,...o&&{loadWarnings:o},...a&&{loadErrors:a}}}function Te(r){if(!Array.isArray(r))return;let e=r.filter(t=>typeof t=="string"&&t.trim().length>0);return e.length>0?e:void 0}async function V(r,e){T("fetchParsedDefinitionIO",e.suppressBrowserWarning??e.suppressClientSideWarning);let{inputs:t,outputs:n,loadWarnings:s,loadErrors:o}=await R(r,e),{inputs:a,parseErrors:i}=W(t);return{inputs:a,outputs:n,...i.length>0&&{parseErrors:i},...s&&{loadWarnings:s},...o&&{loadErrors:o}}}var B=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&&v(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 l=e,m=l.findIndex(x=>x.getParamName()===t);return m!==-1?l[m]=o:l.push(o),l}let a=e,i=o.toComputeFormat(),u=a.findIndex(l=>l.ParamName===t);return u!==-1?a[u]=i:a.push(i),a}static buildFromValue(e,t){let n=new r(e);return v(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(U);return t?t[1]===""?[]:t[1].split(";").map(Number):(f().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 i=r.clampValue(a,e,t,n);o.data=r.serializeValue(i)}}}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 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&&(f().warn(`${s}: ${e} below min ${t}, clamping`),o=t),n!=null&&o>n&&(f().warn(`${s}: ${e} above max ${n}, clamping`),o=n),o}};export{D as a,G as b,C as c,w as d,E as e,ge as f,be as g,R as h,V as i,B as j};
2
- //# sourceMappingURL=chunk-HSDCUZKP.js.map
1
+ import{b as p,c as d,d as c,e as f,h as A,i as _,j as q,m as J,n as H,p as Y,r as N}from"./chunk-GTTKNF4G.js";function h(r,e){if(!r||typeof r!="object")return;let t=r;if(e in t)return t[e];let n=e.toLowerCase();for(let s of Object.keys(t))if(s.toLowerCase()===n)return t[s]}function j(r,e){if(!r||typeof r!="object")return!1;let t=r;if(e in t)return!0;let n=e.toLowerCase();return Object.keys(t).some(s=>s.toLowerCase()===n)}function T(r,e){e||typeof window<"u"&&f().warn(`Warning: ${r} is running on the client side. For better performance and security, consider running this on the server side.`)}var Ce="Unable to load grasshopper definition";function Ie(r){return r instanceof c&&r.message.includes(Ce)}function Q(r,e){if(!e)return;let t=h(r,"values");if(!Array.isArray(t)||t.length===0)return;let n=[];for(let o of t){let a=h(o,"innerTree");(!a||Object.keys(a).length===0)&&n.push(h(o,"paramName")??"<unnamed>")}if(n.length===0)return;let s=n.length===t.length?"all":`${n.length}/${t.length}`;f().warn(`Solve returned empty output(s) (${s}): ${n.join(", ")}. These parameters produced no data \u2014 check the definition's inputs and the branch feeding each.`)}async function D(r,e,t){t.debug&&T("solveGrasshopperDefinition",t.suppressBrowserWarning??t.suppressClientSideWarning);let{response:n}=await O(P(e,r),t);return n}async function X(r,e,t){return t.debug&&T("solveGrasshopperDefinitionWithCacheKey",t.suppressBrowserWarning??t.suppressClientSideWarning),O(P(e,r),t)}async function Z(r,e,t,n){n.debug&&T("solveByCacheKey",n.suppressBrowserWarning??n.suppressClientSideWarning);let s={algo:null,pointer:e,values:r};try{return{...await O(s,n),missed:!1}}catch(o){if(!Ie(o))throw o;return{...await O(P(t,r),n),missed:!0}}}async function O(r,e){Se(r,e);let t=await A("grasshopper",r,e);if("pointer"in t){let{pointer:n,...s}=t,o=s;return Q(o,e.debug),{response:o,cacheKey:typeof n=="string"?n:null}}return Q(t,e.debug),{response:t,cacheKey:null}}function P(r,e){let t={algo:null,pointer:null,values:e};return r instanceof Uint8Array?t.algo=Y(r):/^https?:\/\//i.test(r)?t.pointer=r:H(r)?t.algo=r:t.algo=J(r),t}function Se(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 ee(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 re(r,e){let t=2166136261;for(let n=0;n<r;n++)t^=e(n),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t.toString(16).padStart(8,"0")}function te(r){return re(r.length,e=>r.charCodeAt(e))}function ne(r){return re(r.length,e=>r[e])}function G(r,e){return te(`${F(r)}|${ee(e)}`)}function F(r){return typeof r=="string"?r:`u8:${r.length}:${ne(r)}`}function xe(r){return r instanceof Uint8Array?!0:!/^https?:\/\//i.test(r)}var C=class{constructor(e,t,n={},s){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,"cacheKeyExecutor");p(this,"reuseServerDefinitionCache");p(this,"serverCacheKeys",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.cacheKeyExecutor=s,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 o=n.cache;this.cacheEnabled=o!==void 0&&o!==!1;let a=typeof o=="object"?o:{};this.cacheMax=a.maxEntries??50,this.cacheTtl=a.ttlMs??0,this.reuseServerDefinitionCache=!!s&&(n.reuseServerDefinitionCache??!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){f().error("[SolveScheduler] subscriber threw:",t)}}solve(e,t,n){if(this.disposed)return Promise.reject(new c("SolveScheduler has been disposed and cannot be used",d.INVALID_STATE));let s=G(e,t),o={key:s,enqueuedAt:Date.now(),startedAt:null};if(this.cacheEnabled){let a=this.readCache(s);if(a){let i={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,i),this.notify(),Promise.resolve(a)}}return new Promise((a,i)=>{let u={definition:e,dataTree:t,ctx:o,resolve:a,reject:i,externalSignal:n?.signal};if(u.externalSignal?.aborted){this.settleError(u,this.makeAbortError(o));return}this.enqueue(u)})}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}},i=await this.runExecutor(e.definition,e.dataTree,a),u=performance.now()-o;if(this.cacheEnabled&&this.writeCache(e.ctx.key,i),!this.settleSuccess(e,i))return;this._lastResult=i,this._lastError=null,this._lastDurationMs=u,this.runHook(this.onSettle,e.ctx,{status:"success",response:i,durationMs:u,fromCache:!1})}catch(a){let i=performance.now()-o,u=this.normalizeExecutionError(a,n);this._lastError=u,this._lastDurationMs=i,this.settleError(e,u)&&this.runHook(this.onSettle,e.ctx,{status:"error",error:u,durationMs:i})}finally{e.externalSignal?.removeEventListener("abort",s),this.inFlight.delete(n),this.drainNext(),this.notify()}}async runExecutor(e,t,n){if(!this.cacheKeyExecutor||!this.reuseServerDefinitionCache||!xe(e))return this.executor(e,t,n);let s=F(e),o=this.serverCacheKeys.get(s)??null,a=await this.cacheKeyExecutor(e,t,o,n);return a.cacheKey?this.serverCacheKeys.set(s,a.cacheKey):this.serverCacheKeys.delete(s),a.response}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){let t=new c("Superseded by newer solve",d.SUPERSEDED,{context:{key:e.ctx.key,enqueuedAt:e.ctx.enqueuedAt}});this.settleError(e,t)&&this.runHook(this.onSuperseded,e.ctx)}makeAbortError(e){return new c("Request aborted by caller",d.ABORTED,{context:{key:e.key,enqueuedAt:e.enqueuedAt}})}settleError(e,t){return e.settled?!1:(e.settled={error:t},e.reject(t),!0)}settleSuccess(e,t){return e.settled?!1:(e.settled={ok:!0},e.resolve(t),!0)}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 c?e:this.isAbortLikeError(e)?this.makeAbortError(t.ctx):new c(e instanceof Error?e.message:String(e),d.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){let t=this.makeAbortError(e.ctx);this.settleError(e,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){this.settleError(e,this.makeAbortError(e.ctx))}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){f().error("[SolveScheduler] hook threw:",n)}}};var w=class r{constructor(e){p(this,"config");p(this,"serverStats");p(this,"disposed",!1);this.config=this.normalizeComputeConfig(e),this.serverStats=new q(this.config.serverUrl,this.config.apiKey)}static async create(e){let t=new r(e);if(!await t.serverStats.isServerOnline())throw new c("Rhino Compute server is not online",d.NETWORK_ERROR,{context:{serverUrl:t.config.serverUrl}});return t}getConfig(){return this.ensureNotDisposed(),{...this.config}}async getIO(e){return this.ensureNotDisposed(),V(e,this.config)}async getRawIO(e){return this.ensureNotDisposed(),R(e,this.config)}async solve(e,t,n){this.ensureNotDisposed();try{if(typeof e=="string"&&!e?.trim())throw new c("Definition URL/content is required",d.INVALID_INPUT,{context:{receivedUrl:e}});if(e instanceof Uint8Array&&e.length===0)throw new c("Definition content is empty",d.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 D(t,e,s);if(o?.errors&&o.errors.length>0)throw new c(o.errors.join("; ")||"Computation failed",d.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&&f().error("Compute failed:",s),s instanceof c?s:new c(s instanceof Error?s.message:String(s),d.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=(s,o,a)=>D(o,s,a),n=(s,o,a,i)=>a===null?X(o,s,i).then(u=>({...u,missed:!1})):Z(o,a,s,i);return new C(t,this.config,e,n)}async dispose(){this.disposed||(this.disposed=!0,await this.serverStats.dispose())}ensureNotDisposed(){if(this.disposed)throw new c("GrasshopperClient has been disposed and cannot be used",d.INVALID_STATE)}normalizeComputeConfig(e){return{...e,serverUrl:_(e.serverUrl),apiKey:e.apiKey,authToken:e.authToken,debug:e.debug??!1,suppressBrowserWarning:e.suppressBrowserWarning??e.suppressClientSideWarning}}};var k=new Map;function se(r,e){k.set(r,e)}se("Rhino.Geometry.Point3d",(r,e)=>{let t=e;return!t||typeof t.X!="number"?null:new r.Point([t.X,t.Y,t.Z])});se("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 De(r){if(k.has(r))return k.get(r);for(let[e,t]of k)if(r.startsWith(e))return t}function Pe(r){return!r||typeof r!="object"?null:r.data??r.value??null}function oe(r,e,t){let n=De(e);if(n)try{return n(t,r)}catch(s){f().warn(`Failed to decode Rhino type ${e}:`,s)}try{let s=Pe(r);if(s)return t.CommonObject.decode(s)}catch(s){return f().warn(`Failed to decode ${e} with CommonObject:`,s),{__decodeError:!0,type:e,raw:r}}return r}var I={STRING:"System.String",INT:"System.Int32",DOUBLE:"System.Double",BOOL:"System.Boolean"},we="Rhino.Geometry.",Re=["WebDisplay"],Ee="FileData";function ae(r){return Re.some(e=>r.includes(e))}function ie(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 ve(r,e,t){switch(e){case I.STRING:return typeof r!="string"?r:r.replace(/^"(.*)"$/,"$1");case I.INT:return Number.parseInt(r,10);case I.DOUBLE:return Number.parseFloat(r);case I.BOOL:return String(r).toLowerCase()==="true";default:return t&&e.startsWith(we)?oe(r,e,t):r}}function ue(r,e,t,n){if(typeof r!="string")return r;let s=t?ie(r):r;return ve(s,e,n)}function Ae(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 M(r,e){for(let t of Object.values(r))if(Array.isArray(t))for(let n of t)e(n)}function pe(r,e=!1,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a={};for(let i of r.values)M(i.InnerTree,u=>{if(ae(u.type)||o&&u.type!==I.STRING)return;let l=e?u.id:i.ParamName;if(!l)return;let m=ue(u.data,u.type,n,s);a[l]===void 0?a[l]=m:Array.isArray(a[l])?a[l].push(m):a[l]=[a[l],m]});return{values:a}}function le(r){let e=[];for(let t of r.values)M(t.InnerTree,n=>{if(!n.type.includes(Ee))return;let s=ie(n.data);Ae(s)&&e.push(s)});return e}function L(r,e,t={}){let{parseValues:n=!0,rhino:s,stringOnly:o=!1}=t,a;if("byName"in e?a=r.values.find(u=>u.ParamName===e.byName):a=r.values.find(u=>{let l=!1;return M(u.InnerTree,m=>{m.id===e.byId&&(l=!0)}),l}),!a)return;let i=[];if(M(a.InnerTree,u=>{if("byId"in e&&u.id!==e.byId||ae(u.type)||o&&u.type!==I.STRING)return;let l=ue(u.data,u.type,n,s);i.push(l)}),i.length!==0)return i.length===1?i[0]:i}var E=class{constructor(e,t=!1){this.response=e;this.debug=t}getValues(e=!1,t={}){return pe(this.response,e,t)}getValue(e,t){return L(this.response,e,t)}getValueByParamName(e,t){return L(this.response,{byName:e},t)}getValueByParamId(e,t){return L(this.response,{byId:e},t)}async extractMeshesFromResponse(e){let t={debug:this.debug,...e},n;try{({getThreeMeshesFromComputeResponse:n}=await import("./visualization-WIUVT2FZ.js"))}catch(s){throw new c("Failed to load three.js visualization module. Ensure three.js is installed as a peer dependency.",d.INVALID_STATE,{context:{originalError:s instanceof Error?s.message:String(s)}})}return n(this.response,t)}getFileData(){return le(this.response)}getAndDownloadFiles(e,t){let n=this.getFileData();N(n,e,t)}};function ce(r){return h(r,"data")}function Ne(r){return h(r,"type")}function fe(r){if(typeof r.default!="object"||r.default===null)return{schema:r};if(!j(r.default,"innerTree")){let n=`Input "${r.name??"unknown"}" default had an unrecognized shape (no innerTree key); the default was dropped.`;return f().warn("Unexpected structure in input.default:",r.default),{schema:{...r,default:null},warning:{code:"MALFORMED_DEFAULT",message:n}}}let e=h(r.default,"innerTree")??{};if(Object.keys(e).length===0)return{schema:{...r,default:void 0}};if(r.treeAccess||r.atMost&&r.atMost>1){let n={};for(let[s,o]of Object.entries(e))n[s]=o.map(a=>{let i=ce(a),u=Ne(a);if(typeof i=="string"){if(u==="System.Double"||u==="System.Int32"){let l=Number(i);return Number.isNaN(l)?i:l}if(u==="System.Boolean")return i.toLowerCase()==="true";if(u?.startsWith("Rhino.Geometry")||u==="System.String")try{return JSON.parse(i)}catch{return i}}return i});return{schema:{...r,default:n}}}let t=[];for(let n of Object.values(e))Array.isArray(n)&&n.forEach(s=>{s&&typeof s=="object"&&j(s,"data")&&t.push(ce(s))});return t.length===0?{schema:{...r,default:void 0}}:t.length===1?{schema:{...r,default:t[0]}}:{schema:{...r,default:t}}}var U=/^\{([\d;]*)\}$/;function v(r){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let e=Object.entries(r);return e.length>0&&e.every(([t,n])=>U.test(t)&&Array.isArray(n))}function S(r,e,t){if(r==null)return r;if(Array.isArray(r)){let s=r.map(e).filter(o=>o!==null);return s.length>0?s:void 0}let n=e(r);return n!==null?n:t?void 0:r}var Oe=r=>{if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r.trim());return Number.isNaN(e)?null:e}return null},Ge=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},Fe=r=>typeof r=="string"?r.startsWith('"')&&r.endsWith('"')||r.startsWith('"')?r.slice(1,-1):r:null,Ve=r=>{if(typeof r=="string"){let e=r.trim();return e.startsWith('"')&&e.endsWith('"')&&(e=e.slice(1,-1).trim()),e}return null};function de(r){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:(f().warn(`Parsed value for input ${r} is not an object`),null)}catch(t){return f().warn(`Failed to parse object value "${e}" for input ${r}`,t),null}return null}}function me(r,e,t){let n=Number(r.toFixed(e));return Math.abs(r-n)<t?n:r}function ke(r,e){if(!Number.isFinite(r)||r===0)return .1;let t=Math.abs(r);if(t>=1){let y=String(r).split(".")[1];if(y&&y.length>0){let g=Math.min(y.length,12),b=Math.pow(10,-g),$=Number(b.toFixed(g));return Math.abs($-b)<e?$:b}return 1}let n=String(r),s=n.toLowerCase().match(/e(-?\d+)/);if(s){let x=Number(s[1]);if(x<0||n.toLowerCase().includes("e-")){let y=Math.abs(x),g=Math.pow(10,-y),b=Number(g.toFixed(y));return Math.abs(b-g)<e?b:g}return .1}let o=12,i=t.toFixed(o).replace(/0+$/,""),u=Math.min((i.split(".")[1]||"").length,o);if(u===0)return .1;let l=Math.pow(10,-u),m=Number(l.toFixed(u));return Math.abs(m-l)<e?m:l}function Me(r,e=1e-8){let t=r.paramType==="Integer";if(v(r.default))return{default:r.default,stepSize:t?1:.1};let n=S(r.default,Oe,!0);if(t)return Array.isArray(n)?n=n.map(m=>typeof m=="number"?Math.round(m):m):typeof n=="number"&&(n=Math.round(n)),{default:n,stepSize:1};let s=Array.isArray(n)?n[0]:n,o;typeof s=="number"&&Number.isFinite(s)&&s!==0?o=s:typeof r.minimum=="number"&&Number.isFinite(r.minimum)&&r.minimum!==0?o=r.minimum:typeof r.maximum=="number"&&Number.isFinite(r.maximum)&&r.maximum!==0&&(o=r.maximum);let a=o!==void 0?ke(o,e):.1,i=0,u=String(a),l=u.toLowerCase().match(/e(-?\d+)/);if(l?i=Math.abs(Number(l[1])):i=u.split(".")[1]?.length??0,i===0&&typeof s=="number"&&s!==0&&Math.abs(s)<1){let m=Math.ceil(-Math.log10(Math.abs(s)));Number.isFinite(m)&&m>0&&(i=m)}return i=Math.min(Math.max(i,0),12),Array.isArray(n)?n=n.map(m=>typeof m=="number"?me(m,i,e):m):typeof n=="number"&&(n=me(n,i,e)),{default:n,stepSize:a}}var Le={types:["Number","Integer"],parse(r,e){let{default:t,stepSize:n}=Me(r);return{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,stepSize:n,default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:r.paramType,minimum:r.minimum,maximum:r.maximum,atLeast:r.atLeast,atMost:r.atMost,default:t?[0]:0}}},We={types:["Boolean"],parse(r,e){let t;try{t=S(r.default,Ge,!1)}catch(n){throw n instanceof Error?new c(n.message):n}return{...e,paramType:"Boolean",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Boolean",default:t?[!1]:!1}}},Be={types:["Text"],parse(r,e){let t=S(r.default,Fe,!1);return{...e,paramType:"Text",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Text",default:t?[""]:""}}},je={types:["ValueList"],parse(r,e){if(!r.values||typeof r.values!="object"||Object.keys(r.values).length===0)throw c.missingValues(r.nickname||"unnamed","ValueList");if(r.default!==void 0&&r.default!==null){let t=String(r.default).toLowerCase();Object.keys(r.values).some(s=>s.toLowerCase()===t)||f().warn(`ValueList input "${r.nickname||"unnamed"}" default value "${r.default}" is not in available values`)}return{...e,paramType:"ValueList",values:r.values,default:r.default}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"ValueList",values:r.values??{},default:t?[r.default]:r.default}}},he={types:["Geometry"],parse(r,e){let t=S(r.default,de(r.nickname||"unnamed"),!0);return{...e,paramType:"Geometry",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Geometry",default:t?[null]:null}}},Ue={types:["File"],parse(r,e){let t=S(r.default,de(r.nickname||"unnamed"),!0);return{...e,paramType:"File",acceptedFormats:r.acceptedFormats,default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"File",default:t?[null]:null}}},Ke={types:["Color"],parse(r,e){let t=S(r.default,Ve,!1);return{...e,paramType:"Color",default:t}},fallback(r,e){let t=(r.atMost??1)>1;return{...e,paramType:"Color",default:t?["0, 0, 0"]:"0, 0, 0"}}},ze=[Le,We,Be,je,he,Ue,Ke],K=new Map(ze.flatMap(r=>r.types.map(e=>[e,r]))),ye=he;var $e=new Map([...K.keys()].map(r=>[r.toLowerCase(),r]));function _e(r){return $e.get(r?.toLowerCase())??r}function ge(r){return z(r).input}function z(r){let e={description:r.description,name:r.name,nickname:r.nickname,treeAccess:r.treeAccess,groupName:r.groupName??"",id:r.id},t=_e(r.paramType),{schema:n,warning:s}=fe({...r,paramType:t}),o=s&&{inputName:r.name||"unknown",paramType:t,message:s.message,code:s.code},a=K.get(t);try{if(!a)throw c.unknownParamType(t,r.name);return{input:a.parse(n,e),error:o}}catch(i){if(i instanceof c)return f().error(`Validation error for input ${r.name||"unknown"}:`,i.message),{input:(a??ye).fallback(n,e),error:{inputName:r.name||"unknown",paramType:t,message:i.message,code:i.code}};throw new c(i instanceof Error?i.message:String(i),"VALIDATION_ERROR",{context:{paramName:r.name,paramType:t},originalError:i instanceof Error?i:new Error(String(i))})}}function be(r){return W(r).inputs}function W(r){let e=[],t=[];for(let n of r){let{input:s,error:o}=z(n);e.push(s),o&&t.push(o)}return{inputs:e,parseErrors:t}}async function R(r,e){let t=P(r,[]),n={};if(t.algo&&(n.algo=t.algo),t.pointer&&(n.pointer=t.pointer),!n.algo&&!n.pointer)throw new c("Definition must resolve to either a URL pointer or base64 algo",d.INVALID_INPUT,{context:{definition:r}});let s=await A("io",n,e);if(!s||typeof s!="object")throw new c("Invalid IO response structure",d.INVALID_INPUT,{context:{response:s,definition:r}});let o=Te(s.warnings),a=Te(s.errors);return{inputs:Array.isArray(s.inputs)?s.inputs:[],outputs:Array.isArray(s.outputs)?s.outputs:[],...o&&{loadWarnings:o},...a&&{loadErrors:a}}}function Te(r){if(!Array.isArray(r))return;let e=r.filter(t=>typeof t=="string"&&t.trim().length>0);return e.length>0?e:void 0}async function V(r,e){T("fetchParsedDefinitionIO",e.suppressBrowserWarning??e.suppressClientSideWarning);let{inputs:t,outputs:n,loadWarnings:s,loadErrors:o}=await R(r,e),{inputs:a,parseErrors:i}=W(t);return{inputs:a,outputs:n,...i.length>0&&{parseErrors:i},...s&&{loadWarnings:s},...o&&{loadErrors:o}}}var B=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&&v(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 l=e,m=l.findIndex(x=>x.getParamName()===t);return m!==-1?l[m]=o:l.push(o),l}let a=e,i=o.toComputeFormat(),u=a.findIndex(l=>l.ParamName===t);return u!==-1?a[u]=i:a.push(i),a}static buildFromValue(e,t){let n=new r(e);return v(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(U);return t?t[1]===""?[]:t[1].split(";").map(Number):(f().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 i=r.clampValue(a,e,t,n);o.data=r.serializeValue(i)}}}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 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&&(f().warn(`${s}: ${e} below min ${t}, clamping`),o=t),n!=null&&o>n&&(f().warn(`${s}: ${e} above max ${n}, clamping`),o=n),o}};export{D as a,G as b,C as c,w as d,E as e,ge as f,be as g,R as h,V as i,B as j};
2
+ //# sourceMappingURL=chunk-BSELPXRN.js.map